不完整的mysqldump


11

我正在尝试运行mysqldump来创建数据库快照,并且发现它会在途中随机停止,而不会报告任何错误。我的数据库相对较小(大约100MB),并且正在使用InnoDB。

我像这样运行它:

mysqldump --force --single-transaction --quick --user myuser --password=mypass -h mydatabasehost mydb > /tmp/snapshot.sql

检查退出代码报告0。

我的版本是:用于redhat-linux-gnu(i386)的mysqldump Ver 10.13 Distrib 5.1.52

我见过一些类似的帖子,甚至见过正式的错误报告,但似乎都没有解决方案。

如何获取mysqldump来拍摄完整的数据库快照?

编辑:我的数据库当前位于Amazon的RDS上。


有足够的磁盘空间吗?并且您是否运行过CHECK TABLE来查看表上没有数据库损坏?

您是否尝试过删除--force参数以查看出现了什么错误?还是--quick

@Adrian,是的,我有大约10GB的可用空间,绰绰有余。是的,所有表都可以确认。

@Yzmir,是的,发生相同的问题。

Answers:


5

max_allowed_packet客户端(即mysqldump)服务器(即Amazon RDS)上的设置都不够高可能是一个问题。我都将其设置为500M,这似乎已经解决了问题。

由于InnoDB的信息模式表仅提供行数估计,因此很难判断我的快照是否真正包含RDS中的所有内容。所有表都在那里,但是行数不同。当我有时间编写更全面的分析脚本时,我将给出更明确的答案。


4

你有没有尝试过?

mysqldump --compress --add-drop-table data --routines --events  --comments --extended-insert -h {host} -u {user} -p {database} > dbdump.sql

这是我始终做到的简单方法,没有任何问题。基本上,通过这种方式进行转储时,您会在某个时刻获得所有内容(数据,对象以及有时是宝贵的注释),而忽略未提交的事务。


1
尝试运行该命令时收到以下错误:mysqldump: Got error: 1049: "Unknown database 'data'" when selecting the database
Andy

1
@Andy,您现在对此有错。dev.mysql.com/doc/refman/5.7/en/…。我认为“数据”根本不应该存在。
瑞·马克斯

1

据我了解,如果在转储时对表进行读取,则mysql docs --single-transaction将失败。如果不使用“ --force --single-transaction --quick”运行,结果如何?


我收到同样的错误。
Cerin

我在文档中找不到任何支持此声明的内容。执行--single-transaction时,支持在表上进行AFAIK读写,但是更改表结构的语句(ALTER,CREATE,TRUNCATE等)可能会导致转储失败或提供意外数据。(dev.mysql.com/doc/refman/5.7/en/...
代码指挥官

1

该表很可能已损坏。我并不是说数据和/或索引页面已损坏。可能有一些非常简单的东西被打破了。

当我并行mysqldump多个数据库时,我最近在从服务器上遇到了备份脚本问题。在其中一个数据库上运行mysqldump导致了非常小的mysqldump。该数据库有80多个表。但是,mysqldump在数据库的第五个表处停止。在SHOW CREATE TABLE tblname\G从站上运行表时,出现错误“找不到表”。当我SHOW CREATE TABLE tblname\G在Master上运行时,表说明按预期显示。

发生的事情有点疯狂:一位客户要求还原表,而工程师从磁盘备份中还原了InnoDB表的.ibd文件。.ibd文件的表空间标识(为25)与在ibdata1中注册的表空间标识(为28)不匹配。

我解决了这个问题,方法是从属服务器,mysqldumping主服务器和从头开始设置复制。幸运的是,数据和索引总计为7GB。因此,rstore过程并不重要。

这个故事所讲的道德

基本问题是,当表空间ID不正确时,mysqldump不会在InnoDB上报告错误。当mysqldump完成并且没有按字母顺序转储每个表时,表明它被错误终止,并且这样做时没有打印错误消息。

检查以确保

  • 您可以使用显示表格的结构 SHOW CREATE TABLE
  • 您可以从INFORMATION_SCHEMA.TABLES查询有关表的所有内容

0

以下只是关于mysqldump和InnoDB的一些头脑风暴:

请考虑针对InnoDB表的mysqldump的行为。如果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

尝试在数据库会话中执行此操作(将其设置为两分钟):

SET innodb_lock_wait_timeout = 120;

innodb_lock_wait_timeout是RDS上的静态参数,无法更改。
Cerin

@Cerin:根据文档,您可以在会话中进行设置。
RolandoMySQLDBA 2011年

你是什​​么意思“我的会议”?mysqldump没有列出任何调整超时的选项。
塞林

抱歉,我正在向后看。我的意思是说在Amazon RDS中设置innodb_lock_wait_timeout。
RolandoMySQLDBA 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.