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

然后就坐等自动备份了

相关推荐
海鸥-w6 分钟前
用python (fastapi)做项目第一天创建项目结构,数据建表,ORM配置安装,写第一个接口
数据库·python·fastapi
zfoo-framework23 分钟前
通过redis-cli+lua脚本查询redis数据
数据库·redis·lua
牛栓柱35 分钟前
【后端实战】用 Supabase + React/TS 零成本构建高并发 Multi-Agent 服务
前端·数据库·人工智能·后端·react.js·前端框架
yuezhilangniao38 分钟前
xtr备份prepare到底变化了啥
mysql
yyk的萌40 分钟前
创建属于自己的mysql的mcp
mysql·adb·ai·mcp
流烟默40 分钟前
腾讯云Centos7.6使用yum安装MySQL8
mysql·centos·腾讯云
仙俊红1 小时前
如何优化 MySQL 深分页 SQL
android·sql·mysql
yyuuuzz1 小时前
谷歌云基础服务的入门认知
linux·运维·服务器·数据库·人工智能·github
超梦dasgg1 小时前
工作中 MySQL 读写分离主从延迟:成因、影响、落地方案、生产实战处理
数据库·mysql
Wonderful U2 小时前
Python+Django实战:打造智能生鲜果蔬进销存管理系统(采购入库、库存预警、销售开单、毛利统计)
数据库·python·django