前提要求:
事務日志跟數據文件必須在同一個卷上;
創建快照卷之前,要請求MySQL的全局鎖;在快照創建完成之後手動釋放鎖;
請求全局鎖完成之後,做一次日志滾動;做二進制日志文件及位置標記(手動進行);
1、為數據施加讀鎖,滾動二進制日志文件並記錄當前二進制文件起始時間段:
2、做快照;
3、釋放讀鎖:
4、掛載快照,將快照裡面的數據復制出來,並刪除快照:
[root@localhost mydata]# mount /dev/VG/mysql /mnt/ -o ro [root@localhost mydata]# mkdir /mysqlback [root@localhost mydata]# cp -a /mnt/ /mysqlback/20141121 [root@localhost mydata]# umount /mnt/ [root@localhost mydata]# lvremove /dev/VG/mysql Do you really want to remove active logical volume mysql? [y/n]: y Logical volume "mysql" successfully removed
5、向一個表插入數據是數據發生改變,要在最後使用二進制日志恢復此信息。
mysql> INSERT INTo newtb values('jack'); Query OK, 1 row affected (0.01 sec) mysql> select * from newtb; +------+ | Name | +------+ | tom | | jack | +------+
2 rows in set (0.00 sec)
6、結合之前記錄的二進制日志開始時間導出成一個文件
[root@localhost mydata]# mysqlbinlog --start-position=107 mysql-bin.000011 > /tmp/20141121.sql
7、將數據庫停止,刪除數據,嘗試恢復數據
8、啟動mysql服務並查看數據是否恢復:
9、使用二進制日志恢復後來創建的用戶:
mysql> source /tmp/20141121.sql;
總結:
備份過程:
1、對MySQL數據庫了施加讀鎖,防止在備份過程中有用戶插入數據而導致備份後的數據不一致
2、回滾日志,使當前狀態的數據做一個完整的備份,之後的數據用二進制日志恢復
3、使用SHOW MASTER STATUS命令記錄日志的開始時間
4、使用lvcreate命令對lv做快照
5、去除讀鎖
恢復過程:
6、將創建好的lv快照掛載到目錄,並將裡面的數據復制出來
7、卸載快照、再刪除快照
8、將從快照復制出來的數據復制到/data/mydata
9、使用mysqlbinlog結合之前記錄的開始時間點導出需要的二進制數據為一個xx.sql文件
10、將sql文件導入數據庫即完成整改恢復過程