MySQL数据库脚本备份

环境:centos7、MySQL 8.0

安装mysqldump命令

确认是否安装了 mysqldump
在终端运行:

which mysqldump

如果 没有任何输出,说明 MySQL 客户端未安装。

下载并安装 MySQL 8.0 官方 Yum 仓库

# 下载 MySQL 8.0 官方 repo(适用于 CentOS 7)
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm

# 安装 repo 包
sudo rpm -ivh mysql80-community-release-el7-11.noarch.rpm

# 安装 MySQL 8.0 客户端(仅客户端,不含服务端)
sudo yum install -y mysql-community-client

验证安装

which mysqldump
# 应输出:/usr/bin/mysqldump

mysqldump --version
# 应显示:mysqldump  Ver 8.0.xx for Linux on x86_64 (MySQL Community Server - GPL)

执行备份脚本


# === 配置区 ===
w="$(date "+%Y-%m-%d")"

# MySQL 配置
DB_USER="root"
DB_PASSWORD="123456"
DB_NAME="test"

# 备份目录
BACKUP_DIR="/mnt/sql"

# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"

# 执行备份(本地数据库)
# 使用 --skip-extended-insert 避免大 INSERT 导致 max_allowed_packet 错误
# --complete-insert 确保 INSERT 包含列名,提高兼容性
/usr/bin/mysqldump -h 127.0.0.1 -P 3306 -u"$DB_USER" -p"$DB_PASSWORD" --skip-extended-insert --complete-insert "$DB_NAME" > "$BACKUP_DIR/backup_$w.sql"

# 检查是否成功
if [ $? -eq 0 ]; then
    echo "[$(date)] 备份成功:$BACKUP_DIR/backup_$w.sql"
else
    echo "[$(date)] 备份失败!" >&2
fi

# === 自动清理:删除 7 天前的 .sql 备份文件 ===
find "$BACKUP_DIR" -type f -name "backup_*.sql" -mtime +7 -delete

将执行脚本放到Linux的定时任务中执行

例:/mnt/sql_backup.sh
将备份脚本加入 Linux 定时任务(crontab),每天凌晨 2 点自动执行。
定时任务(cron)本身是系统服务,开机自动运行。

#第一步:给脚本添加执行权限
chmod +x /mnt/sql_backup.sh
#第二步:用 root 用户编辑 crontab
sudo crontab -e

#第三步:添加以下一行到 crontab
0 2 * * * /mnt/sql_backup.sh >> /var/log/sql_backup.log 2>&1

说明:
0 2 * * * → 每天 凌晨 2:00 执行
日志输出到 /var/log/sql_backup.log,方便你查看是否成功
2>&1 表示错误信息也写入日志

保存并退出编辑器
vim/vi:按 Esc → 输入 :wq → 回车
nano:按 Ctrl+O → 回车 → Ctrl+X
看到提示 crontab: installing new crontab 就表示成功了。

验证设置
查看当前 root 的定时任务:

sudo crontab -l

应该能看到你刚加的那一行。
检查日志(第二天 2 点后):

tail -n 10 /var/log/sql_backup.log

将备份出的文件转移到另一台服务器

通过 sshpass 工具 实现“用账号密码自动登录 SSH 并同步文件

CentOS 7 安装 sshpass

# 启用 EPEL 仓库(如果未启用)
sudo yum install -y epel-release

# 安装 sshpass
sudo yum install -y sshpass

验证安装:

sshpass -V
# 应输出版本号

修改备份脚本 /mnt/sql_backup.sh

#!/bin/bash

# === 配置区 ===
w="$(date "+%Y-%m-%d")"

# MySQL 配置
DB_USER="root"
DB_PASSWORD="your_password"
DB_NAME="test"

# 备份目录
BACKUP_DIR="/mnt/sql"

# === 远程服务器配置 ===
REMOTE_HOST="192.168.1.20"     # ← 替换为你的目标服务器 IP
REMOTE_USER="root"             # ← 替换为目标服务器用户名
REMOTE_PASS="your_password"    # ← 替换为目标服务器密码
REMOTE_DIR="/mnt/sql"

mkdir -p "$BACKUP_DIR"

# 1. 本地备份
# 使用 --skip-extended-insert 避免大 INSERT 导致 max_allowed_packet 错误
# --complete-insert 确保 INSERT 包含列名,提高兼容性
/usr/bin/mysqldump -h 127.0.0.1 -P 3306 -u"$DB_USER" -p"$DB_PASSWORD" --skip-extended-insert --complete-insert "$DB_NAME" > "$BACKUP_DIR/backup_$w.sql"

if [ $? -ne 0 ]; then
    echo "[$(date)] 本地备份失败!" >&2
    exit 1
fi
echo "[$(date)] 本地备份成功: $BACKUP_DIR/backup_$w.sql"

# 2. 确保远程目录存在
sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_DIR"

# 3. 同步当天的备份文件到远程
sshpass -p "$REMOTE_PASS" rsync -avz -e "ssh -o StrictHostKeyChecking=no" \
    "$BACKUP_DIR/backup_$w.sql" \
    "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"

if [ $? -eq 0 ]; then
    echo "[$(date)] 远程同步成功: $REMOTE_HOST:$REMOTE_DIR/backup_$w.sql"
else
    echo "[$(date)] 远程同步失败!" >&2
fi

# 4. 清理本地 7 天前的备份
find "$BACKUP_DIR" -type f -name "backup_*.sql" -mtime +7 -delete
echo "[$(date)] 本地 7 天前备份已清理"

# 5. 清理远程服务器 7 天前的备份
sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" \
    "find '$REMOTE_DIR' -type f -name 'backup_*.sql' -mtime +7 -delete"

if [ $? -eq 0 ]; then
    echo "[$(date)] 远程 7 天前备份已清理"
else
    echo "[$(date)] 远程清理失败(可能无权限或路径错误)" >&2
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jzs1064

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值