Mysql備份系列(4)--lvm-snapshot備份mysql數據(全量+增量)操做記錄

 

Mysql最經常使用的三種備份工具分別是mysqldump、Xtrabackup(innobackupex工具)、lvm-snapshot快照。
前面分別介紹了:
Mysql備份系列(1)--備份方案總結性梳理
Mysql備份系列(2)--mysqldump備份(全量+增量)方案操做記錄
Mysql備份系列(3)--innobackupex備份mysql大數據(全量+增量)操做記錄html

lvm-snapshot:基於LVM快照的備份
1.關於快照:
1)事務日誌跟數據文件必須在同一個捲上;
2)剛剛創立的快照卷,裏面沒有任何數據,全部數據均來源於原卷
3)一旦原卷數據發生修改,修改的數據將複製到快照卷中,此時訪問數據一部分來自於快照卷,一部分來自於原卷
4)當快照使用過程當中,若是修改的數據量大於快照卷容量,則會致使快照卷崩潰。
5)快照卷自己不是備份,只是提供一個時間一致性的訪問目錄。mysql

2.基於快照備份幾乎爲熱備:
1)建立快照卷以前,要請求MySQL的全局鎖;在快照建立完成以後釋放鎖;
2)若是是Inoodb引擎, 當flush tables 後會有一部分保存在事務日誌中,卻不在文件中。 所以恢復時候,須要事務日誌和數據文件
但釋放鎖之後,事務日誌的內容會同步數據文件中,所以備分內容並不絕對是鎖釋放時刻的內容,因爲有些爲完成的事務已經完成,但在備份數據中由於沒完成而回滾。 所以須要藉助二進制日誌日後走一段linux

3.基於快照備份注意事項:
1)事務日誌跟數據文件必須在同一個捲上;
2)建立快照卷以前,要請求MySQL的全局鎖;在快照建立完成以後釋放鎖;
3)請求全局鎖完成以後,作一第二天志滾動;作二進制日誌文件及位置標記(手動進行);sql

4.爲何基於MySQL快照的備份很好?
緣由以下幾點:
1)幾乎是熱備 在大多數狀況下,能夠在應用程序仍在運行的時候執行備份。無需關機,只需設置爲只讀或者相似只讀的限制。
2)支持全部基於本地磁盤的存儲引擎 它支持MyISAM, Innodb, BDB,還支持 Solid, PrimeXT 和 Falcon。
3)快速備份 只需拷貝二進制格式的文件,在速度方面無以匹敵。
4)低開銷 只是文件拷貝,所以對服務器的開銷很細微。
5)容易保持完整性 想要壓縮備份文件嗎?把它們備份到磁帶上,FTP或者網絡備份軟件 -- 十分簡單,由於只須要拷貝文件便可。
6)快速恢復 恢復的時間和標準的MySQL崩潰恢復或數據拷貝回去那麼快,甚至可能更快,未來會更快。
7)免費 無需額外的商業軟件,只需Innodb熱備工具來執行備份。數據庫

快照備份mysql的缺點:
1)須要兼容快照 -- 這是明顯的。
2)須要超級用戶(root) 在某些組織,DBA和系統管理員來自不一樣部門不一樣的人,所以權限各不同。
3)停工時間沒法預計,這個方法一般指熱備,可是誰也沒法預料究竟是不是熱備 -- FLUSH TABLES WITH READ LOCK 可能會須要執行很長時間才能完成。
4)多捲上的數據問題 若是你把日誌放在獨立的設備上或者你的數據庫分佈在多個捲上,這就比較麻煩了,由於沒法獲得所有數據庫的一致性快照。不過有些系統可能能自動作到多卷快照。vim

下面便是使用lvm-snapshot快照方式備份mysql的操做記錄,僅依據本人實驗中使用而述.安全

操做記錄:
以下環境,本機是在openstack上開的雲主機,在openstack上建立一個30G的雲硬盤掛載到本機,而後製做lvm邏輯卷。服務器

1、準備LVM卷,並將mysql數據恢復(或者說遷移)到LVM捲上:
1) 建立一個分區或保存到另外一塊硬盤上面
2) 建立PV、VG、LVM
3) 格式化 LV0
4) 掛載LV到臨時目錄
5) 確認服務處於stop狀態
6) 將數據遷移到LV0
7) 從新掛載LV0到mysql數據庫的主目錄/data/mysql/data
8) 審覈權限並啓動服務
[root@test-huanqiu ~]# fdisk -l
.........
Disk /dev/vdc: 32.2 GB, 32212254720 bytes
16 heads, 63 sectors/track, 62415 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000網絡

[root@test-huanqiu ~]# fdisk /dev/vdc                            //依次輸入p->n->p->1->回車->回車->w
.........
Command (m for help): papp

Disk /dev/vdc: 32.2 GB, 32212254720 bytes
16 heads, 63 sectors/track, 62415 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x343250e4

Device Boot Start End Blocks Id System

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-62415, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-62415, default 62415):
Using default value 62415

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@test-huanqiu ~]# fdisk /dev/vdc

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Command (m for help): p

Disk /dev/vdc: 32.2 GB, 32212254720 bytes
16 heads, 63 sectors/track, 62415 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x343250e4

Device Boot Start End Blocks Id System
/dev/vdc1 1 62415 31457128+ 5 Extended

Command (m for help):

[root@test-huanqiu ~]# pvcreate /dev/vdc1
Device /dev/vdc1 not found (or ignored by filtering).
[root@test-huanqiu ~]# vgcreate vg0 /dev/vdc1
Volume group "vg0" successfully created
[root@test-huanqiu ~]# lvcreate -L +3G -n lv0 vg0
Logical volume "lv0" created.
[root@test-huanqiu ~]# mkfs.ext4 /dev/vg0/lv0
[root@test-huanqiu ~]# mkdir /var/lv0/
[root@test-huanqiu ~]# mount /dev/vg0/lv0 /var/lv0/
[root@test-huanqiu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
8.1G 6.0G 1.7G 79% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vda1 190M 37M 143M 21% /boot
/dev/mapper/vg0-lv0 2.9G 4.5M 2.8G 1% /var/lv0

[root@test-huanqiu ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LogVol00 VolGroup00 -wi-ao---- 8.28g
LogVol01 VolGroup00 -wi-ao---- 1.50g
lv0 vg0 -wi-a----- 3.00g

----------------------------------------------------------------------------------------------------
若是要想刪除這個lvs,操做以下:
[root@test-huanqiu ~]# umount /data/mysql/data/            //先卸載掉這個lvs的掛載關係
[root@test-huanqiu ~]# lvremove /dev/vg0/lv0
[root@test-huanqiu ~]# vgremove vg0
[root@test-huanqiu ~]# pvremove /dev/vdc1
[root@test-huanqiu ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LogVol00 VolGroup00 -wi-ao---- 8.28g
LogVol01 VolGroup00 -wi-ao---- 1.50g
----------------------------------------------------------------------------------------------------

mysql的數據目錄是/data/mysql/data,密碼是123456
[root@test-huanqiu ~]# ps -ef|grep mysql
mysql 2066 1286 0 07:33 ? 00:00:06 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql/ --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql//lib/plugin --user=mysql --log-error=/data/mysql/data/mysql-error.log --pid-file=/data/mysql/data/mysql.pid --socket=/usr/local/mysql/var/mysql.sock --port=3306
root 2523 2471 0 07:55 pts/1 00:00:00 grep mysql
[root@test-huanqiu ~]# /etc/init.d/mysql stop
Shutting down MySQL.... SUCCESS!

[root@test-huanqiu ~]# cd /data/mysql/data/
[root@test-huanqiu data]# tar -cf - . | tar xf - -C /var/lv0/

[root@test-huanqiu data]# umount /var/lv0/

[root@test-huanqiu data]# mount /dev/vg0/lv0 /data/mysql/data
[root@test-huanqiu data]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
8.1G 6.0G 1.7G 79% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vda1 190M 37M 143M 21% /boot
/dev/mapper/vg0-lv0 2.9G 164M 2.6G 6% /data/mysql/data

刪除掛載後產生的lost+found目錄
[root@test-huanqiu data]# rm -rf lost+found

[root@test-huanqiu data]# ll -d /data/mysql/data
[root@test-huanqiu data]# ll -Z /data/mysql/data
[root@test-huanqiu data]# ll -Zd /data/mysql/data

須要注意的是:
當SElinux功能開啓狀況下,mysql數據庫重啓會失敗,因此必須執行下面命令,恢復SElinux安全上下文.
[root@test-huanqiu data]# restorecon -R /data/mysql/data/
[root@test-huanqiu data]# /etc/init.d/mysql start
Starting MySQL... SUCCESS!

2、備份: (生產環境下通常都是整個數據庫備份)
1)鎖表
2)查看position號並記錄,便於後期恢復
3)建立snapshot快照
4)解表
5)掛載snapshot
6)拷貝snapshot數據,進行備份。備份整個數據庫以前,要關閉mysql服務(保護ibdata1文件)
7)移除快照

設置此變量爲1,讓每一個事件儘量同步到二進制日誌文件裏,以消耗IO來儘量確保數據一致性。
mysql> SET GLOBAL sync_binlog=1;

查看二進制日誌和position,以備後續進行binlog日誌恢復增量數據(記住這個position節點記錄,對後面的增量數據備份很重要) 
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 1434 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

建立存放binlog日誌的position節點記錄的目錄
全部的position節點記錄都放在這同一個binlog.pos文件下(後面就使用>>符號追加到這個文件下
[root@test-huanqiu ~]# mkdir /backup/mysql/binlog
[root@test-huanqiu ~]# mysql -p123456 -e "SHOW MASTER STATUS;" > /backup/mysql/binlog/binlog.pos
[root@test-huanqiu snap1]# cat /backup/mysql/binlog/binlog.pos
File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
mysql-bin.000004 1434

刷新日誌,產生新的binlog日誌,保證日誌信息不會再寫入到上面的mysql-bin.000004日誌內。
mysql> FLUSH LOGS;

全局讀鎖,讀鎖請求到後不要關閉此mysql交互界面
mysql> FLUSH TABLES WITH READ LOCK;

在innodb表中,即便是請求到了讀鎖,但InnoDB在後臺依然可能會有事務在進行讀寫操做,
可用"mysql> SHOW ENGINE INNODB STATUS;"查看後臺進程的狀態,等沒有寫請求後再作備份。

建立快照,以只讀的方式(--permission r)建立一個3GB大小的快照卷snap1
-s:至關於--snapshot
[root@test-huanqiu ~]# mkdir /var/snap1
[root@test-huanqiu ~]# lvcreate -s -L 2G -n snap1 /dev/vg0/lv0 --permission r
Logical volume "snap1" created.

查看快照卷的詳情(快照卷也是LV):
[root@test-huanqiu ~]# lvdisplay

解除鎖定
回到鎖定表的mysql交互式界面,解鎖:
mysql> UNLOCK TABLES;

此參數能夠根據服務器磁盤IO的負載來調整
mysql> SET GLOBAL sync_binlog=0;

[root@test-huanqiu ~]# mount /dev/vg0/snap1 /var/snap1                //掛載快照卷
[root@test-huanqiu snap1]# df -h
Filesystem             Size   Used  Avail  Use%  Mounted on
/dev/mapper/VolGroup00-LogVol00
                            8.1G  5.8G  1.9G  76%    /
tmpfs                    1.9G  0       1.9G  0%      /dev/shm
/dev/vda1              190M 37M   143M 21%    /boot
/dev/mapper/vg0-lv0 2.9G 115M 2.7G 5% /data/mysql/data
/dev/mapper/vg0-snap1
                               2.9G 115M 2.7G 5% /var/snap1

[root@test-huanqiu ~]# cd /var/snap1/ && ll /var/snap1
[root@test-huanqiu snap1]# mkdir -p /backup/mysql/data/               //建立備份目錄
total 0

對本機的數據庫進行備份,備份整個數據庫。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.01 sec)

mysql> create database beijing;
Query OK, 1 row affected (0.00 sec)

mysql> use beijing;
Database changed

mysql> create table people(id int(5),name varchar(20));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into people values("1","wangshibo");
Query OK, 1 row affected (0.00 sec)

mysql> insert into people values("2","guohuihui");
Query OK, 1 row affected (0.01 sec)

mysql> insert into people values("3","wuxiang");
Query OK, 1 row affected (0.01 sec)

