Mysql DDL執行方式-pt-osc介紹 | 京東雲技術團隊

来源:https://www.cnblogs.com/jingdongkeji/archive/2023/05/30/17443687.html
-Advertisement-
Play Games

大家好,接著上次和大家一起學習了《MySQL DDL執行方式-Online DDL介紹》,那麼今天接著和大家一起學習另一種MySQL DDL執行方式之pt-soc。 ...


1 引言

大家好,接著上次和大家一起學習了《MySQL DDL執行方式-Online DDL介紹》,那麼今天接著和大家一起學習另一種MySQL DDL執行方式之pt-soc

在MySQL使用過程中,根據業務的需求對錶結構進行變更是個普遍的運維操作,這些稱為DDL操作。常見的DDL操作有在表上增加新列或給某個列添加索引。

DDL定義:

Data Definition Language,即數據定義語言,那相關的定義操作就是DDL,包括:新建、修改、刪除等;相關的命令有:CREATE,ALTER,DROP,TRUNCATE截斷表內容(開發期,還是挺常用的),COMMENT 為數據字典添加備註。

註意:DDL操作是隱性提交的,不能rollback,一定要謹慎哦!

下圖是執行方式的性能對比及說明:

圖1 易維平臺說明圖

下麵本文將對DDL的執行工具之pt-osc進行簡要介紹及分析。如有錯誤,還請各位大佬們批評指正。

2 介紹

pt-online-schema-change - ALTER tables without locking them.

pt-online-schema-change alters a table’s structure without blocking reads or writes. Specify the database and table in the DSN. Do not use this tool before reading its documentation and checking your backups carefully.

pt-online-schema-change是Percona公司開發的一個非常好用的DDL工具,稱為 pt-online-schema-change,是Percona-Toolkit工具集中的一個組件,很多DBA在使用Percona-Toolkit時第一個使用的工具就是它,同時也是使用最頻繁的一個工具。它可以做到在修改表結構的同時(即進行DDL操作)不阻塞資料庫表DML的進行,這樣降低了對生產環境資料庫的影響。在MySQL5.6之前是不支持Online DDL特性的,即使在添加二級索引的時候有FIC特性,但是在修改表欄位的時候還是會有鎖表並阻止表的DML操作,這樣對於DBA來說是非常痛苦的,好在有pt-online-schema-change工具在沒有Online DDL時解決了這一問題。

Percona 公司是成立於2006年,總部在美國北卡羅來納的Raleigh。由 Peter Zaitsev 和 Vadim Tkachenko創立, 這家公司聲稱他們提供的軟體都是免費的,他們的收入主要來與開源社區,企業的支持,以及使用他們軟體的公司的支付他們提供support的費用。 而實際上這家公司"壟斷"了業內最流行資料庫支持類的軟體,並且還開發了一些其他的與資料庫相關的東西。

Percona-Toolkit工具集是Percona支持資料庫人員用來執行各種MySQL、MongoDB和系統任務的高級命令行工具的集合,這些任務太難或太複雜而無法手動執行。這些工具是私有或“一次性”腳本的理想替代品,因為它們是經過專業開發、正式測試和完整記錄的。它們也是完全獨立的,因此安裝快速簡便,無需安裝任何庫。

Percona Toolkit 源自 Maatkit 和 Aspersa,這兩個最著名的 MySQL 伺服器管理工​具包。它由 Percona 開發和支持。

3 工作流程

pt-osc 用於修改表時不鎖表,簡單地說,這個工具創建一個與原始表一樣的新的空表,並根據需要更改表結構,然後將原始表中的數據以小塊形式複製到新表中,然後刪除原始表,然後將新表重命名為原始名稱。在複製過程中,對原始表的所有新的更改(insert,delete,update)都將應用於新表,因為在原始表上創建了一個觸發器,以確保所有新的更改都將應用於新表。有關 pt-online-schema-change 工具的更多信息,請查閱手冊文檔 。

pt-osc大致的工作過程如下:

1.創建一個和要執行 alter 操作的表一樣的新的空表結構(是alter之前的結構);

2.在新表執行alter table 語句(速度應該很快);

3.在原表中創建觸發器3個觸發器分別對應insert,update,delete操作,如果表中已經定義了觸發器這個工具就不能工作了;

