MySQL基於LVM快照的備份恢複

來源:互聯網
上載者:User

標籤: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快照的備份恢複

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.