mysql> select * from people;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | wangshibo |
|    2 | guohuihui |
|    3 | wuxiang   |
+------+-----------+
3 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| beijing            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)

--------------------------------------------------------------------------------------------------------------------------
須要注意的是:
innodb表,通常會打開獨立表空間模式(innodb_file_per_table)。
因爲InnoDB默認會將全部的數據庫InnoDB引擎的表數據存儲在一個共享空間中:ibdata1文件。
增刪數據庫的時候,ibdata1文件不會自動收縮,這對單個或部分數據庫的備份也將成爲問題(若是不是整個數據庫備份的狀況下,ibdata1文件就不能備份,不然會影響所有數據庫的數據)
因此如果對單個數據庫或部分數據庫進行快照備份
1)如果直接誤刪除mysql數據目錄下備份庫目錄,能夠直接將快照備份數據解壓就能恢復
2)如果使用drop或delete誤刪除的數據,那麼在使用快照備份數據恢復時,就會出問題!由於單庫備份時ibdata1文件不能單獨備份,恢復時會致使這個文件損壞!

因此正確的作法是:
要對整個數據庫進行備份,而且必定要在mysql服務關閉的狀況下(這樣是爲了保護ibdata1文件)。
由於mysql是採用緩衝方式來將數據寫入到ibdata1文件中的,這正是fflush()函數存在的理由。當mysql在運行時,對ibdata1進行拷貝確定會致使ibdata1文件中的數據出錯,這樣在數據恢復時,也就確定會出現「ERROR 1146 (42S02): Table '****' doesn't exist「的報錯!

在對啓用innodb引擎的mysql數據庫進行遷移的時候也是同理:
在對innodb數據庫進行數據遷移的時候,即將msyql(innodb引擎)服務從一臺服務器遷移到另外一臺服務器時,在對數據庫目錄進行總體拷貝的時候(固然就包括了對ibdata1文件拷貝),必定要在關閉對方mysql服務的狀況下進行拷貝!

ibdata1用來儲存文件的數據,而庫名的文件夾裏面的那些表文件只是結構而已,因爲新版的mysql默認試innodb,因此ibdata1文件默認就存在了,少了這個文件有的數據表就會出錯。要知道:數據庫目錄下的.frm文件是數據庫中不少的表的結構描述文件;而ibdata1文件纔是數據庫的真實數據存放文件。

-------------------------------------------innodb_file_per_table參數說明------------------------------------------
線上環境的話,通常都建議打開這個獨立表空間模式。
由於ibdata1文件會不斷的增大,不會減小,沒法向OS回收空間,容易致使線上出現過大的共享表空間文件,導致當前空間爆滿。
而且ibdata1文件大到必定程序會影響insert、update的速度;而且
另外若是刪表頻繁的話,共享表空間產生的碎片會比較多。打開獨立表空間,方便進行innodb表的碎片整理

使用MyISAM表引擎的數據庫會分別建立三個文件:表結構、表索引、表數據空間。
能夠將某個數據庫目錄直接遷移到其餘數據庫也能夠正常工做。

然而當使用InnoDB的時候,一切都變了。
InnoDB默認會將全部的數據庫InnoDB引擎的表數據存儲在一個共享空間中:ibdata1文件。
增刪數據庫的時候,ibdata1文件不會自動收縮,單個數據庫的備份也將成爲問題。
一般只能將數據使用mysqldump 導出,而後再導入解決這個問題。

在MySQL的配置文件[mysqld]部分,增長innodb_file_per_table參數。
能夠修改InnoDB爲獨立表空間模式,每一個數據庫的每一個表都會生成一個數據空間。

它的優勢:
1)每一個表都有自已獨立的表空間。
2)每一個表的數據和索引都會存在自已的表空間中。
3)能夠實現單表在不一樣的數據庫中移動。
4)空間能夠回收(除drop table操做處,表空不能自已回收)

Drop table操做自動回收表空間,若是對於統計分析或是日值表,刪除大量數據後能夠經過:alter table TableName engine=innodb;回縮不用的空間。
對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。
對於使用獨立表空間的表,無論怎麼刪除,表空間的碎片不會太嚴重的影響性能,並且還有機會處理。

它的缺點:
單表增長過大,如超過100個G。

