MySQL--pt-osc工具學習

来源:http://www.cnblogs.com/TeyGao/archive/2017/07/13/7160421.html
-Advertisement-
Play Games

## ##pt-osc之工作流程:1、檢查更改表是否有主鍵或唯一索引,是否有觸發器2、檢查修改表的表結構,創建一個臨時表,在新表上執行ALTER TABLE語句3、在源表上創建三個觸發器分別對於INSERT UPDATE DELETE操作4、從源表拷貝數據到臨時表,在拷貝過程中,對源表的更新操作會寫 ...


##=====================================================##
pt-osc之工作流程:
1、檢查更改表是否有主鍵或唯一索引,是否有觸發器
2、檢查修改表的表結構,創建一個臨時表,在新表上執行ALTER TABLE語句
3、在源表上創建三個觸發器分別對於INSERT UPDATE DELETE操作
4、從源表拷貝數據到臨時表,在拷貝過程中,對源表的更新操作會寫入到新建表中
5、將臨時表和源表rename(需要元數據修改鎖,需要短時間鎖表)
6、刪除源表和觸發器,完成表結構的修改。

##=====================================================##
pt-osc之工具限制
1、源表必須有主鍵或唯一索引,如果沒有工具將停止工作
2、如果線上的複製環境過濾器操作過於複雜,工具將無法工作
3、如果開啟複製延遲檢查,但主從延遲時,工具將暫停數據拷貝工作
4、如果開啟主伺服器負載檢查,但主伺服器負載較高時,工具將暫停操作
5、但表使用外鍵時,如果未使用--alter-foreign-keys-method參數,工具將無法執行
6、只支持Innodb存儲引擎表,且要求伺服器上有該表1倍以上的空閑空間。

##=====================================================##
pt-osc之拷貝數據
在拷貝數據過程中,工具會把數據按照主鍵或唯一鍵進行拆分,限制每次拷貝數據的行數以保證拷貝進行不過多消耗伺服器資源。為保證源表和目標表數據相同,採用LOCK IN SHARE MODE來獲取要拷貝數據段的最新數據並對數據加共用鎖組織其他回話修改數據,採用LOW_PRIORITY IGNORE來將數據插入到新表中, 關鍵字LOW_PRIORIT使得插入操作會等待其他訪問該表的操作完成會再執行,關鍵字INGORE使得表中出現主鍵或唯一索引鍵重覆時新數據被忽略而不會被插入。

對錶`testdb1`.`tb1001`進行修改時的數據拷貝腳本:

## 先獲取下一次拷貝數據的邊界,強制索引可以有效避免執行計划出現問題
SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `testdb1`.`tb1001` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '8394306')) ORDER BY `id` LIMIT 22256, 2 /*next chunk boundary*/

## 通過拷貝數據的邊界限制,防止單次拷貝過多數據而長時間阻塞其他回話
INSERT LOW_PRIORITY IGNORE INTO `testdb1`.`_tb1001_new` (`id`, `c1`, `c6`) SELECT `id`, `c1`, `c6` FROM `testdb1`.`tb1001` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '8394306')) AND ((`id` <= '8416562')) LOCK IN SHARE MODE /*pt-online-schema-change 14648 copy nibble*/


##=====================================================##
pt-osc之觸發器

pt-osc工具在源表上創建三個AFTER觸發器分別對於INSERT UPDATE DELETE操作,DELETE觸發器使用DELETE IGNORE來保證源表和新表的數據都被刪除, 而INSERT和UPDATE觸發器使用REPLACE INTO來保證新表數據和源表數據一致。

由於MySQL限制相同類型的觸發器只能有一個,因此需要在運行前檢查源表上是否有觸發器,為保證刪除和更新效率和方便和將源表數據進行分片處理,因此要求表上有主鍵或唯一索引。

##=====================================================##
pt-osc之主機性能影響

為避免過度影響主機性能,pt-osc工具通過以下幾個方面來限制:
1、通過參數chunk-size和chunk-time控制每次拷貝數據大小
2、通過參數max-load來檢查主機當前壓力,每次chunk拷貝完成後,都會運行SHOW GLOBAL STATUS LIKE 'Threads_running' 命令檢查當前正在運行的Threads數量,預設Threads_running=25,如果未指定最大值,則會取當前值的120%作為最大值,如果超過閥值則會暫停數據拷貝

##=====================================================##
pt-osc之從庫複製延遲

對於複製延遲比較敏感的業務,可以通過下麵參數來控制複製延遲:

--max-log
預設為1s,每個chunks拷貝完成後,會查看check-slave-lag參數所指定的從庫的延遲信息,如果超過max-log的閥值,則暫停複製數據,直到複製延遲小於max-log的閥值。檢查複製延遲信息依賴於SHOW SLAVE STATUS語句中返回的Seconds_Behind_Master列的值。

--check-interval
當出現複製延遲暫停複製數據後,按照check-interval指定的時間進行周期檢查複製延遲,直到延遲時間低於max-log閥值,然後恢複數據拷貝

--check-slave-lag
需要檢查複製延遲的從庫IP
如果指定check-slave-lag參數,且從庫無法正常連接或從庫IO線程和SQL線程停止,會認為主從存在延遲,導致複製數據操作一直暫停。
如果未指定check-slave-lag參數,預設還是會檢查從庫的延遲,但複製延遲不會導致數據複製暫停。

