English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL 데이터베이스 innodb이 시작되지 않고 재시작할 수 없는 해결 방법

문제 소개

컴퓨터 사용 중에 충돌이 발생하고, 다시 시작하면 mysql이 성공적으로 시작되지 않았음을 발견하고, 에러 로그를 확인하면 innodb 문제로 인해 mysql이 시작되지 않았음을 발견했습니다.

에러 로그

$ mysql.server start
MySQL 시작
. ERROR! 서버는 PID 파일을 업데이트하지 않고 종료되었습니다 (/usr/local/var/mysql/fdipzonedeMacBook-Air.local.pid).
22:08:37 mysqld_safe mysqld 데몬을 데이터베이스로 시작 /usr/local/var/mysql
2016-04-23 22:08:38 0 [경고] TIMESTAMP이 내장된 DEFAULT 값으로 사용되지 않습니다. 사용하십시오 --explict_defaults_for_timestamp 서버 옵션(자세한 내용은 문서를 참조하십시오).
2016-04-23 22:08:38 0 [주의] /usr/local/Cellar/mysql/5.6.24/bin/mysqld (mysqld 5.6.24) 프로세스로 시작 3604 ...
2016-04-23 22:08:38 3604 [경고] lower_case_table_names 설정 =2 기본적으로 파일 시스템이 /usr/local/var/mysql/ 대소문자 구분 없음
2016-04-23 22:08:38 3604 [주의] 플러그인 'FEDERATED'는 비활성화되었습니다.
2016-04-23 22:08:38 3604 [주의] InnoDB: 버퍼 풀 페이지를 참조 계산하기 위해 atomics를 사용합니다
2016-04-23 22:08:38 3604 [주의] InnoDB: InnoDB 메모리 헥스는 비활성화되었습니다
2016-04-23 22:08:38 3604 [주의] InnoDB: Mutexes 및 rw_locks는 GCC atomic builtins를 사용합니다
2016-04-23 22:08:38 3604 [주의] InnoDB: 메모리 바리어는 사용되지 않습니다
2016-04-23 22:08:38 3604 [주의] InnoDB:ziplib을 사용하여 테이블을 압축합니다 1.2.3
2016-04-23 22:08:38 3604 [주의] InnoDB: CPU crc를 사용하고 있습니다32 지시
2016-04-23 22:08:38 3604 [주의] InnoDB: 버퍼 풀 초기화 중, 크기 = 128.0M
2016-04-23 22:08:38 3604 [주의] InnoDB: 버퍼 풀 초기화가 완료되었습니다
2016-04-23 22:08:38 3604 [주의] InnoDB: 지원되는 가장 높은 파일 포맷은 Barracuda입니다.
2016-04-23 22:08:38 3604 [주의] InnoDB: 로그 스캔이 체크포인트 lsn을 넘어섰습니다. 68929933440
2016-04-23 22:08:38 3604 [주의] InnoDB: 데이터베이스가 정상적으로 종료되지 않았습니다!
2016-04-23 22:08:38 3604 [주의] InnoDB: 충돌 복구를 시작 중.
2016-04-23 22:08:38 3604 [주의] InnoDB: .ibd 파일에서 테이블 공간 정보를 읽는 중...
2016-04-23 22:08:38 3604 [에러] InnoDB: 테이블 공간에서 체크섬 일치하지 않음./test_user/user_recommend_code#P#pmax.ibd (테이블 test_user/user_recommend_code#P#pmax)
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기:1024 분석할 페이지 수:64
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기: 1024, 가능한 space_id 개수:0
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기:2048 분석할 페이지 수:48
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기: 2048, 가능한 space_id 개수:0
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기:4096 분석할 페이지 수:24
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기: 4096, 가능한 space_id 개수:0
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기:8192 분석할 페이지 수:12
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기: 8192, 가능한 space_id 개수:0
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기:16384 분석할 페이지 수:6
2016-04-23 22:08:38 3604 [주의] InnoDB: VALID: 공간:2947354 page_no:3 page_size:16384
2016-04-23 22:08:38 3604 [주의] InnoDB: 페이지 크기: 16384, 가능한 space_id 개수:1
2016-04-23 22:08:38 3604 [주의] InnoDB: space_id:2947354, 페이지 수가 일치하는 개수: 1/1 (16384)
2016-04-23 22:08:38 3604 [주의] InnoDB: 선택된 공간:2947354
2016-04-23 22:08:38 3604 [주의] InnoDB: 테이블 공간의 페이지 0을 복원 중 2947354
2016-04-23 22:08:38 3604 [경고] InnoDB: 공간에 page_no=0이 없는 Doublewrite가 있습니다: 2947354
2016-04-23 22:08:38 7fff79b9e300 InnoDB: 운영 체제 오류 번호 2 파일 작업에서.
InnoDB: 오류는 시스템이 지정된 경로를 찾을 수 없다는 것을 의미합니다.
InnoDB: InnoDB를 설치하는 경우, 반드시 생성해야 할 것을 기억하세요
InnoDB: 본인이 디렉토리를 생성해야 합니다. InnoDB는 그런 디렉토리를 생성하지 않습니다.
InnoDB: 오류: 단일 파일을 열 수 없습니다-테이블 테이블스페이스 파일 ./test_user/user_recommend_code#P#pmax.ibd
InnoDB: 테이블이 손상될 수 있기 때문에 크래시 복구를 계속하지 않습니다.
InnoDB: InnoDB 로그에 있는 로그 기록을 적용할 수 없으면, 데이터가 손상될 수 있습니다.
InnoDB: 문제를 해결하고 mysqld를 시작하기 위해:
InnoDB: 1) 파일에서 권한 문제가 있고 mysqld가 파일을 열 수 없다면,
InnoDB: 파일을 열면, 권한을 수정해야 합니다.
InnoDB: 2) 테이블이 필요하지 않거나 백업에서 복구할 수 있다면,
InnoDB: 그런 다음 .ibd 파일을 제거할 수 있으며, InnoDB는 일반적으로 복구를 수행합니다
InnoDB: 크래시 복구와 해당 테이블을 무시합니다.
InnoDB: 3) 파일 시스템이나 디스크가 고장났을 때, 제거할 수 없습니다
InnoDB: .ibd 파일이 있으면, my.cnf에서 innodb_force_recovery > 0을 설정할 수 있습니다
InnoDB: 그리고 InnoDB를 이곳에서 강제로 크래시 복구를 계속합니다.

