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进程,把备份的数据复制到相应的数据目录,确保数据目录权限正确,启用服务即可,由于是直接复制的数据文件,所以索引不用重建。