Как проверить целостность MySQL? - PullRequest
3 голосов
/ 28 ноября 2010

У меня есть большая база данных MySQL 5 для сайта drupal на старой машине. После резервного копирования и восстановления новой базы данных я получил:

ОШИБКА 1064 (42000) в строке **: Вы есть ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует ваша версия сервера MySQL для правильный синтаксис для использования рядом '' Captcha_success_form_ids | а: 1: {s: 13: \ "user_register \"; s: 13: \ "user_register \";} зр» в строке 1

Я не уверен, какая таблица является источником этой ошибки (у меня нет таблицы с именем user_register). Поэтому мне интересно, как я могу быстро проверить исходную базу данных на целостность, прежде чем предпринять еще одно неудачное резервное копирование / восстановление? (У меня есть доступ к командной строке). Спасибо

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

Если вы подозреваете повреждение в исходной базе данных, вы можете сделать следующее:

Для таблиц 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 не будет включать те по умолчанию.Вам необходимо использовать опцию - рутины :

mysqldump --routines -u <user> -p<password> <database> > output
2 голосов
/ 29 ноября 2010

Фрагмент, указанный в сообщении об ошибке, не похож на MySQL - он похож на сериализованные данные PHP, что заставляет меня думать, что в коде вы не экранировали свои данные должным образом Изменилась ли ваша установка PHP? Особенно умные цитаты? (обратите внимание, что умные цитаты устарели).

...