mysql 跨實例復制數據_社區投稿 | MySQL 跨實例 copy 大表解決方案

作者簡介

任坤,現居珠海,先后擔任專職 Oracle 和 MySQL DBA,現在主要負責 MySQL、mongoDB 和 Redis 維護工作。

一、背景

某天晚上 20:00 左右開發人員找到我,要求把 pre-prod 環境上的某張表導入到 prod ,第二天早上 07:00 上線要用。該表有數億條數據,壓縮后 ibd 文件大約 25G 左右,表結構比較簡單:

CREATE TABLE `t` (

`UNIQUE_KEY` varchar(32) NOT NULL,

`DESC` varchar(64) DEFAULT NULL ,

`NUM_ID` int(10) DEFAULT '0' ,

PRIMARY KEY (`UNIQUE_KEY`),

KEY `index_NumID` (`NUM_ID`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED

MySQL 版本:pre-prod 和 prod 都采用 5.7.25 ,單向主從結構。

二、解決方案

最簡單的方法是采用 mysqldump + source ,但是該表數量比較多,之前測試的時候至少耗時 4h+ ,這次任務時間窗口比較短,如果中間執行失敗再重試,可能會影響業務正式上線。采用 select into outfile + load infile 會快一點,但是該方案有個致命問題:該命令在主庫會把所有數據當成單個事務執行,只有把數據全部成功插入后,才會將 binlog 復制到從庫,這樣會造成從庫嚴重延遲,而且生成的單個 binlog 大小嚴重超標,在磁盤空間不足時可能會把磁盤占滿。經過比較,最終采用了可傳輸表空間方案,MySQL 5.6 借鑒 Oracle 引入該技術,允許在 2 個不同實例間快速的 copy innodb 大表。該方案規避了昂貴的 sql 解析和 B+tree 葉節點分裂,目標庫可直接重用其他實例已有的 ibd 文件,只需同步一下數據字典,并對 ibd 文件頁進行一下校驗,即可完成數據同步操作。

具體操作步驟如下:1. 目標庫,創建表結構,然后執行 ALTER TABLE t DISCARD TABLESPACE ,此時表t只剩下 frm 文件

2. 源庫,開啟 2 個會話

session1:執行 FLUSH TABLES t FOR EXPORT ,該命令會對 t 加鎖,將t的臟數據從 buffer pool 同步到表文件,同時新生成 1 個文件 t.cfg ,該文件存儲了表的數據字典信息

session2:保持 session1 打開狀態,此時將 t.cfg 和 t.ibd 遠程傳輸到目標庫的數據目錄,如果目標庫是主從結構,需要分別傳輸到主從兩個實例,傳輸完畢后修改屬主為 mysql:mysql

3. 源庫,session1 執行 unlock tables ,解鎖表 t ,此時 t 恢復正常讀寫

4. 目標庫,執行 ALTER TABLE t IMPORT TABLESPACE ,如果是主從結構,只需要在主庫執行即可

三、實測

針對該表,執行 ALTER TABLE ... IMPORT TABLESPACE 命令只需要 6 分鐘完成,且 IO 消耗和主從延遲都被控制到合理范圍。原本需要數個小時的操作,只需 10 多分鐘完成(算上數據傳輸耗時)。如果線上有空表需要一次性加載大量數據,可以考慮先將數據導入到測試環境,然后通過可傳輸表空間技術同步到線上,可節約大量執行時間和服務器資源。

四、總結

可傳輸表空間,有如下使用限制:源庫和目標庫版本一致

只適用于 innodb 引擎表

源庫執行 flush tables t for export 時,該表會不可寫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529725.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ajax跨域只能是get,jsonp跨域請求只能get變相解決方案

1.java設置返回表頭:response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Allow-Methods","POST");response.setHeader("Access-Control-Max-Age","1000");2.…

云服務器虛擬主機區別,云服務器和虛擬主機的區別

云空間服務是云計算服務的重要組成部分,是面向各類互聯網用戶提供綜合業務能力的服務平臺。平臺整合了傳統意義上的互聯網應用三大核心要素:計算、存儲、網絡,面向用戶提供公用化的互聯網基礎設施服務。采用操作系統虛擬化技術,虛擬化效率高,虛擬化License費用低,能共享操作系統…

php連接mysql并操作系統_PHP 連接并操作MySQL的一個實例

/*** MyClass 抽象類,用于執行查詢語句**/class MyClass{const HOST 192.168.73.110:3306;const USER root;const PASSWORD root;const DB kmdbcenter;static $Instance false;private $QueryResult False;private final function __construct(){if(!mysql_connect(MyCla…

服務器上次文件命令,服務器上次文件命令

服務器上次文件命令 內容精選換一換當創建文件系統后,您需要使用云服務器來掛載該文件系統,以實現多個云服務器共享使用文件系統的目的。CIFS類型的文件系統不支持使用Linux操作系統的云服務器進行掛載。同一SFS容量型文件系統不能同時支持NFS協議和CIFS…

win7裝mysql一直未響應6_win7重裝mysql最后一步無響應解決方法

重新安裝MySQL出示未響應,一般顯示在安裝MySQL程序最后一步的2,3項就不動了。這種情況一般是你以前安裝過MySQL數據庫服務項被占用了。解決方法:一種方法:你可以安裝MySQL的時候在這一步時它默認的服務名是“MySQL” 只需要把這個…

spd不能修改服務器內存條的原因,修改內存SPD 解決藍屏問題

修改內存SPD 解決藍屏問題互聯網 發布時間:2009-04-21 01:18:13 作者:佚名 我要評論問:一臺電腦的內存是HY 256MB DDRII 533,最近又購買了一條HY 256MB DDRII 533內存,與原有內存組成雙通道。使用時偶爾會出現藍…

服務器批量修改代碼,利用Redis實現多服務器批量操作

工作中遇到一個項目需要在多個平臺編譯打包,每次都需要登錄到不同的服務器同步代碼,編譯,打包,上傳,非常麻煩,于是想為何不能一次操作,多臺服務器自動執行呢。網上找了下,有很多解決…

django與mysql實現增刪_django與mysql實現簡單的增刪查改

模型定義from django.db import modelsclass Grades(models.Model):g_name models.CharField(max_length20)create_date models.DateTimeField()girl_num models.IntegerField()boy_num models.IntegerField()isDelete models.BooleanField(defaultFalse)def __str__(self…

服務器本地文件,云服務器 本地文件

云服務器 本地文件 內容精選換一換在云服務器上搭建網站后,部分客戶通過本地網絡訪問網站時出現偶發性無法訪問的情況。確認客戶使用的本地網絡。若客戶的本地網絡是NAT網絡(本地主機通過NAT功能使用公網IP地址訪問彈性云服務器),可能會導致該問題。若客…

mysql oracle 備份數據庫備份_完整備份Oracle數據庫

修改備份文件的有效時間(必須用spfile啟動數據庫)SQLgt; alter system set control_file_record_keep_time30 scopeboth;修改備份文件的有效時間(必須用spfile啟動數據庫)SQL> alter system set control_file_record_keep_time30 scopeboth;System altered.先啟動歸檔SQL>…

修改域服務器IP,域控制器遷移以及修改服務器ip

windows2003域控制器如果服務器太舊就需要遷移至新的服務器上,經本人實驗,無誤。windows server 2003 域控制器轉移遷移準備工作:1. 在Windows Server 2003上運行dcpromo命令將其升級為域控制器,并在升級時選擇使其成為現有Windows 2003域的額外的域控制器。2. 在Wi…

mysql注入fuzz字典_sql注入fuzz bypass waf

本帖最后由 xmidf 于 2018-7-11 10:16 編輯作者:whynot 轉自:先知0x0 前言這里是簡單對sql注入繞過waf的一個小總結,非安全研究員,這里不講原理,關于原理搜集了一些其他大佬的文章(文章在最下面請自取)&#xff0…

python如何開發網站_如何用Python寫一個小網站?

一、準備 python基礎相關準備:pygame的基礎知識,參考目光博客的“用Python和Pygame寫游戲-從入門到精通”安python 3.8.0 在python官網下載,不多說。安裝pygame,命令:pip install pygame如安裝較慢,可以參考…

python項目選擇背景_Python - - 項目實戰 - - 游戲背景

目標背景交替滾動的思路確定顯示游戲背景01,背景交替滾動的思路確定運行 備課代碼,觀察 背景圖像的顯示效果:游戲啟動后,背景圖像 會 連續不斷地 向下方 移動在 視覺上 產生英雄的飛機不斷向上方飛行的 錯覺 - - 在很多跑酷游戲中…

【AI】人工智能復興的推進器之自然語言處理

目錄 一、什么是自然語言處理 二、詞袋模型 三、向量 四、代碼示例 五、大模型和自然語言處理 接上篇:【AI】人工智能復興的推進器之機器學習-CSDN博客 一、什么是自然語言處理 自然語言處理(Natural Language Processing,NLP&#xf…

css阻止換行_CSS中,如何處理短內容和長內容?

本文已經過原作者 shadeed 授權翻譯。當我們使用 CSS 構建布局時,考慮長短文本內容很重要,如果能清楚地知道當文本長度變化時需要怎么處理,可以避免很多不必要的問題。在許多情況下,添加或刪除一個單詞會改變 UI 的外觀&#xff0…

duilib設置透明窗口_界面開發心得與Duilib | 學步園

一、設置窗體透明度和指定透明色(如指定了黑色,即所有黑色的部分將會變得透明)DWORD dwExStyleGetWindowLong(m_hWnd,GWL_EXSTYLE);if((dwExStyle&WS_EX_LAYERED)!WS_EX_LAYERED)SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle|WS_EX_LAYERED);HMODULE hInst Loa…

influxdb無法實現關聯表_InfluxDb專業術語

InfluxDb專業術語重復是最好的學習方式,我們再重復一些Influx的概念吧,雖然很多已經講過,甚至上一課已經講了。我發現我自己還是有點啰嗦,不過這可能是一種好的學習方法哦。聚合函數aggregationaggregation是一個InfluxQL的函數&a…

mysql排序區分大小寫嗎_MySQL操作數據時區分大小寫

一般情況下使用SQL語句執行update login_ticket set status1 where ticket‘ABC‘會將ticket’abc‘的數據也改掉,那么需要在列名ticket的后面加上collate utf8_binupdate login_ticket set status1 where ticket COLLATE utf8_bin‘ABC‘這里的collate后面的是指該…

java的四種訪問權限_Java四種訪問權限

一、訪問權限簡介訪問權限控制: 指的是本類及本類內部的成員(成員變量、成員方法、內部類)對其他類的可見性,即這些內容是否允許其他類訪問。Java 中一共有四種訪問權限控制,其權限控制的大小情況是這樣的:public > protected …