shell中编写备份数据库脚本(使用mysqldump工具)

mysqldump备份

目录

mysqldump备份

分库备份

分表备份


利用自带工具mysqldump 实现数据库分库分表备份。

要想知道需要备份哪些数据库,就得先列出来

mysql -uroot -p'Openlab123!' -N -e 'show databases' | egrep -on_schema|mysql|performance_schema|sys" 
mysql: [Warning] Using a password on the command line interfa
MySchool_db
MyScl_db
WORK
mysl
  • -N: 或者写作 --no-column-names,是一个选项,告诉mysql客户端在输出查询结果时不包含列名行。这对于脚本或自动化任务特别有用,因为它使得输出更易于解析。

  • -e 'show databases': -e 后面跟的是执行的SQL命令,这里是要执行的命令是 show databases,该命令用于列出MySQL服务器上所有的数据库。

整个命令的作用是:以root用户身份,使用密码登录MySQL服务器,并且在登录后执行show databases命令来显示服务器上的所有数据库列表,同时在输出时不包含列标题。

命令会列出所有数据库中名称匹配除去 information_schema, mysql, performance_schema, 或 sys 的数据库的行

mysqldump进行数据库备份

mysqldump -uroot -pOpenlab123! -B MySchool_db > MySchool_db.sql

备份肯定是不能只备份一条 --> 使用for循环进行备份

分库备份

思路:将除去系统自带的数据库以外的数据库名赋值给DBS,再使用for循环遍历DBS变量循环内部就对每一个数据库进行备份

[root@localhost script] DBS=$(mysql -uroot -p'Openlab123!' -N -e "show databases" | egrep -v "information_schema|mysql|performance_schema|sys")
mysql: [Warning] Using a password on the command line interface can be insecure.

[root@localhost script] echo $DBS
MySchool_db MyScl_db WORK mysl


[root@localhost script] for db in $DBS
> do
> echo 备份$db
> done
备份MySchool_db
备份MyScl_db
备份WORK
备份mysl

编写shell备份服务器脚本

#!/bin/bash

DBS=$(mysql -uroot -p'Openlab123!' -N -e "show databases" | egrep -v "information_schema|mysql|performance_schema|sys")

for db in $DBS
do
        mysqldump -uroot -pOpenlab123! -B $db > ${db}_$(date +%F).sql
done

启动脚本

[root@localhost script] ls
db_back.sh
#以下警告是因为使用mysqldump命令的时候直接在命令行输入了密码,要解决这个问题可以重定向到/dev/null 下
[root@localhost script] bash db_back.sh 
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost script] ll
总用量 52
-rw-r--r--. 1 root root   221  5月 27 21:10 db_back.sh
-rw-r--r--. 1 root root 22792  5月 27 21:10 MySchool_db_2024-05-27.sql
-rw-r--r--. 1 root root 10939  5月 27 21:10 MyScl_db_2024-05-27.sql
-rw-r--r--. 1 root root  2413  5月 27 21:10 mysl_2024-05-27.sql
-rw-r--r--. 1 root root  5644  5月 27 21:10 WORK_2024-05-27.sql

此时一个初步的脚本已经完成了,接下来就是优化

  • 将路径修改为变量,将四个基本的数据库修改为变量的形式,将用户密码修改为变量的形式---都是常用修改的设为变量以便往后修改
  • 将主程序加入死循环,并将备份脚本放到特定的目录下。
  • 如果存在这个目录就直接创建,如果不存在就创建并跳过本次循环再生成脚本
#!/bin/bash

BAK_DIR=/backup/db
DB_BASE="information_schema|mysql|performance_schema|sys"
DBS=$(mysql -uroot -p'Openlab123!' -N -e "show databases" | egrep -v ${DB_BASE})
DB_USER_PW="-uroot -pOpenlab123!"

# main program
while true;do
        if [ -d ${BAK_DIR} ];then
                for db in $DBS
                do
                        mysqldump ${DB_USER_PW} -B $db > ${BAK_DIR}/${db}_$(date +%F).sql
                done
                break
        elif [ ! -d ${BAK_DIR} ];then
                mkdir -p ${BAK_DIR}
                continue
        fi
done

分表备份

一样的思路,将每一个库里面每一个表做循环备份

#!/bin/bash

BAK_DIR=/backup/db
DB_USER_PW="-uroot -pOpenlab123!"
DB_BASE="information_schema|mysql|performance_schema|sys"
DBS=$(mysql ${DB_USER_PW} -N -e "show databases" | egrep -v ${DB_BASE})

# main program
while true;do
        if [ -d ${BAK_DIR} ];then
                for db in $DBS
                do
                        TABS=$(mysql ${DB_USER_PW} -N -e "show tables from $db")
                        for tab in $TABS
                        do
                                mysqldump ${DB_USER_PW} $db $tab > ${BAK_DIR}/${db}_${tab}_$(date +%F).sql
                        done
                done
                break

        elif [ ! -d ${BAK_DIR} ];then
                mkdir -p ${BAK_DIR}
                continue
        fi
done

实现效果

[root@localhost script] bash  db_back_tables.sh 
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost script] ls /backup/db/
MySchool_db_grade_2024-05-28.sql            MySchool_db_subject_2024-05-28.sql  MyScl_db_index_4_2024-05-28.sql        MyScl_db_tab22_2024-05-28.sql  WORK_test_2024-05-28.sql
MySchool_db_result_2024-05-28.sql           MySchool_db_t1_2024-05-28.sql       MyScl_db_index5_2024-05-28.sql         mysl_t1_2024-05-28.sql
MySchool_db_student_2024-05-28.sql          MySchool_db_user_2024-05-28.sql     MyScl_db_student_2024-05-28.sql        WORK_college_2024-05-28.sql
MySchool_db_Student_V_1_2024-05-28.sql      MyScl_db_index1_2024-05-28.sql      MyScl_db_student_count_2024-05-28.sql  WORK_dept_2024-05-28.sql
MySchool_db_Student_V_grade_2024-05-28.sql  MyScl_db_index2_2024-05-28.sql      MyScl_db_tab11_2024-05-28.sql          WORK_emp_2024-05-28.sql

其实代码还可以继续优化,因为没有达成将每一个表备份到固定的目录之下

#!/bin/bash

DB_USER_PW="-uroot -pOpenlab123!"
DB_BASE="information_schema|mysql|performance_schema|sys"
BAK_ROOT=/backup

# 创建根备份目录
mkdir -p ${BAK_ROOT}

# 获取所有数据库列表,排除特定系统库
DBS=$(mysql ${DB_USER_PW} -N -e "show databases" | egrep -v ${DB_BASE})

# 遍历数据库
for db in $DBS
do

        BAK_DIR=${BAK_ROOT}/${db}

        # 检查备份目录是否存在,使用if-elif结构
        if [ ! -d "${BAK_DIR}" ]; then
            # 如果目录不存在,则创建
            mkdir -p "${BAK_DIR}"
        fi

        # 获取数据库内的所有表
        TABS=$(mysql ${DB_USER_PW} -N -e "show tables from ${db}")

        # 遍历表并执行备份
        for tab in $TABS; do
            mysqldump ${DB_USER_PW} ${db} ${tab} > ${BAK_DIR}/${db}_${tab}_$(date +%F).sql
        done
done

这个修订版脚本做了以下改动:

  • 移除了不必要的 while true 循环,因为它可能导致无限循环或不期望的退出。
  • 仅创建一次备份根目录,并为每个数据库动态创建子目录。
  • 为每个数据库单独备份其所有表,而不是在每个目录内重新遍历所有数据库。
  • 修正了备份文件路径,确保它们被正确地保存在每个数据库对应的备份目录下。

实现效果

[root@localhost script] bash  db_back_tables.sh 
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [Warning] Using a password on the command line interface can be insecure.

[root@localhost script] tree /backup/
/backup/
├── MySchool_db
│   ├── MySchool_db_grade_2024-05-28.sql
│   ├── MySchool_db_result_2024-05-28.sql
│   ├── MySchool_db_student_2024-05-28.sql
│   ├── MySchool_db_Student_V_1_2024-05-28.sql
│   ├── MySchool_db_Student_V_grade_2024-05-28.sql
│   ├── MySchool_db_subject_2024-05-28.sql
│   ├── MySchool_db_t1_2024-05-28.sql
│   └── MySchool_db_user_2024-05-28.sql
├── MyScl_db
│   ├── MyScl_db_index1_2024-05-28.sql
│   ├── MyScl_db_index2_2024-05-28.sql
│   ├── MyScl_db_index_4_2024-05-28.sql
│   ├── MyScl_db_index5_2024-05-28.sql
│   ├── MyScl_db_student_2024-05-28.sql
│   ├── MyScl_db_student_count_2024-05-28.sql
│   ├── MyScl_db_tab11_2024-05-28.sql
│   └── MyScl_db_tab22_2024-05-28.sql
├── mysl
│   └── mysl_t1_2024-05-28.sql
└── WORK
    ├── WORK_college_2024-05-28.sql
    ├── WORK_dept_2024-05-28.sql
    ├── WORK_emp_2024-05-28.sql
    └── WORK_test_2024-05-28.sql

4 directories, 21 files
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妍妍的宝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值