shell脚本实战案例---数据库的备份-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

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】安装

[root@localhost ~]# yum install -y mysql-community-server-5.7.14-1.el7.x86_64.rpm 
# 由信息得知下面几个都得安装  
[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  
# 由于之前安装了别的数据库所以冲突了需要卸载下面这个  
[root@localhost ~]# yum remove mariadb-libs  
# 重新安装上面的

【4】启动

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

【5】查看

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

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

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

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

[root@node11 ~]# mysql -uroot -p    进入数据库
Enter password: 
# 创建数据库db1和其中的两张表
mysql> create database db1;
mysql> use db1;
create table dept (dept1 int ,dept_name varchar(11));
insert into dept values
(101,'财务'),
(102,'销售'),
(103,'IT技术'),
(104,'行政');

create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);
insert into emp values
(1789,'张三',35,'1980/1/1',4000,101),
(1674,'李四',32,'1983/4/1',3500,101),
(1776,'王五',24,'1990/7/1',2000,101),
(1568,'赵六',57,'1970/10/11',7500,102),
(1564,'荣七',64,'1963/10/11',8500,102),
(1879,'牛八',55,'1971/10/20',7300,103);

# 创建数据库db2和其中的两张表
mysql> create database db2;
mysql> use db2;
CREATE TABLE `t_dept` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `deptName` VARCHAR(30) DEFAULT NULL,
 `address` VARCHAR(40) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');


CREATE TABLE `t_emp` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(20) DEFAULT NULL,
  `age` INT(3) DEFAULT NULL,
 `deptId` INT(11) DEFAULT NULL,
empno int  not null,
 PRIMARY KEY (`id`),
 KEY `idx_dept_id` (`deptId`)
 #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
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】首先我们获取数据库列表

[root@node11 ~]# mysql --help | grep skip    # -N选项跳过列名
  -N, --skip-column-names 
                      (Defaults to on; use --skip-reconnect to disable.)
                      (Defaults to on; use --skip-ssl to disable.)

[root@node11 ~]# mysql -uroot -p'MySQL@123' -N -e 'show databases' | egrep -v "information_schema|mysql|performance_schema|sys"

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

[root@node11 scripts]# vim datab_1.sh
#!/bin/bash

for db in $DBS
do
    echo 备份$db
done

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

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

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

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

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

[root@node11 scripts]# vim datab_2.sh 
#!/bin/bash

# define var
OPT="-uroot -pMySQL@123"
EX_DB="information_schema|mysql|performance_schema|sys"
DBS=$(mysql ${OPT} -N -e 'show databases' | egrep -v ${EX_DB})
BAK_DIR=/backup/mysql


[ -d $BAK_DIR ] || mkdir -p $BAK_DIR
# main program
for db in $DBS
do
    mysqldump ${OPT} -B $db > ${BAK_DIR}/${db}_$(date +%F).sql
done
[root@node11 scripts]# sh  datab_2.sh     # 执行脚本
-n检测语法是否有错误
-x跟踪脚本发现错误

2.2 分表备份

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

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

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

[root@node11 scripts]# vim tab_1.sh
#!/bin/bash

for tab in $TABS
do
    echo 备份表$tab
done

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

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

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

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

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

[root@node11 scripts]# vim tab_2.sh 
#!/bin/bash

# define var
OPT="-uroot -pMySQL@123"
DBS=db1
TABS=$(mysql ${OPT} -N -e "show tables from ${DBS}")
BAK_DIR=/backup/mysql/db1

[ -d $BAK_DIR ] || mkdir -p $BAK_DIR
# main program
for tab in $TABS
do
    mysqldump ${OPT} $DBS $tab > ${BAK_DIR}/${DBS}_${tab}_$(date +%F).sql
done
[root@node11 scripts]# sh tab_2.sh

2.3 分库分表备份

[root@node11 scripts]# vim all.sh
#!/bin/bash

# define var
OPT="-uroot -pMySQL@123"
EX_DB="information_schema|mysql|performance_schema|sys"
BAK_DIR=/backup/mysql

DBS=$(mysql ${OPT} -N -e 'show databases' | egrep -v ${EX_DB})

# main program
for db in $DBS
do
    [ -d ${BAK_DIR}/$db ] || mkdir -p ${BAK_DIR}/$db
    mysqldump ${OPT} -B $db > ${BAK_DIR}/${db}/${db}_$(date +%F).sql
    TABS=$(mysql ${OPT} -N -e "show tables from $db")

    for tab in $TABS
    do
        mysqldump ${OPT} $db $tab > ${BAK_DIR}/${db}/${db}_${tab}_$(date +%F).sql
    done
done

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: shell数据库