在Linux中备份msyql数据库和表的详细操作

前言

1.Docker、本地部署的MySQL数据定时备份,定时清理

2.支持命令行指定数据库备份(逗号分隔),未指定时自动备份所有非系统库

3.按时间分目录存储压缩备份,

4.设置Linux定时任务执行备份

一、本地备份

1.创建Shell备份脚本

复制代码
#!/bin/bash
 
# 定义参数
BACKUP_DIR="/home/backup/"     # 宿主机备份目录
DATE=$(date +"%Y%m%d%H%M")
DOCKER_NAME="yth_admin_mysql"       # 容器名称
DB_USER="root"
DB_PASSWORD="ytHMsql#6068"
DB_NAMES=("yth_admin" "yth_wflow_prod")             # 需要备份的数据库
 
# 创建备份目录(宿主机目录)
mkdir -p $BACKUP_DIR
 
# 循环备份数据库
for DB_NAME in "${DB_NAMES[@]}"; do
  docker exec $DOCKER_NAME sh -c \
    "exec mysqldump -u$DB_USER -p$DB_PASSWORD --databases $DB_NAME" \
    > $BACKUP_DIR/${DB_NAME}-${DATE}.sql
 
  # 检查退出状态
  if [ $? -eq 0 ]; then
    echo "[SUCCESS] Backup of $DB_NAME completed at $(date)"
  else
    echo "[ERROR] Backup failed for $DB_NAME" >&2
    exit 1
  fi
done
 
# 清理旧备份(保留60天)
find $BACKUP_DIR -type f -name "*.sql" -mtime +60 -exec rm {} \;
 
 
# 打印最终完成信息
echo "All databases backup completed at $(date +'%Y-%m-%d %H:%M:%S')" 

文件名称:backup.sh (直接部署的mysql需要用此脚本)

复制代码
#!/bin/bash

# 定义备份参数
BACKUP_DIR="/data/backup/database/mysql/"    # 备份存储目录
DATE=$(date +"%Y%m%d%H%M")                   # 备份文件名中的时间戳
DB_USER="root"                               # MySQL 用户
DB_PASSWORD="root"                           # MySQL 密码
DB_NAME="db1"                                # 要备份的数据库名

# 创建备份目录(宿主机目录)
mkdir -p $BACKUP_DIR

# 创建备份    这里需要用绝对路径,不然定时任务执行时会调用不到该命令
/usr/bin/mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/$DB_NAME-$DATE.sql

# 可选:删除旧备份文件,保留最近7天的备份
find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm {} \;

# 打印备份完成信息
echo "Backup of database '$DB_NAME' completed on $DATE."

2.修改文件权限

复制代码
chmod +x /home/backup/database/backup.sh 

3.运行

复制代码
# sh 你的脚本文件路径
sh /home/backup/backup.sh 

4.添加定时任务进行

创建log日志目录

复制代码
mkdir -p /home/backup/log

进入定时任务编辑器

复制代码
crontab -e

编辑定时任务

复制代码
# 添加一个定时任务,定期执行备份脚本(例如每天凌晨 2 点执行备份)
# 添加日志文件,将正确执行日志输出到 backup.log 将执行失败的日志输出到error.log 
0 2 * * * /home/backup/database/backup.sh >> /home/backup/log/backup.log 2>> /home/backup/log/error.log

查看定时任务是否写入

复制代码
crontab -l

二、远程备份(备份到另一台服务器)

要实现SSH免密登录,需确保本地机器的公钥已添加到远程服务器的authorized_keys中。

1.在本地机器生成SSH密钥对(如果不存在)

复制代码
# 在本地服务器上执行
ssh-keygen -t rsa

连续回车使用默认路径(~/.ssh/id_rsa)和空密码。

2.将公钥复制到远程服务器

复制代码
# 在本地服务器上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.11.0.211

输入远程服务器的root密码,完成后将自动添加公钥到211的~/.ssh/authorized_keys。

