定时备份MySQL/MariaDB数据库并加密压缩后上传到另一台服务器的脚本 - 技术宅银魂 - 科技改变生活 - 万事屋

定时备份MySQL/MariaDB数据库并加密压缩后上传到另一台服务器的脚本

最近用阿里云99元/年的便宜服务器做了MySQL/MariaDB远程数据库,安全起见做个定时脚本备份,外网才3mbps传输太慢,就利用阿里云的内网传输到另一台服务哦,百兆带宽不是乱吹的!

确保在A服务器就是MySQL/MariaDB数据库服务器安装了以下程序:

# For Ubuntu/Debian
apt update && apt install -y mariadb-client zip sshpass
# For CentOS/RHEL
yum install -y mariadb zip sshpass

建立数据库备份目录(自己决定) /www/backup

cd /www
mkdir /backup

在B服务器,就是接收这些备份的远程服务器建立 接收备份的目录(也是自己定) /www/remote-backup

cd /www
mkdir remote-backup

先在B服务器 SSH登陆一下A 服务器,算是登记认认门:

ssh root@192.168.1.101

建议修改SSH端口,比如“22335”,采用非22标准端口登陆SSH命令:

ssh -p 22335 root@192.168.1.101

登陆认证后退出到A服务器

exit

在/www/backup或者自己找地方建立个 “.sh”脚本,名字随便取:

vi /www/backup/bbaaacckkuupp.sh

输入以下内容,开头部分是你A、B服务器的信息,对了,下面数据库账号密码别忘记

#!/bin/bash

# 备份目录设置
LOCAL_BACKUP_DIR="/www/backup"
REMOTE_BACKUP_DIR="/www/remote-backup"
DATE=$(date +%Y%m%d)
REMOTE_HOST="b服务器IP"  # 请替换为实际B服务器IP
REMOTE_PORT="你的B服务器SSH端口,默认22"
REMOTE_USER="你的B服务器管理员账号"
REMOTE_PASS="你的B服务器SSH管理员密码"

# 确保本地备份目录存在
mkdir -p "$LOCAL_BACKUP_DIR"

# 数据库信息
DB_USER="root"  # 请根据实际情况修改数据库用户名
DB_PASS="your_db_password"  # 请替换为实际数据库密码

# SSH 选项,避免交互式提示
SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p $REMOTE_PORT"
SCP_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -P $REMOTE_PORT"

# 备份并压缩函数
backup_database() {
    local db_name=$1
    local zip_pass=$2
    local backup_file="${LOCAL_BACKUP_DIR}/${db_name}_${DATE}.sql"
    local zip_file="${LOCAL_BACKUP_DIR}/${db_name}_${DATE}.zip"

    # 导出数据库
    mysqldump -u"$DB_USER" -p"$DB_PASS" "$db_name" > "$backup_file"

    # 加密压缩
    zip -P "$zip_pass" "$zip_file" "$backup_file"

    # 删除原始sql文件
    rm -f "$backup_file"
}

# 删除超过3天的本地备份
clean_old_local_backups() {
    find "$LOCAL_BACKUP_DIR" -type f -name "*.zip" -mtime +3 -exec rm -f {} \;
}

# 删除远程服务器超过3天的备份
clean_old_remote_backups() {
    sshpass -p "$REMOTE_PASS" ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" \
        "find $REMOTE_BACKUP_DIR -type f -name '*.zip' -mtime +3 -exec rm -f {} \;"
}

# 主备份流程
echo "开始备份: $(date)"

# 备份三个数据库
backup_database "111" "112233"
backup_database "222" "221133"
backup_database "333" "332211"

# 清理本地旧备份
clean_old_local_backups

# 使用 sshpass 实现自动输入密码进行 scp 上传
for zip_file in "${LOCAL_BACKUP_DIR}"/*_${DATE}.zip; do
    sshpass -p "$REMOTE_PASS" scp $SCP_OPTS "$zip_file" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_BACKUP_DIR/"
done

# 清理远程旧备份
clean_old_remote_backups

echo "备份完成: $(date)"

# 设置定时任务(只在首次运行时添加)
CRON_JOB="0 3 * * * /www/backup/bbaaacckkuupp.sh"  # 请将路径替换为实际脚本路径
(crontab -l 2>/dev/null | grep -F "$CRON_JOB") || (crontab -l 2>/dev/null; echo "$CRON_JOB") | crontab -

注意,下面这段111、222、333分别是要备份的数据库名,如果就一个那就一行。后面六位字母就是你自己设定的zip压缩密码,比较重要,建议设置

# 备份三个数据库
backup_database "111" "112233"
backup_database "222" "221133"
backup_database "333" "332211"

代码倒数第二行是定时任务时间,首次运用sh脚本会设定,以后不用管理了。要修改就自己改:

crontab -e

然后么,别忘记给脚本权限:

chmod +x /www/backup/bbaaacckkuupp.sh

首次运行:

./www/backup/bbaaacckkuupp.sh

然后等备份就行,会有提示“Warning: Permanently added ‘[192.168.1.101]:22335’ (ED25519) to the list of known hosts.” 不用管,这是告诉你插入成功了,等结束去B服务器的/www/remote-backup目录看,成功就行了。

    没有回复内容

万事屋新帖