3

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

ERROR 1064 (42000) at line * *: 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 ''captcha_success_form_ids|a:1:{s:13:\"user_register\";s:13:\"user_register\";}sp' 附近使用正确的语法1号线

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

4

2 回答 2

4

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

对于 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
于 2010-11-29T05:25:54.877 回答
4

错误消息中引用的片段看起来不像 MySQL - 它看起来像序列化的 PHP 数据,这让我认为您没有在代码中正确地转义数据。你的 PHP 安装有变化吗?特别是智能报价?(注意 smartquotes 现在已弃用)。

于 2010-11-29T09:56:44.977 回答