使用大量表备份mysql数据库(> 100,000)

时间:2013-06-09 10:48:00

标签: mysql backup mysqldump

我知道,数据库设计非常糟糕,但我们在这里,我有一些论坛平台(基于PunBB),对于每个论坛,我都生成了一组新表。真的很糟糕。

时间过去了,现在我有超过100,000个表(SHOW TABLES; SELECT FOUND_ROWS(); - 112965 rows in set (1.21 sec))。性能很好虽然表可以完成索引的工作,当你直接引用一个表时,它是超快的。

问题是现在我正在尝试支持所有内容并转移到另一台服务器。当然,这需要永远。我发布了mysqldump

mysqldump --max_allowed_packet=500M --force --opt -u root -pXXXX a > fullbackup.sql 

它还在处理,超过12小时!备份的大小已经达到了546 Mb,Mysql仍处于运行状态。

我试图直接复制Mysql文件但是我遇到了很多表已经损坏的问题。

有什么想加快这个速度吗?

3 个答案:

答案 0 :(得分:1)

如果您使用的是AWS RDS,请拍摄快照。

如果不是,请使用其他基于快照的工具。 Percona有一个http://www.percona.com/software/percona-xtrabackup/。使用mysqldump备份大型数据库非常慢

如果您的源数据库已损坏,这是一个独立的问题。

如果您正在复制数据库而副本已损坏,那是因为您正在执行“热复制”,这意味着如果没有特殊的“快照工具”,则无法在数据库运行时复制数据库。甚至文件系统也具有此类工具。您需要一套一致的文件。

答案 1 :(得分:0)

我推测当您复制使用InnoDB的文件时,您的表已损坏。

在MySQL文档here

中说
  

物理备份工具包括用于InnoDB或其他任何表的MySQL Enterprise Backup的mysqlbackup,或用于MyISAM表的文件系统级命令(例如cp,scp,tar,rsync)。

您可以使用MySQL Enterprise Backup执行快速,可靠的物理热备份(即在数据库运行时)。我相信这虽然很贵。

答案 2 :(得分:0)

在我的上一份工作中,我们运行了带有160,000个表的MySQL实例。

有这么多的表,我们不得不禁用innodb_file_per_table并将所有表存储在中央表空间文件ibdata1中。否则,服务器将无法有效运行,因为它有太多打开的文件。使用MySQL 8.0应该会更容易,但是在我们使用的旧版本的MySQL中,数据字典无法扩展到如此多的表。

要进行备份,我们使用了Percona XtraBackup。这是一个开源工具,其工作原理与MySQL Enterprise Backup非常相似。它执行数据目录的物理备份,但这样做没有因直接复制文件而导致文件损坏的风险。 Percona XtraBackup的工作原理是复制文件,但也可以连续复制InnoDB事务日志,因此可以恢复文件的丢失位。非常可靠。

使用Percona XtraBackup备份数据库要快一些,但是还原备份会带来更大的好处。从mysqldump恢复转储文件非常慢。还原物理备份(如Percona XtraBackup生成的备份)的过程可以尽快完成,您可以将备份文件复制到新的数据目录中,然后启动MySQL Server。

Percona最近的博客显示了不同之处:

enter image description here

https://www.percona.com/blog/2018/04/02/migrate-to-amazon-rds-with-percona-xtrabackup/