Mysql增量備份之Mysqldump& Mylvmbackup

李振良發表於2016-05-05

簡單介紹

備份型別 備份方式

熱備份:備份期間不需要服務停機,業務不受影響;

溫備份:備份期間僅允許讀的請求;

冷備份:備份期間需要關閉Mysql服務或讀寫請求都不受影響;

完全備份:full backup備份全部資料集;

增量備份:incrementalbackup 上次完全備份或增量備份以來改變的資料;

差異備份:differentialbackup 上次完全備份以來改變的資料;

完全+增量備份方式恢復用到的備份檔案:完全備份+增量備份+二進位制檔案;

完全+差異備份方式恢復用到的備份檔案:完全備份+增量備份+二進位制檔案;

邏輯備份
優點 缺點

邏輯備份可以使用編輯器或文字處理工具進行編輯或檢視;

恢復非常簡單;

比較靈活;

與儲存引擎無關;

有助於避免資料損壞;

邏輯備份可以使用編輯器或文字處理工具進行編輯或檢視;

恢復非常簡單;

比較靈活;

與儲存引擎無關;

有助於避免資料損壞;

 物理備份
優點 缺點

備份與恢復資料比較簡單;

InnoDBMyISAM的物理備份容易跨平臺、作業系統和Mysql版本;

恢復速度比較快,不需要重新構建索引;

InnoDB的原始檔案會比邏輯備份大得多;

物理備份不是總可以跨平臺、作業系統及Mysql版本;

檔名大小寫敏感和浮點格式有可能會有問題

備份物件:
資料檔案、配置檔案、程式碼:儲存過程,儲存函式、觸發器等、二進位制日誌、事務日誌、伺服器配置、管理指令碼、任務計劃等。

Mysqldump增量備份

使用Mysqldump備份工具實現完全備份,並結合二進位制日誌實現增量備份。

特點:邏輯備份工具、支援InnoDB熱備份、MyISAM溫備份;備份與恢復較慢

一、備份資料庫

1
2
3
mysqldump -uroot -p123.com --lock-all-tables --flush-logs --databases test /mysqlbackup/test_`date +%F`.sql
--lock-all-tables:備份時為所有表請求加鎖
--flush-log:備份之前重新整理日誌

二、備份二進位制檔案

在test庫中建立一個表,增加資料,模擬增量備份,並檢視當前二進位制日誌位置。

1
cp /usr/local/mysql/data/mysqld-bin.00000* /mysqlbackup

1
2
3
4
5
6
7
mysql> create table abc (number INT(11), name varchar(100));
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000004 | 221 | | |
+-------------------+----------+--------------+------------------+

三、檢視二進位制檔案和完整備份後LOG_POS值在什麼位置

1
2
3
less /mysqlbackup/test_2013-09-29.sql  #前幾行可以看到在106
-- Position to start replication or point-in-time recovery from
-- CHANGE MASTER TO MASTER_LOG_FILE=`mysqld-bin.000005`, MASTER_LOG_POS=106;

四、二進位制增量備份

1>.完整備份後到現在備份:

1
2
3
mysqlbinlog --start-position=106 /var/lib/mysql/mysqld-bin/mysql/mysqld-bin.000005 > /mysqlbackup/test_incremental.sql
--start-position:從哪個位置開始匯出二進位制日誌
--stop-position:從哪個位置結束,到末尾可以不指定

2>.向資料庫新增一條記錄,然後刪除資料庫,再恢復到當前資料

1
2
3
4
5
6
7
mysql>create table abd (number INT(1),name varchar(10));
mysql> show master status;   #檢視二進位制所在位置
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 527 | | |
+-------------------+----------+--------------+------------------+

五、恢復資料到當前資料,需要恢復完整備份+增量備份+增量備份後刪除之前的二進位制檔案

1
2
3
4
5
6
mysqlbinlog /var/lib/mysql/mysqld-bin.000005  #檢視二進位制,看在什麼時候做的,檔案最後下面看出在446
# at 446
#130929 11:04:16 server id 1 end_log_pos 527 Query thread_id=10 exec_time=0 error_code=0
SET TIMESTAMP=1380467056/*!*/;
drop database test
/*!*/;

六、匯出之前刪除資料庫至增量備份後的二進位制檔案

1
2
3
4
5
6
mysqlbinlog --start-position=220 --stop-position=446 /var/lib/mysql/mysqld-bin.000005 > /mysqlbackup/test_446.sql
mysql> source/backupn/test_2013-09-06.sql #恢復完整備份
mysql> source/backup/test_incremental.sql #恢復增量備份
mysql> source/backup/test_446.sql #恢復增量後至刪除前的資料
mysql> use test
mysql> show tables;檢視資料恢復成功!

Mylvmbackup快速完整備份

mylvmbackup 是一個工具,用於快速建立完整的物理備份MySQL伺服器的資料檔案,備份資料時,將鎖定 MySQL 所有的表,並將快取中資料寫到磁碟,然後執行 LVM 快照後解鎖。

使用LVM邏輯卷快照功能實現幾乎熱血備份的完全備份,並結合二進位制日誌實現增量備份。

特點:幾乎接近於熱備份、物理備份、備份與恢復較快。

必須mysql資料庫存放目錄是LVM卷下,如果要做增量備份,bin-log日誌也要在LVM卷下,而且LVM卷要有空間給快照備份。

修改mysql和bin-log日誌位置:

1
2
3
vi /etc/my.cnf
datadir=/myvg/data
bin-log=/myvg/binlog/mysqld-bin

mysql有以下幾種日誌: 

錯誤日誌: -log-err 

查詢日誌: -log 

慢查詢日誌: -log-slow-queries 

更新日誌: -log-update 

二進位制日誌: -log-bin

一、建立LVM卷

1
2
3
4
5
6
7
8
9
10
1>.建立物理卷
pvcreate /dev/sdb
2>.建立卷組
vgcreate myvg /dev/sdb
3>.建立邏輯卷
lvcreate -n mylv -L 19G myvg
4>.格式化檔案系統
mkfs.ext4 /dev/myvg/mylv
5>.掛載使用
mount /dev/myvg/mylv/ /data

二、安裝使用Mylvmbackup

1
2
3
wget http://www.lenzg.net/mylvmbackup/mylvmbackup-0.14-0.noarch.rpm
yum install -y perl-TimeDate perl-Config-IniFiles perl-DBD-MySQL #安裝依賴包
rpm -ivh mylvmbackup-0.14-0.noarch.rpm

1、修改主配置檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vi /etc/mylvmbackup.conf
[mysql]
user=root
password=123.com
host=localhost
port=3306
socket=/tmp/mysql.sock
mycnf=/etc/my.cnf
[lvm]
vgname=myvg #卷組的名字
lvname=mylv #邏輯卷的名字
lvsize=5G #備份時建立的snapshot的大小
[fs]
mountdir=/opt/snap_mnt #snapshot的mount位置
backupdir=/backup #備份打包後的存放位置
relpath=mysqldata #如果只是想備份邏輯卷下的某個目錄的話,則要指出來
[tools]
lvcreate=/usr/sbin/lvcreate
lvremove=/usr/sbin/lvremove
mount=/bin/mount
tar=/bin/tar
umount=/bin/umount
[misc]
prefix=backup #備份打包檔案的命名字首
suffix=_mysql #定義備份檔名字尾

2、備份資料庫並驗證備份檔案

1
2
3
4
5
6
7
[root@202 ~]# mylvmbackup
20130906 11:55:33 Info: Running: lvremove -f /dev/myvg/mysql_snap
Logical volume "mysql_snap"successfully removed
20130906 11:55:34 Info: DONE: Removing snapshot
出現以上資訊表示備份成功,最後刪除快照卷!
[root@202 ~]# ls /mysqlbackup/
backup-201309029_115532_mysql.tar.gz

完整備份成功!



相關文章