我想使用mysqldump和MySQL 5.1创建一个包含大约40个InnoDB表和大约1.5GB数据的数据库副本。
哪些最佳参数(即: - single-transaction)将导致最快的转储和数据加载?
同样,在将数据加载到第二个数据库时,是否更快:
1)将结果直接传递给第二个MySQL服务器实例并使用--compress选项
或
2)从文本文件加载它(即:mysql< my_sql_dump.sql)
答案 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可能会有所不同。
--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是一个非常小的数据库,所以它可能不会有太大问题。