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
上述方式可优化部分:
- 使用环境变量来存储敏感信息(如数据库密码),而不是直接在脚本中硬编码。
- 添加错误处理,以确保在备份过程中出现任何问题时能够得到通知。
- 在执行 mysqldump 命令时,确保密码不会被泄露在命令行历史记录中。
优化后:
- 将所需参数配置到环境变量中:
使用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