基於LVM實現MySQL幾乎熱備
幾乎熱備:
對mysql而言,我們如果想實現lvm方式建立快照,在快照建立那一刻,innodb的事物日誌內容可能正在往磁碟上寫,所以必須保證事物日誌和資料檔案必須在同一快照上,如果我們分別對問或路徑建立快照,很有可能造成資料和時間點的不一致,因此就算備份出來也無法恢複
準備工作
將整個資料匯出,以防萬一,如果沒有放在邏輯卷上,那麼則將資料匯出備份並刪除資料目錄,使用lvm方式建立分區並古仔,將資料再覆蓋至原先/mydata/data下 最後初始化資料庫
建立lvm之前必須將mysql資料全部備份並在建立lvm之後對其恢複
[root@test ~]#mysqldump -uroot --lock-all-tables --all-databases --events > /tmp/alldb.sql
刪除資料目錄並建立邏輯卷
[root@test ~]#/etc/init.d/mysqld stop
Shutting downMySQL.. SUCCESS!
[root@test ~]# rm-fr /mydata/
首先進行分區,步驟略過
Device Boot Start End Blocks Id System
/dev/sdb1 1 393 3156741 8e Linux LVM
/dev/sdb2 394 786 3156772+ 8e Linux LVM
建立LVM
root@test ~]#pvcreate /dev/sdb
sdb sdb1 sdb2
[root@test ~]#pvcreate /dev/sdb{1,2}
Physical volume "/dev/sdb1"successfully created
Physical volume "/dev/sdb2"successfully created
[root@test ~]#vgcreate myvg /dev/sdb{1,2}
Volume group "myvg" successfullycreated
[root@test ~]#lvcreate -L 3G -n mydata myvg
Logical volume "mydata" created
[root@test ~]#mke2fs -t ext4 -L MYDATA /dev/
將lvm加入至開機啟動項
[root@test ~]# echo'LABEL=MYDATA/mydata ext4 defaults0 0' >> /etc/fstab
[root@test ~]#mount -a
[root@test ~]# df-h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.3G 4.2G 1.8G 72% /
tmpfs 245M 0 245M 0% /dev/shm
/dev/sda1 194M 28M 156M 16% /boot
/dev/mapper/myvg-mydata
3.0G 69M 2.8G 3% /mydata
建立資料目錄並重新賦值
[root@test ~]#mkdir /mydata/data/
[root@test ~]#chown mysql.mysql -R /mydata/
初始化並啟動mysql
[root@test ~]# cd/usr/local/mysql
[root@test mysql]#scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@test mysql]#/etc/init.d/mysqld start
Starting MySQL....SUCCESS!
匯入資料
首先我們要關閉binlog,使其恢複操作不記錄在二進位記錄檔裡
mysql> setsession sql_log_bin=0;
Query OK, 0 rowsaffected (0.00 sec)
匯入資料庫
mysql> source/tmp/alldb.sql;
mysql> showdatabases;
+--------------------+
| Database |
+--------------------+
|information_schema |
| mydb |
| mysql |
|performance_schema |
| test |
| wpdb |
+--------------------+
6 rows in set (0.00sec)
此時我們的二進位記錄檔可以開啟了,因為是當前會話設定,可以直接退出在進入即可
mysql> setsession sql_log_bin=1;
Query OK, 0 rowsaffected (0.00 sec)
實現幾乎熱備
我們建立快照那一刻起必須保證資料沒有被修改,所以想實現lvm備份必須開啟一個遠程mysql會話將所有表都鎖定,並記錄二進位的位置;
如果mysql資料庫上正在執行一個事物的話,那麼這個請求鎖可能會等待一段時間,等待多久我們是未知的,有可能等待半個小時到一個小時也未可知,但步驟是不可少的。
一旦發現加鎖成功,另啟終端,使用lvcreate命令為資料所在的卷建立快照
對mysql而言,我們如果想實現lvm方式建立快照,在快照建立那一刻,innodb的事物日誌內容可能正在往磁碟上寫,所以必須保證事物日誌和資料檔案必須在同一快照上,如果我們分別對問或路徑建立快照,很有可能造成資料和時間點的不一致,因此就算備份出來也無法恢複