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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...