• shell脚本实战案例---数据库的备份


    目录

    1.环境准备

    2.数据库的分库分表备份

    2.1 分库备份

    2.2 分表备份

    2.3 分库分表备份


    通过此次shell脚本实战案例,我们将学习和了解到如何利用shell脚本实现数据库的分库分表备份。

    1.环境准备

    要实现数据库的备份,首先我们应该要有数据库的环境,以及需要备份的数据

    在这里我们就使用rpm包的方式安装数据库

    【1】先从官网下载rpm安装包,上传至服务器

    https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.14-1.el7.x86_64.rpm-bundle.tar

    【2】解压

     [root@localhost ~]# tar -xf mysql-5.7.14-1.el7.x86_64.rpm-bundle.tar

    【3】安装

    1. [root@localhost ~]# yum install -y mysql-community-server-5.7.14-1.el7.x86_64.rpm
    2. # 由信息得知,下面几个都得安装  
    3. [root@localhost ~]# yum install -y mysql-community-server-5.7.14-1.el7.x86_64.rpm mysql-community-libs-5.7.14-1.el7.x86_64.rpm mysql-community-client-5.7.14-1.el7.x86_64.rpm mysql-community-common-5.7.14-1.el7.x86_64.rpm  
    4. # 由于之前安装了别的数据库,所以冲突了,需要卸载下面这个  
    5. [root@localhost ~]# yum remove mariadb-libs  
    6. # 重新安装上面的

    【4】启动

    [root@node11 ~]# systemctl enable --now mysqld

    【5】查看

    1. [root@node11 ~]# ps -ef | grep mysqld
    2. [root@node11 ~]# netstat -lnupt | grep 3306

    【6】进入数据库,修改密码

    1. [root@node11 ~]# grep password /var/log/mysqld.log # 查看密码
    2. [root@node11 ~]# mysql -uroot -p # 登录数据库
    3. Enter password:
    4. mysql> alter user root@localhost identified by 'MySQL@123'; # 修改密码
    5. Query OK, 0 rows affected (0.00 sec)
    6. mysql> show variables like '%char%'; # 查看字符集
    7. # 永久修改如下:
    8. mysql> \q
    9. Bye
    10. [root@node11 ~]# vim /etc/my.cnf
    11. [mysqld]
    12. character-set-server = utf8
    13. [root@node11 ~]# systemctl restart mysqld # 重启数据库服务

     【7】创建数据库,创建表,导入数据

    1. [root@node11 ~]# mysql -uroot -p 进入数据库
    2. Enter password:
    3. # 创建数据库db1和其中的两张表:
    4. mysql> create database db1;
    5. mysql> use db1;
    6. create table dept (dept1 int ,dept_name varchar(11));
    7. insert into dept values
    8. (101,'财务'),
    9. (102,'销售'),
    10. (103,'IT技术'),
    11. (104,'行政');
    12. create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);
    13. insert into emp values
    14. (1789,'张三',35,'1980/1/1',4000,101),
    15. (1674,'李四',32,'1983/4/1',3500,101),
    16. (1776,'王五',24,'1990/7/1',2000,101),
    17. (1568,'赵六',57,'1970/10/11',7500,102),
    18. (1564,'荣七',64,'1963/10/11',8500,102),
    19. (1879,'牛八',55,'1971/10/20',7300,103);
    20. # 创建数据库db2和其中的两张表
    21. mysql> create database db2;
    22. mysql> use db2;
    23. CREATE TABLE `t_dept` (
    24. `id` INT(11) NOT NULL AUTO_INCREMENT,
    25. `deptName` VARCHAR(30) DEFAULT NULL,
    26. `address` VARCHAR(40) DEFAULT NULL,
    27. PRIMARY KEY (`id`)
    28. ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    29. INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
    30. INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
    31. INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
    32. INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
    33. INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
    34. INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');
    35. CREATE TABLE `t_emp` (
    36. `id` INT(11) NOT NULL AUTO_INCREMENT,
    37. `name` VARCHAR(20) DEFAULT NULL,
    38. `age` INT(3) DEFAULT NULL,
    39. `deptId` INT(11) DEFAULT NULL,
    40. empno int not null,
    41. PRIMARY KEY (`id`),
    42. KEY `idx_dept_id` (`deptId`)
    43. #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
    44. ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    45. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
    46. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
    47. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
    48. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
    49. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
    50. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
    51. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
    52. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
    53. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
    54. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010);

     最后查看一下,确保数据无误。

    2.数据库的分库分表备份

    此次实验,我们利用自带的mysqldump工具,实现数据库的分库分表备份

    [root@node11 ~]# mkdir -p /server/scripts        # 脚本路径
    [root@node11 ~]# mkdir -p /backup/mysql        # 数据库备份路径

    2.1 分库备份

    【1】首先我们获取数据库列表

    1. [root@node11 ~]# mysql --help | grep skip # -N选项:跳过列名
    2. -N, --skip-column-names
    3. (Defaults to on; use --skip-reconnect to disable.)
    4. (Defaults to on; use --skip-ssl to disable.)
    5. [root@node11 ~]# mysql -uroot -p'MySQL@123' -N -e 'show databases' | egrep -v "information_schema|mysql|performance_schema|sys"

    【2】然后我们实现循环遍历数据库

    1. [root@node11 scripts]# vim datab_1.sh
    2. #!/bin/bash
    3. for db in $DBS
    4. do
    5. echo 备份$db
    6. done

    【3】其次备份数据库语句的实现

    1. [root@node11 scripts]# mysqldump -uroot -p'MySQL@123' -B db1 > /backup/mysql/db1_$(date +%F).sql
    2. # 注意:-B作用:创建数据库和切换数据库,不加-B时,在恢复时必须手动创建数据库
    3. [root@node11 scripts]# ll /backup/mysql/
    4. -rw-r--r-- 1 root root 2940 Oct 29 03:36 db1_2023-10-29.sql

    【4】最后分库备份的参考代码

    刚才备份的SQL语句全部删掉,进行测试

    上面的分步骤中,数据库固定,下面的脚本中要进行修改

    1. [root@node11 scripts]# vim datab_2.sh
    2. #!/bin/bash
    3. # define var
    4. OPT="-uroot -pMySQL@123"
    5. EX_DB="information_schema|mysql|performance_schema|sys"
    6. DBS=$(mysql ${OPT} -N -e 'show databases' | egrep -v ${EX_DB})
    7. BAK_DIR=/backup/mysql
    8. [ -d $BAK_DIR ] || mkdir -p $BAK_DIR
    9. # main program
    10. for db in $DBS
    11. do
    12. mysqldump ${OPT} -B $db > ${BAK_DIR}/${db}_$(date +%F).sql
    13. done
    14. [root@node11 scripts]# sh datab_2.sh # 执行脚本
    15. -n:检测语法是否有错误
    16. -x:跟踪脚本,发现错误

    2.2 分表备份

    【1】首先我们获取数据库中表

    [root@node11 scripts]# mysql -uroot -pMySQL@123 -N -e 'show tables from db1'

    【2】然后我们实现循环遍历数据库中的表

    1. [root@node11 scripts]# vim tab_1.sh
    2. #!/bin/bash
    3. for tab in $TABS
    4. do
    5. echo 备份表$tab
    6. done

    【3】其次备份数据库中的表的语句

    1. [root@node11 mysql]# mkdir db1
    2. [root@node11 scripts]# mysqldump -uroot -pMySQL@123 db1 emp > /backup/mysql/db1/db1_emp_$(date +%F).sql

    【4】最后分库备份的参考代码

    刚才备份的SQL语句全部删掉,进行测试

    上面的分步骤中,数据库固定,下面的脚本中要进行修改

    1. [root@node11 scripts]# vim tab_2.sh
    2. #!/bin/bash
    3. # define var
    4. OPT="-uroot -pMySQL@123"
    5. DBS=db1
    6. TABS=$(mysql ${OPT} -N -e "show tables from ${DBS}")
    7. BAK_DIR=/backup/mysql/db1
    8. [ -d $BAK_DIR ] || mkdir -p $BAK_DIR
    9. # main program
    10. for tab in $TABS
    11. do
    12. mysqldump ${OPT} $DBS $tab > ${BAK_DIR}/${DBS}_${tab}_$(date +%F).sql
    13. done
    14. [root@node11 scripts]# sh tab_2.sh

    2.3 分库分表备份

    1. [root@node11 scripts]# vim all.sh
    2. #!/bin/bash
    3. # define var
    4. OPT="-uroot -pMySQL@123"
    5. EX_DB="information_schema|mysql|performance_schema|sys"
    6. BAK_DIR=/backup/mysql
    7. DBS=$(mysql ${OPT} -N -e 'show databases' | egrep -v ${EX_DB})
    8. # main program
    9. for db in $DBS
    10. do
    11. [ -d ${BAK_DIR}/$db ] || mkdir -p ${BAK_DIR}/$db
    12. mysqldump ${OPT} -B $db > ${BAK_DIR}/${db}/${db}_$(date +%F).sql
    13. TABS=$(mysql ${OPT} -N -e "show tables from $db")
    14. for tab in $TABS
    15. do
    16. mysqldump ${OPT} $db $tab > ${BAK_DIR}/${db}/${db}_${tab}_$(date +%F).sql
    17. done
    18. done

    后续可以结合计划任务进行数据库的备份。

  • 相关阅读:
    学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义
    链表经典算法题目
    yum的nginx平滑升级
    了解一下Monorepo
    举个栗子~Tableau 技巧(231):学做卷起来的时间螺旋图
    AOP 面向切面编程
    从零开始的C++(五)
    Java习题:第三章 面向对象
    同步和异步
    前端面试题(JS部分)
  • 原文地址:https://blog.csdn.net/m0_71840604/article/details/134094212