MySQL基於LVM快照的備份恢複

來源:互聯網
上載者:User

MySQL基於LVM快照的備份恢複

目錄
1、資料庫全備份
2、準備LVM卷
3、資料恢複到LVM卷
4、基於LVM快照備份資料
5、資料災難恢複
6、總結

寫在前面:
測試環境中已安裝有mysql 5.5.36資料庫,但資料目錄沒有存放在LVM卷,此次要示範基於LVM的資料備份和恢複,所以就把mysql的資料先遷移到LVM上再做快照卷的備份。
如果innodb表基於LVM來做備份,那交易記錄檔和資料檔案要在同一個LVM的邏輯卷上,因為在同一時刻我們只能對一個邏輯卷做快照,如果交易記錄與資料檔案不在同一卷上,那做快照後會導致交易記錄的事件與真正資料中提交的事務會不一致。

1、資料庫全備份
先把現有的資料利用mysqldum工具進行全備份:
[root@mariadb ~]# mysqldump -uroot -p123456 --lock-all-tables --flush-logs --events --routines --master-data=2 --all-databases > /backup/data_dir/fulldata-`date +%F` .sql
[root@mariadb ~]# ls /backup/data_dir/
fulldata-2015-04-14.sql
[root@mariadb ~]# service mysqld stop  #停止mysql

2、準備LVM卷

事先準備好兩個卷作為LVM的PV:
[root@mariadb ~]# fdisk -l
Disk /dev/sda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000bf287
  Device Boot      Start        End      Blocks  Id  System
/dev/sda1  *          1          13      102400  83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              13        1926    15360000  83  Linux
/dev/sda3            1926        2056    1048576  82  Linux swap / Solaris
/dev/sda4            2056        6527    35916127+  5  Extended
/dev/sda5            2056        2709    5248011  8e  Linux LVM
/dev/sda6            2710        3363    5253223+  8e  Linux LVM

建立PV:
[root@mariadb ~]# pvcreate /dev/sda5 /dev/sda6
  Physical volume "/dev/sda5" successfully created
  Physical volume "/dev/sda6" successfully created

建立VG:
12 [root@mariadb ~]# vgcreate mygroup /dev/sda5 /dev/sda6
  Volume group "mygroup" successfully created

建立LV:
[root@mariadb ~]# lvcreate -n mysqldata --size 3G mygroup  #大小設定為3GB
  Logical volume "mysqldata" created

格式化LV並掛載:
[root@mariadb ~]# lvdisplay #顯示邏輯卷的詳細資料
[root@mariadb ~]# mke2fs -t ext4 /dev/mygroup/mysqldata #格式化
[root@mariadb ~]# blkid /dev/mygroup/mysqldata #擷取UUID
/dev/mygroup/mysqldata: UUID="f863e626-e34e-4207-b9cb-7fbb9c5b7f1e" TYPE="ext4"
[root@mariadb ~]# mkdir /mnt/mydata #建立掛載目錄

