好像一般大家都不用这个吧,这里也仅是当做记录吧。
其实lvm快照不管是什么存储引擎都可以做到接近热备,看起来也还不错的样子。不过却也需要一些所必须的条件。
如:LVM卷,而且也有足够的空闲空间来做快照,并且事务日志也要与数据文件在一起。
好啦,废话不多说,我们先看看怎么用吧。
大体步骤:
1、全局锁。
2、滚动二进制日志,并做好记录
3、创建lvm快照。
4、释放锁。
5、从快照盘手动复制数据。
6、卸载并移除快照盘。
来吧。
先来看看lvm的情况:
[root@nfs backup]# vgs #卷组空闲4G多。我这里够用了。 VG #PV #LV #SN Attr VSize VFree vg0 1 5 0 wz--n- 58.59g 4.82g [root@nfs backup]# lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert mysql vg0 -wi-ao---- 3.00g #mysql的逻辑卷,好小啊。 root vg0 -wi-ao---- 14.65g swap vg0 -wi-ao---- 1.94g usr vg0 -wi-ao---- 19.53g var vg0 -wi-ao---- 14.65g
因为锁定的时间越短越好,所以用两个终端分别操作。
终端A开始在Mysql命令行下创建全局锁。在繁忙的环境下可能要等一会儿。
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; #刷写缓冲区中的信息到磁盘并创建全局锁 Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH LOGS; #滚动二进志日志 Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> SHOW MASTER STATUS; #查看当前日志,并做好记录 +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000002 | 245 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
终端B赶紧创建快照。注意快照盘的大小啊,太小的话会撑爆的。
[root@nfs backup]# lvcreate -L 2G -n backup -s -p r /dev/vg0/mysql Logical volume "backup" created
创建成功,终端A解除锁.
MariaDB [(none)]> UNLOCK TABLE; Query OK, 0 rows affected (0.00 sec)
然后就可以开始复制数据啦,cp或其它命令。
[root@nfs backup]# mount /dev/vg0/backup /mnt/ -r [root@nfs backup]# cp -a /mnt/data . [root@nfs backup]# ls data [root@nfs backup]# cd data [root@nfs data]# ls aria_log.00000001 BA hellodb ib_logfile0 mysql mysql-bin.index nfs.star.com.err performance_schema testdb1 testdb3 aria_log_control DDD ibdata1 ib_logfile1 nfs-slow.log nfs.star.com.pid test testdb2 TTT [root@nfs data]#
复制完成,也就完成了完全备份了。 事务日志可不能删除,里面或许还有已提交或尚未提交的事务。
卸载并移除快照盘。
[root@nfs data]# umount /mnt [root@nfs data]# pwd /backup/data [root@nfs data]# lvremove /dev/vg0/backup Do you really want to remove active logical volume backup? [y/n]: y Logical volume "backup" successfully removed [root@nfs data]#
在我们解除全局锁以后,数据库中可能就已经有数据写入了。 而刚才的备份只是之前的备份。 如果想恢复到最新的状态,就要用二进志日志。 刚才不是记录了一个二进志日志的信息吗,从那个日志以后的所有都是备份之后变化。
所以我们现在再创建一些表,插入一些数据试试。来模拟一下备份之后的数据修改。
MariaDB [(none)]> CREATE DATABASE ABCD; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE TABLE ABCD.tb1 (ID int,name char(30)); Query OK, 0 rows affected (0.03 sec) MariaDB [(none)]> INSERT INTO ABCD.tb1 VALUES (1,'tom'),(2,'lili'),(3,'tonny'); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0
我这里创建了一个ABCD的库,并在库里创建了tb1表,插入了数据。
恢复数据:
模拟数据损坏,把所有数据文件都给删掉。并停止数据库。
[root@nfs data]# ls ABCD aria_log_control DDD ibdata1 ib_logfile1 mysql-bin.000014 nfs-slow.log nfs.star.com.pid test testdb2 TTT aria_log.00000001 BA hellodb ib_logfile0 mysql mysql-bin.index nfs.star.com.err performance_schema testdb1 testdb3 [root@nfs data]# rm -rf * [root@nfs data]# ls [root@nfs data]# killall mysqld [root@nfs binlogs]# service mysqld start #数据库已经不能启动了。 Starting MySQL... [FAILED] [root@nfs binlogs]#
导出从上次记录开始的二进制文件的内容。并用head查看一下,万是文件里面是报错信息呢。
[root@nfs binlogs]# ls master-bin.000001 master-bin.000002 master-bin.index [root@nfs binlogs]# mysqlbinlog --start-position=245 master-bin.000002 > /backup/backup.sql [root@nfs binlogs]# head -n 30 /backup/backup.sql
恢复:
1、把所备份的所有文件复制到数据库目录。
[root@nfs data]# ls #刚才启动数据库所生成的文件。 aria_log.00000001 aria_log_control ibdata1 ib_logfile0 ib_logfile1 nfs-slow.log nfs.star.com.err [root@nfs data]# rm -rf * [root@nfs data]# cp -a /backup/data/* . #把我们备份的数据复制过来 [root@nfs data]# ls aria_log.00000001 BA hellodb ib_logfile0 mysql mysql-bin.index nfs.star.com.err performance_schema testdb1 testdb3 aria_log_control DDD ibdata1 ib_logfile1 mysql-bin.000014 nfs-slow.log nfs.star.com.pid test testdb2 TTT [root@nfs data]# ll #查看权限是否有问题。 [root@nfs data]# service mysqld start Starting MySQL.. [ OK ] [root@nfs data]#
启动成功了。但没有我们刚才创建的库ABCD。
MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | BA | | DDD | | TTT | | hellodb | | mysql | | performance_schema | | test | | testdb1 | | testdb2 | | testdb3 | +--------------------+ 11 rows in set (0.00 sec) MariaDB [(none)]>
2、恢复二进制日志。
MariaDB [(none)]> SET sql_log_bin=0 -> ; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> SHOW VARIABLES LIKE 'sql_log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_log_bin | OFF | +---------------+-------+ 1 row in set (0.00 sec) MariaDB [(none)]> source /backup/backup.sql
3、查看数据。
MariaDB [(none)]> use ABCD; Database changed MariaDB [ABCD]> SHOW TABLES; +----------------+ | Tables_in_ABCD | +----------------+ | tb1 | +----------------+ 1 row in set (0.00 sec) MariaDB [ABCD]> SELECT * FROM tb1; +------+-------+ | ID | name | +------+-------+ | 1 | tom | | 2 | lili | | 3 | tonny | +------+-------+ 3 rows in set (0.00 sec) MariaDB [ABCD]>