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

时间:2020-03-06 14:42:02  来源:igfitidea点击:

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

什么是最好的参数(即:-单个事务)将导致最快的数据转储和加载?

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

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

或者

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

解决方案

将其直接管道传输到另一个实例,以避免磁盘开销。除非我们在慢速的网络上运行,否则不要理会" --compress",因为在快速的局域网或者环回网络上,网络开销并不重要。

我认为,如果我们尝试使用数据库复制而不是使用mysqldump,它将更快并且可以节省磁盘空间。我个人使用sqlyog enterprise进行繁重的工作,但是还有许多其他工具可以提供相同的服务。除非我们当然只想使用mysqldump。

对于innodb,--order-by-primary --extended-insert通常是最好的组合。如果性能排在最后并且目标设备具有许多CPU内核,则可能要拆分生成的转储文件并在许多线程中进行并行插入,直到innodb_thread_concurrency / 2.

另外,将目标上的innodb_buffer_pool_size调整为我们可以承受的最大值,并将innodb_log_file_size增加到128或者256 MB(请注意,在重启mysql守护程序之前,我们需要删除旧的日志文件,否则它将不会重启)

使用Maatkit的mk-parallel-dump工具。

至少那可能会更快。我更相信mysqldump。

我们多久这样做一次?这真的是应用程序性能问题吗?也许我们应该设计一种不需要转储整个数据的方法(复制?)

另一方面,1.5G是一个很小的数据库,因此可能不会有太大问题。

快速转储停顿的数据库:

将" -T"选项与mysqldump一起使用会在指定目录中导致大量.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工具的含义。多次调用底层mysqldump程序的perl脚本。但是,当我尝试使用这些工具时,我很难完成恢复,而没有重复的关键错误,而这些错误并没有发生在香草垃圾场上,因此请记住,里程可能会有所不同。

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

--single-transaction开关对于无需停止静默进行活动数据库转储或者无需停止从属情况进行从属数据库转储非常有用。

可悲的是,-T与--single-transaction不兼容,因此我们只能得到一个。

通常,转储比恢复它要快得多。仍然有一个工具可以接收传入的整体转储文件,并将其分解为多个要并行加载的文件。据我所知,这样的工具尚不存在。

通过网络转移转储通常是一个胜利

要在一个主机上监听传入的转储,请执行以下操作:

nc -l 7878 > mysql-dump.sql

然后在数据库主机上运行

mysqldump $OPTS | nc myhost.mydomain.com 7878

这样可以减少对主服务器上的磁盘心轴的争用,从而将转储写入磁盘稍微加快了转储的速度(假设网络足够快,可以跟上,对于同一数据中心中的两个主机而言,这是一个相当安全的假设)。另外,如果我们要构建新的从属服务器,则可以省去完成转储文件后必须传输的步骤。

请注意,显然,我们需要有足够的网络带宽以不使速度减慢,并且,如果TCP会话中断,则必须重新开始,但是对于大多数转储,这并不是主要问题。

最后,我想澄清一处常见的困惑。

尽管我们在mysqldump示例和教程中经常看到这些标志,但它们是多余的,因为默认情况下它们是打开的:

  • --opt
  • `-添加表
  • -添加锁
  • --create-options
  • -禁用键
  • --extended-insert
  • -锁表
  • --quick
  • --set-charset

从http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html:

Use of --opt is the same as specifying --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, and --set-charset. All of the options that --opt stands for also are on by default because --opt is on by default.

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