简介:
数据库脚本备份是指将数据库结构和数据导出为文本格式的过程,以便在需要时可以轻松地恢复数据库。数据库脚本备份通常使用类似于 mysqldump 的工具来导出数据库内容,并将其保存为 SQL 脚本文件。这些脚本文件包含了在数据库中创建或修改表、视图、存储过程、触发器等对象的 SQL 语句,以及插入、更新和删除数据的 SQL 语句。定时备份可以定期将数据库备份到安全的位置,以防止数据库出现故障、数据丢失等问题。这样可以大大提高数据的安全性和可靠性。需要注意,在进行定时备份时,需要确保备份计划的设置合理和准确,同时备份文件的存储位置和安全性也需要得到充分保证。
一、数据库的分库备份(使用mysqldump)
1.编写脚本
#!/bin/bash
#mysql的账户信息
mysql_user="root"
mysql_password="123456"
#数据库的服务器地址
mysql_host="192.168.136.160"
#数据库的备份目录
backup_dir="/backup/dir"
#数据库备份文件名前缀
backup_prefix="backup_database"
#备份文件后缀名
backup_suffix="$(date "+%Y-%m-%d %H:%M:%S").sql.gz"
#获取需要备份的数据库列表除本来就有的几个库
databases=$(mysql -h$mysql_host -u$mysql_user -p$mysql_password -e "show databases;" | egrep -v "(Database|information_schema|performance_schema|mysql)")
#也可以指定备份的哪一个数据库
#database=("school" "test")
for db in $databases
do
#检查数据库备份目录是否存在
[ -d $backup_dir ] || mkdir -p $backup_dir
#构造备份的指定目录以及文件名
backup_file="$backup_dir/$backup_prefix.$db.$backup_suffix"
#使用mysqldump备份数据库,并压缩成gzip格式
mysqldump -u$mysql_user -p$mysql_password -h $mysql_host --single-transaction --routines --triggers --events --add-drop-database --databases $db | gzip > "$backup_file"
#single-transaction:以事务的方式进行备份,确保备份过程中不会对正在执行的事务造成影响。
# --routines:备份存储过程和函数。
# --triggers:备份触发器。
# --events:备份事件。
# --add-drop-databases:在备份文件中包含创建数据库的语句,以便在恢复备份时可以先删除已有的数据库。
#输出备份结果
if [ $? -eq 0 ]
then
echo "备份$db成功,备份文件为$backup_file"
else
echo "备份$db失败"
fi
done
2.执行脚本查看结果
[root@server ~]# bash database_backup.sh
[root@server ~]# ls /backup/dir/
# 也可以进行解包查看
[root@server dir]# gunzip backup_database.school.2023-08-02\ 17\:05\:35.sql.gz
# 查看数据库创建语句是否完整
二、数据库的分表备份(mysqldump)
1.编写脚本
[root@server ~]# vim datatable_backup.sh
#!/bin/bash
# MySQL 用户名和密码
mysql_user="root"
mysql_password="123456"
#数据库的服务器地址
mysql_host="192.168.136.160"
#数据库的备份目录
backup_dir="/backup/dir"
#数据库备份文件名前缀
backup_prefix="backup_table"
#备份文件后缀名
backup_suffix="$(date "+%Y-%m-%d %H:%M:%S").sql.gz"
#指定备份的数据库
database="school"
#指定备份的表
tables=("student" "score")
for table in "${tables[@]}"
do
#检查数据库备份目录是否存在
[ -d $backup_dir ] || mkdir -p $backup_dir
#构造备份的指定目录以及文件名
backup_file="$backup_dir/$backup_prefix.$table.$backup_suffix"
#使用mysqldump备份指定表,并压缩成gzip格式
mysqldump -u$mysql_user -p$mysql_password -h $mysql_host --single-transaction --routines --triggers --events --add-drop-table --databases $database --tables $table | gzip > "$backup_file"
#输出备份结果
if [ $? -eq 0 ]
then
echo "备份$table成功,备份文件为$backup_file"
else
echo "备份$table失败"
fi
done
2.执行脚本查看结果
[root@server ~]# bash datatable_backup.sh
mysqldump: Got error: 1045: Access denied for user '-p'@'server' (using password: NO) when trying to connect
备份student成功,备份文件为/backup/dir/backup_table.student.2023-08-03 00:08:36.sql.gz
mysqldump: Got error: 1045: Access denied for user '-p'@'server' (using password: NO) when trying to connect
备份score成功,备份文件为/backup/dir/backup_table.score.2023-08-03 00:08:36.sql.gz
[root@server ~]# ll /backup/dir/
三、使用mysqldump实现分库分表备份
1.编写脚本
#!/bin/bash
# MySQL 用户名和密码
mysql_user="root"
mysql_password="123456"
# 数据库的服务器地址
mysql_host="192.168.136.160"
# 数据库备份目录
backup_dir="/backup/dir"
# 数据库备份文件名前缀
backup_prefix="backup_database"
# 备份文件后缀名
backup_suffix="$(date "+%Y-%m-%d %H:%M:%S").sql.gz"
# 获取需要备份的数据库列表,除本来就有的几个库
databases=$(mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_password" -e "show databases;" | egrep -v "(Database|information_schema|sys|performance_schema|mysql)")
# 也可以指定备份的哪一个数据库
# databases=("school" "test")
for db in $databases
do
# 检查数据库备份目录是否存在
[ -d "$backup_dir" ] || mkdir -p "$backup_dir/$db"
# 备份整个数据库
backup_file="$backup_dir/$backup_prefix.$db.$backup_suffix"
mysqldump -u"$mysql_user" -p"$mysql_password" -h "$mysql_host" --single-transaction --routines --triggers --events --add-drop-database --databases "$db" | gzip > "$backup_file"
if [ $? -eq 0 ]; then
echo "备份数据库 $db 成功,备份文件为 $backup_file"
else
echo "备份数据库 $db 失败"
fi
# 备份每个表
tables=$(mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_password" -N -e "show tables from $db")
for table in $tables
do
table_backup_dir="$backup_dir/$db/$table"
[ -d "$table_backup_dir" ] || mkdir -p "$table_backup_dir"
table_backup_file="$table_backup_dir/$backup_prefix.$db.$table.$backup_suffix"
mysqldump -u"$mysql_user" -p"$mysql_password" -h "$mysql_host" --single-transaction --routines --triggers --events "$db" "$table" | gzip > "$table_backup_file"
if [ $? -eq 0 ]; then
echo "备份数据库 $db 中的表 $table 成功,备份文件为 $table_backup_file"
else
echo "备份数据库 $db 中的表 $table 失败"
fi
done
done
2.执行脚本备份
[root@server ~]# bash backup_database_table.sh
[root@server ~]# tree /backup/dir/
/backup/dir/
├── backup_database.department.2023-08-03\ 00:30:51.sql.gz
├── backup_database.school.2023-08-03\ 00:30:51.sql.gz
├── department
│ ├── t_dept
│ │ └── backup_database.department.t_dept.2023-08-03\ 00:30:51.sql.gz
│ └── t_emp
│ └── backup_database.department.t_emp.2023-08-03\ 00:30:51.sql.gz
└── school
├── score
│ └── backup_database.school.score.2023-08-03\ 00:30:51.sql.gz
└── student
└── backup_database.school.student.2023-08-03\ 00:30:51.sql.gz