結論:
共享表空間在Insert操做上少有優點。其它都沒獨立表空間表現好。當啓用獨立表空間時,請合理調整一下:innodb_open_files。
InnoDB Hot Backup(冷備)的表空間cp不會面對不少無用的copy了。並且利用innodb hot backup及表空間的管理命令能夠實。

1)innodb_file_per_table設置.設置爲1,表示打開了獨立的表空間模式。 若是設置爲0,表示關閉獨立表空間模式,開啓方法以下:
在my.cnf中[mysqld]下設置
innodb_file_per_table=1

2)查看是否開啓:
mysql> show variables like "%per_table%";
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)

3)關閉獨享表空間
innodb_file_per_table=0關閉獨立的表空間
mysql> show variables like ‘%per_table%’;
-------------------------------------------innodb_file_per_table參數說明------------------------------------------
--------------------------------------------------------------------------------------------------------------------------

備份前,必定要關閉mysql數據庫!由於裏面會涉及到ibdata1文件備份,不關閉mysql的話,ibdata1文件備份後會損壞,從而致使恢復數據失敗!
[root@test-huanqiu snap1]# /etc/init.d/mysql stop
Shutting down MySQL.... SUCCESS!
[root@test-huanqiu data]# lsof -i:3306
[root@test-huanqiu data]#

如今備份整個數據庫
[root@test-huanqiu snap1]# tar -zvcf /backup/mysql/data/`date +%Y-%m-%d`dbbackup.tar.gz ./
[root@test-huanqiu snap1]# ll /backup/mysql/data/
total 384
-rw-r--r--. 1 root root 392328 Dec 5 22:15 2016-12-05dbbackup.tar.gz

釋放快照卷,每次備份以後,應該刪除快照,減小IO操做
先卸載,再刪除
[root@test-huanqiu ~]# umount /var/snap1/
[root@test-huanqiu ~]# df -h                //確認上面的掛載關係已經沒了
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
8.1G 5.8G 1.9G 76% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vda1 190M 37M 143M 21% /boot
/dev/mapper/vg0-lv0 2.9G 115M 2.7G 5% /data/mysql/data
[root@test-huanqiu ~]# lvremove /dev/vg0/snap1
Do you really want to remove active logical volume snap1? [y/n]: y
Logical volume "snap1" successfully removed


數據被快照備份後,能夠啓動數據庫
[root@test-huanqiu ~]# /etc/init.d/mysql start
Starting MySQL.. SUCCESS!
[root@test-huanqiu ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 15943 mysql 16u IPv4 93348 0t0 TCP *:mysql (LISTEN)
[root@test-huanqiu ~]#

如今再進行新的數據寫入:

mysql> use beijing;
Database changed
mysql> insert into people values("4","liumengnan");
Query OK, 1 row affected (0.02 sec)

mysql> insert into people values("5","zhangjuanjuan");
Query OK, 1 row affected (0.00 sec)

mysql> select * from people;
+------+---------------+
| id   | name          |
+------+---------------+
|    1 | wangshibo     |
|    2 | guohuihui     |
|    3 | wuxiang       |
|    4 | liumengnan    |
|    5 | zhangjuanjuan |
+------+---------------+
5 rows in set (0.00 sec)

mysql> create table heihei(name varchar(20),age varchar(20));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into heihei values("jiujiujiu","nan");
Query OK, 1 row affected (0.00 sec)

mysql> select * from heihei;
+-----------+------+
| name      | age  |
+-----------+------+
| jiujiujiu | nan  |
+-----------+------+
1 row in set (0.00 sec)

mysql> create database shanghai;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| beijing            |
| mysql              |
| performance_schema |
| shanghai           |
| test               |
+--------------------+
6 rows in set (0.00 sec)

假設一不當心誤操做刪除beijing和shanghai庫

mysql> drop database beijing;
Query OK, 2 rows affected (0.03 sec)

mysql> drop database shanghai;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

莫慌!接下來就說下數據恢復操做~~
3、恢復流程以下:
0)因爲涉及到增量數據備份,因此提早將最近一次的binlog日誌從mysql數據目錄複製到別的路徑下
1)在mysql數據庫中執行flush logs命令,產生新的binlog日誌,讓日誌信息寫入到新的這個binlog日誌中
1)關閉數據庫,必定要關閉
2)刪除數據目錄下的文件
3)快照數據拷貝回來,position節點記錄回放
4)增量數據就利用mysqlbinlog命令將上面提早拷貝的binlog日誌文件導出爲sql文件,並剔除其中的drop語句,而後進行恢復。
5)重啓數據

