標籤:mysql備份、恢複 lvm 熱備 hotbackup
LVM(Logical Volume Management邏輯卷管理)實現幾乎熱備的原理:利用LVM的快照卷達到可以儲存資料庫在某一時刻的瞬時狀態,只需把當時的快照備份出來即可。
LVM的快照原理:簡單的講就是lvm對某個卷建立快照卷後,快照卷則作為原卷的另一個訪問入口,當原卷的資料發生變化時,則先把原卷的內容先複製一份到快照卷,然後才會繼續對原卷資料的修改,這也就是之所以快照卷的容量大小應該大於整個備份過程中資料庫的變化量的原因。所以當備份完成以後,快照卷也就可以拆除了,它的作用就是在備份過程中把發生變化的資料的快照時狀態先拷貝過來一個副本。
用lvm對mysql備份的前提:資料檔案和交易記錄檔應該在同一個卷上,否則快照卷資料和交易記錄時間點不一致,恢複後會引起資料庫錯亂。
原理明白了,操作起來就比較簡單了:
當然要首先準備好lvm卷且保證mysql的datadir和innodb_log_group_home_dir在這個卷上
/* 建立一張新表tb1,並插入一些資料以做測試 */MariaDB [hellodb]> CREATE TABLE tb1(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,Name VARCHAR(30) NOT NULL,Gender ENUM(‘F‘,‘M‘,‘O‘) NOT NULL);Query OK, 0 rows affected (0.11 sec)MariaDB [hellodb]> DESC tb1;+--------+-------------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+--------+-------------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || Name | varchar(30) | NO | | NULL | || Gender | enum(‘F‘,‘M‘,‘O‘) | NO | | NULL | |+--------+-------------------+------+-----+---------+----------------+3 rows in set (0.00 sec)MariaDB [hellodb]> INSERT INTO tb1 (Name,Gender) VALUES (‘Bob‘,‘M‘),(‘Tina‘,‘F‘),(‘Axx‘,‘O‘);Query OK, 3 rows affected (0.03 sec)Records: 3 Duplicates: 0 Warnings: 0/* 備份前為所有表加讀鎖,查看一下當前二進位日誌位置 */MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> SHOW MASTER STATUS;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000007 | 245 | | |+------------------+----------+--------------+------------------+1 row in set (0.01 sec)
/* 再開一個終端,前面mysql會話不要退出 */[[email protected] ~]# mkdir /backup/mydata-`date +%F`/* 也可以將當前二進位位置儲存到檔案,以備恢複時查看 */[[email protected] ~]# mysql -e ‘SHOW MASTER STATUS;‘ > /backup/mydata-2014-07-29/bin-pos-`date +%F-%T`/* 保證有可用的vg */[[email protected] ~]# vgs VG #PV #LV #SN Attr VSize VFree myvg 2 1 0 wz--n- 10.02g 7.02g vg0 3 1 0 wz--n- 29.29g 0 /* 建立快照卷,-L | --size (LogicalVolumeSize) 指定快照卷大小,一定不可以比變化量小,否則會引起快照卷崩潰,備份失敗;-n | --name 指定快照卷名字; -p | --permission 指定快照卷許可權 r唯讀,-s --snap-shot /dev/myvg/mylv 指定要對/dev/myvg/mylv建立快照卷 如果此時資料庫伺服器比較繁忙,則需要等待正在提交的日誌刷寫到磁碟等,可能會需要一定等待時間*/[[email protected] ~]# lvcreate -L 100M -n mydata-snap -p r -s /dev/myvg/mylv Logical volume "mydata-snap" created[[email protected] ~]# mkdir /mnt/snap[[email protected] ~]# mount /dev/myvg/mydata-snap /mnt/snap/mount: block device /dev/mapper/myvg-mydata--snap is write-protected, mounting read-only[[email protected] ~]# cd /mnt/snap/[[email protected] snap]# lsdata lost+found[[email protected] snap]# ls data/aria_log.00000001 ib_logfile0 mysql-bin.000001 mysql-bin.000005 node1.bob.org.erraria_log_control ib_logfile1 mysql-bin.000002 mysql-bin.000006 node1.bob.org.pidhellodb mydb mysql-bin.000003 mysql-bin.000007 performance_schemaibdata1 mysql mysql-bin.000004 mysql-bin.index test[[email protected] snap]# cp -ap /mnt/snap/data/ /backup/mydata-2014-07-29/[[email protected] snap]# ls /backup/mydata-2014-07-29/data/aria_log.00000001 ib_logfile0 mysql-bin.000001 mysql-bin.000005 node1.bob.org.erraria_log_control ib_logfile1 mysql-bin.000002 mysql-bin.000006 node1.bob.org.pidhellodb mydb mysql-bin.000003 mysql-bin.000007 performance_schemaibdata1 mysql mysql-bin.000004 mysql-bin.index test
備份完成回到mysql會話,解鎖表
MariaDB [(none)]> UNLOCK TABLES;Query OK, 0 rows affected (0.01 sec)
這樣一個基於lvm快照的mysql備份就完成了,然後還可以結合二進位日誌做增量備份和恢複等,可參照前一篇文章 MySQL 備份和恢複(一)mysqldump
本文出自 “不懂IT的中醫不是好IT” 部落格,請務必保留此出處http://zhishen.blog.51cto.com/1612050/1532420