在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 确认即可。之后脚本将不再报错。
相关推荐
檀越剑指大厂3 小时前
金仓KReplay:定义数据库平滑迁移新标准
数据库
余—笙3 小时前
Linux(docker)安装搭建CuteHttpFileServer/chfs文件共享服务器
linux·服务器·docker
lang201509283 小时前
Linux高效备份:tar与gzip完全指南
linux·运维·服务器
努力成为一个程序猿.3 小时前
【Flink】FlinkSQL-动态表和持续查询概念
大数据·数据库·flink
IDOlaoluo3 小时前
OceanBase all-in-one 4.2.0.0 安装教程(CentOS 7/EL7 一键部署详细步骤)
linux·centos·oceanbase
毕设十刻4 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
wanhengidc4 小时前
云手机的基本原理
运维·服务器·游戏·智能手机·云计算
篙芷4 小时前
两台服务器 NFS 共享目录实战
运维·服务器
catoop4 小时前
在 WSL 的 Ubuntu 中安装和配置 SSH 服务
linux·ubuntu·ssh