先將最新一次的binlog日誌備份到別處,用做增量數據備份。
好比mysql-bin.000006是最新一次的binlog日誌
[root@test-huanqiu data]# cp mysql-bin.000006 /backup/mysql/data/

產生新的binlog日誌,確保日誌寫入到這個新的binlog日誌內,而再也不寫入到上面備份的binlog日誌裏。
mysql> flush logs;

[root@test-huanqiu data]# ll mysql-bin.000007
-rw-rw----. 1 mysql mysql 120 Dec 5 23:19 mysql-bin.000007

[root@test-huanqiu data]# /etc/init.d/mysql stop
Shutting down MySQL.... SUCCESS!
[root@test-huanqiu data]# lsof -i:3306
[root@test-huanqiu data]# pwd
/data/mysql/data
[root@test-huanqiu data]# rm -rf ./*
[root@test-huanqiu data]# tar -zvxf /backup/mysql/data/2016-12-05dbbackup.tar.gz ./

[root@test-huanqiu data]# /etc/init.d/mysql start
Starting MySQL SUCCESS!
[root@test-huanqiu data]# cat /backup/mysql/binlog/binlog.pos
File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
mysql-bin.000004 1434
[root@test-huanqiu data]# mysqlbinlog --start-position=1434 /data/mysql/data/mysql-bin.000004 | mysql -p123456

登錄數據庫查看,發現這只是恢復到快照備份階段的數據:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| beijing            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from beijing.people;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | wangshibo |
|    2 | guohuihui |
|    3 | wuxiang   |
+------+-----------+
3 rows in set (0.00 sec)

mysql> 

快照備份以後寫入的數據要利用mysqlbinlog命令將上面拷貝的mysql-bin000006文件導出爲sql文件,並剔除其中的drop語句,而後進行恢復。
[root@test-huanqiu ~]# cd /backup/mysql/data/
[root@test-huanqiu data]# ll
total 388
-rw-r--r--. 1 root root 392328 Dec 5 22:15 2016-12-05dbbackup.tar.gz
-rw-r-----. 1 root root 1274 Dec 5 23:19 mysql-bin.000006
[root@test-huanqiu data]# mysqlbinlog mysql-bin.000006 >000006bin.sql

剔除其中的drop語句
[root@test-huanqiu data]# vim 000006bin.sql          //手動刪除sql語句中的drop語句

而後在mysql中使用source命令恢復數據
mysql> source /backup/mysql/data/000006bin.sql;

再次查看下,發現增量部分的數據也已經恢復回來了

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| beijing            |
| mysql              |
| performance_schema |
| shanghai           |
| test               |
+--------------------+
6 rows in set (0.00 sec)

mysql> use beijing;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_beijing |
+-------------------+
| heihei            |
| people            |
+-------------------+
2 rows in set (0.00 sec)

mysql> select * from people;
+------+---------------+
| id   | name          |
+------+---------------+
|    1 | wangshibo     |
|    2 | guohuihui     |
|    3 | wuxiang       |
|    4 | liumengnan    |
|    5 | zhangjuanjuan |
+------+---------------+
5 rows in set (0.00 sec)

mysql> select * from heihei;
+-----------+------+
| name      | age  |
+-----------+------+
| jiujiujiu | nan  |
+-----------+------+
1 row in set (0.00 sec)

-----------------------------------------------------------------------------------------------------------------
思路:
1)全庫的快照備份只須要在開始時備份一份便可,這至關於全量備份。
2)後續只須要天天備份一次最新的binlog日誌(備份後當即flush logs產生新的binlog日誌),這至關於增量備份了。
3)利用快照備份恢復全量數據,利用備份的binlog日誌進行增量數據恢復
4)crontab計劃任務,天天定時備份最近一次的binlog日誌便可。
----------------------------------------------------------------------------------------------------------------

相關文章
相關標籤/搜索