MySQL、MariaDB、OceanBase远程异地定时备份脚本

问题背景

公司需要在异地机房远程备份数据库,以防止数据丢失,同时要支持MySQL、MariaDB和OceanBase。由于MariaDB和OceanBase支持MySQL语法,所以可以直接用MySQL Client进行备份。

安装MySQL客户端

bash 复制代码
yum install mysql

编写脚本

编写/backup/backup.sh,它的作用是执行备份到sql文件,并自动压缩成tar.gz压缩包,再删除30天前的压缩包

bash 复制代码
#!/bin/bash

# 检查参数个数
if [ "$#" -lt 3 ]; then
    echo "Usage: $0 <remote_user>@<server>:<port> -p <password> -d <database_name>"
    exit 1
fi

# 解析参数
REMOTE_INFO="$1"
REMOTE_DB_PASSWORD=""
REMOTE_DB_NAME=""

# 从第一个参数中提取用户名、主机和端口
IFS='@' read -ra ADDR <<< "$REMOTE_INFO"
IFS=':' read -ra USR <<< "${ADDR[1]}"
REMOTE_DB_USER=${ADDR[0]}
REMOTE_DB_HOST=${USR[0]}
REMOTE_DB_PORT=${USR[1]}

# 从第二个参数中提取密码
for arg in "$@"; do
    case $arg in
        -p) shift; REMOTE_DB_PASSWORD="$1";;
        -d) shift; REMOTE_DB_NAME="$1";;
        *) shift;;
    esac
done
echo ----------------开始备份---------------------
echo REMOTE_DB_USER=$REMOTE_DB_USER
echo REMOTE_DB_HOST=$REMOTE_DB_HOST
echo REMOTE_DB_PORT=$REMOTE_DB_PORT
echo REMOTE_DB_PASSWORD=$REMOTE_DB_PASSWORD
echo REMOTE_DB_NAME=$REMOTE_DB_NAME

BACKUP_PATH="/backup/${REMOTE_DB_HOST}_${REMOTE_DB_PORT}_${REMOTE_DB_NAME}"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_PATH/$REMOTE_DB_NAME-$DATE.sql"
TAR_FILE="$BACKUP_FILE.tar.gz"
DAYS_TO_KEEP=30

# 创建备份目录,如果不存在的话
mkdir -p $BACKUP_PATH

# 远程备份命令,包含端口号
mysqldump -h $REMOTE_DB_HOST -u $REMOTE_DB_USER -p$REMOTE_DB_PASSWORD -P $REMOTE_DB_PORT $REMOTE_DB_NAME > $BACKUP_FILE

# 检查备份是否成功
if [ $? -eq 0 ]; then
    echo "备份成功: $BACKUP_FILE"

    # 压缩备份文件
    cd $BACKUP_PATH
    tar czf $TAR_FILE $REMOTE_DB_NAME-$DATE.sql
    if [ $? -eq 0 ]; then
        echo "压缩成功: $TAR_FILE"
    else
        echo "压缩失败"
    fi

    # 删除原.sql文件
    rm -f $BACKUP_FILE
    if [ $? -eq 0 ]; then
        echo "删除备份文件: $BACKUP_FILE"
    else
        echo "删除备份文件失败: $BACKUP_FILE"
    fi

    # 删除旧备份文件
    find $BACKUP_PATH -type f -name "*.tar.gz" -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
    if [ $? -eq 0 ]; then
        echo "已自动清理 $DAYS_TO_KEEP 天前的压缩包"
    else
        echo "清理压缩包失败"
    fi
else
    echo "备份失败"
fi

设置定时任务

bash 复制代码
crontab -e

和vi的使用方法一样,在里面写上如下的信息即可,假设在192.168.1.10这台服务器上有个MySQL开了3306端口,并且用户名为root,密码为MyPass@w0rd,数据库为test_db,每天晚上0点准时备份,则定时任务这么写:

bash 复制代码
0 0 * * * /backup/backup.sh root@192.168.1.10:3306 -p MyPass@w0rd -d test_db >> /backup/system.log

如果要备份多个库直接写多行即可:

bash 复制代码
0 0 * * * /backup/backup.sh root@192.168.1.10:3306 -p MyPass@w0rd -d test_db >> /backup/system.log
5 0 * * * /backup/backup.sh root@192.168.1.11:3306 -p !@3QWEasd -d test_db2 >> /backup/system.log

这样系统就会在0点备份test_db库,在0点5分备份test_db2库,最后备份出来的压缩包会放在\backup\192.168.1.10_3306_test_db\\backup\192.168.1.11_3306_test_db2\下面

已知的其他问题

mysqldump不支持复杂的视图和函数备份,一般这俩也不会经常动,所以建议单独备份一下。

相关推荐
i道i2 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
Oak Zhang4 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
久醉不在酒5 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
WindFutrue5 小时前
使用Mybatis向Mysql中的插入Point类型的数据全方位解析
数据库·mysql·mybatis
虚拟网络工程师6 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
一只爱撸猫的程序猿6 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx
计算机毕设源码qq-38365310416 小时前
(附项目源码)Java开发语言,215 springboot 大学生爱心互助代购网站,计算机毕设程序开发+文案(LW+PPT)
java·开发语言·spring boot·mysql·课程设计
袁庭新6 小时前
Cannal实现MySQL主从同步环境搭建
java·数据库·mysql·计算机·java程序员·袁庭新
爱学习的白杨树7 小时前
MySQL中有哪几种锁?
数据库·mysql
Stara051110 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi