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

news/2024/9/23 10:05:08/

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/bashDBS=$(mysql -uroot -p'Openlab123!' -N -e "show databases" | egrep -v "information_schema|mysql|performance_schema|sys")for db in $DBS
domysqldump -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/bashBAK_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;doif [ -d ${BAK_DIR} ];thenfor db in $DBSdomysqldump ${DB_USER_PW} -B $db > ${BAK_DIR}/${db}_$(date +%F).sqldonebreakelif [ ! -d ${BAK_DIR} ];thenmkdir -p ${BAK_DIR}continuefi
done

分表备份

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

#!/bin/bashBAK_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;doif [ -d ${BAK_DIR} ];thenfor db in $DBSdoTABS=$(mysql ${DB_USER_PW} -N -e "show tables from $db")for tab in $TABSdomysqldump ${DB_USER_PW} $db $tab > ${BAK_DIR}/${db}_${tab}_$(date +%F).sqldonedonebreakelif [ ! -d ${BAK_DIR} ];thenmkdir -p ${BAK_DIR}continuefi
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/bashDB_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
doBAK_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; domysqldump ${DB_USER_PW} ${db} ${tab} > ${BAK_DIR}/${db}_${tab}_$(date +%F).sqldone
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.sql4 directories, 21 files

http://www.ppmy.cn/news/1463693.html

相关文章

Linux漏洞SSL/TLS协议信息泄露漏洞(CVE-2016-2183) - 非常危险(7.5分) 解决办法!升级openssl

漏洞情况 详细描述 TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及 Triple 3DES存在大约四十亿块的生日界,这可使远程攻击者通过Sweet32攻击&…

【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)

目录 0. 前情提醒: 1. 插入排序 1.1 基本思想: 1.2 直接插入排序 实现步骤: 动图演示: 特性总结: 代码实现: 1.3 希尔排序(缩小增量排序) 基本思想: 步骤演示&…

如果jupyter notebook不能实现网页自动跳转,参考下面的链接

一招搞定Jupyter-notebook命令行打开之后不能自动跳转浏览器_一招搞定jupter notebook命令行打开之后-CSDN博客

MongodDB实现用户名密码远程登录的配置步骤

1. 引入 根据参考1,在CentOS7上搭建了MongodDB6.0。 搭建后,参考2中的步骤,进行配置,就能使用mongosh命令来连接mongo,也可以实现远程登录。 但是,此时不需要密码,就能连接上MongoDB&#xff0…

OpenCV学习(2.1) 初识图像

1.图像对象 图像是由一个个像素组成的,像素越多,体现到图像就是更加清晰,有更多的细节。举个例子,通常来说的分辨率,1080P,720P,480P就是指像素的数量,数量越多就越清晰。 2.打印图…

pip安装报错解决之后,手动安装太麻烦,怎么办

在使用pip install package_name安装公共库的时候,经常会报错: Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>pip install hatch WARNING: Ignoring invalid distribution -ip (d:\soft\python\py…

日拱一卒,功不唐捐

"日拱一卒,功不唐捐"是一句富有哲理的成语,源自中国的文化背景,结合了象棋术语和佛家理念,具有深刻的寓意。 日拱一卒:这里的“卒”指的是中国象棋中的兵(或卒),按照规则…

初级爬虫的总结一

初级爬虫的总结一之百度网页爬虫 一、寻找正确的sugrec二、url拼接出问题,解决办法 我遇到的问题: 1、没有找对网页sugrec,导致connect-type没有找对,以及一些小问题 2、url拼接时候出现乱码 一、寻找正确的sugrec 1、打开百度网…