【脚本】使用脚本备份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
    评论
要在 Docker 部署数据库脚本,您可以按照以下步骤进行操作: 1. 准备数据库脚本文件。确保您已经准备好要部署数据库脚本文件。这可以是 SQL 文件、shell 脚本或其他数据库脚本文件。 2. 创建 Docker 容器。使用适用于您的数据库Docker 镜像来创建一个容器。例如,如果您要使用 MySQL 数据库,可以运行以下命令创建一个 MySQL 容器: ```shell docker run -d --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> mysql:tag ``` 这将创建一个名为 `mysql-container` 的 MySQL 容器,并设置 `MYSQL_ROOT_PASSWORD` 环境变量为您的数据库的根密码。请将 `<password>` 替换为实际的密码,并将 `tag` 替换为所需的 MySQL 版本标签(例如 `5.7`)。 3. 将脚本文件复制到容器使用以下命令将数据库脚本文件复制到运行的容器: ```shell docker cp <script-file> mysql-container:/<destination-path>/<script-file> ``` 这将把 `<script-file>` 复制到名为 `mysql-container` 的容器的 `<destination-path>` 目录下。请将 `<script-file>` 替换为实际的脚本文件名,并将 `<destination-path>` 替换为目标路径。 4. 进入容器并执行脚本使用以下命令进入容器并执行数据库脚本: ```shell docker exec -it mysql-container bash ``` 这将在容器打开一个交互式终端。 5. 在容器执行脚本。在容器终端使用适合您的数据库类型的命令运行脚本。例如,对于 MySQL,可以运行以下命令: ```shell mysql -u root -p <destination-path>/<script-file> ``` 这将使用根用户登录 MySQL 并执行脚本。根据您的脚本数据库类型,可能需要提供其他参数或进行其他调整。 6. 等待脚本执行完成。根据脚本的大小和复杂性,可能需要一些时间来执行脚本。请耐心等待直到脚本执行完成。 现在,您已经成功在 Docker 容器部署数据库脚本。您可以通过连接到容器或使用相关的应用程序验证脚本是否成功执行。 请注意,上述步骤提到的 `<password>` 和 `<script-file>` 都是需要您替换为实际的密码和文件名的占位符。确保根据您的环境进行相应的调整。 希望这个步骤对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值