什么是最快的转储方式?使用mysqldump加载MySQL InnoDB数据库?

时间:2008-09-25 01:58:23

标签: mysql database backup innodb

我想使用mysqldump和MySQL 5.1创建一个包含大约40个InnoDB表和大约1.5GB数据的数据库副本。

哪些最佳参数(即: - single-transaction)将导致最快的转储和数据加载?

同样,在将数据加载到第二个数据库时,是否更快:

1)将结果直接传递给第二个MySQL服务器实例并使用--compress选项

2)从文本文件加载它(即:mysql< my_sql_dump.sql)

5 个答案:

答案 0 :(得分:21)

快速转储静默数据库:

在mysqldump中使用“-T”选项会在指定目录中生成大量的.sql和.txt文件。转储大型表比使用INSERT语句的单个.sql文件快约50%(壁挂时间减少1/3)。

此外,如果您可以并行加载多个表并使多个内核饱和,则还原时会有很大的好处。在8核盒子上,除了“-T”提供的效率改进之外,这可能是恢复转储的挂钟时间的8倍差异。因为“-T”会导致每个表存储在一个单独的文件中,所以并行加载它们比分割大量的.sql文件更容易。

将上述策略置于逻辑极端,可以创建一个脚本来并行地广泛转储数据库。那么,这正是Maakit mk-parallel-dump(参见http://www.maatkit.org/doc/mk-parallel-dump.html)和mk-parallel-restore工具的原因; perl脚本,它们对底层mysqldump程序进行多次调用。但是,当我尝试使用这些时,我无法完成恢复,而没有重复的密钥错误,这些错误不会发生在vanilla转储中,所以请记住,您的milage可能会有所不同。

从LIVE数据库转储数据(无服务中断):

--single-transaction开关对于获取实时数据库的转储非常有用,而不必停顿或转储从属数据库而不必停止从属。

可悲的是,-T与--single-transaction不兼容,所以你只能得到一个。

通常,转储比恢复快得多。仍然有一个工具可以获取传入的单片转储文件,并将其分成多个部分并行加载。据我所知,这样的工具还不存在。


通过网络转移转储通常是一场胜利

要在一个主机上监听传入转储:

nc -l 7878 > mysql-dump.sql

然后在您的数据库主机上运行

mysqldump $OPTS | nc myhost.mydomain.com 7878

这样可以减少主服务器上磁盘轴的争用,从而将转储写入磁盘,从而略微加快转储速度(假设网络速度足够快,可以保证同一数据中心的两台主机相当安全)。另外,如果要构建新的从属服务器,这将节省在转储完成后必须传输转储文件的步骤。

警告 - 显然,你需要有足够的网络带宽,不要让事情变得无法忍受,如果TCP会话中断,你必须从头开始,但对于大多数转储,这不是一个主要问题。


最后,我想澄清一点共同的困惑。

尽管你经常在mysqldump示例和教程中看到这些标志,但它们是多余的,因为它们在默认情况下处于打开状态:

  • --opt
  • --add-drop-table
  • --add-locks
  • --create-options
  • --disable-keys
  • --extended-insert
  • --lock-tables
  • --quick
  • --set-charset

来自http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

  

使用--opt与指定--add-drop-table, - add-locks, - create-options, - disable-keys, - extended-insert,--lock-tables相同, - quick和--set-charset。

在这些行为中,“ - quick”是最重要的行为之一(在传输第一行之前跳过缓存mysqld中的整个结果集),并且可以使用“mysql”(不转向 - 快速启动)默认情况下)显着加快返回大型结果集的查询(例如,转储大表的所有行)。

答案 1 :(得分:7)

将其直接管道到另一个实例,以避免磁盘开销。除非您在慢速网络上运行,否则不要打扰--compress,因为在快速LAN或环回时,网络开销并不重要。

答案 2 :(得分:2)

我认为如果您尝试使用database replication而不是使用mysqldump,它会更快并节省磁盘空间。我亲自使用sqlyog enterprise进行了非常繁重的工作,但也有一些other tools可以提供相同的服务。除非您当然只想使用mysqldump。

答案 3 :(得分:1)

对于innodb, - order-by-primary --extended-insert通常是最好的组合。如果你的每一个性能和目标框之后都有许多CPU内核,你可能想要拆分生成的转储文件并在许多线程中进行并行插入,直到innodb_thread_concurrency / 2。

另外,将目标上的innodb_buffer_pool_size调整到你可以承受的最大值,并将innodb_log_file_size增加到128或256 MB(小心这一点,你需要在重启mysql守护进程之前删除旧的日志文件,否则它不会重启)

答案 4 :(得分:0)

使用Maatkit的mk-parallel-dump工具。

至少那可能会更快。我更信任mysqldump。

你多久这样做?它真的是应用程序性能问题吗?也许您应该设计一种不需要转储整个数据的方法(复制?)

另一方面,1.5G是一个非常小的数据库,所以它可能不会有太大问题。