mysql主從一致性校驗工具-pt

来源:http://www.cnblogs.com/feiren/archive/2017/11/03/7777218.html
-Advertisement-
Play Games

一、環境 1、系統環境 系統IP主機名說明server_id centos6.7 MasterIP master 資料庫:主 177 centos6.7 SlaveIP slave 資料庫:從 148 2、軟體環境 軟體版本安裝方式說明 pt工具 3.0.4 編譯安裝 這是一個綜合工具包,包含很多p ...


一、環境

1、系統環境

系統IP主機名說明server_id
centos6.7 MasterIP master 資料庫:主 177 
centos6.7 SlaveIP slave 資料庫:從 148

2、軟體環境

軟體版本安裝方式說明
pt工具 3.0.4 編譯安裝 這是一個綜合工具包,包含很多pt命令
mysql資料庫 5.6.37 yum安裝 主從環境

3、需要用到庫

庫名表名用途
 percona checksums

存儲pt命令監測的結果,第一次執行檢測命令時會自己創建

修複工具修複的時候會讀取該表

#本表格也可以自己創建,在使用pt工具的時候指定庫表名字,詳見下麵的參數解釋。

註意:自建庫表測試尚未通過。

二、為什麼要做主從一致性監測

1、主從複製是基於binlog的邏輯複製,難免出現複製數據不一致的風險

2、這個風險不但會引起用戶數據訪問前後不一致的風險

3、而且會導致後續複製出現1032、1062錯誤進而引起複制架構停滯的隱患

4、為了及時發現並解決這個問題

5、我們需要定期或不定期地開展主從複製數據一致性的校驗和修複工作

三、主從一致性監測原理

四、pt工具監測

用到的命令:

1、pt-table-check       #監測主從一致

2、pt-table-sync         #修複主從一致

mysql主從一致性校驗,基於pt工具進行。

#限制及問題

1、在檢查階段,超過1000行的數據,如果沒有設定索引或者主鍵,則報錯,該表會跳過檢查。

2、在修複階段,如果表沒有設置主鍵或索引,則修複報錯,可以手動進行修複。

3、監測是基於塊進行的,如果mysql表的數據沒有進行分塊,那麼當表過大時,會造成監測一段時間後發現沒有問題會跳過改表。

4、當資料庫兩個數據不一致,但是checksum檢測一致時,沒有比對出不一致。

主庫和從庫賬號一致,密碼不一致發現了這種問題。

原因:對於修改密碼的操作,chencksum的值並沒有發生變化。

五、安裝pt工具

最好所有主庫從庫都安裝

1、安裝依賴

yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y

yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y

2、下載安裝包

1、官網下載

3、安裝

 tar xzvf percona-toolkit-3.0.4_x86_64.tar.gz

 cd percona-toolkit-3.0.4

perl Makefile.PL   --安裝到非預設路徑PREFIX=${HOME}

 make

 make test

 make install

六、pt工具常用命令

1、創建監測賬號

grant all on *.*  to   'zxfly_check'@'192.168.22.% ' identified by 'zxfly';

flush privileges;

2、監控用的表為:percona.checksum該表會自動創建。

監測:

#指定庫名

pt-table-checksum --databases zxfly -u'zxfly' -p'zxfly' -hMasterIP -P3306 2>/logs/pt_error.log 1>/logs/pt_info.log

#不指定庫,監測所有資料庫(除information_schema、percona、performance_schema庫)

pt-table-checksum --quiet -u'zxfly' -p'zxfly' -hMasterIP -P3306 2>/logs/pt_error.log 1>/logs/pt_info.log

pt-table-checksum --replicate-check-only -u'zxfly' -p'zxfly' -hMasterIP -P3306

列印修複sql:指定庫表

pt-table-sync  --databases=dataname --tables=table1,table2 h=MasterIP,u=zxfly,p=zxfly h=SlaveIP,u=zxfly,p=zxfly --charset=utf8 --print 

