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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/657552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Mybatis】映射文件中获取参数的类型是集合或数组处理

基本数据类型的参数或者对象作为参数的情况,在Mybatis还有一些特殊处理的参数类型要特别注意:如果参数类型是集合Collection(List,Set)或者是数组,Mybatis也会把这些类型的参数封装在一个Map对象中传递到xm…

使用Python发送电子邮件

大家好,当我们需要迅速、方便地与他人沟通时,电子邮件是无疑是一种不可或缺的通信工具。无论是在个人生活中还是工作场合,电子邮件都是我们日常生活中的重要组成部分。它不仅能够传递文字信息,还可以发送附件、链接和嵌入式多媒体…

CANDela studio使用小tips

打开软件的时候注意先选择英文,因为双击CDD/CDDT文件默认打开的是德文,所以最正确的打开方式是先打开CANDela studio,再导入CDD,不仅可以避免用德文打开,还能避免vector软件的bug。 不同的版本有不同的权限。 admin有…

uni微信小程序input框过滤中文字节以及规定以外的符号

问题描述 需求是输入账号只能为手机号、邮箱、字母和数字组成的字符串,那么就是所有大小写字母、数字、以及符号 - _ . 四种。 条件限制 微信小程序无法直接通过type属性实现,type属性中没有专门为只允许英文字母的输入类型。详情见input | uni-ap…

【Python】搭建pypi私仓

1. 下载依赖 pip install pypiserver # 命令安装 pypiserver 库 pip install passlib # passlib 包来读取 Apache htpasswd 文件apt-get install -y apache2-utils2. 生成密码 使用htpasswd库在指定路径/path/to/.pypipasswd生成密码文件 htpasswd -c /path/to/.pypipasswd …

数据结构之堆(优先级队列)

前言 在上一章我们讲了二叉树,这一节我们来讲堆(优先级队列),所以想知道堆创建,可以看一下二叉树的一些简单概念。http://t.csdnimg.cn/4jUR6http://t.csdnimg.cn/4jUR6 目录 前言 堆 1.概念 2.优先级队列的模拟实…

补环境——A股市场

补环境 吐环境 1.Proxy对象 Proxy对象由两个部分组成:target、handler target:目标对象 handler:是一个对象,声明了代理target的指定行为,支持的拦截操作,一共13种: get(target,propKey,receiver)&…

【全开源】酒店订单管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的旨在为民宿、酒店、宾馆等提供房态、订单、财务、客史等数据化、信息化的智慧管理工具,实现一站式订房管理,帮助酒店、民宿、宾馆提升管理效率,降低管理成本,提升行业竞争力。 打造高效、便捷的酒…

为什么c语言不对0和NULL做严格的区分?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!这个答案很简单:c语言不区分…

ubuntu中idea创建spark项目步骤

1.前置条件 ubuntu中已经安装idea,jdk,scala,spark 2.打开idea,新建,选择Maven项目 3.在IDEA中,File-Setting-Plugin,下载Scala插件 4.File-project structure,导入插件 4.1在全局库中,选择导入刚才的sca…

HTML 页面布局

慢慢生活,慢慢变好 —— 24.5.28 页面布局 盒子: 页面中所有的元素(标签),都可以看做是一个盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更方便的进行页面布局 盒子模型组成: 内容区域(content)、内边距区域(pa…

什么是知识中台?为什么企业需要知识中台?

如今市面上的企业数不胜数,企业的任何一个小细节都会产生很大的影响。近几年来一直很热门的知识中台备受企业关注。关于如何高效地管理、整合和运用知识,成为了每一家企业都在重点关注的问题。而知识中台,就是为了解决这一问题而诞生的一个全…

鸿蒙开发接口UI界面:【@ohos.router (页面路由)】

页面路由 说明开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。页面路由需要在页面渲染完…

如何在生产环境中以非 Root 用户启动 Kafka

目录 如何在生产环境中以非 Root 用户启动 Kafka1. 创建 Kafka 用户2. 设置目录权限3. 配置 systemd 服务文件4. 启动和启用 Kafka 服务5. 验证 Kafka 服务经验总结 为了在生产环境中以非 root 用户(如 kafka 用户)启动 Kafka,您需要确保 Ka…

Unity之如何使用Localization来实现文本+资源多语言

前言 使用Unity实现本地化(Localization)功能 在当今的游戏开发中,支持多语言已成为一项基本需求。Unity作为主流的游戏开发引擎,提供了强大的本地化工具,使开发者能够方便地为游戏添加多语言支持。本文将介绍如何在U…

Linux 防火墙 firewalld 常用命令

1 防火墙 - firewalld 1.1 开启防火墙 # 临时性开启,服务器重启后会恢复为原来的状态 systemctl start firewalld # 永久性开启(即开机启动),重启服务器后生效 systemctl enable firewalld1.2 关闭防火墙 # 临时性关闭&#xf…

Neural Filters:照片恢复

Ps菜单:滤镜/Neural Filters/恢复/照片恢复 Neural Filters/RESTORATION/Photo Restoration 照片恢复 Photo Restoration借助 AI 强大功能快速恢复旧照片,提高对比度、增强细节、消除划痕。将此滤镜与着色相结合以进一步增强效果。 “照片恢复”滤镜利用…

Vue3 之 动态组件和KeepAlive组件

一、动态组件 1、简介 ​ 在某些业务场景下,页面的某模块具有多个组件但在同一时间只显示一个,需要在多个组件之间进行频繁的切换,如:tab切换等场景。除了可以使用v-if、v-show根据不同条件显示不同组件之外,还可以通…

Sora,数据驱动的物理引擎

文生视频技术 Text-to-Video 近日,Open AI发布文生视频模型Sora,能够生成一分钟高保真视频。人们惊呼:“真实世界将不再存在。” Open AI自称Sora是“世界模拟器”,让“一句话生成视频”的AI技术向上突破了一大截,引…

AI早班车5.22

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…