##=====================================================##
pt-osc之chunk設置
在pt-osc的幫助文檔中,關於chunk的參數有如下:
--chunk-index=s Prefer this index for chunking tables

--chunk-index-columns=i Use only this many left-most columns of a --chunk-index

--chunk-size=z Number of rows to select for each chunk copied (default 1000)

--chunk-size-limit=f Do not copy chunks this much larger than the desired chunk size (default 4.0)

--chunk-time=f Adjust the chunk size dynamically so each data-copy query takes this long to execute (default 0.5)

當chunk-size和chunk-time兩者都未指定時,chunk-size預設值為1000,chunk-time預設值為0.5S,第一次按照chunk-size來進行數據複製,然後根據第一次複製的時間動態調整chumk-size的大小,以適應伺服器的性能變化,如上一次複製1000行消耗0.1S,則下次動態調整chumk-size為5000。
如果明確指定chumk-size的值或將chunk-time指定為0,則每次都按照chunk-size複製數據。

##=====================================================##
pt-osc之alter語句限制
1、不需要包含alter table關鍵字,可以包含多個修改操作,使用逗號分開,如"drop clolumn c1, add column c2 int"
2、不支持rename語句來對錶進行重命名操作
3、不支持對索引進行重命名操作
4、如果刪除外鍵,需要對外鍵名加下劃線,如刪除外鍵fk_uid, 修改語句為"DROP FOREIGN KEY _fk_uid"
##=====================================================##
pt-osc之命令模板
## --execute表示執行
## --dry-run表示只進行模擬測試
## 表名只能使用參數t來設置,沒有長參數
pt-online-schema-change \
--host="127.0.0.1" \
--port=3358 \
--user="root" \
--password="root@root" \
--charset="utf8" \
--max-lag=10 \
--check-salve-lag='xxx.xxx.xxx.xxx' \
--recursion-method="hosts" \
--check-interval=2 \
--database="testdb1" \
t="tb001" \
--alter="add column c4 int" \
--execute

##=====================================================##
pt-osc之命令輸出
上面命令執行輸出如下:
No slaves found. See --recursion-method if host 171DB166 has slaves.
Will check slave lag on:
170DB166
Operation, tries, wait:
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `testdb1`.`tb001`...
Creating new table...
Created new table testdb1._tb001_new OK.
Altering new table...
Altered `testdb1`.`_tb001_new` OK.
2016-04-28T23:18:04 Creating triggers...
2016-04-28T23:18:04 Created triggers OK.
2016-04-28T23:18:04 Copying approximately 1 rows...
2016-04-28T23:18:04 Copied rows OK.
2016-04-28T23:18:04 Swapping tables...
2016-04-28T23:18:04 Swapped original and new tables OK.
2016-04-28T23:18:04 Dropping old table...
2016-04-28T23:18:04 Dropped old table `testdb1`.`_tb001_old` OK.
2016-04-28T23:18:04 Dropping triggers...
2016-04-28T23:18:04 Dropped triggers OK.
Successfully altered `testdb1`.`tb001`.

##=====================================================##


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

-Advertisement-
Play Games
更多相關文章
  • 經常需要註釋,取消註釋代碼 Ctrl + / 對每段代碼前面添加或者取消 // Ctrl + Shift + / 對代碼添加 或取消 /* */ 實用快捷鍵,持續更新中... ... ...
  • 一,代碼。 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSLog(@"--產生隨機數 %@",[self ge ...
  • xtrabackup是由percona提供的mysql備份工具,它是一款物理備份工具,通過連接資料庫把資料庫的數據備份出來。對於innodb存儲引擎其支持全量備份和增量備份。對於myisam存儲引擎只支持增量備份。因為xtrabackup對innodb的增量備份是基於表空間的LSN進行的,所謂LSN ...
  • 首先是寫一個分割字元串的函數,返回table類型 CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)RETURN ty_str_splitIS j INT := 0; i INT := 1; ...
  • SparkStreaming與Kafka整合遇到的問題及解決方案 ...
  • 問題背景描述: 在MySQL中執行SQL語句,比如insert,賊慢,明明可能也就只是一行數據的插入,數據量很小,但是耗費的時間卻很多,為什麼?一、存儲結構分析MySQL存儲結構圖:解析:1、讀操作:記憶體讀-->cache緩存讀-->磁碟物理讀讀取到的數據會按上述順序往回送。2、寫操作:記憶體數據直接 ...
  • 最近在找工作,面試時很多企業會問到關於資料庫優化的問題,今天在這裡總結一下資料庫優化問題,以MySQL資料庫為例進行講解。 為什麼要優化: 隨著實際項目的啟動,資料庫經過一段時間的運行,最初的資料庫設置,會與實際資料庫運行性能會有一些差異,這時我們 就需要做一個優化調整。 資料庫優化這個課題較大,可 ...
  • 使用動態視圖: sys.dm_os_buffer_descriptors 這個視圖返回一個8K data page的下列屬性: (1)該頁屬於哪個資料庫 (2)該頁屬於資料庫哪個文件 (3)該頁的Page_ID (4)該頁的類型。可以根據這個來判斷此頁時索引頁還是數據頁 (5)該頁內有多少行數據 ( ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...