집 >데이터 베이스 >MySQL 튜토리얼 >MySQL 데이터베이스 innodb가 시작되지 않고 다시 시작되지 않는 문제에 대한 솔루션_MySQL
문제 소개
사용 중 컴퓨터가 다운되었습니다. 재시작 후 mysql이 성공적으로 시작되지 않은 것을 발견했습니다. 오류 로그를 살펴보니 mysql이 시작되지 않는 원인이 되는 innodb에 문제가 있음을 발견했습니다.
오류 로그
$ mysql.server start Starting MySQL . ERROR! The server quit without updating PID file (/usr/local/var/mysql/fdipzonedeMacBook-Air.local.pid). 22:08:37 mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql 2016-04-23 22:08:38 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2016-04-23 22:08:38 0 [Note] /usr/local/Cellar/mysql/5.6.24/bin/mysqld (mysqld 5.6.24) starting as process 3604 ... 2016-04-23 22:08:38 3604 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive 2016-04-23 22:08:38 3604 [Note] Plugin 'FEDERATED' is disabled. 2016-04-23 22:08:38 3604 [Note] InnoDB: Using atomics to ref count buffer pool pages 2016-04-23 22:08:38 3604 [Note] InnoDB: The InnoDB memory heap is disabled 2016-04-23 22:08:38 3604 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2016-04-23 22:08:38 3604 [Note] InnoDB: Memory barrier is not used 2016-04-23 22:08:38 3604 [Note] InnoDB: Compressed tables use zlib 1.2.3 2016-04-23 22:08:38 3604 [Note] InnoDB: Using CPU crc32 instructions 2016-04-23 22:08:38 3604 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2016-04-23 22:08:38 3604 [Note] InnoDB: Completed initialization of buffer pool 2016-04-23 22:08:38 3604 [Note] InnoDB: Highest supported file format is Barracuda. 2016-04-23 22:08:38 3604 [Note] InnoDB: Log scan progressed past the checkpoint lsn 68929933440 2016-04-23 22:08:38 3604 [Note] InnoDB: Database was not shutdown normally! 2016-04-23 22:08:38 3604 [Note] InnoDB: Starting crash recovery. 2016-04-23 22:08:38 3604 [Note] InnoDB: Reading tablespace information from the .ibd files... 2016-04-23 22:08:38 3604 [ERROR] InnoDB: checksum mismatch in tablespace ./test_user/user_recommend_code#P#pmax.ibd (table test_user/user_recommend_code#P#pmax) 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size:1024 Pages to analyze:64 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size: 1024, Possible space_id count:0 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size:2048 Pages to analyze:48 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size: 2048, Possible space_id count:0 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size:4096 Pages to analyze:24 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size: 4096, Possible space_id count:0 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size:8192 Pages to analyze:12 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size: 8192, Possible space_id count:0 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size:16384 Pages to analyze:6 2016-04-23 22:08:38 3604 [Note] InnoDB: VALID: space:2947354 page_no:3 page_size:16384 2016-04-23 22:08:38 3604 [Note] InnoDB: Page size: 16384, Possible space_id count:1 2016-04-23 22:08:38 3604 [Note] InnoDB: space_id:2947354, Number of pages matched: 1/1 (16384) 2016-04-23 22:08:38 3604 [Note] InnoDB: Chosen space:2947354 2016-04-23 22:08:38 3604 [Note] InnoDB: Restoring page 0 of tablespace 2947354 2016-04-23 22:08:38 3604 [Warning] InnoDB: Doublewrite does not have page_no=0 of space: 2947354 2016-04-23 22:08:38 7fff79b9e300 InnoDB: Operating system error number 2 in a file operation. InnoDB: The error means the system cannot find the path specified. InnoDB: If you are installing InnoDB, remember that you must create InnoDB: directories yourself, InnoDB does not create them. InnoDB: Error: could not open single-table tablespace file ./test_user/user_recommend_code#P#pmax.ibd InnoDB: We do not continue the crash recovery, because the table may become InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it. InnoDB: To fix the problem and start mysqld: InnoDB: 1) If there is a permission problem in the file and mysqld cannot InnoDB: open the file, you should modify the permissions. InnoDB: 2) If the table is not needed, or you can restore it from a backup, InnoDB: then you can remove the .ibd file, and InnoDB will do a normal InnoDB: crash recovery and ignore that table. InnoDB: 3) If the file system or the disk is broken, and you cannot remove InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf InnoDB: and force InnoDB to continue crash recovery here.
솔루션
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): 감지된 손상된 페이지를 무시합니다.
2. (SRV_FORCE_NO_BACKGROUND): 메인 스레드가 실행되지 않도록 합니다. 메인 스레드가 전체 제거 작업을 수행해야 하는 경우 충돌이 발생합니다.
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 다시 시작
현재 선택, 생성, 삭제 작업만 수행할 수 있고, 삽입, 업데이트, 삭제 작업은 수행할 수 없습니다
논리 내보내기를 실행하고 완료 후 innodb_force_recovery=0
, innodb_purge_threads=1
을 실행한 다음 데이터베이스를 재구축하고 마지막으로 내보낸 데이터를
요약
이상은 이 글의 전체 내용입니다. mysql을 배우시거나 사용하시는 모든 분들께 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시면 메시지를 남겨주시면 감사하겠습니다.