数据库的脚本备份

简介:
数据库脚本备份是指将数据库结构和数据导出为文本格式的过程,以便在需要时可以轻松地恢复数据库。数据库脚本备份通常使用类似于 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 
# 查看数据库创建语句是否完整

image.png

二、数据库的分表备份(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/

image.png

三、使用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

猜你喜欢

转载自blog.csdn.net/m0_50816276/article/details/132075328