我有一台运行 CentOS 和 MySQL 数据库的生产服务器。在家里,我有一台 QNAP NAS(运行一个小型嵌入式 Linux)。我想在我的 NAS 上创建一个 Cron 作业来备份我的 CentOS 生产服务器中的数据。问题是我不想传输未压缩的数据(SQL 转储最终将达到 5gb 左右)。我想通过 SSH 连接到服务器,运行 SQL 转储,压缩结果,然后下载它。
这可能吗?最有效的方法是什么?
答案1
您可以使用这个方便的单行程序,从当地的连接侧:
ssh user@remoteserver "mysqldump -h myhost -u myuser -pmypass mydb | gzip" > /path/to/my/dump.sql.gz
简而言之,你的mysqldump
SSH 命令生成的输出将通过管道传输到gzip
在连接的远端然后重定向到stdout
,然后重定向到/path/to/my/dump.sql.gz
NAS 上。只有压缩数据才会通过网络发送。
您可以通过在脚本中运行以下内容来稍微扩展它(这相当于 John 在他的回答中指定的内容):
ssh user@remoteserver "mysqldump -h myhost -u myuser -pmypass -D mydb | gzip > /tmp/dump.sql.gz"
scp user@remoteserver:/tmp/dump.sql.gz /path/to/my/dump.sql.gz
ssh user@remoteserver "rm -f /tmp/dump.sql.gz"
这是一种稍微冗长的方法,将首先转储/压缩整个数据库,然后通过网络复制它scp
,最后删除远程副本。
答案2
好的,我将分享我个人的方法,即我每天使用存档备份所有 mysql 数据库。
使用以下代码在 /bin 或你喜欢的任何其他位置创建文件 mysqlbackup.sh
#!/bin/bash # modify the following to suit your environment export DAYS="3" export DB_BACKUP="/backup/" export DB_USER="root" export DB_PASSWD="<you root password>" # title and version echo "" echo "mySQL_backup" echo "----------------------" echo "* Deleting OLD Backup ..." # this will delete old file older than DAYS find $DB_BACKUP -mtime +$DAYS -exec rm -rf {} \; echo "* Creating new backup..." # Next command take backup compressed with bzip2 save in directory DB_BACKUP mysqldump --all-databases | bzip2 > $DB_BACKUP/mysql-`date +%Y-%m-%d-%H:%M`.bz2 echo "----------------------" echo "Done" exit 0
- 保存该文件
- 使用 chmod +x filename 将该脚本标记为可执行
- 在 cron 中设置该脚本以便每天运行 0 0 * * * /bin/mysqlbackup.sh,该脚本将在每天午夜 12 点创建。
- 每天使用 cron 将 rsync /backup 同步到您的 nas。您可以使用以下链接来设置 rsync。 http://www.thegeekstuff.com/2011/07/rsync-over-ssh-without-password/ https://blogs.oracle.com/jkini/entry/how_to_scp_scp_and
或者
- 您也可以修改包含 rsync 文件夹的原始脚本,在这种情况下您不需要设置第二个 cron。
祝你好运......
答案3
这是可能的 - 我曾经做过非常类似的事情。使用 SSH 执行mysql_dump
(或您最喜欢的等效命令)并与 进行合并gzip
,然后使用scp
进行传输,然后再次通过 SSH 访问rm
转储文件。