Linux服务器数据库远程备份,核心思路是“本地压缩+加密传输+异地存储”,用cron定时任务把mysqldump或xtrabackup产生的备份文件通过scp/rsync推送到远端服务器。这套方案不需要额外购买商业软件,纯命令行就能落地,是目前中小团队最常用的做法。
linux服务器数据库远程备份怎么实现
玩过Linux的都知道,数据库备份这件事,最怕的就是“备份了个寂寞”文件在本地躺得好好的,机房一断电全没了,远程备份就是要把备份文件挪到另一台物理机器上,说白了就是给数据上双保险。
先分清你要备什么数据库
不同数据库的备份工具完全不一样,选错工具等于白干,按主流场景分三类:
- MySQL/MariaDB:用自带的
mysqldump逻辑备份,适合数据量在GB级别;数据量上了TB,得换Percona XtraBackup做物理备份。 - PostgreSQL:用
pg_dump或pg_basebackup,前者备单库,后者备整个集群。 - SQL Server:如果用Linux版SQL Server,还是跑
mssql-scripter或者直接备份.bak文件。
行业共识认为,逻辑备份适合中小规模数据库,物理备份才是大数据量的归宿,如果你不清楚该选哪种,就看一个指标:备份文件超过10GB,直接上XtraBackup。
远程备份的核心链路拆解
远程备份并不是什么黑魔法,就是三步走:
- 本地生成备份文件 数据库导出成SQL或二进制文件
- 传输到远程主机 ssh通道走scp或rsync,加密且安全
- 远程留存与清理 远端脚本按策略删除过期备份
这里有个很多新手会犯的错:直接用mysqldump把输出通过管道扔给远程主机上的mysql命令,这根本不是备份,是同步,真正的备份必须落盘成文件,而且要验证文件完整性。
mysql数据库异地备份方案
MySQL是Linux服务器上的大户,单独拎出来讲,先给出一套经过大量生产环境验证的完整方案,你照着复制就能用。
第一步:创建专用备份用户
别用root直接干活,安全性和可追踪性都差,MySQL里建一个只读账号:
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY '强密码'; GRANT SELECT, SHOW VIEW, EVENT, TRIGGER ON . TO 'backup_user'@'localhost'; FLUSH PRIVILEGES;
注意,如果需要备份存储过程和函数,还得加上SHOW VIEW和EVENT权限,实测经验是漏了EVENT权限会导致events表备份报错。
第二步:本地备份脚本
写一个/usr/local/bin/backup_mysql.sh:
#!/bin/bash
# MySQL数据库本地备份脚本
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="your_database"
# 创建备份目录
mkdir -p ${BACKUP_DIR}
# 执行备份,压缩存储
mysqldump -u backup_user -p"密码" --single-transaction --routines --triggers ${DB_NAME} | gzip > ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz
# 删除7天前的本地备份
find ${BACKUP_DIR} -name ".sql.gz" -mtime +7 -exec rm -f {} \;
参数--single-transaction对InnoDB表特别重要,它用一致性快照的方式备份,不会锁表,线上业务不受影响。
第三步:推送到远程服务器
本地备份只是第一步,关键是传走,基于ssh密钥认证的rsync是首选,增量传输、断点续传都有,先配好免密登录:
ssh-keygen -t rsa -b 4096 ssh-copy-id backup_user@remote_server_ip
然后在备份脚本末尾加上推送逻辑:
# 推送到远程备份服务器
rsync -avz --partial ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz backup_user@remote_server_ip:/data/backup/db/
顺手验证远程文件是否完整:
# 校验文件大小是否和本地一致
LOCAL_SIZE=$(stat -c%s ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz)
REMOTE_SIZE=$(ssh backup_user@remote_server_ip "stat -c%s /data/backup/db/${DB_NAME}_${DATE}.sql.gz")
if [ "$LOCAL_SIZE" == "$REMOTE_SIZE" ]; then
echo "远程备份文件大小一致,传输成功"
else
echo "远程备份文件大小不一致,检查网络或磁盘空间!"
fi
第四步:cron定时任务
用crontab -e配置执行计划,比如每天凌晨2点备份:
0 2 /usr/local/bin/backup_mysql.sh >> /var/log/db_backup.log 2>&1
日志别扔进/dev/null,否则出了事连排查线索都没有,日志文件注意配置logrotate做轮转,不然几年下来硬盘全是日志。
linux定时备份mysql数据库到远程服务器的安全加固
基本的定时备份搭好之后,接下来得考虑安全,一个裸奔的备份通道,相当于把数据库的钥匙挂在门口,随时可能被人取走。
用SSH密钥替代密码认证
刚才的ssh-copy-id已经解决了这个问题,但要强调几点细节:
- 私钥权限必须600:
chmod 600 ~/.ssh/id_rsa - 禁用远程服务器的密码登录:编辑
/etc/ssh/sshd_config,设置PasswordAuthentication no,然后重启sshd服务 - 使用非默认端口:把22改成高位端口,比如2299,能挡掉绝大多数的端口扫描攻击
加密备份文件本身
传输过程加密还不够,文件在远端静止存放时也要加密,用openssl对备份文件再套一层:
openssl enc -aes-256-cbc -salt -in ${DB_NAME}_${DATE}.sql.gz -out ${DB_NAME}_${DATE}.sql.gz.enc -k "加密口令"
解密时用对应的解密命令就行,这样即使备份服务器被拖库,拿到的也是一堆密文,没有口令根本解不开。
传输过程中的带宽控制
备份文件动辄几个GB,走公网传输会占满带宽,把正常业务流量全堵死了,rsync支持限速:
rsync -avz --bwlimit=4096 --partial ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz backup_user@remote_server_ip:/data/backup/db/
--bwlimit=4096表示限制带宽为4096KB/s,即4MB/s,具体限多少,根据你的出口带宽和业务峰值来调,云服务器的话,一般建议不超过公网带宽的30%。
远程备份后的恢复演练别偷懒
备份备份,备而不恢复等于零,业内专家指出,恢复不了的数据备份,等于在沙滩上盖大楼,远程备份做完之后,还得定期做恢复演练真实环境里90%以上的人从来没真正恢复过备份,真到出事故那天才发现备份文件是坏的,那才叫欲哭无泪。
恢复测试脚本
在远程备份服务器上写一个恢复验证脚本:
#!/bin/bash
# 从远程备份恢复MySQL数据库到测试实例
BACKUP_FILE=$(ls -t /data/backup/db/.sql.gz | head -1)
# 解压
gunzip -c ${BACKUP_FILE} > /tmp/restore_test.sql
# 导入临时数据库
mysql -u root -p"密码" -e "CREATE DATABASE IF NOT EXISTS restore_test"
mysql -u root -p"密码" restore_test < /tmp/restore_test.sql
# 验证行数
mysqldump -u root -p"密码" restore_test | wc -l
最好每个月做一次完整恢复演练,把备份文件恢复到一台全新的实例上,和前一天的线上数据做比对,出现不一致,马上排查是备份脚本问题还是恢复流程问题。
备份监控告警别靠手工
脚本跑没跑成功,不能靠人肉每天登录去看日志,用系统自带的监控命令或者FreeTier的监控脚本,把备份成功与否变成一条告警消息:
# 把备份结果推送到群机器人
if [ ${LOCAL_SIZE} -eq ${REMOTE_SIZE} ]; then
curl -s -X POST "https://your_webhook" -H "Content-Type: application/json" -d '{"msg":"数据库备份成功"}'
else
curl -s -X POST "https://your_webhook" -H "Content-Type: application/json" -d '{"msg":"数据库备份失败,请立即排查!"}'
fi
云服务器和物理机的备份策略略不同:云服务器建议同时做跨可用区快照,物理机则优先保证异地机房容灾,两者所需的工具和成本差异较大,方案选型时注意结合预算。
常见问题与避坑指南
备份大数据库时占用太多磁盘空间怎么办?
用XtraBackup做增量备份,配合全量备份周期:
- 周一全量备份
- 周二到周日增量备份
- 全量备份保留2份,增量保留7天
恢复时先恢复全量,再叠加增量,对本地磁盘空间敏感的场景,这个方法比每天全量省70%以上的空间。
远程备份和目标服务器之间网络不稳定怎么办?
rsync支持断点续传,配合--partial参数,中断后重新执行会从上次中断的位置继续,还可以改为先传到本机临时文件,再批量推送,减少传输次数。
sqlserver远程备份到linux服务器怎么做?
SQL Server在Linux上提供了sqlcmd工具,备份语法和Windows上一样:
BACKUP DATABASE [你的数据库] TO DISK = '/var/opt/mssql/data/你的数据库.bak' WITH FORMAT;
备份完成后用scp或者samba挂载再拷贝都行,企业级数据库备份方案价格不低,小团队用这套组合拳完全够用。
远程备份这条路还得继续走
数据库远程备份就是那件“平时没用、出事救命”的事,按本地落盘-加密传输-异地留存-定期恢复演练四条主线把流程跑通,剩下的就是坚持执行,别再让备份文件躺在同一台服务器上,那不是备份,那是自我安慰。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/792856.html


