MySQL基于LVM快照的备份恢复(2)

4、备份数据库
4.1、准备备份目录
[root@mariadb mysql55]# mkdir -pv /backup/`date +%F`/{data,binlog} 
#以日期命令一个目录,在内还创建data和binlog目录,分别用来存放数据和二进制日志信息

4.2、修改变量、请求全表读锁
mysql> SET GLOBAL sync_binlog=1; #设置此变量为1,让每个事件尽可能同步到二进制日志文件里,以消耗IO来尽可能确保数据一致性
mysql> SHOW MASTER STATUS; #查看二进制日志和position,此信息保存在/backup/2015-04-14/binlog的binlog.txt里
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000016 |  1068076 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> FLUSH LOGS; #刷新日志
mysql> FLUSH TABLES WITH READ LOCK; #读锁请求到后不要关闭此mysql交互界面

在innodb表中,即使是请求到了读锁,但InnoDB在后台依然可能会有事务在进行读写操作,可用"mysql> SHOW ENGINE INNODB STATUS;"查看后台进程的状态,等没有写请求后再做备份。
4.2、创建快照
以只读的方式创建一个1GB大小的快照卷data-snap:
[root@mariadb mysql55]# lvcreate --snapshot /dev/mygroup/mysqldata -n data-snap --size 1G --permission r

查看快照卷的详情(快照卷也是LV):
[root@mariadb mysql55]# lvdisplay

4.3、解除锁定
回到锁定表的mysql交互式界面,解锁:
mysql> UNLOCK TABLES;
mysql> SET GLOBAL sync_binlog=0;  #此参数可以根据服务器磁盘IO的负载来调整

4.4、挂载快照卷并备份数据
[root@mariadb ~]# mount /dev/mygroup/data-snap /tmp/  #挂载快照卷
[root@mariadb ~]# ls /tmp/data/
ibdata1  ib_logfile0  ib_logfile1  mariadb.pid  mydb1  mydb2  mysql  performance_schema  test
[root@mariadb mysql55]# cp -aR /tmp/data /backup/2015-04-14/data/  #备份数据
[root@mariadb mysql55]# ls /backup/2015-04-14/data/data/
ibdata1  ib_logfile0  ib_logfile1  mariadb.pid  mydb1  mydb2  mysql  performance_schema  test

4.5、释放快照卷

[root@mariadb ~]# umount /tmp/
[root@mariadb ~]# lvremove /dev/mygroup/data-snap
Do you really want to remove active logical volume data-snap? [y/n]: y
  Logical volume "data-snap" successfully removed

5、数据灾难恢复

破坏数据,把数据目录下的所有文件都删除:
[root@mariadb mysql55]# rm -rf /mnt/mydata/data/*
[root@mariadb mysql55]# service mysqld stop  #PID文件也被删掉了,无法正常停止服务
 ERROR! MySQL server PID file could not be found!
[root@mariadb mysql55]# killall mysqld

把备份数据copy到数据目录:
[root@mariadb mysql55]# cp -Ra /backup/2015-04-14/data/data/* /mnt/mydata/data/
[root@mariadb mysql55]# ll /mnt/mydata/data/  #确认各文件的权限是否为mysql
启动服务:
[root@mariadb mysql55]# service mysqld start
Starting MySQL SUCCESS!

检查数据是否已恢复:
mysql> SHOW DATABASES;
+--------------------+
| Database          |
+--------------------+
| information_schema |
| mydb1              |
| mydb2              |
| mysql              |
| performance_schema |
| test              |
+--------------------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM mydb1.tb1;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |  10 |
|  2 | jack |  20 |
|  3 | zcj  |  18 |
+----+------+------+

6、总结

基于LVM的数据备份方案几乎实现了热备,只是在请求读锁时会影响线上的业务,一旦当读锁请求到,创建快照几乎是瞬间完成,快照卷创建好后就可解除锁定,而备份就像复制或归档文件一样简单。数据恢复时只需要关闭mysql进程,把备份的数据复制到相应的数据目录,确保数据目录权限正确,启用服务即可,由于是直接复制的数据文件,所以索引不用重建。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5c8adad6c01dc18980a42251071ef5a1.html