標籤:lvm mysql備份
目錄
1、資料庫全備份
2、準備LVM卷
3、資料恢複到LVM卷
4、基於LVM快照備份資料
5、資料災難恢複
6、總結
寫在前面:
測試環境中已安裝有mysql 5.5.36資料庫,但資料目錄沒有存放在LVM卷,此次要示範基於LVM的資料備份和恢複,所以就把mysql的資料先遷移到LVM上再做快照卷的備份。
如果innodb表基於LVM來做備份,那交易記錄檔和資料檔案要在同一個LVM的邏輯卷上,因為在同一時刻我們只能對一個邏輯卷做快照,如果交易記錄與資料檔案不在同一卷上,那做快照後會導致交易記錄的事件與真正資料中提交的事務會不一致。
1、資料庫全備份
先把現有的資料利用mysqldum工具進行全備份:
[[email protected] ~]# mysqldump -uroot -p123456 --lock-all-tables --flush-logs --events --routines --master-data=2 --all-databases > /backup/data_dir/fulldata-`date +%F` .sql[[email protected] ~]# ls /backup/data_dir/fulldata-2015-04-14.sql[[email protected] ~]# service mysqld stop #停止mysql
2、準備LVM卷
事先準備好兩個卷作為LVM的PV:
[[email protected] ~]# fdisk -lDisk /dev/sda: 53.7 GB, 53687091200 bytes255 heads, 63 sectors/track, 6527 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x000bf287 Device Boot Start End Blocks Id System/dev/sda1 * 1 13 102400 83 LinuxPartition 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:
[[email protected] ~]# pvcreate /dev/sda5 /dev/sda6 Physical volume "/dev/sda5" successfully created Physical volume "/dev/sda6" successfully created
建立VG:
[[email protected] ~]# vgcreate mygroup /dev/sda5 /dev/sda6 Volume group "mygroup" successfully created
建立LV:
[[email protected] ~]# lvcreate -n mysqldata --size 3G mygroup #大小設定為3GB Logical volume "mysqldata" created
格式化LV並掛載:
[[email protected] ~]# lvdisplay #顯示邏輯卷的詳細資料[[email protected] ~]# mke2fs -t ext4 /dev/mygroup/mysqldata #格式化[[email protected] ~]# blkid /dev/mygroup/mysqldata #擷取UUID/dev/mygroup/mysqldata: UUID="f863e626-e34e-4207-b9cb-7fbb9c5b7f1e" TYPE="ext4"[[email protected] ~]# mkdir /mnt/mydata #建立掛載目錄
在/etc/fstab檔案中加入下邊一行:
[[email protected] ~]# vim /etc/fstabUUID=f863e626-e34e-4207-b9cb-7fbb9c5b7f1e /mnt/mydata ext4 defaults 0 0[[email protected] ~]# mount -a #重新掛載[[email protected] ~]# 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卷
建立資料目錄及使用權限設定:
[[email protected] ~]# mkdir /mnt/mydata/data[[email protected] ~]# chown -R mysql:mysql /mnt/mydata/data[[email protected] ~]# vim /etc/my.cnf #修改資料目錄位置datadir = /mnt/mydata/data[[email protected] ~]# cd /opt/lamp/mysql55/ #切換到mysql的安裝目錄
初始化資料庫:
[[email protected] mysql55]# scripts/mysql_install_db --user=mysql --datadir=/mnt/mydata/data
修改datadir指向的目錄:
[[email protected] mysql55]# vim /etc/rc.d/init.d/mysqld datadir=/mnt/mydata/data
啟動mysql,很奇怪,在我沒有修改mysqld指令檔中的datadir時也能正常啟動:
[[email protected] mysql55]# service mysqld start
接入mysql,修改接入密碼匯入備份資料:
mysql> SET PASSWORD FOR [email protected]=PASSWORD(‘123456‘);mysql> FLUSH PRIVILEGES;mysql> source /backup/data_dir/fulldata-2015-04-14.sqlmysql> show databases; #資料已恢複+--------------------+| Database |+--------------------+| information_schema || mydb1 || mydb2 || mysql || performance_schema || test |+--------------------+
4、備份資料庫
4.1、準備備份目錄
[[email protected] 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:
[[email protected] mysql55]# lvcreate --snapshot /dev/mygroup/mysqldata -n data-snap --size 1G --permission r
查看快照卷的詳情(快照卷也是LV):
[[email protected] mysql55]# lvdisplay
4.3、解除鎖定
回到鎖定表的mysql互動式介面,解鎖:
mysql> UNLOCK TABLES;mysql> SET GLOBAL sync_binlog=0; #此參數可以根據伺服器磁碟IO的負載來調整
4.4、掛載快照卷並備份資料
[[email protected] ~]# mount /dev/mygroup/data-snap /tmp/ #掛載快照卷[[email protected] ~]# ls /tmp/data/ibdata1 ib_logfile0 ib_logfile1 mariadb.pid mydb1 mydb2 mysql performance_schema test[[email protected] mysql55]# cp -aR /tmp/data /backup/2015-04-14/data/ #備份資料[[email protected] mysql55]# ls /backup/2015-04-14/data/data/ibdata1 ib_logfile0 ib_logfile1 mariadb.pid mydb1 mydb2 mysql performance_schema test
4.5、釋放快照卷
[[email protected] ~]# umount /tmp/[[email protected] ~]# lvremove /dev/mygroup/data-snapDo you really want to remove active logical volume data-snap? [y/n]: y Logical volume "data-snap" successfully removed
5、資料災難恢複
破壞資料,把資料目錄下的所有檔案都刪除:
[[email protected] mysql55]# rm -rf /mnt/mydata/data/*[[email protected] mysql55]# service mysqld stop #PID檔案也被刪掉了,無法正常停止服務 ERROR! MySQL server PID file could not be found![[email protected] mysql55]# killall mysqld
把備份資料copy到資料目錄:
[[email protected] mysql55]# cp -Ra /backup/2015-04-14/data/data/* /mnt/mydata/data/[[email protected] mysql55]# ll /mnt/mydata/data/ #確認各檔案的許可權是否為mysql啟動服務:[[email protected] mysql55]# service mysqld startStarting 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進程,把備份的資料複製到相應的資料目錄,確保資料目錄許可權正確,啟用服務即可,由於是直接複製的資料檔案,所以索引不用重建。
本文出自 “知識需要總結與記錄” 部落格,請務必保留此出處http://zhaochj.blog.51cto.com/368705/1632736
MySQL基於LVM快照的備份恢複