1. 程式人生 > >基於Xtrabackup及可傳輸表空間實現多源資料恢復

基於Xtrabackup及可傳輸表空間實現多源資料恢復

開發十年,就只剩下這套架構體系了! >>>   

本文目錄一、使用背景

1.可傳輸表空間基本流程
2.使用前提條件/限制
二、技術要點
三、實施步驟
1.實驗環境
2.源端操作
1) 造測試資料並模擬小壓力
2) 備份單庫資料
3) 備份表結構
4) 批量生成可傳輸表空間命令
3.目標端操作

1) 備份資料恢復準備
2) 恢復表結構至目標端
3) 捨棄目標端對應表空間檔案
4) 拷貝表資料及配置檔案到目標端sbtest庫資料目錄
5) 執行匯入表空間檔案操作
4.建立複製(多源複製)
四、參考連結

Keywords:
MySQL xtrabackup Transportable Tablespaces 
MySQLdump multi-source replication

一、使用背景 

MySQL在5.7以後引入了多源複製(Multi-Source)功能,可用於將多個單獨的資料庫匯聚到一個數據庫例項下,方便使用者進行資料分析、彙總或推送至其他資料庫平臺。早期針對匯聚場景初始化各源端資料到匯聚庫,為了提升效率通常會使用使用開源並行邏輯匯入匯出工具myloader/mydumper

進行資料匯入/匯出,當源端多例項多庫資料量較大(100G以上)情況下,使用myloader/mydumper花費的時間則可能無法滿足時間要求,需要考慮是否有更高效的方式進行資料初始化同步操作,以及當複製通道異常時更便捷快速修復

ps:多源複製使用物理備份(xtrabackup)做資料初始化時,常規方式只有第一個通道可做覆蓋還原,後續通道需邏輯還原或用其他方式還原,如該方案所描述的方式。

MySQL在5.6以後支援了可傳輸表空間,以及Xtrabackup針對該功能在備份時提供了一個對應引數export,該引數支援對InnoDB儲存引擎表的備份資料export轉換,且與常規備份操作一樣可生成備份時間點的binlog資訊(GTID資訊),結合這兩特性可以更高效和快速的方式實現多庫資料匯聚的初始匯入操作


▽場景架構圖如下▽
 



1.可傳輸表空間基本流程
先簡單梳理一下可傳輸表空間基本流程:
 

  • 在源端將InnoDB表進行ibd資料檔案匯出處理(export tablespace))
  • 在目標端建立與源端相同表結構的表
  • 將目標端的表資料檔案捨棄(discard tablespace)
  • 用源端的相對應ibd檔案覆蓋到目標端
  • 在目標端執行表空間檔案的匯入/置換(import tablespace)


單純使用可傳輸表空間功能無法記錄對應表的事務點,也就是如果需要進行匯聚複製同步,無法知道從binlog哪個檔案的哪個position點進行資料同步,這也就是需要引入xtrabackup及export功能的原因。備份元資料資訊本身會記錄複製同步點資訊。

2.使用前提條件/限制

  • MySQL須為5.6以上版本
  • 表儲存引擎須為InnoDB儲存引擎(支援可傳輸表空間)
  • 匯入完成後建議執行ANALYZE TABLE更新統計資訊


二、技術要點

  • sysbench 源端造測試資料並模擬壓力
  • mysqldump 備份源端表結構
  • concat()拼接批量可傳輸表空間SQL
  • xtrabackup 備份源端單庫(部分庫)資料
  • Transportable Tablespace可傳輸表空間功能
  • Multi-source Replication 多源複製
  • mysql-error.log 錯誤資訊日誌校驗
  • ANALYZE TABLE更新統計資訊


三、實施步驟 

1.實驗環境 
 




2.源端操作 
 

  • 1) 造測試資料並模擬小壓力
使用sysbench建立4張各100W記錄的測試表,並使用2個併發持續模擬業務壓力:
 
## 造資料
shell> /opt/sysbench-0.9/sysbench/sysbench --test=/opt/sysbench-0.9/sysbench/tests/db/oltp.lua --oltp-table-size=1000000 --oltp-tables-count=4 --mysql-user=sysbench --mysql-password=sysbench --mysql-host=10.186.60.16 --mysql-port=3333 prepare

## 模擬小壓力
shell> /opt/sysbench-0.9/sysbench/sysbench --test=/opt/sysbench-0.9/sysbench/tests/db/oltp.lua --oltp-table-size=1000000 --oltp-tables-count=4 --mysql-user=sysbench --mysql-password=sysbench --mysql-host=10.186.60.16 --mysql-port=3333 --num-threads=2 --max-requests=0 --max-time=0 --report-interval=1 run
  • 2) 備份單庫資料


使用xtrabackup備份工具對源端sbtest庫進行單庫備份,儲存至/data/mysql/backup/目錄下:

shell> innobackupex --databases=sbtest /data/mysql/backup/
  • 3) 備份表結構


為可傳輸表空間做準備,將源端表結構備份並後續在目標端匯入:

shell> cd /data/mysql/backup
shell> mysqldump --no-data --set-gtid-purged=off sbtest>sbtest_schema.sql

 

  • 4) 批量生成可傳輸表空間命令

 

  • discard


使用concat函式拼接出批量DISCARD TABLESPACE的SQL:

shell> cd /data/mysql/backup
shell> mysql -ssre "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DISCARD TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='sbtest';" >discard_tbs.sql

## 輸出檔案如下所示
shell> cat discard_tbs.sql
ALTER TABLE sbtest.sbtest1 DISCARD TABLESPACE;
ALTER TABLE sbtest.sbtest2 DISCARD TABLESPACE;
ALTER TABLE sbtest.sbtest3 DISCARD TABLESPACE;
ALTER TABLE sbtest.sbtest4 DISCARD TABLESPACE;
  • import


使用concat函式拼接出批量IMPORT TABLESPACE的SQL:

shell> cd /data/mysql/backup
shell> mysql -ssre "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' IMPORT TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='sbtest';">import_tbs.sql

## 輸出檔案如下所示
shell> cat import_tbs.sql
ALTER TABLE sbtest.sbtest1 IMPORT TABLESPACE;
ALTER TABLE sbtest.sbtest2 IMPORT TABLESPACE;
ALTER TABLE sbtest.sbtest3 IMPORT TABLESPACE;
ALTER TABLE sbtest.sbtest4 IMPORT TABLESPACE;


拷貝源端/data/mysql/backup目錄下生成的所有相關檔案到目標端/data/mysql/backup下
 

3.目標端操作

  • 1) 備份資料恢復準備


對備份資料進行apply-log日誌應用及將資料進行export轉換生成配置檔案:

shell> innobackupex --apply-log --export /data/mysql/backup/2019-02-22_15-26-20/

## export執行完後sbtest庫下備份檔案如下所示
## exp結尾的檔案為Percona針對Percona XtraDB做export的配置檔案
## cfg結尾的檔案為Percona針對MySQL可傳輸表空間export的配置檔案

shell>  ll /data/mysql/backup/2019-02-22_15-26-20/sbtest/
總用量 999556
-rw-r----- 1 root root        67 2月  22 15:40 db.opt
-rw-r--r-- 1 root root       569 2月  22 15:53 sbtest1.cfg
-rw-r----- 1 root root     16384 2月  22 15:53 sbtest1.exp
-rw-r----- 1 root root      8632 2月  22 15:40 sbtest1.frm
-rw-r----- 1 root root 255852544 2月  22 15:53 sbtest1.ibd
-rw-r--r-- 1 root root       569 2月  22 15:53 sbtest2.cfg
-rw-r----- 1 root root     16384 2月  22 15:53 sbtest2.exp
-rw-r----- 1 root root      8632 2月  22 15:40 sbtest2.frm
-rw-r----- 1 root root 255852544 2月  22 15:53 sbtest2.ibd
-rw-r--r-- 1 root root       569 2月  22 15:53 sbtest3.cfg
-rw-r----- 1 root root     16384 2月  22 15:53 sbtest3.exp
-rw-r----- 1 root root      8632 2月  22 15:40 sbtest3.frm
-rw-r----- 1 root root 255852544 2月  22 15:53 sbtest3.ibd
-rw-r--r-- 1 root root       569 2月  22 15:53 sbtest4.cfg
-rw-r----- 1 root root     16384 2月  22 15:53 sbtest4.exp
-rw-r----- 1 root root      8632 2月  22 15:40 sbtest4.frm
-rw-r----- 1 root root 255852544 2月  22 15:53 sbtest4.ibd

 

  • 2) 恢復表結構至目標端


將源端表結構在目標端資料庫建立:

shell> cd /data/mysql/backup

## 手工建立sbtest庫
shell> mysql -e "create database sbtest;"

## 匯入源端對應的表結構
shell> mysql sbtest< sbtest_schema.sql

## 驗證
shell> mysql -e "show tables from sbtest;"

 

  • 3) 捨棄目標端對應表空間檔案

 

shell> cd /data/mysql/backup
shell> mysql <discard_tbs.sql

## 執行後效果如下所示,ibd檔案已被捨棄
shell>  ll /data/mysql/data/sbtest/
-rw-r----- 1 mysql mysql   67 2月  22 15:58 db.opt
-rw-r----- 1 mysql mysql 8632 2月  22 15:58 sbtest1.frm
-rw-r----- 1 mysql mysql 8632 2月  22 15:58 sbtest2.frm
-rw-r----- 1 mysql mysql 8632 2月  22 15:58 sbtest3.frm
-rw-r----- 1 mysql mysql 8632 2月  22 15:58 sbtest4.frm

 

  • 4) 拷貝表資料及配置檔案到目標端sbtest庫資料目錄

 

## 拷貝ibd檔案
shell> cp /data/mysql/backup/2019-02-22_15-26-20/sbtest/*.ibd /data/mysql/data/sbtest/

## 拷貝cfg檔案
shell> cp /data/mysql/backup/2019-02-22_15-26-20/sbtest/*.cfg /data/mysql/data/sbtest/

## 修改檔案許可權為mysql使用者
shell> chown -R mysql:mysql /data/mysql/data/sbtest

 

  • 5) 執行匯入表空間檔案操作
shell> cd /data/mysql/backup

## 出現Warning為可傳輸表空間正常輸出,可忽略,詳情可參考下圖所示note說明
shell> mysql <import_tbs.sql
Warning (Code 1814): InnoDB: Tablespace has been discarded for table 'sbtest1'
Warning (Code 1814): InnoDB: Tablespace has been discarded for table 'sbtest2'
Warning (Code 1814): InnoDB: Tablespace has been discarded for table 'sbtest3'
Warning (Code 1814): InnoDB: Tablespace has been discarded for table 'sbtest4'

## 可通過MySQL錯誤日誌檢視import期間是否存在匯入異常
shell> less /data/mysql/data/mysql-error.log



4.建立複製(多源複製) 

mysql> CHANGE MASTER TO 
MASTER_HOST='10.186.60.16', 
MASTER_USER='repl', 
MASTER_PORT=3333, 
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=149327998 FOR CHANNEL '10-186-60-16';

mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=('sbtest.%');

mysql> START SLAVE FOR CHANNEL '10-186-60-16';
mysql> SHOW SLAVE STATUS FOR CHANNEL '10-186-60-16'\G;



四、參考連結

  • Percona xtrabackup export功能介紹

https://www.percona.com/doc/percona-xtrabackup/2.4/xtrabackup_bin/restoring_individual_tables.html

  • MySQL 可傳輸表空間功能說明

https://dev.mysql.com/doc/refman/5.7/en/tablespace-copying.html

  • 場景示例思路來源部落格

http://www.cnblogs.com/xuanzhi201111/p/6609867.html
 

使用指南系列

| 使用指南
深度分析 | MyCat與DBLE的對比效能調
開源分散式中介軟體 DBLE 快速入門指南
DBLE 自定義拆分演算法
DBLE Server.xml 配置解析
DBLE Schema.xml 配置解析
DBLE rule.xml 配置解析
| 案例分析
DBLE和Mycat跨分片查詢結果不一致案例分析
| 社群活動
DBLE核心研發主講:MySQL分散式中介軟體公開課開課啦


開源分散式中介軟體DBLE
社群官網:https://opensource.actionsky.com/
GitHub主頁:https://github.com/actiontech/dble
技術交流群:669663113

開源資料傳輸中介軟體DTLE
社群官網:https://opensource.actionsky.com/
GitHub主頁:https://github.com/actiontech/dtle
技術交流群:852990221
 

相關推薦

基於Xtrabackup傳輸空間實現資料恢復

開發十年,就只剩下這套架構體系了! >>>   

基於關係型資料庫和ES搜尋引擎,實現,百億級資料的大資料分析方案

背景: 隨著公司各項業務的快速發展與擴張,伺服器和各種應用系統隨之而增加,同時對應用系統、伺服器的穩定性,可持續性提出了更高的要

exp/expdp傳輸空間和rman convert實現大資料量快速遷移

將Oracle資料庫中某個使用者遷移到另外一個庫上,遷移的資料量大小約 120GB 。如果採用 expdp 匯出的話時間會很長,再加上匯出的 DMP 檔案拷貝和 impdp 匯入資料的時間,不能滿足要求。  這裡採用 RMAN 的CONVERT 功能和 exp/expdp

基於hive的拉鏈設計實現

show htm schema ive when form put 增量 上傳 參考http://lxw1234.com/archives/2015/08/473.htm 測試數據 order_2015-08-21 1 2015-08-18 2015-08-18 創建2 2

MySQL5.7傳輸空間——遷移分區

flush 目標 utf8 存儲 nod db文件 否則 exp 完成 Mysql 傳輸表空間--將InnoDB分區表復制到另一個實例(二)實驗環境:(都是mysql5.7) 源庫:192.168.2.200 mysql5.7.16 zhangdb下的em

Java版數據結構與算法(三):基於實現LinkedList碼徹底分析

方法 extends 16px 設置 存在 數組 bounds 自己 數據信息 LinkedList 是一個雙向鏈表。它可以被當作堆棧、隊列或雙端隊列進行操作。LinkedList相對於ArrayList來說,添加,刪除元素效率更高,ArrayList添加刪除元素的話需移動

oracle 創建空間oracle 11g空間之最大最小

rop create default 數據文件 32位系統 conn dbf ide 剩余空間 /*分為四步 *//*第1步:創建臨時表空間 */create temporary tablespace emaoyi_temp tempfile ‘D:\app\Adminis

ORACLE RAC 11G 添加以刪除UNDO空間

clu table alt 空間使用 11g 10g 分享 set nbsp 在生產環境上,由於閃存盤的容量有限,現在需要將閃存盤裏面的UNDO表空間,替換到非閃存的磁盤裏面。 磁盤的使用情況如下: 表空間使用情況如下: RAC兩個節點占用將近167G的空間。 操作步驟

Mysql下傳輸空間

源庫 test 目標庫  tes 把test庫下的 t3表 ,傳輸到tes庫下面 步驟 1 目標庫上建立與原庫一樣的表t3 2 解除安裝目標庫下的t3的表空間 3 在源庫執行表空間匯出 4 將源庫上的匯出檔案複製到目標庫,並修改許可權 5 源庫上執行解鎖操作 6 目標庫上執行表空間

mysql database:傳輸空間

源庫 [[email protected] ~]# su - mysql [[email protected] ~]$ mysql -utpcc -ptpcc mysql> use 

遷移工具的選型-複製ibd的方法-傳輸空間

1.1. 場景 有的時候開放人員自己的庫需要幫忙導一些資料,但是表的資料量又很大。雖然說使用mysqldump或mysqlpump也可以導。但是這耗時需要比較久。 記得之前建議開放人員可以直接使用navicat去抽取測試庫的資料。但是發現但遇到大表的時候,發現navicat會卡死。 1.2.&

mysql 5.6 使用傳輸空間遷移恢復誤刪除的

以前在網上也看過一些對5.6傳輸表空間的介紹,不過都寫的不夠具體詳細,今天有空就具體操作了一把,並詳細記錄了一下算留個檔 一,簡單說明: 1),傳輸表空間的限制:   1,mysql 版本 5.6.6 及其以上,並且版本建議源和目標版本建議都是GA版並且大版本一樣   2

ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kaggle資料集預測泰坦尼克號生存人員

ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kaggle資料集預測泰坦尼克號生存人員 實驗資料 設計思路   實現程式碼(部分程式碼) /** js程式碼實現SVM演算法 */ //ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kagg

caffe:contactslice層用法說明實現資料標籤、

contact解析 Concat層的作用就是將兩個及以上的特徵圖按照在channel或num維度上進行拼接,並沒有eltwise層的運算操作,舉例,如果說在channel維度上進行拼接的話,首先除了channel維度可以不一樣,其餘維度必須一致(也就是num、H、W一致),以Caffe為例,介紹

資料檔案大小限制、空間大小限制、資料檔案大小限制翻譯mos文章

Oracle 10g和11g中以下內容的最大值: 資料庫大小 表空間大小 檔案大小 小檔案資料庫對於小型檔案資料庫,Oracle資料庫具有以下限制: 最大資料檔案數為:65533 每個資料檔案的最大資料塊:2 ^ 22 -1 = 4194303 最大資料檔案大小= db_

Caffe中LMDB介面實現標籤資料準備訓練

有不少部落格講Caffe多標籤輸入的問題,但總覺得講的不夠透徹,在實踐角度上沒有給出詳細的指導,所以本文力求能給出詳細的實踐過程和說明。 Caffe多標籤輸入常用的的方法有以下幾種: 1. 修改Caffe原始碼使其支援多標籤輸入,參考CSDN部落格《

ORACLE 資料庫、空間、SCHEMA、資料檔案的概念

      在Oracle中,結合邏輯儲存與物理儲存的概念,我們可以這樣來理解資料庫、表空間、SCHEMA、資料檔案這些概念:      資料庫是一個大圈,裡面圈著的是表空間,表空間裡面是資料檔案,那麼schema是什麼呢?schema是一個邏輯概念,是一個集合,但schem

Oracle中查詢當前資料庫中的所有空間和對應的資料檔案語句命令

--轉載路徑:http://www.cnblogs.com/wangsaiming/p/3573917.html --------------------------------------------------------------------------------

oracle資料庫和空間的最大資料容量限制

from  http://www.enkj.com/help/newscontent/113209 資料庫顧名思義是資料的集合也是虛擬主機搭建網站儲存資料的工具,而Oracle則是管理這些資料集合的軟體系統,它是一個物件關係型的資料庫管理系統。 表空間是Oracle對物理

hive聯查實現取最新資料

hive不支援update語句,但我們可以通過增加一個變更表來間接實現update功能。 假設我們有一張user表,對user表的更新都作為新記錄插入到user_delta表中,每條插入都有插入時間欄位updated。獲取最新的user資訊: SELEC