我正在尝试运行 mysqldump 来创建数据库快照,我发现它会在中途随机停止,而不会报告任何错误。我的数据库相对较小(大约 100MB)并且正在使用 InnoDB。
我像这样运行它:
mysqldump --force --single-transaction --quick --user myuser --password=mypass -h mydatabasehost mydb > /tmp/snapshot.sql
检查退出代码报告 0。
我的版本是:mysqldump Ver 10.13 Distrib 5.1.52,适用于 redhat-linux-gnu (i386)
我看过一些类似的帖子,甚至是官方的错误报告,但两种解决方案似乎都不适用。
如何让 mysqldump 获取完整的数据库快照?
编辑:我的数据库目前驻留在亚马逊的 RDS 上。
在客户端(即 mysqldump)和服务器(即 Amazon RDS)
max_allowed_packet
上都设置得不够高可能是个问题。我将两者都设置为 500M,这似乎解决了问题。由于 InnoDB 的信息模式表仅提供行数估计,因此很难判断我的快照是否真正包含 RDS 中的所有内容。所有的表都在那里,但行数不同。当我有时间编写更彻底的分析时,我会更新一个更明确的答案。
你有没有尝试过?
这很简单,我总是这样做没有任何问题。基本上以这种方式进行转储,您可以在某个特定时刻获得您拥有的一切(数据、对象和有时宝贵的评论),而忽略未提交的事务。
据我了解,如果在转储时对表执行读取,则 mysql 文档 --single-transaction 将失败。在没有“--force --single-transaction --quick”的情况下运行的结果是什么?
该表完全有可能已损坏。我并不是说数据和/或索引页已损坏。可能有一些非常简单的东西被破坏了。
我最近在并行 mysqldumped 多个数据库时遇到了从服务器上的备份脚本问题。在其中一个数据库上运行 mysqldump 会产生一个非常小的 mysqldump。数据库有 80 多个表。但是,mysqldump 在数据库中的第五个表处停止。当我
SHOW CREATE TABLE tblname\G
在 Slave 上的桌子上运行时,我收到错误“找不到桌子”。当我SHOW CREATE TABLE tblname\G
在 Master 上运行时,表描述按预期显示。发生的事情有点疯狂:客户要求恢复表,工程师从磁盘备份中恢复了 InnoDB 表的 .ibd 文件。.ibd 文件的表空间 id(25)与 ibdata1 中注册的表空间 id(28)不匹配。
我通过冲洗从属设备、mysqldumping 主设备并从头开始设置复制来解决了这个问题。幸运的是,数据和索引空间总计 7GB。因此 rstore 过程没什么大不了的。
故事的道德启示
基本问题是当表空间 id 不正确时,mysqldump 不会在 InnoDB 上报告错误。当 mysqldump 完成并且不按字母顺序转储每个表时,这表明它因错误而终止,并且没有打印错误消息。
检查以确保
SHOW CREATE TABLE
以下只是对mysqldump和InnoDB的一些头脑风暴:
请考虑 mysqldump 针对 InnoDB 表的行为。如果 InnoDB 缓冲池中有任何脏页属于您要转储的表,则必须先将该表的脏页刷新到磁盘,然后
SELECT /* SQL_NO_CACHE */
才能对其执行。由于您使用的是 Amazon RDS,我的直觉是您的数据库位于多租户基础设施中(如果我过于简化,请随时更正此声明)。其他数据库可能正在使用共享 InnoDB 缓冲池、共享元数据文件 (ibdata1) 和共享表空间(如果禁用了innodb_file_per_table,则为 ibdata1)。
数据库也可能存在一些冗余,这可能会影响MVCC对数据库的影响,即使它是一个小数据集。
您可能希望在 mysqldump 会话中增加innodb_lock_wait_timeout(默认为 50 秒),以查看这是否对 Amazon RDS 有任何影响(或让 Amazon 增加此限制)。另外,尝试转储单个表。
更新 2011-11-14 17:58 EDT
尝试在您的数据库会话中执行此操作(将其设置为两分钟):