利用LVM快照備份mysql數據庫

利用LVM的快照功能做MySQL數據庫備份,這種方法最大的好處是完全不影響MySQL的運行,這是一種幾乎熱備的備份方式。


一、步驟
1、首先對數據庫施加讀鎖
2、記錄二進制日誌文件的文件名和事件位置
3、創建快照卷
4、解鎖數據庫
5、掛載快照卷,複製數據文件
6、刪除快照卷


二、準備工作

首先,要對LVM的快照有所瞭解(http://svenman.blog.51cto.com/6867097/1357510這篇博客寫了LVM的快照),並將數據文件放在LVM上。

其次,在數據庫中新建一張測試用的表

mysql> select * from data.info;
+-----+-------+------+
| sid | name  | age  |
+-----+-------+------+
|   1 | tom   |   25 |
|   2 | jerry |   26 |
|   3 | jim   |   40 |
|   4 | ccr   |   34 |
|   5 | dss   |   21 |
|   6 | safe  |   44 |
+-----+-------+------+
6 rows in set (0.00 sec)


三、開始備份

1. 首先對數據庫施加讀鎖

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)


2. 記錄二進制日誌文件的文件名和事件位置

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      964 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


3. 創建快照卷

[root@mysql ~]# cat /etc/my.cnf
[client]
user=root
password=mysql
[mysqld]
datadir=/mysql/data
socket=/tmp/mysql.sock
user=mysql
[root@mysql ~]# df -Th
/dev/mapper/myvg-mydata
              ext4    689M  128M  527M  20% /mysql
#可以看到mysql的數據放在myvg下的mydata這個邏輯捲上
[root@mysql ~]# lvcreate -n snap-data -L 100M -p r -s /dev/myvg/mydata
  Logical volume "snap-data" created
#快照完成


4. 解鎖數據庫

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)


5. 掛載快照卷,複製數據文件

[root@mysql mnt]# mount -o ro /dev/myvg/snap-data /mnt/
[root@mysql mnt]# cd /mnt/
[root@mysql mnt]# ls
data  lost+found
[root@mysql mnt]# tar -jcvf /root/mysql-backup-`date +%F`.tar.bz2 data/
[root@mysql mnt]# cd ~
[root@mysql ~]# ls
anaconda-ks.cfg  install.log  install.log.syslog  mysql-backup-2014-02-22.tar.bz2


6. 刪除快照卷

[root@mysql ~]# umount /mnt/
[root@mysql ~]# lvremove /dev/myvg/snap-data
Do you really want to remove active logical volume snap-data? [y/n]: y
  Logical volume "snap-data" successfully removed

這樣就備份完成了。


三、恢復測試

1. 在新建的info表中再插入2行數據

mysql> insert into info(name,age) values('seven',30),('eight',49);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0


2. 備份上次lvm快照開始的position號以後的二進制文件

[root@mysql ~]# mysqlbinlog --start-position=964 /mysql/data/mysql-bin.000002 > /root/bak.sql

mysqlbinlog的用法:

  A.指定恢復時間     --start-date和--stop-date選項,格式“2014-2-22 16:33:04”

  B.指定恢復位置     --start-position和--stop-position選項


3. 刪除所有文件

[root@mysql ~]# service mysqld stop
[root@mysql ~]# rm /mysql/* -fr


4. 開始恢復(LVM完全備份的恢復

[root@mysql ~]# tar -jxvf mysql-backup-2014-02-22.tar.bz2 -C /mysql/
[root@mysql ~]# service mysqld start
Starting MySQL                                             [  OK  ]
[root@mysql ~]# mysql
mysql> select * from data.info;
+-----+-------+------+
| sid | name  | age  |
+-----+-------+------+
|   1 | tom   |   25 |
|   2 | jerry |   26 |
|   3 | jim   |   40 |
|   4 | ccr   |   34 |
|   5 | dss   |   21 |
|   6 | safe  |   44 |
+-----+-------+------+
6 rows in set (0.00 sec)

進行LVM快照後,我們新插入的數據沒有恢復過來


5. 利用二進制文件基於時間點恢復(增量備份的恢復

mysql> source /root/bak.sql
#這是第2步從二進制文件中導出的腳本
mysql> select * from data.info;
+-----+-------+------+
| sid | name  | age  |
+-----+-------+------+
|   1 | tom   |   25 |
|   2 | jerry |   26 |
|   3 | jim   |   40 |
|   4 | ccr   |   34 |
|   5 | dss   |   21 |
|   6 | safe  |   44 |
|   7 | seven |   30 |
|   8 | eight |   49 |
+-----+-------+------+
8 rows in set (0.00 sec)
#新插入的2行數據也恢復了

這樣,完全備份+增量備份的備份和恢復就完成了。


附:

邏輯備份工具mysqldump介紹

-u                        #指定用戶名
-p                        #指定用戶密碼
-h                        #指定主機地址
-A|--all-databases        #備份所有數據庫
--databases               #備份指定數據庫
--single-transcation      #基於此項可以實現對InnoDB表做熱備份
--flush-logs              #備份之前刷新日誌
--lock-all-tables         #執行備份時爲所有表請求加鎖
-E|--events               #備份事件調度器代碼
-R|--routines             #備份存儲過程和存儲函數
--triggers                #備份觸發器
--master-data=2           #該選項將會記錄binlog的日誌位置與文件名並追加到文件中,如果爲1將會輸出CHANGE

#導出全庫
mysqldump  -u root  -p  --all-databases > dump.sql
#導出單個庫,或者單個庫中的某個表
mysqldump --u root -p data > dump.sql
mysqldump --u root -p data info > dump.sql
#導出多個數據庫
mysqldump --u root -p  --databases data mysql > dump.sql

--ignore-table             #備份時排除某張表

mysqldump -u user -ppasswd dbname --ignore-table=dbname.tableName > dump.sql


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