如何检查MySQL的完整性?

时间:2010-11-28 06:06:22

标签: mysql database-integrity

我在旧机器上有一个用于drupal站点的大型MySQL 5数据库。在备份并恢复新数据库之后,我得到了:

  

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

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

2 个答案:

答案 0 :(得分:3)

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

对于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

答案 1 :(得分:2)

错误消息中引用的片段看起来与MySQL不同 - 它看起来像序列化的PHP数据,这让我觉得你没有在代码中正确地转发你的数据。您的PHP安装是否已更改?特别是智能引用? (注意,智能引用现已弃用)。