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

tct7dpnv  于 2022-11-21  发布在  Mysql
关注(0)|答案(6)|浏览(172)

我想用mysqldump和MySQL 5.1创建一个数据库副本,其中包含大约40个InnoDB表和大约1.5GB的数据。
最佳参数是什么(即:--单事务),这将导致最快的数据转储和加载?
此外,在将数据加载到第二个DB时,以下操作是否更快:
1)将结果直接传输到第二个MySQL服务器示例,并使用--compress选项

2)从文本文件加载(即:数据库管理系统

hwamh0ep

hwamh0ep1#

快速转储静止的数据库:

在mysqldump中使用“-T“选项会在指定的目录中产生大量的.sql和.txt文件。与使用INSERT语句转储单个.sql文件相比,转储大型表的速度要快约50%(所需时间少1/3)。
此外,如果您可以并行加载多个表,并使多个核心饱和,则在恢复时会有巨大的好处。在8核心的盒子上,这可能是恢复转储的挂钟时间的8倍之多,加上“-T”提供的效率改进。因为“-T”导致每个表存储在单独的文件中,并行加载它们比拆分一个大的.sql文件要容易。
将上述策略发挥到逻辑的极致,可以创建一个脚本来并行地转储数据库。perl脚本,它可以多次调用底层的mysqldump程序。但是,当我尝试使用这些脚本时,我很难在不出现重复键错误的情况下完成恢复,而vanilla转储不会出现这种错误,所以请记住,您的milage可能会有所不同。

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

--single-transaction开关对于转储活动数据库而不必使其停顿或转储从属数据库而不必停止从属操作非常有用。
遗憾的是,-T与--单事务不兼容,因此您只能得到一个。
通常,转储比恢复快得多。仍然有一个工具的空间,它接受传入的整体转储文件,并将其分成多个部分,以并行加载。据我所知,这样的工具还不存在。

通过网络传输转储通常是一种优势

要在一个主机上侦听传入转储,请运行:

nc -l 7878 > mysql-dump.sql

然后在DB主机上运行

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。--opt所代表的所有选项在默认情况下也是打开的,因为--opt在默认情况下是打开的。
在这些行为中,“--quick”是最重要的行为之一(在传输第一行之前跳过在mysqld中缓存整个结果集),并且可以与“mysql”(默认情况下不打开--quick)一起使用,以显著加快返回大型结果集的查询速度(例如转储一个大表的所有行)。

7jmck4yq

7jmck4yq2#

除非你运行在一个慢速网络上,否则不要使用--compress,因为在一个快速的局域网或环回上,网络开销并不重要。

mqxuamgl

mqxuamgl3#

我认为,如果您尝试使用数据库复制而不是使用mysqldump,速度会快得多,并且可以保存磁盘空间。就我个人而言,我使用sqlyog enterprise来完成繁重的工作,但也有许多其他工具可以提供相同的服务。当然,除非您只想使用mysqldump。

p8ekf7hl

p8ekf7hl4#

对于innodb,--order-by-primary --extended-insert通常是最好的组合。如果您需要最后一点性能,并且目标机器有很多CPU内核,您可能需要拆分生成的转储文件,并在多个线程中并行插入,最多可达innodb_thread_concurrency/2。
此外,将目标上的innodb_buffer_pool_size调整到您可以承受的最大值,并将innodb_log_file_size增加到128或256 MB(注意,您需要在重新启动mysql守护进程之前删除旧的日志文件,否则它将无法重新启动)

0lvr5msh

0lvr5msh5#

使用Maatkit中的mk-parallel-dump工具。
至少那样会更快。我会更信任我的qldump。
你多久做一次?这真的是一个应用程序性能问题吗?也许你应该设计一种不需要转储整个数据的方法(复制)。
另一方面,1.5G是一个相当小的数据库,所以它可能不会是一个大问题。

ttisahbt

ttisahbt6#

mydumper是一个不错的选择,它支持并行导出,甚至每个表都支持并行线程,并且支持压缩文件,请参见:

相关问题