该脚本用于自动备份MySQL数据库,并根据不同的日期生成不同类型的备份文件。主要功能包括:
- 使用
mysqldump
命令备份MySQL数据库。 - 根据当前日期生成备份文件名,并将备份文件移动至远程主机。
- 根据每周不同的日期生成不同类型的备份文件:周日生成完整备份,其他日期生成增量备份。
主要功能
-
备份文件夹创建: 如果指定的备份文件夹不存在,脚本会自动创建该文件夹。
-
选择备份类型: 根据当前日期,选择是生成完整备份还是增量备份。
-
完整备份(周日): 如果当前是周日,将备份整个数据库,并在备份文件名中添加日期后缀。此备份包含数据库结构和数据。
-
增量备份(其他日期): 如果当前不是周日,则生成增量备份,仅备份数据而不包括数据库结构。此备份会跳过创建表的 SQL 语句,并将数据插入到单独的 INSERT 语句中,以提高备份效率。
-
远程传输备份文件: 使用
scp
命令将备份文件传输至远程主机,以确保备份文件的安全存储。
参考脚本
#!/bin/bash
set -e
# 备份文件夹
backup_dir="/opt/backup"
# 数据库账号
mysql_user="root"
# 数据库密码
mysql_password="1"
# 要备份的数据库名称
mysql_database="one"
# 获取周几
weekday=$(date +'%u')
# 如果备份文件夹不存在则创建
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
echo "备份文件夹 $backup_dir 不存在,已创建该文件夹。"
fi
echo "开始执行备份操作"
# 如果是周日执行当前备份
if [ "$weekday" -eq 7 ]; then
backup_file="$backup_dir/QL.dir/full_backup_$(date +'%Y%m%d').sql"
mysqldump --user="$mysql_user" --password="$mysql_password" --single-transaction --skip-lock-tables --routines --triggers --events --add-drop-database --add-drop-table "$mysql_database" > "$backup_file/$mysql_database$(date +'%Y%m%d').sql"
else
backup_file="$backup_dir/ZL.dir/INcmt_backup_$(date +'%Y%m%d').sql"
mysqldump --user="$mysql_user" --password="$mysql_password" --single-transaction --skip-lock-tables --no-create-info --skip-comments --skip-extended-insert "$mysql_database" > "$backup_file/$mysql_database$(date +'%Y%m%d').sql"
fi
echo "数据库$mysql_database备份完成"
scp $backup_dir/$mysql_database$(date +'%Y%m%d').sql 192.168.10.100:/data/mysql/backup
echo "移动备份文件至远程主机"
参数说明
mysqldump参数:
参数 | 作用 |
---|---|
–single-transaction | 使用单个事务来导出数据,这对于 InnoDB 存储引擎是特别有用的,因为它允许在不锁定表的情况下创建一致性的备份 |
–skip-lock-tables | 不锁定任何表来读取数据,这通常与 --single-transaction 一起使用 |
–routines | 告诉 mysqldump 导出存储过程和函数 |
–triggers | 告诉 mysqldump 导出触发器 |
–events | 告诉 mysqldump 导出事件调度器的事件 |
–add-drop-database | 会在每个数据库的导出内容前添加一个 DROP DATABASE 语句,并在之后添加一个 CREATE DATABASE 语句。这有助于在恢复时删除并重新创建数据库 |
–add-drop-table | 这会在每个表的导出内容前添加一个 DROP TABLE 语句,并在之后添加一个 CREATE TABLE 语句。这有助于在恢复时删除并重新创建表。 |
–no-create-info | 不导出 CREATE TABLE 语句。这意味着备份文件中将不包含创建表的 SQL 语句,只有表中的数据。 |
–skip-comments | 不导出任何注释。这可以减少备份文件的大小,并加速备份过程。 |
–skip-extended-insert | 不使用扩展的 INSERT 语句。默认情况下,mysqldump 使用扩展的 INSERT 语句来插入多行数据,以提高效率。但使用这个选项会导致每行数据都使用单独的 INSERT 语句,这可能使备份文件更大,但有时候这样做有助于兼容某些特定的数据库导入工具或系统。 |
示例用法
# 在每天定时任务中执行数据库备份
0 0 * * * /bin/bash /path/to/backup_script.sh