mysql之lvm快照方式备份恢复

好像一般大家都不用这个吧,这里也仅是当做记录吧。

其实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]>

j_0004.gif


你可能感兴趣的:(mysql,mysql备份,lvm)