上一篇写了mariadb的几种复制模型,这次就丢几个maraidb的常用备份恢复模拟吧。 文中用到的数据库hellodb链接 使用的hellodb.sql文件地址 https://pan.baidu.com/s/1uI3Br-HJ8t5-C-_bfZenPg

备份相关知识

为什么要备份

备份主要是用来应对以下的情况:灾难恢复,硬件故障,软件故障,自然灾害,×××恶意×××,人为的误操作导致数据的损坏等。 备份时要关注的重点在于能容忍最多丢失多少的数据量,在如今数据基本和金钱等价的现实下,数据还是能少丢就少丢吧;恢复数据要在多长时间内完成;需要恢复哪些数据。 注意: 单纯做备份是不可行的,做好备份之后还要考虑做的备份是否可用(还原测试);定期做还原演练(在个人机器实验)。

备份的分类

完全备份-整个数据集全部备份。 增量备份-仅仅备份最近一次完全备份或者增量备份(若存在增量)以后的变化的数据,备份速度相对较快,但是还原比较复杂,需要做整合。 差异备份-仅仅备份一次完全备份以来变化的数据,备份速度相对增量备份慢,但是还原简单。 部分备份-只备份数据的子集,例如部分库和部分表。

尽可能要讲数据文件和二进制日志文件分开存放。

冷备:数据库读写操作全部停止直到备份结束。 温备:读操作可以进行,但是无法进行写操作。 热备:读写操作都不受影响,均可正常进行。 MyISAM:温备,不支持热备。 InnoDB:都支持(现在大多都使用,同时还支持事务) 物理备份:直接复制数据文件进行备份,与存储引擎相关,占用空间多,速度快。 逻辑备份:从数据库中导出数据到其他地方存储,与存储引擎无关,占用空间相对较少,速度慢,可能会丢失数据精度。

额外考虑

在进行备份之前我们考虑清楚后才可以进行,毕竟数据无价。 1.做温备时候锁要持续的时间 2.备份过程中会占用多少系统的资源 3.备份会消耗的时间 4.数据恢复时候消耗的时间 5.我们该备份什么 数据 二进制日志,InnoDB事务日志文件 程序代码(指的是数据库的) 服务器的配置文件

几种备份方式的简单演示

简单的cp和tar就不做演示了,cp和tar属于物理备份工具,适用于所有的存储引擎,但是仅仅支持冷备;可以完全备份混合部分备份。

基于LVM的备份

环境

centos7.4 mariadb 10.2.15 这里我的数据目录在/data/mysql 二进制文件目录在/data/binlog

准备mariadb配置

修改数据库的配置文件将二进制文件和数据文件分开存放并且重启数据库,重读配置文件。

	#mariadb的高版本配置文件被拆分到几个文件中去了
	vim /etc/my.cnf.d/server.cnf

	[mysqld]
	#指定数据目录
	datadir=/data/mysql
	#指定二进制文件路径和名称前缀
	log_bin=/data/binlog/mysql-bin
	#将每个数据库都单独存放
	innodb_file_per_table

