备份&将特定表/列从极大的MySQL数据库压缩到不同的服务器上

时间:2014-05-08 14:04:34

标签: php mysql database backup database-backups

我的目标是运行数据库特定部分的每日备份(覆盖前一天的备份),以便我可以轻松下载并导入它,并在出现任何问题时获取所有重要数据。

我目前有一个20GB的Web服务器(Ubuntu),我的数据库大约是11GB,并且正在增长(慢慢地),所以我知道我需要启动第二个Web服务器来存储备份。 (一旦它变为~20GB,我最终需要升级我的主服务器。)

我的数据目前设置在一些索引表中,但我不需要备份所有数据,所以我想运行一个只选择我需要的查询并重建一个新数据库(.sql)。这有助于保持尺寸缩小,但文件仍然非常大,所以我也想压缩这个文件,GZIP是否可行?这也可以将整个数据库整齐地打包到一个文件中,这是我需要的。

此外,由于我可能正在使用第二台服务器向第一台服务器请求数据,我该如何确保请求不会超时?

TL; DR 需要每天备份一个巨大的(10+ GB)数据库到另一台服务器上,同时删除流程中的某些表/列并压缩以优化硬盘&带宽使用所以我可以轻松下载&如果需要,导入备份(一个文件)。

3 个答案:

答案 0 :(得分:2)

Mysqldump可以输出选定的表,您可以将输出传递给gzip:

$ mysqldump mydatabase table1 table2 table3 |
    gzip -c > dump.sql.gz

mysqldump可以选择转储行的子集。

$ mysqldump --where "created_at > '2014-03-01'" ...other options...

当然,您转储的所有表都必须识别WHERE条件。也就是说,如果您引用其中一个表中不存在的列,那就是错误。

Mysqldump没有选择列子集的选项。


重新评论:

$ (mysqldump ...first... ; mysqldump ...second...) | gzip -c > dump.sql.gz

答案 1 :(得分:0)

对于压缩,您可以运行任何用于将数据库通过管道导出到gzip的内容,如下所示:

mysqldump -uMyUser DatabaseName | gzip -1 > dbdump-`date +'%F-%T'`.gz

最后一点是给你生成的gzip一个很好的时间戳。如果你重视空间超过CPU周期,你可以尝试使用bzip2,看看是否能节省一些成本,但一般来说.gz应该没问题。

检查mysqldump联机帮助页以获取有关设置要包含哪些表的信息(例如,通过--tables)

答案 2 :(得分:0)

您可以使用MySQL Replication将数据提取到您希望备份的计算机/服务器。然后让它在备份服务器上创建转储/备份,这样就不会在网络上传输10gb文件。