我想使用mysqldump和MySQL 5.1创建一个包含约40个InnoDB表和大约1.5GB数据的数据库副本。
什么是最好的参数(例如:--single-transaction),可以得到最快的导出和加载数据?
另外,在将数据加载到第二个数据库时,哪种方式更快:
1)直接将结果管道传输到第二个MySQL服务器实例,并使用--compress选项?
还是
2)从文本文件中加载(例如:mysql < my_sql_dump.sql)?
我想使用mysqldump和MySQL 5.1创建一个包含约40个InnoDB表和大约1.5GB数据的数据库副本。
什么是最好的参数(例如:--single-transaction),可以得到最快的导出和加载数据?
另外,在将数据加载到第二个数据库时,哪种方式更快:
1)直接将结果管道传输到第二个MySQL服务器实例,并使用--compress选项?
还是
2)从文本文件中加载(例如:mysql < my_sql_dump.sql)?
使用mysqldump的"-T"选项会在指定目录中产生大量的.sql和.txt文件。相比于只有INSERT语句的单个.sql文件,这种方法对于导出大表格来说要快50%(需要的墙上时间少1/3)。
此外,如果可以并行加载多个表格并饱和多个核心,则恢复时会有巨大的好处。在一个8核的机器上,这可能会使恢复转储的墙上时间快8倍,除了"-T"提供的效率改进之外。因为"-T"会导致每个表格都存储在单独的文件中,所以并行加载它们比拆分一个大的.sql文件更容易。
将上述策略推向其逻辑极端,就可以创建一个脚本来广泛地并行导出数据库。这正是Maakit mk-parallel-dump(请参见http://www.maatkit.org/doc/mk-parallel-dump.html)和mk-parallel-restore工具所做的事情;这些perl脚本可以多次调用底层的mysqldump程序。然而,当我尝试使用这些工具时,我遇到了一些问题,在不使用vanilla dumps的情况下,无法完成还原而出现重复键错误,所以请记住,你的结果可能会有所不同。
--single-transaction开关非常有用,可以在不需要静默或停止复制的情况下对主库或从库进行转储。
遗憾的是,-T 与 --single-transaction 不兼容,因此您只能使用其中一种。
通常情况下,导出数据的速度比恢复数据的速度快得多。目前还没有这样一种工具,可以将单个大型导出文件分割成小块并并行加载。
要在一个主机上监听传入的转储,请运行:
nc -l 7878 > mysql-dump.sql
mysqldump $OPTS | nc myhost.mydomain.com 7878
直接将其发送到另一个实例,以避免磁盘开销。如果您在快速局域网或回环上运行,则不必费心使用 --compress
,因为在此情况下,网络开销并不重要。
使用来自Maatkit的mk-parallel-dump工具。
至少这可能会更快。我会更信任mysqldump。
您有多频繁地进行此操作?这确实是应用程序性能问题吗?也许您应该设计一种不需要倒入整个数据(复制?)的方式。
另一方面,1.5G是相当小的数据库,因此可能不会成为太大问题。