也可以在远程服务器上手动创建/root/.ssh/authorized_keys,然后复制本地服务器id_rsa.pub文件中的内容

3.验证免密登录

复制代码
ssh root@172.11.0.211

应无需密码直接登录。

4.修复权限问题(如需要)

在远程服务器(211)上检查权限:

复制代码
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

5.修改备份脚本

复制代码
#!/bin/bash

# 定义参数
REMOTE_HOST="172.11.0.211"    # 远程服务器IP
REMOTE_USER="root"            # 远程服务器SSH用户(建议使用专用账户)
DOCKER_NAME="mysql"    # 容器名称
BACKUP_DIR="/home/backup/database/mysql/${REMOTE_HOST}"  # 按IP区分备份目录
DATE=$(date +"%Y%m%d%H%M")
DB_USER="root"                # 专用备份用户
DB_PASSWORD="root"
DB_NAMES=("db1" "db2")             # 需要备份的数据库
 
# 自动将远程主机密钥添加到本地信任列表(首次执行一次即可)
# ssh-keyscan -H ${REMOTE_HOST} >> ~/.ssh/known_hosts 2>/dev/null
 
# 创建备份目录
mkdir -p $BACKUP_DIR
 
# 循环备份数据库
for DB_NAME in "${DB_NAMES[@]}"; do
  # 通过 SSH 在远程服务器执行 Docker 命令备份
  ssh ${REMOTE_USER}@${REMOTE_HOST} \
    "docker exec ${DOCKER_NAME} mysqldump \
    -u${DB_USER} \
    --password='${DB_PASSWORD}' \
    --databases ${DB_NAME} \
    --single-transaction \
    --routines \
    --triggers \
    --hex-blob" > "${BACKUP_DIR}/${DB_NAME}-${DATE}.sql" 2>> "${BACKUP_DIR}/error.log"
 
  # 检查退出状态
  if [ $? -eq 0 ]; then
    echo "[SUCCESS] Backup of $DB_NAME completed at $(date)"
  else
    echo "[ERROR] Backup failed for $DB_NAME. Check error.log for details." >&2
    # 可选:继续备份其他数据库而不是退出
    # exit 1
  fi
done
 
# 清理旧备份(保留7天)
find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm {} \;
 
# 打印最终完成信息
echo "All databases backup completed at $(date +'%Y-%m-%d %H:%M:%S')" 

注:出现 Host key verification failed 错误的原因是本地计算机尚未将远程服务器的 SSH 公钥添加到信任列表中。

复制代码
# 在本地终端运行以下命令,手动完成首次 SSH 连接认证:
ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "echo '首次连接成功'"
# 系统会提示是否信任远程服务器,输入 yes 确认即可。之后脚本将不再报错。
相关推荐
秦jh_1 分钟前
【Qt】常用控件(上)
服务器·数据库·qt
晨曦夜月5 分钟前
头文件与目标文件的关系
linux·开发语言·c++
Xyz996_5 分钟前
Ansible进行Nginx编译安装的详细步骤
运维·ansible
白仑色7 分钟前
java中的anyMatch和allMatch方法
java·linux·windows·anymatch·allmatch
爬山算法10 分钟前
Netty(14)如何处理Netty中的异常和错误?
java·前端·数据库
云和数据.ChenGuang10 分钟前
自动化运维工程师之ansible启动rpcbind和nfs服务
运维·服务器·运维技术·数据库运维工程师·运维教程
yimengsama11 分钟前
VMWare虚拟机如何连接U盘
linux·运维·服务器·网络·windows·经验分享·远程工作
松涛和鸣15 分钟前
32、Linux线程编程
linux·运维·服务器·c语言·开发语言·windows
云和数据.ChenGuang17 分钟前
AB压力测试运维工程师技术教程
运维·压力测试·运维工程师
꧁坚持很酷꧂18 分钟前
把虚拟机Ubuntu中的USB设备名称改为固定名称
linux·数据库·ubuntu