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可能会有所不同.
--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"(默认情况下不会启用 - 启用)大大加快返回大结果集的查询(例如,转储大表的所有行).