使用Shell脚本进行MySQL数据库备份

使用Shell脚本进行MySQL数据库备份

在日常的数据库管理中,定期备份是保障数据安全的重要手段。MySQL数据库备份可以通过多种方式实现,其中使用Shell脚本进行自动化备份是一种高效且灵活的方法。本文将介绍如何编写一个Shell脚本来实现MySQL数据库的自动备份,并对脚本进行优化。

基本备份脚本

首先,我们来看一个基本的MySQL数据库备份脚本。这个脚本会将指定的数据库备份到指定目录,并按照日期进行分类存储。以下是基本脚本的代码:

#!/bin/bash

# 备份文件保存路径
backup_dir=/data/mysqlbackup
# 当前时间
current_time=`date +%Y-%m-%d-%H-%M-%S`
# 当前年份
year=`date +%Y`
# 当前月份
month=`date +%m`
# 当前日
day=`date +%d`
# 备份工具
tool=mysqldump
# mysql数据库用户名
username=root
# mysql数据库密码
password='123456'
# 对将要备份的多个数据库用数组分开
database_names=(database1 database2 database3)
 
# -d用来判断目录是否存在,存在返回真,不存在则
if [ ! -d $backup_dir/$year/$month/$day ]
then
    #不存在则用mkdir命令来创建目录, -p选项确保指定的整个目录路径都会被创建,创建的目录为/data/mysqlbackup/年份/月份/日
    mkdir -p $backup_dir/$year/$month/$day
fi
 
# 循环需要备份的数据库数组
for i in ${database_names[@]}
do
    #--single-transaction这个选项保证了通过将导出操作封装在一个事务(隔离级别为REPEATABLE READ)内来使得导出的数据是一个一致性快照
    #| gzip意思是利用管道命令连接gzip命令然后把sql文件直接压缩为gz压缩文件
    $tool -u $username -p $password --single-transaction $i | gzip > $backup_dir/$year/$month/$day/$i-$current_time.sql.gz
    # 把备份情况写进日志
    echo "成功创建备份:$backup_dir/$year/$month/$day/$i-$current_time.sql.gz" >> $backup_dir/mysqlbackup.log
done 

这个脚本的基本功能已经可以满足日常的备份需求,但在实际使用中,我们可以对其进行一些优化,以提高脚本的安全性、可读性和可维护性。

优化后的备份脚本

为了使脚本更加完善,我们可以进行以下优化:

  1. 变量引用:在引用变量时加上双引号,避免路径或文件名中包含空格等特殊字符导致的问题。

  2. 密码安全:建议不要在脚本中明文存储密码,可以考虑使用环境变量或配置文件来存储密码。

  3. 日志记录:增加备份失败的日志记录,以便于排查问题。

  4. 代码可读性:使用更具描述性的变量名,并在适当的位置添加注释以提高代码的可读性。

  5. 命令替换:使用 $(...) 代替反引号 `...` 进行命令替换,提高可读性和嵌套能力。

下面是优化后的脚本:

#!/bin/bash

# 备份文件保存路径
backup_dir="/data/mysqlbackup"
# 当前时间
current_time=$(date +%Y-%m-%d-%H-%M-%S)
# 当前年份
year=$(date +%Y)
# 当前月份
month=$(date +%m)
# 当前日
day=$(date +%d)
# 备份工具
tool="mysqldump"
# MySQL数据库用户名
username="root"
# MySQL数据库密码(建议使用更安全的方式存储密码,如环境变量或配置文件)
password="123456"
# 将要备份的多个数据库用数组分开
database_names=("database1" "database2" "database3")

# 创建备份目录,如果不存在则创建
backup_path="$backup_dir/$year/$month/$day"
if [ ! -d "$backup_path" ]; then
    mkdir -p "$backup_path"
fi

# 循环需要备份的数据库数组
for db in "${database_names[@]}"; do
    # --single-transaction 选项保证了通过将导出操作封装在一个事务(隔离级别为 REPEATABLE READ)内来使得导出的数据是一个一致性快照
    # | gzip 意思是利用管道命令连接 gzip 命令然后把 sql 文件直接压缩为 gz 压缩文件
    $tool -u "$username" -p"$password" --single-transaction "$db" | gzip > "$backup_path/$db-$current_time.sql.gz"
    
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "成功创建备份:$backup_path/$db-$current_time.sql.gz" >> "$backup_dir/mysqlbackup.log"
    else
        echo "备份失败:$backup_path/$db-$current_time.sql.gz" >> "$backup_dir/mysqlbackup.log"
    fi
done

本文来自投稿,不代表极客运维立场,如若转载,请注明出处:https://www.geeklinux.cn/db/mysql/171.html

(0)
geeklinux.cn的头像geeklinux.cn
上一篇 2024 年 7 月 7 日 下午5:33
下一篇 2024 年 7 月 10 日 下午3:01

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注