Как проверить целостность MySQL?
У меня есть большая база данных MySQL 5 для сайта drupal на старой машине. После резервного копирования и восстановления новой базы данных я получил:
ОШИБКА 1064 (42000) в строке **: в вашем синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с ''captcha_success_form_ids|a:1:{s:13:\"user_register\";s:13:\"user_register\";}sp'в строка 1
Я не уверен, какая таблица является источником этой ошибки (у меня нет таблицы с именем user_register). Поэтому мне интересно, как я могу быстро проверить целостность исходной базы данных, прежде чем предпринять еще одно неудачное резервное копирование / восстановление? (У меня есть доступ к командной строке). Спасибо
2 ответа
Фрагмент, указанный в сообщении об ошибке, не похож на MySQL - он выглядит как сериализованные данные PHP, что заставляет меня думать, что вы не экранировали свои данные должным образом в коде. Изменилась ли ваша установка PHP? Особенно умные цитаты? (обратите внимание, что smartquotes теперь не рекомендуется).
Если вы подозреваете коррупцию в исходной базе данных, вы можете сделать следующее:
Для таблиц MyISAM:
CHECK TABLE <table_name>;
REPAIR TABLE <table_name>;
Для таблиц InnoDB:
http://www.mysqlperformanceblog.com/2008/07/04/recovering-innodb-table-corruption/
Я лично видел повреждение таблиц MyISAM в нескольких редких случаях, которые CHECK и REPAIR смогли обнаружить и исправить. Я никогда не сталкивался с повреждением таблиц InnoDB, поэтому не могу сказать из личного опыта в отношении информации, представленной в ссылке.
Тем не менее, если бы я был на вашем месте, я бы начал с более внимательного изучения выходного файла, созданного mysqldump, чтобы посмотреть, смогу ли я точно определить источник ошибки. mysqldump обычно выводит один оператор INSERT на таблицу со всеми данными в одной строке, поэтому диагностировать ошибки немного сложно, потому что номер строки, включенный в сообщение об ошибке, мало помогает. Итак, что я бы сделал, это отредактировал выходной файл mysqldump и вставил строки между каждой строкой. Например:
Оригинал:
INSERT INTO table VALUES (a,b,c),(d,e,f),(g,h,i), ...
Изменить на:
INSERT INTO table VALUES (a,b,c),
(d,e,f),
(g,h,i),
...
Поскольку вам удобно работать с командной строкой, вы можете автоматизировать это с помощью sed и т. Д.
Затем попробуйте импортировать измененный файл. Вы должны получить ту же ошибку, но на этот раз номер строки поможет точно определить строку, которая вызывает проблему. На этом этапе вы сможете диагностировать проблему (или опубликовать оскорбительную часть вывода mysqldump здесь, и мы постараемся помочь).
РЕДАКТИРОВАТЬ:
Происходит ли указанное вами сообщение об ошибке при импорте базы данных? Или база данных успешно импортируется, но приложение выдает сообщение об ошибке при доступе к базе данных? Я предполагал первое, но теперь думаю, что это может быть второе после перечитывания вашего вопроса.
Еще одна идея: есть ли в вашей базе данных хранимые процы? Если так, mysqldump не будет включать те по умолчанию. Вам нужно использовать опцию --routines:
mysqldump --routines -u <user> -p<password> <database> > output