其实我们用来备份的服务器都是内网服务器,非root账号加随机生成的密码还有非22端口已经很安全了,无奈前端设备改了证书登陆,之后一些自动化链接也也该全部改为证书登陆,只能一起改了。
天天手动 mysqldump 再 rz/sz 拖包?你不累我都嫌慢。今天这篇MySQL 自动备份+SCP证书传输教程,手把手教你:
- 全程密钥登录,端口 12345,暴力扫描直接吃灰;
- dump 完自动 zip 加密码,SCP 一脚踢到远程 Debian11 备份机;
- crontab 无人值守,旧包自动清理,磁盘不爆。
照着抄,30 分钟搞定,老板都挑不出毛病。
一、环境清单(照抄就行)
主库 | Ubuntu 20.04,MariaDB 10.6,端口 3306 |
备份机 | Debian11,内网 IP 192.168.1.100,SSH 端口 12345 |
客户端 | 任意 Linux,带 cron 就行 |
二、证书登录:先给大门换锁
备份机如果还用密码,脚本里写明文等于裸奔。
# Debian11 生成专用钥匙(跑一遍)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/mysql_backup_key
# passphrase 建议写:1122334455 (脚本里要用)
把公钥扔进备份机 authorized_keys:
ssh-copy-id -i ~/.ssh/mysql_backup_key.pub -p 12345 user@192.168.1.100
测试能无钥匙登录后再关密码:
sudo nano /etc/ssh/sshd_config
----
PasswordAuthentication no
PermitRootLogin prohibit-password
----
sudo systemctl restart ssh
三、自动备份脚本:dump→zip→SCP→清理 一条龙的日常
脚本放 /opt/mysql_backup.sh
,记得 chmod +x。
#!/bin/bash
set -e
################### 只改这里 ###################
LOCAL_DIR="/home/backup/mysql8" # 本地暂存
REMOTE_HOST="192.168.1.100"
REMOTE_PORT="12345"
REMOTE_USER="backup"
IDENTITY_FILE="/home/backup/.ssh/mysql_backup_key" # 私钥路径
REMOTE_DIR="/data/backup/mysql" # 远端目录
RETAIN_DAY=7 # 保留天数
MAIL_TO="dba@rei3.com"
# 数据库列表(库名=压缩密码)
declare -A DB_PASS=([blog]="blog2024" [shop]="shop2024")
MYSQL_ROOT_PASS="your_mysql_root_pass"
##################################################
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$LOCAL_DIR"
# 清理本地旧包
find "$LOCAL_DIR" -name "*.zip" -mtime +$RETAIN_DAY -delete
for DB in "${!DB_PASS[@]}"; do
SQL="${DB}_${DATE}.sql"
ZIP="${DB}_${DATE}.zip"
# 1. 导出
mysqldump -uroot -p"$MYSQL_ROOT_PASS" \
--single-transaction --routines --triggers "$DB" \
> "$LOCAL_DIR/$SQL"
# 2. 压缩加密码
zip -P "${DB_PASS[$DB]}" "$LOCAL_DIR/$ZIP" "$LOCAL_DIR/$SQL"
rm -f "$LOCAL_DIR/$SQL"
# 3. 证书上传,无密码裸奔
scp -i "$IDENTITY_FILE" -P "$REMOTE_PORT" \
"$LOCAL_DIR/$ZIP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
done
# 远端清理
ssh -i "$IDENTITY_FILE" -p "$REMOTE_PORT" \
"$REMOTE_USER@$REMOTE_HOST" \
"find $REMOTE_DIR -name '*.zip' -mtime +$RETAIN_DAY -delete"
# 邮件打卡
echo "MySQL 自动备份完成 $(date +%F)" | mail -s "备份日报" "$MAIL_TO"
四、让钥匙永不断线:keychain 自动加载
crontab 里没环境变量,agent 会掉。
sudo apt install keychain -y
echo 'eval $(keychain --eval /home/backup/.ssh/mysql_backup_key)' >> ~/.bashrc
source ~/.bashrc
登录时输一次 passphrase 1122334455,后面关机重启都由 keychain 帮你挂 agent。
五、crontab 无人值守
# 每天 2 点备份
0 2 * * * bash /opt/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
日志看 `tail -f /var/log/mysql_backup.log`,出错会 mails 给你。
六、常见翻车笔记
- 1130 Host ‘127.0.0.1’ is not allowed → 删掉 mysqldump 的 `-h127.0.0.1`,走 socket 最快。
- scp: Permission denied (publickey) → 私钥权限 600、路径写错、passphrase 没加载,按顺序排查。
- Could not open a connection to your authentication agent → crontab 没环境变量,用 keychain 或手动 `eval $(ssh-agent)` 再 `ssh-add`。
七、总结
证书登录 + SCP 自动备份 MySQL,全程零明文密码,端口 12345 让扫描器直接迷路;dump 后 zip 加密,老包自动清理,磁盘永不满。脚本一扔 crontab,你就可以安心喝茶去了。
© 万事屋原创 | 转载请保留出处:https://www.rei3.com
没有回复内容