备份包含大量表(>;100000)的mysql数据库

备份包含大量表(>;100000)的mysql数据库,mysql,backup,mysqldump,Mysql,Backup,Mysqldump,我知道,数据库设计真的很糟糕,但现在我们有了一些论坛平台(基于PunBB),我为每个论坛生成了一组新的表。真是个坏主意 时间过去了,现在我有超过100000个表(SHOW tables;SELECT FOUND_ROWS();-112965行(1.21秒))。虽然性能非常好,因为表执行索引的工作,而且当您直接引用一个表时,它的速度非常快 现在的问题是,我正在尝试备份所有内容并移动到另一台服务器。当然,这需要永远。我启动了一个mysqldump: mysqldump --max_allowed_p

我知道,数据库设计真的很糟糕,但现在我们有了一些论坛平台(基于PunBB),我为每个论坛生成了一组新的表。真是个坏主意

时间过去了,现在我有超过100000个表(
SHOW tables;SELECT FOUND_ROWS();
-
112965行(1.21秒)
)。虽然性能非常好,因为表执行索引的工作,而且当您直接引用一个表时,它的速度非常快

现在的问题是,我正在尝试备份所有内容并移动到另一台服务器。当然,这需要永远。我启动了一个
mysqldump

mysqldump --max_allowed_packet=500M --force --opt -u root -pXXXX a > fullbackup.sql 
它还在处理中,有12个多小时!备份的大小已经达到546MB,Mysql仍在运行

我曾尝试直接复制Mysql文件,但遇到了很多表已损坏的问题


有没有加快速度的想法?

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

如果不是,请使用其他基于快照的工具。Percona有一个。使用mysqldump备份大型数据库的速度非常慢

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


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

我假定,当您复制使用InnoDB的文件时,您的表已损坏

它在MySQL文档中说

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


您可以使用MySQL Enterprise Backup执行快速、可靠的物理热备份(即在数据库运行时)。但我相信它的价格相当昂贵。

在我的上一份工作中,我们运行了包含160000多个表的MySQL实例

对于这么多的表,我们必须禁用
innodb\u file\u per\u table
,并将所有表存储在中央表空间文件
ibdata1
中。如果我们不这样做,服务器将无法有效运行,因为它有太多打开的文件。使用MySQL 8.0应该更容易,但在我们使用的旧版本MySQL中,数据字典无法扩展到这么多表

为了进行备份,我们使用了。这是一个开源工具,其工作原理与MySQL企业备份非常相似。它执行数据目录的物理备份,但不会因直接复制文件而导致文件损坏。Percona XtraBackup的工作原理是复制文件,但也不断复制InnoDB事务日志,因此可以恢复文件中丢失的部分。它非常可靠

使用Percona XtraBackup备份数据库的速度稍微快一点,但在恢复备份时会带来更大的好处。从mysqldump恢复转储文件非常慢。恢复物理备份(如Percona XtraBackup生成的备份)的速度与将备份文件复制到新的数据目录,然后启动MySQL服务器的速度一样快

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


表名是否有模式?像一个普通的前缀?另外,所有表中的行总数是多少?我假设所有的表都有相同的结构,它的前缀是每个论坛的名称。所有的表都有相同的结构。已经有一段时间了。我不记得我到底做了什么。显然,在性能和可靠性之间存在折衷,因此取决于服务器的RAM,您可以总是考虑将表复制到内存表和/或将转储文件输出到RAMDISK中的文件。我会认真考虑改变你的数据库模式,虽然!还有其他优化MySQL性能的方法,包括分片。您的表使用的是什么存储引擎?MySQL的哪个版本?