在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 确认即可。之后脚本将不再报错。
相关推荐
i***11861 小时前
【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用
数据库·oracle
海棠蚀omo1 小时前
解读Linux进程的“摩尔斯电码”:信号产生的原理与实践,掌控进程的生死时速
linux·操作系统
2301_789380495 小时前
vsc中使用DBHub-MCP连接云Mysql到vsc-copilot
数据库·mysql
杨DaB5 小时前
【MySQL】02 数据库的基本操作
数据库·mysql·oracle
m***66735 小时前
SQL 实战—递归 SQL:层级结构查询与处理树形数据
java·数据库·sql
昙鱼5 小时前
Markdown文件导入Milvus向量数据库完整指南
数据库·ai·milvus
A__tao5 小时前
gotool.top 的 SQL 转 Markdown
数据库·sql
Austindatabases6 小时前
基于SQLite如何设计应用程序,拆散,散,还的散!
数据库·sqlite
YouEmbedded6 小时前
解码UDP
linux·udp
w***48827 小时前
Linux安装redis
linux·运维·redis