由于这里实现的是基于LVM的备份因此数据要存放于lvm卷上

	#创建目录
		mkdir /data/{binlog,mysql} -pv
	#挂载逻辑卷
		mount /dev/vg0/lv_data  /data/mysql
		mount /dev/vg0/lv_binlog  /data/binlog
		chown -R mysql:mysql /data/
	#重启数据库
	systemctl restart mariadb
	#如果出现下图提示就执行以下命令
	#低版本一般不会出现,mariadb在10.2.15包括以上要手动重新初始化数据库才能正常启动
	mysql_install_db --datadir=/data/mysql --user=mysql
	systemctl restart mariadb
	```
![](http://i2.51cto.com/images/blog/201806/15/537c9a073bdb1e574a5624e8de9ece56.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### 实现LVM的快照备份
既然要做备份实验那么就先在数据库中导入一些数据,

mysql <hellodb_innodb.sql

![](http://i2.51cto.com/images/blog/201806/15/81c4f4b2bef00056d4cbfedab0bda837.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

1.在数据库添加读锁,限制其他用户写入数据

#进入数据库,我这里没有设密码可以直接登入 mysql #添加读锁 mysql>flush tables with read lock; #查看二进制日志文件,记录文件名和pos编号 mysql>show master logs;

![](http://i2.51cto.com/images/blog/201806/15/d286fab91c03139d6fd46299fc7a74c9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.创建快照,这里要新打开一个终端

lvcreate -n lv_mysql_snap -L 1G -s -p r /dev/vg0/lv_data

3.数据库解锁

mysql>unlock tables;

4.挂载快照并备份数据文件

mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt #复制文件,由于是做演示所以就进备份到本地了 cp -a /mnt/ /backup/

5.删除快照

#卸载 umount /mnt #删除快照(快照存在会影响数据的写入) lvremove /dev/vg0/lv_mysql_snap

到这里备份基本完成
###  实现LVM快照的还原
1.模拟损坏
#模拟在损坏前有用户写入了其他数据信息
mysql> create database db1;
mysql> create database db2;
#删除数据库数据
rm -rf /data/mysql/*
#停止数据库
systemctl stop mariadb
2.还原备份的数据文件
cp -av /backup/*  /data/mysql/
3.禁止外部用户连接
vim /etc/my.cnf.d/server.cnf

#加入以下字段到mysqld skip_networking #重启数据库 systemctl start maraidb

![](http://i2.51cto.com/images/blog/201806/15/09d7d1be74e775870e0d10137dfa3d0a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
4.恢复binlog中最新日志到数据库中,要先登录数据库查看以下master logs

cd /data/binlog/ mysqlbinlog --start-position=8960 mysql-bin.000002 > /backup/bin.sql mysqlbinlog mysql-bin.000003 >> /backup/bin.sql mysqlbinlog mysql-bin.000004 >> /backup/bin.sql mysqlbinlog mysql-bin.000005 >> /backup/bin.sql mysql < /backup/bin.sql

![](http://i2.51cto.com/images/blog/201806/15/98cc5e66dc25b93b325f92c7cadd7dde.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
5.恢复用户访问

vim /etc/my.cnf.d/server.cnf #删除字段 skip_networking systemctl restart mariadb

6.查看数据信息,发现后续添加的信息也恢复了
![](http://i2.51cto.com/images/blog/201806/15/f4cea9d25acc36f188759474db044d7a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)


## 基于mysqldump实现备份恢复
这里是还原了新环境的虚拟机
### 数据库数据文件损坏,如何还原最新状态
这里的前提是要求有着完全备份,而且可以正常获取最新从二进制日志文件

1.完全备份数据库

mysqldump -A -F --single-transaction --master-data=2 > /backup/full.sql

2.修改数据库后破坏数据信息
![](http://i2.51cto.com/images/blog/201806/15/1f8c3fa0eaa3b05f6001061a0820ce17.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

rm -rf /data/mysql/*

3.重启数据库并恢复备份

systemctl stop mariadb mysql_install_db --datadir=/data/mysql --user=mysql

编辑配置文件并禁止其他用户访问

vim /etc/my.cnf.d/server.cnf innodb_file_per_table systemctl start mariadb

#将二进制文件生成sql文件 #查看全备份的sql文件可以看到备份时候的二进制文件和起始位置(如果是恢复失误删除的表可以在整合完二进制文件生成的sql文件后,找到误删除表的语句,删除该语句即可) mysqlbinlog --start-position=385 mysql-bin.000005 >bin.sql

恢复完全备份数据

mysql < /backup/full.sql mysql < bin.sql

![](http://i2.51cto.com/images/blog/201806/15/cbce1fd7c49c6ef1994ab11a2af8128c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
4.修改配置文件删除innodb_file_per_table字段重启即可
![](http://i2.51cto.com/images/blog/201806/15/c911b0edec22d537ef0373d906ba329d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

### 单表备份
单表恢复(涉及表之间的关联问题)
备份

mysqldump hellodb students > /backup/stu_bak.sql

还原备份

mysql hellodb < /backup/stu_bak.sql