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

Jos*_*man 13 mysql database backup innodb

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

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

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

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

要么

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

Dav*_*son 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
Run Code Online (Sandbox Code Playgroud)

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

mysqldump $OPTS | nc myhost.mydomain.com 7878
Run Code Online (Sandbox Code Playgroud)

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

注意事项 - 显然,你需要有足够的网络带宽,不要让事情变得无法忍受,如果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, - 相同快速,和--set-charset.默认情况下,--opt代表的所有选项也都是打开的,因为默认情况下启用了--opt.

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


Joh*_*kin 7

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