修複:

pt-table-sync  --databases=dataname --tables=table1,table2 h=MasterIP,u=zxfly,p=zxfly h=SlaveIP,u=zxfly,p=zxfly --charset=utf8 --exec

 

七、pt工具常用參數

1、pt-table-checksum

參數參數說明備註
--[no]check-replication-filters 不檢查複製過濾器,建議啟用。後面可以用--databases來指定需要檢查的資料庫。 當前環境不需要該參數,預設開啟
--no-check-binlog-format 不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。 預設是監測,使用預設值,如果添加該參數可能導致diff不出來
--replicate-check-only 只顯示不同步的信息。

開啟這個,可以減少輸出並且顯示不一致的從庫主機名

不過這個只是顯示已經檢測過的不一致信息,並不能顯示當前的。

--replicate= 把checksum的信息寫入到指定表中,建議直接寫到被檢查的資料庫當中。不需要指定 預設會創建percona庫下checksum表
-h -u -p -P masterIP 監測賬號 密碼 埠  
--databases= 指定需要被檢查的資料庫,多個則用逗號隔開。  
--tables= 指定需要被檢查的表,多個用逗號隔開  
--recursion-method 指定監測從庫的模式,預設使用processlist,也可以指定dsn

多個從庫可以這樣指定。--recursion-method=dsn=h=host,D=pt,t=dsns

D 庫名 t 表名

--quiet 安靜模式,最小化列印,紙列印錯誤行 與--replicate-check-only類似,但不顯示從庫信息

dsn庫表結構及用法為:

  1. CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );
  2. -- 寫入從庫信息
  3.  INSERT INTO dsns (parent_id,dsn) values(1, "h=replica_host,u=checksums,p=password,P=3306"); 
  4. -- 如果有多個從庫,就插入多條記錄. 
  5. -- 也可以按如下簡寫
  6. INSERT INTO dsns (parent_id,dsn) values(1, "h=replica_host");

2、pt-table-sync

參數參數說明備註
--replicate= 指定通過pt-table-checksum得到的表 預設會創建percona庫下checksum表時不需要指定
--databases= 指定執行同步的資料庫 在只修複指定的庫時使用
--tables= 指定需要被修複的表,多個用逗號隔開  
--sync-to-master 指定一個DSN,即從的IP 會通過show processlist或show slave status 去自動的找主。報錯找不到主庫時使用
h= u= p= 伺服器地址,賬號,密碼 命令里有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
--print 列印修複的sql語句 只列印不執行。
--exec 或 --execute 執行修複  
--algorithms=c 指定修複演算法

default Chunk,Nibble,GroupBy,Stream 在報錯演算法問題的時候需要指定演算法

--charset= 指定預設字元集 如果數據中包含中文不指定次字元集的話修複不成功

3、輸出信息解釋

TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的信息。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。

八、pt工具常見報錯信息

1、監測報錯(找不到從庫,使用--recursion-method指定模式)

Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.

2、binlog模式問題(由於指定為row行複製造成 使用--no-check-binlog-format跳過監測,不過這樣有可能監測不出來主從不一致的信息,row行模式對於主從來說不需要進行主從監測)

Replica centos-1 has binlog_format ROW which could cause pt-table-checksum to break replication. Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation.  If you understand the risks, specify --no-check-binlog-format to disable this check.

3、沒有索引或主鍵導致的,在數據較少的時候(低於1000行,沒有測試出該信息,超過1000行會報錯)

Cannot checksum table test.t: There is no good index and the table is oversized. at ./pt-table-checksum line 6370.

4、等待信息,已檢測的百分比,這是因為設置了主鍵但是沒有索引導致沒有分塊且表過大造成。

Checksumming database.table:  27% 01:17 remain

九、對多個庫所有數據進行監測結果

pt-table-checksum監測資料庫結果:

