mysql大表修改工具: pt-online-schame-change

来源:https://www.cnblogs.com/raok/archive/2023/01/13/17037226.html
-Advertisement-
Play Games

在表數據量很大的時候直接添加欄位,以及其他表結構修改,會嚴重影響線上使用,而且耗費時間很長;使用這個工具可以很好的線上修改表結構。 好處: 降低主從延時的風險 可以限速、限資源,避免操作時MySQL負載過高 建議: 在業務低峰期做,將影響降到最低 直接原表修改缺點: 當表的數據量很大的時候,如果直接 ...


在表數據量很大的時候直接添加欄位,以及其他表結構修改,會嚴重影響線上使用,而且耗費時間很長;使用這個工具可以很好的線上修改表結構。

好處:

降低主從延時的風險

可以限速、限資源,避免操作時MySQL負載過高

建議:

在業務低峰期做,將影響降到最低

直接原表修改缺點:

當表的數據量很大的時候,如果直接線上修改表結構,嚴重影響線上環境,而且耗時不可預估

註意:

需要確認表必須包含主鍵或者唯一索引

工具會創建觸發器,所以原表上不能有觸發器

有外鍵的表需要註意使用參數--alter-foreign-keys-method(現在業務上不建議表中外鍵關聯,建議在業務中控制)

原理:

  • 首先它會新建一張一模一樣的表,表名一般是_new尾碼
  • 然後在這個新表執行更改欄位操作
  • 然後在原表上加三個觸發器,DELETE/UPDATE/INSERT,將原表中要執行的語句也在新表中執行
  • 最後將原表的數據拷貝到新表中,然後替換掉原表

1.數據備份

無論操作多麼有把握,也要把備份做好(萬一很可怕)**

2.安裝

下載安裝包:

wget  https://downloads.percona.com/downloads/percona-toolkit/3.3.1/source/tarball/percona-toolkit-3.3.1.tar.gz

解壓:

tar -xvf percona-toolkit-3.3.1.tar.gz

安裝一些依賴包:

yum install perl-DBIyum install perl-DBD-MySQLyum install perl-Time-HiResyum install perl-IO-Socket-SSLyum -y install perl-Digest-MD5

3.測試可用

在解壓包的bin目錄下執行,看是否正常,查看命令

./pt-online-schema-change --help

4.參數欄位及含義

參數 含義
--user= 連接用戶名
--password= 連接密碼
--host= 連接IP
P=
--alter= 執行表變更的語句
D= database 庫名
t= table 表名
--charset=utf8 使用utf8編碼,避免中文亂碼
--no-check-alter 不檢查alter語句
--print 列印操作日誌
--execute 執行修改表結構,真正的執行alter,–dry-run與–execute必須指定一個,二者相互排斥
–dry-run 創建和修改新表,但不會創建觸發器、複製數據、和替換原表。並不真正執行,與--print配合查看執行細節

5.具體操作

  1. 添加一個欄位

如果執行失敗,檢查alter語句,如果確認無誤 可以避免檢查 --no-check-alter

./pt-online-schema-change --user=xxxx --password=xxxx --host=xxx.xxx.xxx.xxxx --alter "add column group_id bigint(20) not NULL default '0' comment 'test' " P=30306,D=h_pushcenter,t=h_message --charset=utf8 --no-version-check --print --execute
  1. 修改欄位

    sql語句:

ALTER TABLE `h_message` MODIFY COLUMN `group_id` int(20)  NOT NULL DEFAULT '1';ALTER TABLE `h_message` MODIFY COLUMN `group_id` int(20)  NOT NULL DEFAULT '1';

pt命令:

--alter "MODIFY COLUMN group_id int(20) NOT NULL DEFAULT '1'"
  1. 修改欄位名

sql語句:

ALTER TABLE `h_message` CHANGE column group_id group_id_0 bigint(20);

pt命令:

--alter "CHANGE group_id group_id_0 bigint(20)"
  1. 添加索引

sql語句:

ALTER TABLE `h_message` ADD INDEX h_message_n1(group_id);

pt命令:

--alter "ADD INDEX h_message_n1(group_id)"

6.操作日誌

  • 創建new結尾的新表
Creating new table...CREATE TABLE `h_pushcenter`.`_h_message_new` .....Created new table h_pushcenter._h_message_new OK.
  • 新表執行alter操作
