是否可以分叉mysqldump数据?

时间:2011-02-06 19:49:40

标签: mysql perl mysqldump

我正在使用perl在具有大约3000万条记录的远程服务器上恢复mysql数据库。这是> 2天&看着我的网络连接我没有充分利用我的上行带宽。我需要每周至少1次这样做。有没有办法分叉一个mysqldump(我正在使用perl),这样我就可以充分利用我的带宽(我不介意我有点窒息......我只需要完成这个快)。

4 个答案:

答案 0 :(得分:2)

您无法将整个转储上传到远程服务器并在那里开始还原吗?

答案 1 :(得分:1)

恢复mysqldump只是执行一系列将从头开始恢复数据库的命令。如果执行路径是; 1)发送命令2)远程系统执行命令3)远程系统回复命令完成4)发送下一个命令,然后你花费大部分时间等待网络延迟。

我知道大多数SQL主机都允许您专门上传转储文件,以避免您所讨论的恢复时间。每个月拿我钱的公司甚至有一个基于网络的表格,你可以用它从一个通过sftp上传的文件中恢复数据库。浏览托管服务的文档。他们应该有类似的东西。如果没有别的(你在命令行上感觉很舒服),你可以将它直接上传到你的帐户,并从那里的shell中进行。

答案 2 :(得分:1)

mk-parallel-dumpmk-parallel-restore旨在满足您的需求,但在我的测试中,mk-parallel-dump实际上比普通的mysqldump慢。您的里程可能会有所不同。

(我猜最大的因素是你的数据文件所在的主轴数量,在我的情况下,1,并不特别有利于并行化。)

第一个警告:mk-parallel- *写了一堆文件,并确定何时开始发送它们是安全的(当你完成接收它们时)可能有点棘手。我相信这是留给读者的练习,对不起。

第二个警告:mk-parallel-dump专门宣传为不用于备份。因为“在此版本发布时存在一个阻止--lock-tables无法正常工作的错误”,它实际上只对您知道不会更改的数据库有用,例如,您可以停止启动而没有任何后果的从属服务器,然后在mk-parallel-dump完成后开始SLAVE。

我认为比并行化转储更好的解决方案可能就是:

如果你每周都在做你的mysqldump,你可以只做一次(使用--single-transaction(你应该这样做)和--master-data = n)然后启动一个通过ssh隧道连接到远程主站的slave,因此slave会不断更新。缺点是,如果要克隆本地副本(可能是为了进行备份),则需要足够的磁盘来保留额外的副本。优点是,一周(基于查询)的复制日志可能比重新发送数据要小得多,而且它也会逐渐到达,因此不会堵塞管道。

答案 3 :(得分:1)

您的数据库总共有多大?你使用什么样的表?

使用mysqldump进行备份的一个很大的风险与表锁定和备份过程中对表的更新有关。

mysqldump备份过程基本上如下:

For each table {
   Lock table as Read-Only
   Dump table to disk
   Unlock table
}

危险在于,如果在备份运行时运行影响多个表的INSERT / UPDATE / DELETE查询,则备份可能无法正确捕获查询结果。当您的备份需要数小时才能完成并且您正在处理活动数据库时,这是一个非常实际的风险。想象一下 - 您的代码运行一系列更新表A,B和C的查询。备份过程当前已将表B锁定。

  • 不会捕获对A的更新,因为此表已经备份。
  • 不会捕获对B的更新,因为该表当前已被锁定以进行写入。
  • 将捕获对C的更新,因为备份尚未达到C。

这是在数据库中销毁参照完整性的简便方法。

您的备份过程需要是原子的和事务性的。如果您无法在备份过程中关闭整个数据库以进行写入,那么您将面临灾难。

此外 - 这里肯定有问题。在之前的公司,我们每晚运行450G Mysql DB备份(最大的表有150M行),备份完成时间不到6小时。

两个想法:

  1. 你有奴隶数据库吗?从那里运行备​​份 - 停止复制(防止RW风险),运行备份,重新启动复制。
  2. 你的桌子是否使用InnoDB?考虑投资InnoDBhotbackup来解决这个问题,因为备份过程利用了作为InnoDB存储引擎一部分的日志。