數據大小監測花費時間監測報錯的表原因
93G 30m28.523s

4個

#字元集bug(工具自帶,無法解決)

正式平臺這些表都沒有

    1個

未監測到(中文表名監測不到)

正式平臺無此表

    1個 沒有主鍵或者索引(數據條數:132835)

十、pt修複工具pt-table-sync遇到的問題

在使用pt-table-checksum進行檢測後,發現主從不一致的情況後可以使用pt-table-sync工具進行修複操作。

其原理為:基於pt-table-checksum監測的結果進行檢查並生成修複語句去修複從庫中的數據。

遇到的報錯:

1、修複時候沒有任何提示,但是修複報錯。使用–print列印修複語句發現又亂碼。

處理方法:查看表的字元集,通過--charset=命令指定預設字元集

2、報錯:Failed to prepare TableSyncChunk plugin: Cannot chunk table `zxfly_zxfly1`.`mongo_task_data` using the character column guid, most likely because all values start with the same character. This table must be synced separately by specifying a list of --algorithms without the Chunk algorithm at /usr/local/bin/pt-table-sync line 4088.  while doing table on 192.168.0.177

原因是在預設的演算法中,要保證主鍵欄位的數據前一位有不一樣字元出現,而該表的主鍵數據第一個字元是一樣的。

解決辦法:

使用--algorithms=參數指定演算法,當然這種應該最好分庫分表進行恢復。

6、修複報錯(原因:沒有唯一索引或主鍵導致的,1000以內的,1000行以上沒有索引或主鍵在監測時就會跳過。)

Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.

 


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

-Advertisement-
Play Games
更多相關文章
  • IP地址分類: IP地址根據首首位元組開始位可以分為5大類: 分類 首位元組開始位 首位元組數字範圍 網路地址格式 最大網路個數 每個網路最多主機個數 A 0 0~127 網路 主機 主機 主機 127 16777214 B 10 128~191 網路 網路 主機 主機 16384 65534 C 110 ...
  • 近期使用ASP.NET Core2.0對博客進行了重寫,在部署到伺服器時遇到了一些問題,來記錄一下留用。 配置環境 安裝 .Net Framework3.5 在IIS管理器上直接開啟,這裡總是失敗,上網上找了找,發現了可以使用命令行安裝,打開PowerShell,依次執行: ​ ​ ​ 執行完就安裝 ...
  • 先停止docker服務 設置阿裡加速器 看到“Daemon has completed initialization”執行結果就表示配置完成。 重啟docker服務 然後再去打鏡像,速度無比快。。。 End ...
  • 一、準備 環境:centos6.8 nginx:1.13.6 二、開始 首先安裝依賴包: yum install -y gcc gcc-c++ autoconf automake make zlib zlib-devel openssl openssl-devel pcre pcre-devel 開 ...
  • 為何創建此腳本是因為方便項目的佈署,不需要手動地去同步不同的項目,而只需要簡單的執行shell腳本,輸入項目名就能發佈到服器上。 1、shell文件代碼 2、關鍵字解釋: name表示要同步的文件名 --exculde="node_modules"表示過濾的文件夾 --progress 顯示文件同 ...
  • 1. cyclictest 簡介以及安裝 1.1 cyclictest 簡介 cyclictest 是什麼? 看名字應該就能大致猜出來它是一種 test 程式,Cyclictest的維基主頁這麼介紹它“Cyclictest is a high resolution test program, wri ...
  • CentOS系統的優化 優化之前,首先查看版本信息 # cat /etc/redhat-release CentOS release 6.7 (Final) # 系統版本信息 # uname –r 2.6.32-573.el6.x86_64 # 內核版本信息 # uname -m x86_64 #表 ...
  • MMU是Memory Management Unit的縮寫,中文名是記憶體管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬體機制的記憶體訪問授權,多用戶多進程操作系統。TLB(Translation Lookaside Buffe... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...