在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 确认即可。之后脚本将不再报错。
相关推荐
qq_401700411 小时前
Qt Modbus 工程化封装:超时、重试、取消与资源释放,别让异步请求变成隐患
数据库·qt
ESDWAN1 小时前
SD-WAN 是什么?工作原理、适用场景与选型要点
开发语言·网络·数据库·架构·php
m0_639906941 小时前
MySQL 慢查询优化|explain执行计划详解
数据库·mysql
云飞云共享云桌面1 小时前
智能装备工厂研发部门多设计师共享一台SolidWorks服务器做设备装配建模
运维·服务器·网络·人工智能·3d·自动化·制造
正儿八经的少年1 小时前
MyBatis 一对一、一对多 SQL
数据库·sql·mybatis
Elastic 中国社区官方博客2 小时前
Elastic 在《Forrester Wave™:2026 年第四季度智能运维平台》报告中被评为强劲表现者
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
Apache IoTDB2 小时前
从 IoTDB 到 CED-DB:哈尔滨工业大学探索云边端协同时序数据库
数据库·时序数据库·iotdb
自由彩虹2 小时前
靶场通关16--victim1
linux·服务器·网络·安全·web安全·网络安全
叼烟扛炮2 小时前
Linux 学习笔记(三十九):网络基石——TCP/IP 模型与 UDP 实战
linux·运维·网络·笔记·学习·tcp/ip
闲云野鹤在人间2 小时前
头秃修炼手册:StorageClass+StatefulSet+ETCD 全套渡劫笔记
linux·数据库·笔记·云原生·kubernetes·etcd