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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章