English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Problem introduction
The computer crashed during use, and after restarting, it was found that MySQL did not start successfully. Checking the error log found that innodb issues caused MySQL to fail to start.
Error log
$ 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] Плагин 'FEDERATED' отключен. 2016-04-23 22:08:38 3604 [Note] InnoDB: Используются атомарные операции для подсчета страниц буферного пула 2016-04-23 22:08:38 3604 [Note] InnoDB: Памятка InnoDB отключена 2016-04-23 22:08:38 3604 [Note] InnoDB: Мьютексы и rw_locks используют атомарные内置 функции GCC 2016-04-23 22:08:38 3604 [Note] InnoDB: Барьер памяти не используется 2016-04-23 22:08:38 3604 [Note] InnoDB: Сжатые таблицы используют zlib 1.2.3 2016-04-23 22:08:38 3604 [Note] InnoDB: Используются инструкции CPU crc32 2016-04-23 22:08:38 3604 [Note] InnoDB: Инициализация буферного пула, размер = 128.0M 2016-04-23 22:08:38 3604 [Note] InnoDB: Завершено инициализация буферного пула 2016-04-23 22:08:38 3604 [Note] InnoDB: Самый высокий поддерживаемый формат файла - Barracuda. 2016-04-23 22:08:38 3604 [Note] InnoDB: Сканирование журнала прошло дальше точки проверки lsn 68929933440 2016-04-23 22:08:38 3604 [Note] InnoDB: База данных не была закрыта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 [Заметка] InnoDB: Размер страницы:16384 Страницы для анализа:6 2016-04-23 22:08:38 3604 [Заметка] InnoDB: VALID: пространство:2947354 page_no:3 размер_страницы: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 в пространстве: 2947354 2016-04-23 22:08:38 7fff79b9e300 Ошибка операционной системы номер 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, вы можете установить innodb_force_recovery > 0 в my.cnf 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, это может привести к сбою.
3. (SRV_FORCE_NO_TRX_UNDO): не выполнять операции откат транзакций.
4. (SRV_FORCE_NO_IBUF_MERGE): не выполнять операции слияния буфера вставки.
5. (SRV_FORCE_NO_UNDO_LOG_SCAN): не проверять журнал redo, 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时有所帮助,如果有疑问,请大家留言交流,感谢大家对呐喊教程的支持。