【脚本】使用脚本备份docker中部署的mysql数据库

v1版本明文密码方式

#!/bin/bash

# 定义 MySQL 容器名称和数据库信息
container_name="mysql_container"
db_user="root"
db_password="your_password"

# 定义要备份的数据库列表
databases=("database1" "database2" "database3")

# 定义备份文件保存路径
backup_dir="/host/path/to/backup"

# 创建备份文件保存目录
mkdir -p ${backup_dir}

# 获取当前时间作为备份文件名的一部分
timestamp=$(date +"%Y%m%d%H%M%S")

# 循环备份每个数据库
for db_name in "${databases[@]}"
do
    backup_file="${backup_dir}/${timestamp}_backup_${db_name}.sql"

    # 使用 Docker 执行 mysqldump 命令备份数据库
    docker exec ${container_name} mysqldump -u ${db_user} -p${db_password} ${db_name} > ${backup_file}

    if [ $? -eq 0 ]; then
        echo "数据库 ${db_name} 备份成功!备份文件路径:${backup_file}"
    else
        echo "数据库 ${db_name} 备份失败!"
    fi
done
上述方式可优化部分
  1. 使用环境变量来存储敏感信息(如数据库密码),而不是直接在脚本中硬编码。
  2. 添加错误处理,以确保在备份过程中出现任何问题时能够得到通知。
  3. 在执行 mysqldump 命令时,确保密码不会被泄露在命令行历史记录中。

优化后

  1. 将所需参数配置到环境变量中:

使用vi命令编辑文件

vi ~/.bashrc

在文件中插入你的配置信息,保存退出

export CONTAINER_NAME="your_mysql_container"
export DB_USER="root"
export DB_PASSWORD="your_secure_password"
export BACKUP_DIR="/path/to/your/backup/directory"

使更改立即生效,需要重新加载 .bashrc 文件

source ~/.bashrc

通过运行以下命令来验证环境变量是否已正确设置

echo $CONTAINER_NAME
echo $DB_USER
echo $DB_PASSWORD
echo $BACKUP_DIR

v2版本脚本

#!/bin/bash

# 使用环境变量存储敏感信息
container_name="${CONTAINER_NAME:-mysql_container}"
db_user="${DB_USER:-root}"
db_password="${DB_PASSWORD:-your_password}"

# 定义要备份的数据库列表
databases=("database1" "database2" "database3")

# 定义备份文件保存路径
backup_dir="${BACKUP_DIR:-/host/path/to/backup}"

# 创建备份文件保存目录
mkdir -p ${backup_dir}

# 获取当前时间作为备份文件名的一部分
timestamp=$(date +"%Y%m%d%H%M%S")

# 循环备份每个数据库
for db_name in "${databases[@]}"
do
    backup_file="${backup_dir}/${timestamp}_backup_${db_name}.sql"

    # 使用 Docker 执行 mysqldump 命令备份数据库,确保密码不会被泄露
    docker exec ${container_name} sh -c "mysqldump -u ${db_user} -p${db_password} ${db_name}" > ${backup_file}

    if [ $? -eq 0 ]; then
        echo "数据库 ${db_name} 备份成功!备份文件路径:${backup_file}"
    else
        echo "数据库 ${db_name} 备份失败!"
    fi
done

执行结果如下:
在这里插入图片描述
在这里插入图片描述


v3版本脚本

当采用cron执行时可能读取不到用户配置的环境参数,需要采用source指定读取。添加日志输出记录,并将文件压缩保存:

#!/bin/bash

# 使用环境变量存储敏感信息
container_name="${CONTAINER_NAME:-mysql_container}"
db_user="${DB_USER:-root}"
db_password="${DB_PASSWORD:-your_password}"


# 定义要备份的数据库列表
databases=("database1" "database2" "database3")

# 定义备份文件保存路径
backup_dir="${BACKUP_DIR:-/host/path/to/backup}"

# 定义日志文件路径
log_file="${BASH_SOURCE%/*}/backup_log.log"

# 创建备份文件保存目录
if [ ! -d "$backup_dir" ]; then
  mkdir -p "$backup_dir"
fi

# 获取当前时间作为备份文件名的一部分
timestamp=$(date +"%Y%m%d%H%M%S")

# 日志函数,用于输出日志信息到log_file
log() {
    echo "$(date +"%Y-%m-%d %H:%M:%S") $1" >> $log_file
}

log "开始执行备份脚本"

# 循环备份每个数据库
for db_name in "${databases[@]}"
do
    backup_file="${backup_dir}/${timestamp}_backup_${container_name}_${db_name}.sql"

    # 使用 Docker 执行 mysqldump 命令备份数据库,确保密码不会被泄露
    docker exec ${container_name} sh -c "mysqldump --single-transaction -u ${db_user} -p${db_password} ${db_name}" > ${backup_file}

    if [ $? -eq 0 ]; then
        log "数据库 ${db_name} 备份成功!备份文件路径:${backup_file}"
        # 压缩备份文件
        gzip ${backup_file}
    else
        log "数据库 ${db_name} 备份失败!"
        # 记录日志或发送通知
    fi
done

# 删除15天之前的备份文件
find ${backup_dir} -type f -name "*.sql.gz" -mtime +15 -exec rm {} \;

log "备份脚本执行完毕"


补充mysql服务器上直接执行部署脚本:

#!/bin/bash

# 要备份的数据库名,可以指定多个数据库,以空格分隔
DATABASES="db1 db2" #需要改为自己的数据库

# 备份文件的保存路径
BACKUP_DIR="/backup/db" #需要改为自己备份的路径

# 生成备份文件的名称,包括日期和数据库名
BACKUP_FILENAME=$(date +"%Y%m%d")

# 日志文件路径
LOG_FILE="$(dirname "$0")/backup_log.log"

# 确保备份目录存在
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    if [ $? -ne 0 ]; then
        echo "$(date): 创建备份目录 $BACKUP_DIR 失败。" >> "$LOG_FILE"
        exit 1
    fi
fi

# 执行备份的命令
for db in $DATABASES; do
    mysqldump --user="需要改为有权限执行的用户" --password="用户密码" $db > "$BACKUP_DIR/${BACKUP_FILENAME}_${db}_backup.sql"
    if [ $? -eq 0 ]; then
        echo "$(date): 数据库 $db 备份成功。" >> "$LOG_FILE"
    else
        echo "$(date): 数据库 $db 备份失败。" >> "$LOG_FILE"
    fi
done

# 删除30天前的备份文件
find "$BACKUP_DIR" -type f -name "${BACKUP_FILENAME}_*_backup.sql" -mtime +30 -delete
echo "$(date): 删除 30 天前的备份文件完成。" >> "$LOG_FILE"

# 打印备份完成的信息
echo "$(date): 备份已完成。备份文件保存在: $BACKUP_DIR" >> "$LOG_FILE"

使用 cron 定时执行:

  • 将这个脚本设置为 cron 任务,以定期自动执行备份操作。
  • 编辑 crontab 文件:
    crontab -e
    
  • 添加一行 cron 表达式,指定每天凌晨 3 点执行脚本:
    0 3 * * * /path/to/backup_script.sh
    
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值