通過XtraBackup進行資料庫表備份和表空間傳輸例項
一.安裝教程
1.XtraBackup簡介
XtraBackup有很多功能和優點:例如支援全備、增量備份、部分備份;支援壓縮備份;備份不影響資料讀寫、事務等,但是也有缺陷不足:例如不支援離線備份、不支援直接備份到磁帶裝置、不支援Cloud Back,MyISAM的備份也會阻塞。XtraBackup只支援Linux平臺。
2.安裝包
將percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz拷貝至linux機器/wind下
拷貝包
lib64numa1-2.0.3-4-mdv2011.0.x86_64.rpm(依賴包)
DBD-mysql-4.043.tar.gz(依賴包)
DBI-1.639.tar.gz (依賴包)
percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
解壓包
tar –zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
rpm –ivh lib64numa1-2.0.3-4-mdv2011.0.x86_64.rpm
tar –zxvf DBI-1.639.tar.gz
(安裝DBI教程)
http://blog.sina.com.cn/s/blog_a32eff280102vmpn.html
perlMakefile.PL
make
make test
make install
./list.pl
tar –zxvf DBD-mysql-4.043.tar.gz
在percona-xtrabackup-2.4.9-Linux-x86_64/bin下輸入inno+TAB
若能補全命令innobackupex則安裝成功
二.使用教程
1.全量備份
./innobackupex --defaults-file=/etc/my.cnf--user=windin --password=windin --host=10.202.16.13 /wind/zyd/mysqlback/full --no-timestamp
--defaults-file=/etc/my.cnf ——mysql的配置檔案
--user=windin——使用者名稱 --password 密碼 --host 機器ip
/wind/zyd/mysqlback/full——備份檔案的目錄
--no-timestamp ——不使用預設的時間目錄
2.全量還原
(1)關閉資料庫
service mysqld stop
(2)全備下的資料夾必須為空
mv /wind/mysql/data /wind/mysql/data_bak
(3)利用 --apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至資料檔案使資料檔案處於一致性狀態。
./innobackupex --apply-log /wind/zyd/mysqlback/full
(4)拷貝備份至data目錄下.
if
/innobackupex--defaults-file=/etc/my.cnf --copy-back--rsync /wind/zyd/mysqlback/full
else
cp -r /wind/zyd/mysqlback/full/* /wind/mysql/data
(5)許可權修改chown -R mysql:users /wind/mysql/data2
3.增量備份
(1)全表備份————備份時佔用資源大小,速度
./innobackupex --defaults-file=/etc/my.cnf --user=windin--password=windin --host=10.202.16.13 /wind/zyd/mysqlback/full --no-timestamp
(2)增量備份
指定資料庫備份
./innobackupex --defaults-file=/etc/my.cnf --user=windin--password=windin --host=10.202.16.13 --databases="xtra_db" --incremental-basedir=/wind/zyd/mysqlback/full --incremental/wind/zyd/mysqlback/incremental --no-timestamp
4.增量還原
(1)關閉資料庫
service mysqld stop
全量資料日誌回滾操作日誌記錄
(2)全量備份回滾記錄
./innobackupex --apply-log --redo-only /wind/zyd/mysqlback/full
說明:指定全備目錄,--redo-only 對已提交的事務進行前滾,僅最後一次增備恢復不需要新增該引數
(3)增量備份回滾操作日誌記錄合併
./innobackupex --apply-log /wind/zyd/mysqlback/full --incremental-dir=/wind/zyd/mysqlback/incremental
##最後再prepare全量備份
##./innobackupex --apply-log /wind/zyd/mysqlback/full
(4)全量資料匯入mysql
cp /wind/zyd/mysqlback/full/*/wind/mysql/data
./innobackupex --copy-back /wind/zyd/mysqlback/full
(5)許可權修改chown -Rmysql:mysql /var/lib/mysql/bak/
注意:-defaults-file 放在首位
--user 資料庫使用者名稱
--passw 資料庫密碼
--host 資料庫機器ip
--databases 資料庫名
/zyd/mysqlback 拷貝檔案的路徑
三.效能測試
1.全量備份速度
開發站測試資料量10G 大約150S 2min半 60M/s
10.20.5.64主站資料量2.3T 183M/s 3.5小時
2.全量恢復速度
開發站測試資料量10G 大約210S 3min半 每秒大約0.05G
10.20.5.64主站資料量2.3T 183M/s 5.5小時
四.應用場景
1.msyqldump和xtrabackup工具優缺點對比分析
mysqldump工具
資料量100G 所需時間13h
優點:對於單表或少表使用方便,風險小,不需要全例項替換。
缺點:對於多表或全例項使用複雜,耗時長。
xtrabackup工具
資料量2.3T 所需時間9h
優點:對於全例項使用方便,耗時短。
缺點:對於單表使用代價高,風險大。
2.大資料同步方案優化
1)採用xtrabackup工具
對於超過150G大小的資料同步時
需要進行全例項搬遷時(如SSD老化,更換例項機器等)
2)採用mysqldump工具
對於小於150G大小的資料同步時
五.通過表空間傳輸
1.操作步驟
1).在source server A上,建立一個表
mysql> use test;
mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
2).在destination server B上,也建立同樣的表結構
mysql> use test;
mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
3).在destination server B上,discard 該表(這一步是必須的)
mysql> ALTER TABLE t DISCARD TABLESPACE;
4).在source server A上,執行 FLUSH TABLES ... FOR EXPORT, 該表這時候處於quiesce狀態,只讀,且建立.cfg metadata檔案
mysql> use test;
mysql> FLUSH TABLES t FOR EXPORT;
此時,.cfg 檔案在InnoDB的data directory中
5).拷貝.ibd & .cfg 從.TRG檔案(ource server A 到 在destinationserver B
shell> scp /path/to/datadir/test/t.{ibd,cfg}destination-server:/path/to/datadir/test
6).在source server A, 執行unlocktables 來釋放FLUSHTABLES ... FOR EXPORT 加的locks
mysql> use test;
mysql> UNLOCK TABLES;
7).在destinationserver B上,匯入tablespace
mysql> use test;
mysql> ALTER TABLE t IMPORT TABLESPACE;
2.使用xtrabackup優化方法
原生的方式適合小範圍匯出,比如一兩個表.如果匯出的表很多,可以用innobackupex行輔助,並且innobackupex沒有鎖,不影響線上的業務.具體方法見第二章。然後將ibd檔案,cfg檔案和TRG檔案拷貝到目標例項資料庫。
最後在目標例項執行alter table 表名 import tablespace;
3.效能比較
這幾步中,最慢的是import,其他幾乎是瞬間完成。但是,因為是直接拷貝表文件,所以比mysqldump要快很多。
4.留存問題
表中中文傳輸後存在中文亂碼問題。待研究。
先檢視資料庫的編碼然後全部改為utf8
show variableslike 'character%';
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
具體效能需要進一步測試。
以下是一個例子。
show create table tb_object_0088;
CREATE TABLE "test"."tb_object_0088" (
"SEQID"decimal(10,0) NOT NULL,
"OB_OBJECT_ID"varchar(38) CHARACTER SET utf8 NOT NULL,
"PROGRESS"varchar(1) CHARACTER SET utf8 DEFAULT NULL,
"RP_GEN_DATETIME"datetime NOT NULL,
"RP_ACTION"varchar(1) CHARACTER SET utf8 DEFAULT NULL,
"F1_0088"varchar(10) CHARACTER SET utf8 NOT NULL,
"F2_0088"varchar(100) CHARACTER SET utf8 NOT NULL,
"F3_0088"varchar(8) CHARACTER SET utf8 NOT NULL,
"F4_0088"varchar(8) CHARACTER SET utf8 NOT NULL,
"F5_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F6_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F7_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F8_0088"varchar(200) CHARACTER SET utf8 DEFAULT NULL,
"F9_0088"varchar(100) CHARACTER SET utf8 DEFAULT NULL,
"F10_0088"decimal(20,6) DEFAULT NULL,
"F11_0088"varchar(20) CHARACTER SET utf8 DEFAULT NULL,
"F12_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F13_0088"varchar(1000) CHARACTER SET utf8 DEFAULT NULL,
"F14_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F15_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F16_0088"varchar(4000) CHARACTER SET utf8 DEFAULT NULL,
"F17_0088"varchar(100) CHARACTER SET utf8 DEFAULT NULL,
"F18_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F19_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F20_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F21_0088"varchar(2000) CHARACTER SET utf8 DEFAULT NULL,
"F22_0088" varchar(10)CHARACTER SET utf8 DEFAULT NULL,
"F23_0088"varchar(10) CHARACTER SET utf8 DEFAULT NULL,
"F24_0088"varchar(200) CHARACTER SET utf8 DEFAULT NULL,
"F25_0088"decimal(9,0) DEFAULT NULL,
PRIMARY KEY("OB_OBJECT_ID"),
KEY "idx_f1_0088"("F1_0088"),
KEY "idx_f2_0088"("F2_0088"),
KEY"idx_f22_0088" ("F22_0088"),
KEY "idx_f8_0088"("F8_0088"),
KEY "idx_f9_0088"("F9_0088")
)
;
alter tabletest.tb_object_0088 discard tablespace;
use stonedbforwfc;
FLUSH TABLES tb_object_0088FOR EXPORT;
unlock tables;
cp t.cfg t.ibd /wind/data/mysqldadta/test
chmod –R 777 t.*
alter tabletest.tb_object_0088 import tablespace;