【问题标题】:How to check MySQL integrity?如何检查 MySQL 的完整性?
【发布时间】:2011-05-16 18:55:16
【问题描述】:

我有一个大型 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”的表)。所以我想知道如何在进行另一次失败的备份/恢复工作之前快速检查原始数据库的完整性? (我有命令行访问权限)。谢谢

【问题讨论】:

  • 不是user_register表,是你尝试插入的数据,好像你做了serialise,尝试插入这个
  • 如何生成备份?例如,您使用的是 mysqldump、MySQL Administrator 等吗?尝试使用 mysqldump 看看是否出现同样的错误。
  • @Haim:那我怎样才能摆脱这个错误呢?
  • @cbranch:我用mysqldump命令备份,用mysql恢复。我爱贝壳!
  • 在您的代码中查找captcha_success_form_id?

标签: mysql database-integrity


【解决方案1】:

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

【讨论】:

  • +1 这是一个比我更好的答案。我同意这看起来像是一个逃避问题。问题是错误是在您导入数据库时​​发生(即 mysqldump 的错误/问题),还是在应用程序运行后(即 PHP 代码或配置的错误/问题)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多