今天给大家带来的是关于数据库备份与恢复的教程,当我们手贱或者不知道什么原因导致数据库的崩溃,甚至删除数据库时怎么办,总不能跑路吧?所以我们做好日常的备份和相关的灾后重建很有必要。
那么备份都有什么方式,方法呢?一,文件备份,就是很笨的把所有的文件的都一一拷贝到我们准备好的各种存储设备上,但是此种方法缺乏时效性,需要冷备,就是把服务停掉,慢慢拷,而且只能作用与少量数据备份,太多的话装不下,功能性贼弱,二,逻辑备份,重数据库中导出数据而另进行的备份,优点是编辑器简单,恢复简单,缺点是备份是数据较大时,备份较慢,所以我们推出了完全备份和差异备份还有增量备份,完全备份顾名思义就是把数据库完全备份下来,不过我们可以把它和差异备份和增量备份相结合,差异备份就是备份的数据是上一次全备份之后新增加的和修改过的数据,增量备份就是备份的数据是上一次备份后增加的和修改过的数据,有的小伙伴就蒙圈了,这是什么鬼?那么给你一张图就能很好的体现出三种方式备份的区别。
总的来说我们的完全备份和增量备份,是和楼梯结构差不多,一级一级的去备份,当我们恢复的时候,当然也是一级一级的去恢复,而差异备份则不然,它和完全备份结合时,是相对于全备份而言的,当有一天数据丢失时,直接使用全备份和前一天的备份就能很快找到我们的数据。
今天我们就先来实验一下完全备份+增量备份。
完全备份我们使用的是mysqldump工具,增量备份我们使用的是二进制日志方式实现,那么具体怎么操作呢?
实验环境:centos7虚拟机一台,安装完成mysql
第一步:准备备份目录,更改所属人,所属组
mkdir /backup
chown mysql:mysql /backup/
第二步:准备备份数据库及表
mysql
create database qiangge;
use qiangge;
create tabel zao(id int not null,name char(20));
第三步:进行完整备份
mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 >/backup/`date +%F-%T`-all.sql
# --all-databases:全部的数据库
# --lock-all-tables:锁全部表(为了保持数据一致性)
# --flush-log:刷新二进制文件从内存写入硬盘
# --master-data=2:导出的语句chage master to被注释
第四步:向表中插入数据
mysql
use qiangge;
insert into zao values (01,'jerry'),(02,'tom'),(03,'dog'),(04,'cat');
第五步:进行增量备份,备份称二进制日志
vim /etc/my.cnf
[mysqld]
log-bin=bl
systemctl restart mariadb
mysqlbinlog --start-position=NUM1 --stop-position=NUM2 /var/lib/mysql/bl.000002 > /backup/`date +%F-%T`-bl.sql
#NMU1,NUM2都是查看bl.000002,具体的方法是mysqlbinlog bl.000002,如果bl.000002没有,那就找一下bl.000001,at NUM1开头,中间夹着SQL语句,COMMIT/*!*/;结尾的一段,上面有end_log_pos NUM2。
第六步:继续插入数据,在没有备份的情况下删除数据库,模拟误操作
mysql
use qiangge;
insert into zao values (06,'mile fly'),(07,'usaf');
drop database qiangge;
第七步:数据恢复,由于最后我们没有备份就删除了数据库,所以我们首先需要保护最后的二进制日志,查看删除操作之前的position值:mysqlbinlog 二进制文件。
第八步:将最后操作的二进制日志备份
mysqlbinlog --start-position=NUM3 --stop-position=NMU4 二进制日志 >/backup/`date +%F-%T`-bl2.sql
第九步:导入之前备份的数据库
mysql
mysql
mysql
第十步:查看数据库的恢复
mysql
select * from qiangge.zao;
完成。我们可以查看到我们成功的完成了数据库的恢复。
然后,我们第二个实验的方法是基于一个小工具xtrabackup,它有更简单的命令和备份速度快,还原快,备份可靠,节省磁盘的等等一大堆优点,还可以自动实现备份检验。
首先,我们先要安装一个包,yum源就可以
yum install percona-xtrabackup
然后新建一个目录专门存储备份数据
mkdir /backup
1 完全备份
innobackupex --user=root /backup/
2 添加数据
mysql
create database qiangge;
use qiangge;
create table six(id int,name char(20));
insert into six values (1,'haha'),(2,'hehe');
3 增量备份
innobackupex --incremental /backup/ --incremental-basedir=/backup/2017-11-16_23-55-11/
4 删除数据库
mysql
drop database qiangge;
5 数据恢复前准备
为什么要准备呢?因为因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态,所以已提交的事务要重放,合并到完全备份上,没提交事务的要回滚.
innobackupex --apply-log --redo-only /backup/2017-11-16_23-55-11
innobackupex --apply-log --redo-only /backup/2017-11-16_23-55-11 --incremental-dir=/backup/2017-11-16_23-57-12
#一定要用绝对路径,此处为坑,笔者当时切到该目录下,可以补全,以为可以使用相对路径,结果排了半下午的错
6 恢复阶段,数据恢复
innobackupex --copy-back /backup/2017-11-16_23-55-11
此时它会提醒我们/var/lib/mysql是非空的,这是为什么呢?因为该目录下的是数据库数据,它会直接把所有的数据恢复到该目录,我们直接删除此目录。
rm -rf /var/lib/mysql/*
再次执行该命令,发现还有问题,我们更改一下目录的所有人,所属组
chown -R mysql.mysql /var/lib/mysql
systemctl restart mysql
然后成功,进入瞅一眼,数据库完全ok的啦!
最后我们要再来一个lvm2快照和binlog的结合,就是逻辑卷快照和二进制日志结合使用的数据备份和恢复。
1 首先添加一块硬盘,作为逻辑卷
2 添加物理卷
pvcreate /dev/sdb1
3 添加卷组
vgcreate myvg /dev/sdb1
4 添加逻辑卷
lvcreate -n mydata -L 5G myvg
5 格式化逻辑卷
mkfs.ext4 /dev/mapper/myvg-mydata
6 挂载逻辑卷
mount /dev/mapper/myvg-mydata /lvm_data
7 修改mysql配置文件,使得数据文件在逻辑卷上 datadir=/lvm_data
8 重启mariadb服务
9 创建数据库,进行操作
mysql
create database qiangge;
use qiangge;
create table six(id int,name char(20));
insert into six values (1,'six'),(2,'sixsix');
10 锁定表
mysql
flush tables read lock;
11 创建快照卷
lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvgmydata
12 解锁所有表
mysql
unlock tables;
13 挂载快照卷
mount /dev/myvg/mydata-snap /lvm_snap/
14 打包物理备份
tar cvf /tmp/mysqlback.tar ./*
15 卸载snap
umount /lvm_snap/
16 删除snap
lvremove myvg mydata-snap
17 删除数据库
rm -rf /lvm_data/*
18 解压恢复数据库
tar -xvf /tmp/mysqlback.tar ./
19 验证数据是否恢复
上面的三种方式可以应付日常管理备份恢复了,那么具体他们的区别是什么呢?笔者总结了一下