Altering new table...
ALTER TABLE `h_pushcenter`.`_h_message_new` add column  group_id bigint(20) not NULL default '0'  comment 'test'
Altered `h_pushcenter`.`_h_message_new` OK.
  • 原表上創建3個觸發器
Creating triggers...
Event : DELETE
Event : UPDATE
Event : INSERTCreated triggers OK.
  • 複製數據到新表
Copying approximately 8187 rows...
Copied rows OK.
  • 重命名新舊兩個表,然後替換,刪除舊表
2021-05-19T10:33:08 Swapping tables...RENAME TABLE `h_pushcenter`.`h_message` TO `h_pushcenter`.`_h_message_old`, `h_pushcenter`.`_h_message_new` TO `h_pushcenter`.`h_message`2021-05-19T10:33:09 Swapped original and new tables OK.2021-05-19T10:33:09 Dropping old table...DROP TABLE IF EXISTS `h_pushcenter`.`_h_message_old`2021-05-19T10:33:09 Dropped old table `h_pushcenter`.`_h_message_old` OK.
  • 刪除觸發器
2021-05-19T10:33:09 Dropping triggers...DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_h_message_del`DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_h_message_upd`DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_h_message_ins`2021-05-19T10:33:09 Dropped triggers OK.
  • 完成

傳送門:https://raokun.top/raokun/archives/mysql-da-biao-xiu-gai-gong-ju-pt-online-schame-change

鏈接:
mysql好用工具: pt-online-schame-change


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

-Advertisement-
Play Games
更多相關文章
  • 需求效果:文本的高度為50dp,並且文字垂直居中 根據需求寫出如下代碼: Text(text = "你好,世界!", modifier = Modifier.height(50.dp), textAlign = TextAlign.Center) 運行後發現Text文字沒有垂直居中,設置textAl ...
  • 摘要:跨域,對後端工程師來說,可謂既熟悉又陌生。 本文分享自華為雲社區《後端老司機的跨域之旅》,作者: 勇哥java實戰分享。 跨域,對後端工程師來說,可謂既熟悉又陌生。 這兩個月我以架構師的角色參與一款教育產品的孵化,有了一段難忘的跨域之旅。 寫這篇文章,我想分享我在跨域這個知識點的經歷和思考,希 ...
  • 原文鏈接: 工作流引擎架構設計 最近開發的安全管理平臺新增了很多工單申請流程需求,比如加白申請,開通申請等等。最開始的兩個需求,為了方便,也沒多想,就直接開發了對應的業務代碼。 但隨著同類需求不斷增多,感覺再這樣寫可要累死人,於是開始了工作流引擎的開發之路。查找了一些資料之後,開發了現階段的工作流引 ...
  • 混沌工程是通過主動製造故障場景並根據系統在各種壓力下的行為表現確定優化策略的一種系統穩定性保障手段,簡單說就是通過主動註入故障的方式、提前發現問題,然後解決問題規避風險。 ...
  • 視頻格式就是通常所說的.mp4,.flv,.ogv,.webm等。簡單來說,它其實就是一個盒子,用來將實際的視頻流以一定的順序放入,確保播放的有序和完整性。 ...
  • ​01 前言 筆者在嘗試擴容C盤時,程式出錯導致D盤無法正常使用,最後誤將其格式化的悲傷故事。(低級錯誤) 02 竇娥冤 前天晚上十點左右,看著電腦里的C盤已經空間不足好幾天了,便想著擴容一下。 因為我的電腦是雙系統, Windows10+MacOS(黑蘋果) 所以硬碟的磁碟分區比較複雜, 一些引導 ...
  • 假設要在centos7.6防火牆上開啟443埠 前言:文章內容可能會因環境不同而有所差異,所謂集思廣益說不定靈感就來了呢; 文章初衷旨在交流學習、記錄個人成長,如果能幫助到您,那就點個贊噢。 1、查看防火牆是否開啟,如果沒有開啟防火牆,預設開放所有埠。 註意:如果是生產環境有業務在運行,開啟防火 ...
  • 簡述 本篇文章主要介紹如何使用 CloudCanal 構建一條 Oracle 到 PostgreSQL 的數據同步鏈路 技術要點 縮小的資料庫許可權要求 CloudCanal 對 Oracle 資料庫的高許可權要求,主要來自兩個面向 DBA 的操作,自動構建字典和 自動切換歸檔日誌,這兩個操作主要是讓用 ...
一周排行
    -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# ...