해결 방법

1. 데이터가 중요하지 않거나 이미 백업이 있다면, mysql 시작을 복구하면 됩니다

mysql 디렉토리에 진입합니다. 일반적으로: /usr/local/var/mysql/

ib_logfile를 삭제합니다*

ibdata를 삭제합니다*

모든 데이터베이스 물리 디렉토리를 삭제합니다. (예: 데이터베이스가 test_db라면 rm을 실행합니다) -rf test_db)

mysql을 다시 시작합니다.

데이터베이스를 다시 구축하거나 백업을 사용하여 덮어씁니다.

2. 데이터가 중요하며 백업이 없다면

innodb_force_recovery 매개변수를 사용하여 mysqld가 복구 단계를 건너뛰고 mysqld를 시작하여 데이터를 수출하고 데이터베이스를 다시 구축할 수 있습니다.

innodb_force_recovery는 다음과 같이 설정할 수 있습니다.1-6대수는 전체 수의 영향을 받습니다.

     1、(SRV_FORCE_IGNORE_CORRUPT): 발견된 corrupt 페이지를 무시합니다.

     2、(SRV_FORCE_NO_BACKGROUND): 메인 스레드의 실행을 차단합니다. 메인 스레드가 full purge 작업을 수행해야 할 경우, 캐시드(crash)가 발생할 수 있습니다.

     3、(SRV_FORCE_NO_TRX_UNDO): 거래 취소 작업을 수행하지 않습니다.

     4、(SRV_FORCE_NO_IBUF_MERGE): 삽입 버퍼의 병합 작업을 수행하지 않습니다.

     5、(SRV_FORCE_NO_UNDO_LOG_SCAN): 재작업 로그를 확인하지 않습니다. InnoDB 저장 엔진은 미결제 거래를 이미 결제된 거래로 간주합니다.

     6、(SRV_FORCE_NO_LOG_REDO): 로그 레도의 작업을 수행하지 않습니다.

my.cnf(Windows는 my.ini)에 추가합니다.

innodb_force_recovery = 6 
innodb_purge_thread = 0

mysql을 재시작합니다.

이 때는 select, create, drop 작업만 수행할 수 있으며, insert, update, delete 작업을 수행할 수 없습니다.

로직 수출을 실행하고, 완료된 후 innodb_force_recovery=0, innodb_purge_threads=을 설정합니다.1그런 다음 데이터베이스를 다시 구축하고, 수출한 데이터를 다시 입력합니다.

결론

이 글의 모든 내용은 MySQL을 배우거나 사용할 때 도움이 되기를 바랍니다. 궁금한 점이 있으면 댓글로 주세요. 감사합니다. 나락 교본에 대한 지원에 감사합니다.

추천해드립니다