2010-11-28 64 views
2

我在旧机器上有一个大的MySQL 5数据库,用于Drupal站点。备份和恢复新鲜的数据库后,我得到了:如何检查MySQL的完整性?

在行

错误1064(42000)* *:你 在您的SQL语法错误; 检查对应 你的MySQL服务器版本的 正确的语法附近 'captcha_success_form_ids使用手动|一:1:{S:13:\ “user_register \”; S:13:\ “user_register \”; } sp' at line 1

我不确定哪个表是这个错误的起源(我没有名为'user_register'的表)。所以我想知道如何在进行另一次失败的备份/恢复工作之前快速检查原始数据库的完整性? (我有命令行访问)。由于

+0

其不是表user_register,它试图插入的数据,似乎你做serialise,并尝试插入这个 – 2010-11-28 06:42:09

+0

你如何生成备份?例如,你在使用mysqldump,MySQL Administrator等吗?尝试使用mysqldump,看看你是否得到相同的错误。 – cbranch 2010-11-28 06:44:15

回答

2

错误消息中引用的片段看上去一点也不像MySQL的 - 它看起来像系列化PHP数据,让我觉得你是不是在正确转义数据代码。您的PHP安装已更改?特别是smartquotes? (注意smartquotes现在已被弃用)。

3

如果在原始数据库怀疑损坏,您可以执行以下操作:

对于MyISAM表:

CHECK TABLE <table_name>; 
REPAIR TABLE <table_name>; 

InnoDB表:

http://www.mysqlperformanceblog.com/2008/07/04/recovering-innodb-table-corruption/

我在CHECK和REPAIR能够检测和纠正的几个罕见场合中,我个人发现了MyISAM表的腐败现象。我从来没有经历过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