我正在使用perl在具有大约3000万条记录的远程服务器上恢复mysql数据库。这是> 2天&看着我的网络连接我没有充分利用我的上行带宽。我需要每周至少1次这样做。有没有办法分叉一个mysqldump(我正在使用perl),这样我就可以充分利用我的带宽(我不介意我有点窒息......我只需要完成这个快)。
答案 0 :(得分:2)
您无法将整个转储上传到远程服务器并在那里开始还原吗?
答案 1 :(得分:1)
恢复mysqldump只是执行一系列将从头开始恢复数据库的命令。如果执行路径是; 1)发送命令2)远程系统执行命令3)远程系统回复命令完成4)发送下一个命令,然后你花费大部分时间等待网络延迟。
我知道大多数SQL主机都允许您专门上传转储文件,以避免您所讨论的恢复时间。每个月拿我钱的公司甚至有一个基于网络的表格,你可以用它从一个通过sftp上传的文件中恢复数据库。浏览托管服务的文档。他们应该有类似的东西。如果没有别的(你在命令行上感觉很舒服),你可以将它直接上传到你的帐户,并从那里的shell中进行。
答案 2 :(得分:1)
mk-parallel-dump和mk-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锁定。
这是在数据库中销毁参照完整性的简便方法。
您的备份过程需要是原子的和事务性的。如果您无法在备份过程中关闭整个数据库以进行写入,那么您将面临灾难。
此外 - 这里肯定有问题。在之前的公司,我们每晚运行450G Mysql DB备份(最大的表有150M行),备份完成时间不到6小时。
两个想法: