MySQL使用pt-online-change-schema工具線上修改1.6億級數據表結構

来源:http://www.cnblogs.com/zishengY/archive/2017/05/14/6852333.html
-Advertisement-
Play Games

摘 要:本文闡述了MySQL DDL 的問題現狀、pt-online-schema-change的工作原理,並實際利用pt-online-schema-change工具線上修改生產環境下1.6億級數據表結構。 在一個軟體生命周期中,我們都知道,前期的表結構設計是非常重要的,因為當表數據量一上來後再進 ...


  要:本文闡述了MySQL DDL 的問題現狀、pt-online-schema-change的工作原理,並實際利用pt-online-schema-change工具線上修改生產環境下1.6億級數據表結構。

 

在一個軟體生命周期中,我們都知道,前期的表結構設計是非常重要的因為當表數據量一上來後再進行表結構修改危險性比較大,而且要操作的時間也比較長。

 

在筆者參與的項目中,就曾遇到這樣一個問題,首先上去查看了一下該表的信息,已有約2億的數據量,而且每分鐘還要併發寫入4萬條記錄,而由於這個表有一個欄位前期設計過短,導致寫入到資料庫後,這個欄位的值就一直亂碼。因為該表在生產環境下使用,影響到業務,需要及時修改這個欄位長度,並且修改該表結構時不能停服務。那麼如何解決這種問題呢?

 一、MySQL DDL 的問題現狀

開始想了下,減少這個表的數據量再DDL,將這個表一周以前的數據備份到一個臨時表,再刪除這個表一周以前的數據。

而在MySQL中在對錶進行ddl時,會鎖表,當表比較小比如小於1w條記錄時,操作時間較短,對前端影響較小,當時遇到千萬乃至上億級級別的表(保留一周的數據量還有1.6億),就會影響前端應用對錶的寫操作。

因為目前InnoDB引擎是通過以下步驟來進行DDL的:

1 按照原始表(original_table)的表結構和DDL語句,新建一個不可見的臨時表(tmp_table)

2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等)

3 執行insert into tmp_table select * from original_table

4 rename original_table和tmp_table,最後drop original_table

5 釋放 write lock。

我們可以看見在InnoDB執行DDL的時候,原表是只能讀不能寫的。為此 perconal 推出一個工具 pt-online-schema-change ,其特點是修改過程中不會造成讀寫阻塞

     

二、pt-online-schema-change介紹

【工具簡介】

pt-osc模仿MySQL內部的改表方式進行改表,但整個改表過程是通過對原始表的拷貝來完成的,即在改表過程中原始表不會被鎖定,並不影響對該表的讀寫操作。

首先,osc創建與原始表相同的不包含數據的新表並按照需求進行表結構的修改,然後將原始表中的數據按chunk大小逐步拷貝到新表中,當拷貝完成後,會自動同時修改原始表和新表的名字並預設將原始表刪除

【工具安裝及使用】

參見下麵下麵這篇文章

linuxpercona-toolkit工具包的安裝和使用(超詳細版)

【工作原理】

1 創建兩個和你要執行 alter 操作的表結構一樣的空表。如圖:

說明:t_ad_req_log就是原表;

_t_ad_req_log_ol是舊表,這個表是用來當你執行失敗的時候,還原回來的原表結構;

_t_ad_req_log_new是新表,這個表就是這次要修改的表。

 

 

2 執行表結構修改,然後從原表中的數據到copy到 表結構修改後的表(即_t_ad_req_log_new)

3 在原表上創建觸發器將 copy 數據的過程中,在原表的更新操作更新到新表.

   註意:如果表中已經定義了觸發器這個工具就不能工作了。

4 copy 完成以後,用rename table 新表代替原表,預設刪除原表。

 

修改的命令如下:

/usr/local/bin/pt-online-schema-change --user=用戶名 --password=密碼 --host=127.0.0.1 --port=埠號 --charset=utf8 --nodrop-old-table --alter="modify  media_code varchar(64) DEFAULT NULL COMMENT '當前視頻編碼' " D=ad_api,t=t_ad_req_log --exec

參數說明:

--user=用戶名     指定用戶名

--password=用戶名     指定用戶密碼

--port=埠號     指定埠號

--charset=utf8   指定字元編碼

--alter=    後面就是接需要修改的內容,比如上面表示的就是修改ad_api資料庫t_ad_req_log表的media_code 欄位長度為64位

 下麵請看一個完整的圖:

 

 

 

註:如果對percona-toolkit工具安裝及使用有疑問的先查看下這兩篇文章。

linux下percona-toolkit工具包的安裝和使用(超詳細版)

pt-online-schema-change解讀

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ( 自己寫的插件,數據序列化,格式化拋出的異常都會導致flume停止,不能繼續取數據,異常可以自己處理 ) 最近在用Flume做數據的收集。用到了裡面的Spooldir的源在使用中有如下的問題: 如果文件的某一行有亂碼,不符合指定的編碼規範,那麼flume會拋出一個exception,然後就停在那兒 ...
  • 1、行列轉換: decode(條件,值1,返回值1,值2,返回值2,...值n,返回值n,預設值); select decode(sign(變數1-變數2),-1,變數1,變數2) from dual; --取較小值 sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1 例如: 變數1 ...
  • 一、 DFS:distributied file system 是一種允許文件通過網路在多台主機上風向的文件系統,可讓多機器上的多用戶分享文件和存儲空間 二、HDFS的shell **切記後面加的 / 符號 三、HDFS的dfsadmin命令 ...
  • 如圖: 無法安裝原因都是這幾個工具無法識別10.0這個版本,可以修改註冊表來先完成安裝,然後再改回去 PHPManager的修改方法如下: 打開註冊表工具(運行Regedt32),找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SV... ...
  • 定時任務兩實例 例1: 每分鐘列印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。 錯誤示例: 解答知識小結: 1、定時任務要加註釋2、如果已經要定向到文件中,結尾不要有>/dev/null 2>&13、/server/log目錄必須要存在才能出結果,如沒有創建這個目錄。 ...
  • 在WindowsServer2016上安裝ExchangeServer2016的體驗與以往版本的不同,不再是直接運行SETUP然後一路NEXT就可以順利完成的了。本人安裝過程中就遇到兩個意料之外的情況還好最後成功解決了,我把經驗分享出來給同樣被困住的人參考參考,希望有所幫助。 ...
  • WannaCry ransomware used in widespread attacks all over the world Customer Guidance for WannaCrypt attacks(Microsoft Security Response Center) How to ...
  • a.場景: 平時會使用百度網盤下載電影,但是用ios版的百度雲實在是有點慢,而平時不用windows,因此只能在linux上尋找解決之道. b.背景(我正在使用中): linux:ubuntu 14.04 64bit 瀏覽器:firefox41.0.2 c.安裝詳情: 1.安裝火狐插件flashgo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...