4.以一定塊大小從原表拷貝數據到臨時表,拷貝過程中通過原表上的觸發器在原表進行的寫操作都會更新到新建的臨時表,保證數據不會丟失(會限制每次拷貝數據的行數以保證拷貝不會過多消耗伺服器資源,採用 LOCK IN SHARE MODE 來獲取要拷貝數據段的最新數據並對數據加共用鎖阻止其他會話修改數據,不過每次加S鎖的行數不多,很快就會被釋放);

5.將原表Rename為old表,再把新表Rename為原表(整個過程只在rename表的時間會鎖一下表,其他時候不鎖表);

6.如果有參考該表的外鍵,根據alter-foreign-keys-method參數的值,檢測外鍵相關的表,做相應設置的處理(根據修改後的數據,修改外鍵關聯的子表),如果被修改表存在外鍵定義但沒有使用
--alter-foreign-keys-method 指定特定的值,該工具不予執行;

7.預設最後將舊原表刪除、觸發器刪除。

圖2 pt-osc工作過程示意圖

4 用法

Percona Toolkit 是成熟的,但是官方還是建議在使用前做到以下幾點:

•閱讀該工具的詳細文檔

•查看該工具的已知“錯誤”

•在非生產伺服器上測試該工具

•備份您的生產數據並驗證備份

下載安裝:

從官方網站下載percona-toolkit,然後執行下麵的命令進行安裝(示例):

# 安裝依賴包
yum install perl-TermReadKey.x86_64 
yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL


# 安裝percona-toolkit
rpm -ivh percona-toolkit-3.1.0-2.el7.x86_64.rpm


執行類似下麵的命令修改表結構:

pt-online-schema-change --alter="add column c1 int;" --execute D=test,t=table,u=user,p=password


alter參數指定修改表結構的語句,execute表示立即執行,D、t、u、p分別指定庫名、表名、用戶名和密碼,執行期間不阻塞其它並行的DML語句。pt-online-schema-change還有許多選項,具體用法可以使用pt-online-schema-change --help查看聯機幫助。

5 限制

pt-online-schema-change也存在一些局限性:

1.在使用此工具之前,應為表定義PRIMARY KEY或唯一索引,因為它是DELETE觸發器所必需的;

2.如果表已經定義了觸發器,則不支持 pt-osc ;(註:不是不能有任何觸發器,只是不能有針對insert、update、delete的觸發器存在,因為一個表上不能有兩個相同類型的觸發器);

3.如果表具有外鍵約束,需要使用選項
--alter-foreign-keys-method,如果被修改表存在外鍵定義但沒有使用 --alter-foreign-keys-method 指定特定的值,該工具不予執行;

4.還是因為外鍵,對象名稱可能會改變(indexes names 等);

5.在Galera集群環境中,不支持更改MyISAM表,系統變數 wsrep_OSU_method 必須設置為總序隔離(Total Order Isolation,TOI);

6.此工具僅適用於 MySQL 5.0.2 及更新版本(因為早期版本不支持觸發器);

7.需要給執行的賬戶在 MySQL上授權,才能正確運行。(應在伺服器上授予PROCESS、SUPER、REPLICATION SLAVE全局許可權以及 SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER 和 TRIGGER 表許可權。Slave 只需要 REPLICATION SLAVE 和 REPLICATION CLIENT 許可權。)

6 對比OnLine DDL

下麵的表格是國外技術牛人進行的測試數據,是Online DDL和pt-osc對一個包含1,078,880行的表應用一些alter操作的對比結果,僅供參考:

online ddl pt-osc
更改操作 受影響的行 是否鎖表 時間(秒) 受影響的行 是否鎖表 時間(秒)
添加索引 0 3.76 所有行 38.12
下降指數 0 0.34 所有行 36.04
添加列 0 27.61 所有行 37.21
重命名列 0 0.06 所有行 34.16
重命名列更改其數據類型 所有行 30.21 所有行 34.23
刪除列 0 22.41 所有行 31.57
更改表引擎 所有行 25.3 所有行 35.54

那麼現在的問題是,我們應該使用哪種方法來執行alter語句呢?

雖然pt-osc允許對正在更改的表進行讀寫操作,但它仍然會在後臺將表數據複製到臨時表,這會增加MySQL伺服器的開銷。所以基本上,如果Online DDL不能有效工作,我們應該使用 pt-sc。換句話說,如果Online DDL需要將數據複製到臨時表(algorithm=copy)並且該表將被長時間阻塞(lock=exclusive)或者在複製環境中更改大表時,我們應該使用 pt-osc工具。

