好像一般大家都不用這個吧,這裏也僅是當做記錄吧。
其實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]>