MySQL定时异机备份

场景:将A机器MySQL数据库部分表每日定时备份到B机器上 (只适用于Linux)

实现方式算是比简单了,就是用mysqldump生成文件,使用scp命令传输到另一台机器上。

1. 编写备份shell脚本

在A机器新建脚本

(当然没有vim的话vi命令也可以)

bash 复制代码
vim backupAndUpload.sh
bash 复制代码
#!/bin/bash

# 定义变量,见名知意,不做解释
SOURCE_DB_USER="root"
SOURCE_DB_PASSWORD="123"
SOURCE_DB_NAME="aaa"
TABLES=("tb1" "tb2" "tb3" "tb4" "tb5" "tb6")
BACKUP_FILE="/home/app/data-backup/aaa.sql"
REMOTE_USER="root"
REMOTE_PORT="22"
REMOTE_HOST="192.168.2.222"
REMOTE_PATH="/home/app/data-backup"
LOG_FILE="/home/app/data-backup/out.log"

# 记录日志函数
log() {
    local message="$1"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" | tee -a $LOG_FILE
}

# 生成备份文件
log "开始备份数据库..."
mysqldump -u${SOURCE_DB_USER} -p${SOURCE_DB_PASSWORD} ${SOURCE_DB_NAME} ${TABLES[@]} --single-transaction > ${BACKUP_FILE}

# 检查备份是否成功
if [ $? -eq 0 ]; then
    log "备份成功,开始上传文件..."

    # 使用scp上传备份文件
      scp -P ${REMOTE_PORT} ${BACKUP_FILE} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}

    # 检查上传是否成功
    if [ $? -eq 0 ]; then
        log "文件上传成功"
    else
        log "文件上传失败"
    fi
else
    log "备份失败"
fi

解析:

  1. 定义变量:脚本中定义了数据库用户、密码、数据库名称、表名列表、备份文件名、远程用户、远程主机和远程路径。
  2. 生成备份文件:使用 mysqldump 命令生成备份文件,并将指定的表导出到 BACKUP_FILE 文件中。
  3. 检查备份是否成功:通过检查 mysqldump 命令的返回值来判断备份是否成功。
  4. 上传备份文件:如果备份成功,则使用 scp 命令将备份文件上传到远程服务器的指定路径。
  5. 检查上传是否成功:通过检查 scp 命令的返回值来判断文件上传是否成功。

2.生成ssh密钥

由于scp需要交互输入密码才能传输,所以下面使用SSH 密钥认证方式

在A机器上执行以下命令生成密钥

bash 复制代码
ssh-keygen -t rsa

三次回车

密钥会生成在/root/.ssh/目录下(以下都是以root用户操作的所以家目录就是/root)

将A机器上的公钥id_rsa.pub复制到B机器/root/.ssh目录

在B机器执行以下命令将公钥追加到authorized_keys文件

bash 复制代码
cat id_rsa.pub >> ~/.ssh/authorized_keys

如果提示没有该文件,就在家目录建一个.ssh目录

bash 复制代码
mkdir -p ~/.ssh

3. 手动执行

上面设置好之后可以手动执行脚本看是否成功

在A机器执行

赋予脚本执行权限

bash 复制代码
chmod +x backupAndUpload.sh
bash 复制代码
./backupAndUpload.sh

4.设置定时执行

当然还是在A机器执行,输入下面命令进入crontab编辑

bash 复制代码
crontab -e

最后一行加入以下内容,每日凌晨01:20执行一次

(写给小白:其实就是vi编辑器 按i键输入后在按ESC键,最后后输入:wq保存)

bash 复制代码
20 1 * * * /home/app/backupAndUpload.sh

最后用下面命令查询是否保存成功

bash 复制代码
crontab -l

然后就坐等自动备份了

相关推荐
凌虚5 小时前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
五阿哥永琪5 小时前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善5 小时前
了解Mysql优化吗?如何优化索引?
数据库·mysql
赤壁小虾8 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
MC皮蛋侠客8 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python
奈斯先生Vector9 小时前
把 Midjourney 二次编辑做成生产系统:customId 能力令牌、Action Graph 与 WebUI 精修工作台
数据库·人工智能·架构·aigc·音视频·midjourney
Lethehong9 小时前
双擎并驱·全链路并行:KFS让TB级异构增量同步秒级到达
数据库
MC皮蛋侠客9 小时前
SQLAlchemy 系列(八):AsyncIO、并发与 Web 生命周期——让每个并发任务持有自己的 Session
数据库·python
一水10 小时前
Redis实战:一个AI工作流系统里的五个应用场景,从传参到限流的完整链路
数据库·redis·wpf
Ai拆代码的曹操10 小时前
MySQL GROUP BY 性能优化:执行计划分析 + 索引重构实战
mysql·性能优化·重构