pt-osc官方文檔:
https://docs.percona.com/percona-toolkit/pt-online-schema-change.html

7 總結

本次和大家一起學習瞭解pt-online-schema-change工具,介紹了其產生的背景、基本工作流程、用法及相應的一些限制。還介紹了其與Online DDL執行方式的一些對比,如果錯誤還請指正。

目前可用的DDL操作工具包括pt-osc,github的gh-ost,以及MySQL提供的線上修改表結構命令Online DDL。pt-osc和gh-ost均採用拷表方式實現,即創建個空的新表,通過select+insert將舊表中的記錄逐次讀取並插入到新表中,不同之處在於處理DDL期間業務對錶的DML操作。

到了MySQL 8.0 官方也對 DDL 的實現重新進行了設計,其中一個最大的改進是 DDL 操作支持了原子特性。另外,Online DDL 的 ALGORITHM 參數增加了一個新的選項:INSTANT,只需修改數據字典中的元數據,無需拷貝數據也無需重建表,同樣也無需加排他 MDL 鎖,原表數據也不受影響。整個 DDL 過程幾乎是瞬間完成的,也不會阻塞 DML,不過目前8.0的INSTANT使用範圍較小,後續再對8.0的INSTANT做詳細介紹吧。

下一期文章將和大家一起學習、瞭解github的gh-ost,敬請期待哦!

作者:京東物流 劉鄧忠

來源:京東雲開發者社區


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

-Advertisement-
Play Games
更多相關文章
  • 在visual studio開發H5網站的調試時候,需要在多環境調試,比如在不同瀏覽器和不同解析度的電腦、不同的手機瀏覽器測試。或者項目比較著急,需要邊測試邊開發,可不可以不發佈讓測試人員來測試呢?visual studio 2022在17.5版本推出了開發隧道(Dev Tunnels)的功能,就是 ...
  • # 1.創建Yarp項目 目的:通過代理解決網路無法訪問openAI的問題 項目源碼地址:[https://github.com/raokun/YarpProject](https://github.com/raokun/YarpProject) ## 1.創建.net7 webapi項目 創建一個 ...
  • # 前言 在剛剛開始學習網路安全時候,裝好了kali準備測試一下。 運行了py結尾的腳本出現了以下錯誤: ![](https://img2023.cnblogs.com/blog/2572943/202305/2572943-20230531000850176-695077837.png) #解決方 ...
  • 前言 大家好,我是 god23bin。歡迎來到這個系列,每天只需一分鐘,記住一個 Linux 命令不成問題。今天讓我們從 cd 命令開始,掌握在 Linux 系統中切換目錄的技巧。 ...
  • 大家好,我是 god23bin。今天我給大家帶來的是 Linux 命令系列,每天只需一分鐘,記住一個 Linux 命令不成問題。今天,我們要介紹的是一個常用而又強大的命令:ls(list)。 ...
  • # 數據導入 ## 使用 Insert 方式同步數據 用戶可以通過 MySQL 協議,使用 INSERT 語句進行數據導入 INSERT 語句的使用方式和 MySQL 等資料庫中 INSERT 語句的使用方式類似。 INSERT 語句支持以下兩種語法: ```SQL INSERT INTO tabl ...
  • 這是一份最好的中藥資料庫,不但欄位內容最為詳細,而且記錄數也是最多的,欄位包含:藥名、別名、漢語拼音、拉丁文名、英文名、拉丁植物動物礦物名、性味、歸經、功效、主治、用法用量、用藥禁忌、功效分類、藥理作用、中藥化學成分、選方、各家論述、考證、科屬分類、採收和儲藏、資源分佈、動植物形態、生藥材鑒定、藥用 ...
  • 《全唐詩》是清朝初年編修的彙集唐代詩歌的總集,全書共九百捲,收錄唐代詩人二千五百二十九家,詩作四萬二千八百六十三首,是中國規模最大的一部詩歌總集。(全唐詩ACCESS資料庫含記錄數有43086條) 《全宋詞》薈萃了宋代三百年間的詞作,收錄宋代詞人一千三百三十家,詞作兩萬一千一百一十六首,是中國近百年 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...