在/etc/fstab檔案中加入下邊一行:
[root@mariadb ~]# vim /etc/fstab
UUID=f863e626-e34e-4207-b9cb-7fbb9c5b7f1e /mnt/mydata  ext4  defaults 0 0
[root@mariadb ~]# mount -a #重新掛載
[root@mariadb ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/mygroup-mysqldata on /mnt/mydata type ext4 (rw)

3、資料恢複到LVM卷

建立資料目錄及使用權限設定:
[root@mariadb ~]# mkdir /mnt/mydata/data
[root@mariadb ~]# chown -R mysql:mysql /mnt/mydata/data
[root@mariadb ~]# vim /etc/my.cnf  #修改資料目錄位置
datadir = /mnt/mydata/data
[root@mariadb ~]# cd /opt/lamp/mysql55/ #切換到mysql的安裝目錄

初始化資料庫:

[root@mariadb mysql55]# scripts/mysql_install_db --user=mysql --datadir=/mnt/mydata/data

修改datadir指向的目錄:

[root@mariadb mysql55]# vim /etc/rc.d/init.d/mysqld 
datadir=/mnt/mydata/data

啟動mysql,很奇怪,在我沒有修改mysqld指令檔中的datadir時也能正常啟動:

[root@mariadb mysql55]# service mysqld start

接入mysql,修改接入密碼匯入備份資料:
mysql> SET PASSWORD FOR root@localhost=PASSWORD('123456');
mysql> FLUSH PRIVILEGES;
mysql> source /backup/data_dir/fulldata-2015-04-14.sql
mysql> show databases;  #資料已恢複
+--------------------+
| Database          |
+--------------------+
| information_schema |
| mydb1              |
| mydb2              |
| mysql              |
| performance_schema |
| test              |
+--------------------+

4、備份資料庫
4.1、準備備份目錄
[root@mariadb mysql55]# mkdir -pv /backup/`date +%F`/{data,binlog} 
#以日期命令一個目錄,在內還建立data和binlog目錄,分別用來存放資料和二進位日誌資訊

4.2、修改變數、請求全表讀鎖
mysql> SET GLOBAL sync_binlog=1; #設定此變數為1,讓每個事件儘可能同步到二進位記錄檔裡,以消耗IO來儘可能確保資料一致性
mysql> SHOW MASTER STATUS; #查看二進位日誌和position,此資訊儲存在/backup/2015-04-14/binlog的binlog.txt裡
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000016 |  1068076 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> FLUSH LOGS; #重新整理日誌
mysql> FLUSH TABLES WITH READ LOCK; #讀鎖請求到後不要關閉此mysql互動介面

在innodb表中,即使是請求到了讀鎖,但InnoDB在後台依然可能會有事務在進行讀寫操作,可用"mysql> SHOW ENGINE INNODB STATUS;"查看後台進程的狀態,等沒有寫請求後再做備份。
4.2、建立快照
以唯讀方式建立一個1GB大小的快照卷data-snap:
[root@mariadb mysql55]# lvcreate --snapshot /dev/mygroup/mysqldata -n data-snap --size 1G --permission r

查看快照卷的詳情(快照卷也是LV):
[root@mariadb mysql55]# lvdisplay

4.3、解除鎖定
回到鎖定表的mysql互動式介面,解鎖:
mysql> UNLOCK TABLES;
mysql> SET GLOBAL sync_binlog=0;  #此參數可以根據伺服器磁碟IO的負載來調整

4.4、掛載快照卷並備份資料
[root@mariadb ~]# mount /dev/mygroup/data-snap /tmp/  #掛載快照卷
[root@mariadb ~]# ls /tmp/data/
ibdata1  ib_logfile0  ib_logfile1  mariadb.pid  mydb1  mydb2  mysql  performance_schema  test
[root@mariadb mysql55]# cp -aR /tmp/data /backup/2015-04-14/data/  #備份資料
[root@mariadb mysql55]# ls /backup/2015-04-14/data/data/
ibdata1  ib_logfile0  ib_logfile1  mariadb.pid  mydb1  mydb2  mysql  performance_schema  test

4.5、釋放快照卷

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

5、資料災難恢複

破壞資料,把資料目錄下的所有檔案都刪除:
[root@mariadb mysql55]# rm -rf /mnt/mydata/data/*
[root@mariadb mysql55]# service mysqld stop  #PID檔案也被刪掉了,無法正常停止服務
 ERROR! MySQL server PID file could not be found!
[root@mariadb mysql55]# killall mysqld

把備份資料copy到資料目錄:
[root@mariadb mysql55]# cp -Ra /backup/2015-04-14/data/data/* /mnt/mydata/data/
[root@mariadb mysql55]# ll /mnt/mydata/data/  #確認各檔案的許可權是否為mysql
啟動服務:
[root@mariadb mysql55]# service mysqld start
Starting MySQL SUCCESS!

檢查資料是否已恢複:
mysql> SHOW DATABASES;
+--------------------+
| Database          |
+--------------------+
| information_schema |
| mydb1              |
| mydb2              |
| mysql              |
| performance_schema |
| test              |
+--------------------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM mydb1.tb1;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |  10 |
|  2 | jack |  20 |
|  3 | zcj  |  18 |
+----+------+------+

6、總結

基於LVM的資料備份方案幾乎實現了熱備,只是在請求讀鎖時會影響線上的業務,一旦當讀鎖請求到,建立快照幾乎是瞬間完成,快照卷建立好後就可解除鎖定,而備份就像複製或歸檔檔案一樣簡單。資料恢複時只需要關閉mysql進程,把備份的資料複製到相應的資料目錄,確保資料目錄許可權正確,啟用服務即可,由於是直接複製的資料檔案,所以索引不用重建。

  • 使用LVM建立彈性磁碟儲存——第一部分 
  • 在Linux中擴充/縮減LVM(第二部分) 
  • 在 LVM中 錄製邏輯卷快照並恢複(第三部分)
  • 在LVM中設定精簡資源撫平卷(第四部分)
  • 使用條塊化I/O管��多個LVM磁碟(第五部分)

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.