percona-toolkit--pt-table-checksum
pt-table-checksum 是 Percona-Toolkit的組件之一,用于檢測(cè)MySQL主、從庫(kù)的數(shù)據(jù)是否一致。其原理是在主庫(kù)執(zhí)行基于statement的sql語(yǔ)句來生成主庫(kù)數(shù)據(jù)塊的checksum,把相同的sql語(yǔ)句傳遞到從庫(kù)執(zhí)行,并在從庫(kù)上計(jì)算相同數(shù)據(jù)塊的checksum,最后,比較主從庫(kù)上相同數(shù)據(jù)塊的checksum值,由此判斷主從數(shù)據(jù)是否一致。檢測(cè)過程根據(jù)唯一索引將表按row切分為塊(chunk),以為單位計(jì)算,可以避免鎖表。檢測(cè)時(shí)會(huì)自動(dòng)判斷復(fù)制延遲、 master的負(fù)載, 超過閥值后會(huì)自動(dòng)將檢測(cè)暫停,減小對(duì)線上服務(wù)的影響。
pt-table-checksum 默認(rèn)情況下可以應(yīng)對(duì)絕大部分場(chǎng)景,官方說,即使上千個(gè)庫(kù)、上萬億的行,它依然可以很好的工作,這源自于設(shè)計(jì)很簡(jiǎn)單,一次檢查一個(gè)表,不需要太多的內(nèi)存和多余的操作;必要時(shí),pt-table-checksum 會(huì)根據(jù)服務(wù)器負(fù)載動(dòng)態(tài)改變 chunk 大小,減少?gòu)膸?kù)的延遲。
pt-table-checksum要求主從復(fù)制是基于STATEMENT格式進(jìn)行的復(fù)制,并且會(huì)在主庫(kù)執(zhí)行binlog_format=STATEMENT語(yǔ)句。由于MySQL的限制,這一設(shè)置并不會(huì)傳遞到從庫(kù)進(jìn)行。因此當(dāng)從庫(kù)的binlog格式是ROW時(shí),無法直接對(duì)從庫(kù)的從庫(kù)進(jìn)行校驗(yàn)操作。工具在進(jìn)行校驗(yàn)操作時(shí)都會(huì)檢查所有從庫(kù)的binlog_format,可以使用選項(xiàng)--[no]check-binlog-format進(jìn)行控制;工具假設(shè)主從數(shù)據(jù)庫(kù)中SCHEMA和表結(jié)構(gòu)都是一致的。如果從庫(kù)上不存在主庫(kù)的SCHEMA,或者是從庫(kù)上表結(jié)構(gòu)與主庫(kù)不一致,則有可能導(dǎo)致主從復(fù)制中斷
為了減少對(duì)數(shù)據(jù)庫(kù)的干預(yù),pt-table-checksum還會(huì)自動(dòng)偵測(cè)并連接到從庫(kù),當(dāng)然如果失敗,可以指定--recursion-method
默認(rèn)情況,pt-table-checksum工具會(huì)對(duì)所有連接到的從庫(kù)進(jìn)行檢查,從庫(kù)連接策略由選項(xiàng)--recursion-method和--recurse控制,檢查項(xiàng)目如下:--[no]check-replication-filters 工具檢查每個(gè)從庫(kù)上是否有存在主從復(fù)制過濾器,如果發(fā)現(xiàn)有復(fù)制過濾器,則校驗(yàn)操作會(huì)中止,工具會(huì)退出。--replicate指定的表 工具檢查每個(gè)從庫(kù)上是否都存在選項(xiàng)--replicate指定保存校驗(yàn)結(jié)果的表。如果有從庫(kù)沒有這張表時(shí),校驗(yàn)操作有可能導(dǎo)致主從復(fù)制中斷。這項(xiàng)檢查無法被關(guān)閉,如果從庫(kù)不存在表,則工具會(huì)一直等待直到從庫(kù)存在該表。單個(gè)chunk大小 工具檢查主庫(kù)上表的是否可以在單個(gè)chunk范圍內(nèi)進(jìn)行校驗(yàn)。具體說明可以參考官方說明:REPLICA CHECKS。主從復(fù)制延遲 工具在每次校驗(yàn)完一個(gè)chunk之后都會(huì)檢查每個(gè)從庫(kù)是否有延遲,或者通過選項(xiàng)--check-slave-lag指定需要檢查的從庫(kù)。校驗(yàn)塊 工具在主庫(kù)校驗(yàn)完每張表之后都會(huì)等待每個(gè)從庫(kù)最后一個(gè)校驗(yàn)塊的完成,再執(zhí)行選項(xiàng)--[no]replicate-check指定的操作。pt-table-checksum:在主(master)上通過執(zhí)行校驗(yàn)的查詢對(duì)復(fù)制的一致性進(jìn)行檢查,對(duì)比主從的校驗(yàn)值,從而產(chǎn)生結(jié)果。DSN指向的是主的地址,該工具的退出狀態(tài)不為零,如果發(fā)現(xiàn)有任何差別,或者如果出現(xiàn)任何警告或錯(cuò)誤.CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );INSERT INTO dsns (parent_id,dsn) values(1, "h=192.168.1.129,u=admin,p=123456,P=3307"); pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --databases=check_sum h=192.168.1.128,u=admin,p=123456,P=3306--recursion-method=dsn=h=192.168.1.128, D=test,t=dsns在等號(hào)的兩側(cè)不能有空格出現(xiàn),并且區(qū)分大小寫,多個(gè)選項(xiàng)之前以','(逗號(hào))隔開,主要選項(xiàng)如下:A 指定字符集 D 指定DSN表所在數(shù)據(jù)庫(kù) t 指定DSN表 h 指定要連接的HOST P 指定要連接的PORT S 指定連接所使用的SOCKET文件(Unix systems) u 指定連接的用戶名 p 指定連接的用戶名密碼選項(xiàng)來告訴從庫(kù)在哪里。它的易用性還體現(xiàn)在,復(fù)制若有延遲,在從庫(kù) checksum 會(huì)暫停直到趕上主庫(kù)的計(jì)算時(shí)間點(diǎn)(也通過選項(xiàng)--設(shè)定一個(gè)可容忍的延遲最大值,超過這個(gè)值也認(rèn)為不一致)。
為了保證主數(shù)據(jù)庫(kù)服務(wù)的安全,該工具實(shí)現(xiàn)了許多保護(hù)措施:
? ? 1)自動(dòng)設(shè)置 innodb_lock_wait_timeout 為1s,避免引起
? ? 2)默認(rèn)當(dāng)數(shù)據(jù)庫(kù)有25個(gè)以上的并發(fā)查詢時(shí),pt-table-checksum會(huì)暫停。可以設(shè)置 --max-load 選項(xiàng)來設(shè)置這個(gè)閥值
? ? 3)當(dāng)用 Ctrl+C 停止任務(wù)后,工具會(huì)正常的完成當(dāng)前 chunk 檢測(cè),下次使用 --resume 選項(xiàng)啟動(dòng)可以恢復(fù)繼續(xù)下一個(gè) chunk
常用參數(shù)解釋:
--ask-pass 命令行提示密碼輸入,保護(hù)密碼安全,前提需安裝模塊perl-TermReadKey。--[no]check-binlog-format 默認(rèn)值:yes 指定檢查所有服務(wù)器上的binlog_format系統(tǒng)參數(shù)是否相同。--check-interval 默認(rèn)值:1s 指定因?yàn)檫x項(xiàng)'--max-lag'檢查之間休眠時(shí)間。--[no]check-replication-filters 默認(rèn)值:yes 指定檢測(cè)主從復(fù)制是否有設(shè)置復(fù)制過濾器。默認(rèn)如果有設(shè)置復(fù)制過濾器,則工具不進(jìn)行檢查校驗(yàn)操作。--check-slave-lag 指定主從復(fù)制延遲大于選項(xiàng)'--max-lag'指定的值之后暫停檢查校驗(yàn)操作。默認(rèn)情況下,工具會(huì)檢查所有的從庫(kù),但該選項(xiàng)只作用于指定的從庫(kù)(通過DSN連接方式)。--chunk-index 指定使用哪個(gè)索引對(duì)表進(jìn)行chunk分塊操作。默認(rèn)情況下會(huì)選擇最優(yōu)的索引,工具會(huì)在SQL語(yǔ)句中添加FORCE INDEX子句。--chunk-index-columns 指定使用選項(xiàng)'--chunk-index'的索引使用最左前綴幾個(gè)索引字段,只適用于復(fù)合索引。--chunk-size 默認(rèn)值:1000 指定表分塊的chunk大小,每個(gè)chunk需要校驗(yàn)的表行數(shù),允許的后綴單位為k、M、G。 當(dāng)指定了這個(gè)選項(xiàng)會(huì)覆蓋工具默認(rèn)動(dòng)態(tài)調(diào)整chunk塊大小以便在選項(xiàng)'--chunk-time'指定時(shí)間內(nèi)完成行的校驗(yàn)。所以在大多數(shù)情況下不建議使用該選項(xiàng),應(yīng)該使用選項(xiàng)'--chunk-time'來調(diào)整。--chunk-size-limit 默認(rèn)值:2.0 指定chunk的行數(shù)最多可以超過選項(xiàng)'--chunk-size'指定的行數(shù)的多少倍。最小值是1,表示chunk的行數(shù)不能超過選項(xiàng)'--chunk-size'指定的值。由于行數(shù)是通過explain估算的,所以不建議指定為1。當(dāng)參數(shù)值為0時(shí),則不會(huì)檢查是否超過指定的行數(shù)。--chunk-time 默認(rèn)值:0.5 動(dòng)態(tài)調(diào)整每個(gè)chunk的大小使相應(yīng)的表行數(shù)都在指定的時(shí)間內(nèi)完成校驗(yàn)操作。 如果該選項(xiàng)值設(shè)置為0,則不會(huì)動(dòng)態(tài)調(diào)整chunk的大小,就有可能造成每次校驗(yàn)操作的時(shí)間不同,但每個(gè)chunk大小還是一致的。--columns,-c 指定只需要校驗(yàn)的字段,如有多個(gè)則用','(逗號(hào))隔開。該選項(xiàng)一般只針對(duì)檢驗(yàn)一張表時(shí)有效,除非有多張表具有相同的字段。--[no]create-replicate-table 默認(rèn)值:yes 創(chuàng)建選項(xiàng)'--replicate'指定的數(shù)據(jù)庫(kù)和表。表結(jié)構(gòu)與選項(xiàng)'--replicate'指定的結(jié)構(gòu)相同。--replicate 默認(rèn)值:percona.checksums 指定保存校驗(yàn)結(jié)果的表。創(chuàng)建表的結(jié)構(gòu)如下: ' CREATE TABLE checksums (db CHAR(64) NOT NULL,tbl CHAR(64) NOT NULL,chunk INT NOT NULL,chunk_time FLOAT NULL,chunk_index VARCHAR(200) NULL,lower_boundary TEXT NULL,upper_boundary TEXT NULL,this_crc CHAR(40) NOT NULL,this_cnt INT NOT NULL,master_crc CHAR(40) NULL,master_cnt INT NULL,ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (db, tbl, chunk),INDEX ts_db_tbl (ts, db, tbl) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ' 因?yàn)檫x項(xiàng)'--[no]create-replicate-table'默認(rèn)值為true,所以默認(rèn)情況下如果數(shù)據(jù)庫(kù)和表之前不存在則會(huì)自動(dòng)創(chuàng)建percona庫(kù)和checksums表。除非另有選項(xiàng)指定。選項(xiàng)'--replicate'指定的表不會(huì)進(jìn)行校驗(yàn)操作,指定的表默認(rèn)加入選項(xiàng)'--ignore-tables'。--[no]replicate-check 默認(rèn)值:yes 指定在校驗(yàn)完每張表后檢查主從當(dāng)前表是否出現(xiàn)不一致。工具通過連接到從庫(kù)執(zhí)行簡(jiǎn)單的SELECT語(yǔ)句查詢校驗(yàn)結(jié)果與主庫(kù)的校驗(yàn)結(jié)果進(jìn)行差異對(duì)比,結(jié)果顯示在輸出中的DIFF字段中。--replicate-check-only 指定僅僅執(zhí)行檢查主從數(shù)據(jù)是否一致而不進(jìn)執(zhí)行真正的校驗(yàn)操作(主要通過查詢之前保留的校驗(yàn)結(jié)果)。該選項(xiàng)只適用于同時(shí)指定選項(xiàng)'--no-replicate-check'。--replicate-check-retries 默認(rèn)值:1 指定當(dāng)校驗(yàn)出主從數(shù)據(jù)不一致重試校驗(yàn)的次數(shù)。--replicate-database 指定工具在執(zhí)行校驗(yàn)操作時(shí)在哪個(gè)數(shù)據(jù)庫(kù)下進(jìn)行,相當(dāng)于執(zhí)行了語(yǔ)句USE [DB_NAME]。--resume 指定從最后完成校驗(yàn)的chunk開始恢復(fù)校驗(yàn)。適用于還未完成所有表的校驗(yàn)就工具就中斷的情況。--retries 默認(rèn)值:2 指定當(dāng)出現(xiàn)非嚴(yán)重性錯(cuò)誤時(shí)重復(fù)校驗(yàn)一個(gè)塊的次數(shù)。非嚴(yán)重性錯(cuò)誤指的是如鎖等待超時(shí)或長(zhǎng)查詢被kill的情況。--run-time 指定校驗(yàn)操作運(yùn)行的時(shí)間。默認(rèn)情況需要校驗(yàn)完所有的表數(shù)據(jù)后停止,可以指定時(shí)間單位為:s(秒)、m(分鐘)、h(小時(shí))、d(天)。--skip-check-slave-lag DSN類型,可重復(fù)使用 指定DSN連接從庫(kù)時(shí)跳過主從延遲檢查,可以指定多個(gè)從庫(kù)檢查。--set-vars 默認(rèn):wait_timeout=10000innodb_lock_wait_timeout=1lock_wait_timeout=60 運(yùn)行檢查時(shí)指定參數(shù)值,如有多個(gè)用','(逗號(hào))分隔。如'--set-vars=wait_timeout=5000'。--[no]empty-replicate-table 默認(rèn)值:yes 指定進(jìn)行當(dāng)前校驗(yàn)之前刪除之前每張表的校驗(yàn)記錄。該選項(xiàng)并不是對(duì)保存校驗(yàn)結(jié)果的表進(jìn)行truncate,而是在校驗(yàn)每張表之前刪除當(dāng)前表之前的校驗(yàn)結(jié)果,因此當(dāng)校驗(yàn)操作過早停止,則有可能還有表沒有校驗(yàn)數(shù)據(jù),如果是從之前校驗(yàn)操作恢復(fù),也不會(huì)清空保存校驗(yàn)結(jié)果的表。如果想清空保存校驗(yàn)結(jié)果的表,則在校驗(yàn)操作進(jìn)行之前手動(dòng)對(duì)表執(zhí)行truncate操作。--databases,-d 指定只需要校驗(yàn)的數(shù)據(jù)庫(kù),如有多個(gè)則用','(逗號(hào))隔開。--engines,-e 指定只需要校驗(yàn)的指定存儲(chǔ)引擎類型的表。--explain 指定顯示校驗(yàn)查詢語(yǔ)句,但不執(zhí)行真正的校驗(yàn)操作。該選項(xiàng)會(huì)禁用選項(xiàng)'--[no]empty-replicate-table',如果指定兩次,則工具實(shí)際使用的是迭代的chunk算法,打印出每個(gè)塊的上邊界和下邊界值,但不執(zhí)行真正的校驗(yàn)。--fail-on-stopped-replication 指定當(dāng)主從復(fù)制停止時(shí),校驗(yàn)中止操作并提示錯(cuò)誤而不是等待主從復(fù)制恢復(fù)之后再進(jìn)行。--function 默認(rèn)值:CRC32 指定校驗(yàn)操作使用的哈希函數(shù)。可選函數(shù)有SHA1、MD5等。--ignore-columns 指定需要忽略校驗(yàn)的字段,如有多個(gè)則用','(逗號(hào))隔開。--ignore-databases 指定需要忽略校驗(yàn)的數(shù)據(jù)庫(kù),如有多個(gè)則用','(逗號(hào))隔開。--ignore-databases-regex 指定采用正則表達(dá)式匹配忽略校驗(yàn)的數(shù)據(jù)庫(kù)。--ignore-engines 默認(rèn)值:FEDERATED,MRG_MyISAM 指定需要忽略校驗(yàn)的存儲(chǔ)引擎類型的表,如有多個(gè)則用','(逗號(hào))隔開。--ignore-tables 指定需要忽略校驗(yàn)的表,如有多個(gè)則用','(逗號(hào))隔開。表名稱可以使用數(shù)據(jù)庫(kù)名加以限定。--ignore-tables-regex 指定采用正則表達(dá)式匹配忽略校驗(yàn)的表。--max-lag 默認(rèn)值:1s 指定允許主從復(fù)制延遲時(shí)長(zhǎng)的最大值,單位秒。如果在每次校驗(yàn)查詢之后主從延遲超過指定的值,則校驗(yàn)操作將暫停執(zhí)行,暫停休眠時(shí)間為選項(xiàng)'--check-interval'指定的值。待休眠時(shí)間結(jié)束之后再次檢查主從延遲時(shí)長(zhǎng),檢查方法是通過從庫(kù)查詢的'Seconds_Behind_Master'值來確定。如果主從復(fù)制延遲一直大于該參數(shù)指定值或者從庫(kù)停止復(fù)制,則操作將一直等待直到從庫(kù)重新啟動(dòng)并且延遲小于該參數(shù)指定值。--max-load 數(shù)組類型,默認(rèn)值:Threads_running = 25 在校驗(yàn)要詢完每個(gè)chunk數(shù)據(jù)之后,運(yùn)行SHOW GLOBAL STATUS檢查所指定變量值高于該參數(shù)指定變量的閾值時(shí)將暫停校驗(yàn)操作。如果有多個(gè)變量閾值,可以用','(逗號(hào))進(jìn)行分隔,參數(shù)指定形式可以為變量名=MAX_VALUE或變量名:MAX_VALUE。 如果只是指定變量名,沒有為其指定閾值,則檢查當(dāng)前值并增加20%作為閾值。如:--max-load=Threads_running:沒有指定具體值,以當(dāng)前查詢值增加20%作為閾值,如當(dāng)前為100,閾值為120;--max-load=Threads_running:10:以當(dāng)前指定值為閾值。--host,-h 指定連接的數(shù)據(jù)庫(kù)IP地址。--port,-P 指定連接的數(shù)據(jù)庫(kù)Port端口。--user,-u 指定連接的數(shù)據(jù)庫(kù)用戶。--password,-p 指定連接的數(shù)據(jù)庫(kù)用戶密碼。--database,-d 指定連接的數(shù)據(jù)庫(kù)。--socket,-S 指定使用SOCKET文件連接。--progress 打印工具執(zhí)行過程的進(jìn)度提示到STDERR。選項(xiàng)值有兩部分組成,用逗號(hào)進(jìn)行分隔,第一部分為百分比,時(shí)間和迭代。第二部分為根據(jù)第一部分?jǐn)?shù)據(jù)更新頻率,也分為百分比,時(shí)間和迭代。--quiet,-q 不打印工具執(zhí)行過程的信息到STDOUT(禁用'--progress')。但錯(cuò)誤和警告還是打印到STDERR。--recurse 指定搜尋從庫(kù)的層級(jí),默認(rèn)無限級(jí)。--recursion-method 默認(rèn)值:processlist,hosts 指定獲取從庫(kù)的方式。pt-table-checksum在執(zhí)行校驗(yàn)操作時(shí)會(huì)執(zhí)行多次REPLICA CHECKS操作。 METHOD USES =========== ============================================= processlist SHOW PROCESSLIST hosts SHOW SLAVE HOSTS cluster SHOW STATUS LIKE 'wsrep\_incoming\_addresses' dsn=DSN DSNs from a table none Do not find slaves ========================================================== processlist:通過SHOW PROCESSLIST方式找到slave,為默認(rèn)方式,當(dāng)SHOW SLAVE HOSTS不可用時(shí)。一旦實(shí)例運(yùn)行在非3306端口上時(shí),hosts方式就會(huì)變?yōu)槟J(rèn)方式; hosts:通過SHOW SLAVE HOSTS方式找到slave,hosts方式要求從庫(kù)配置'--report_host'和'--report_port'這兩個(gè)參數(shù); cluster:基于集群版本Galera 23.7.3及更新版本; dsn:通過讀取表中從庫(kù)的DSN信息進(jìn)行連接。--tables,-t 指定只需要校驗(yàn)的表,如有多個(gè)則用','(逗號(hào))隔開。表名稱可以使用數(shù)據(jù)庫(kù)名加以限定。--tables-regex 指定采用正則表達(dá)式匹配校驗(yàn)的表。--where 指定通過where條件確定表中需要校驗(yàn)的數(shù)據(jù)。--truncate-replicate-table 指定在執(zhí)行校驗(yàn)操作之前對(duì)保存校驗(yàn)結(jié)果的表執(zhí)行truncate操作。注意與選項(xiàng)'--[no]empty-replicate-table'的區(qū)分。--version 顯示工具的版本并退出。--[no]version-check 默認(rèn)值:yes 檢查Percona Toolkit、MySQL和其他程序的最新版本。最重要的一點(diǎn)就是:
要在主庫(kù)上授權(quán),能讓主庫(kù)ip訪問。這一點(diǎn)不能忘記!(實(shí)驗(yàn)證明從庫(kù)上可以不授權(quán),但最好還是從庫(kù)也授權(quán))
注意:
1)根據(jù)測(cè)試,需要一個(gè)即能登錄主庫(kù),也能登錄從庫(kù)的賬號(hào);
2)只能指定一個(gè)host,必須為主庫(kù)的IP;
3)在檢查時(shí)會(huì)向表加S鎖;
4)運(yùn)行之前需要從庫(kù)的同步IO和SQL進(jìn)程是YES狀態(tài)。表要有主鍵索引或唯一鍵索引
工作過程
1\. 連接到主庫(kù):pt工具連接到主庫(kù),然后自動(dòng)發(fā)現(xiàn)主庫(kù)的所有從庫(kù)。默認(rèn)采用show full processlist來查找從庫(kù),但是這只有在主從實(shí)例端口相同的情況下才有效。
3\. 查找主庫(kù)或者從庫(kù)是否有復(fù)制過濾規(guī)則:這是為了安全而默認(rèn)檢查的選項(xiàng)。你可以關(guān)閉這個(gè)檢查,但是這可能導(dǎo)致checksum的sql語(yǔ)句要么不會(huì)同步到從庫(kù),要么到了從庫(kù)發(fā)現(xiàn)從庫(kù)沒有要被checksum的表,這都會(huì)導(dǎo)致從庫(kù)同步卡庫(kù)。
5\. 開始獲取表,一個(gè)個(gè)的計(jì)算。
6\. 如果是表的第一個(gè)chunk,那么chunk-size一般為1000;如果不是表的第一個(gè)chunk,那么采用19步中分析出的結(jié)果。
7\. 檢查表結(jié)構(gòu),進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換等,生成checksum的sql語(yǔ)句。
8\. 根據(jù)表上的索引和數(shù)據(jù)的分布,選擇最合適的split表的方法。
9\. 開始checksum表。
10\. 默認(rèn)在chunk一個(gè)表之前,先刪除上次這個(gè)表相關(guān)的計(jì)算結(jié)果。除非–resume。
14\. 根據(jù)explain的結(jié)果,判斷chunk的size是否超過了你定義的chunk-size的上限。如果超過了,為了不影響線上性能,這個(gè)chunk將被忽略。
15\. 把要checksum的行加上for update鎖,并計(jì)算。
17-18\. 把計(jì)算結(jié)果存儲(chǔ)到master_crc master_count列中。
19\. 調(diào)整下一個(gè)chunk的大小。
20\. 等待從庫(kù)追上主庫(kù)。如果沒有延遲備份的從庫(kù)在運(yùn)行,最好檢查所有的從庫(kù),如果發(fā)現(xiàn)延遲最大的從庫(kù)延遲超過max-lag秒,pt工具在這里將暫停。
21\. 如果發(fā)現(xiàn)主庫(kù)的max-load超過某個(gè)閾值,pt工具在這里將暫停。
22\. 繼續(xù)下一個(gè)chunk,直到這個(gè)table被chunk完畢。
23-24\. 等待從庫(kù)執(zhí)行完checksum,便于生成匯總的統(tǒng)計(jì)結(jié)果。每個(gè)表匯總并統(tǒng)計(jì)一次。
25-26\. 循環(huán)每個(gè)表,直到結(jié)束。
校驗(yàn)結(jié)束后,在每個(gè)從庫(kù)上,執(zhí)行如下的sql語(yǔ)句即可看到是否有主從不一致發(fā)生:
select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc) \G命令:
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=bim.checksums --create-replicate-table --databases=bim ?h=103.32.132.166,u=root,p=0202,P=3306
Cannot connect to P=3306,h=10.2.132.160,p=...,u=root
? ? ? ? ? ? TS ERRORS ?DIFFS ? ? ROWS ?DIFF_ROWS ?CHUNKS SKIPPED ? ?TIME TABLE
08-03T10:17:52 ? ? ?0 ? ? ?0 ? ? 1829 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.445 bim.a20200911
08-03T10:17:53 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.358 bim.a_pwd_change
08-03T10:17:53 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.361 bim.act_evt_log
08-03T10:17:53 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.360 bim.act_ge_bytearray
08-03T10:17:54 ? ? ?0 ? ? ?0 ? ? ? ?3 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.359 bim.act_ge_property
08-03T10:17:54 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.382 bim.act_hi_actinst
08-03T10:17:55 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.356 bim.act_hi_attachment
08-03T10:17:55 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.365 bim.act_hi_comment
08-03T10:17:55 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.392 bim.act_hi_detail
08-03T10:17:56 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.350 bim.act_hi_identitylink
08-03T10:17:56 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.483 bim.act_hi_procinst
08-03T10:17:56 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.310 bim.act_hi_taskinst
08-03T10:17:57 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.316 bim.act_hi_varinst
08-03T10:17:57 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.299 bim.act_re_deployment
08-03T10:17:57 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.376 bim.act_re_model
08-03T10:17:58 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.366 bim.act_re_procdef
08-03T10:17:58 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.352 bim.act_ru_event_subscr
08-03T10:17:59 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.378 bim.act_ru_execution
08-03T10:17:59 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.345 bim.act_ru_identitylink
08-03T10:17:59 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.347 bim.act_ru_job
08-03T10:18:00 ? ? ?0 ? ? ?0 ? ? ? ?0 ? ? ? ? ?0 ? ? ? 1 ? ? ? 0 ? 0.476 bim.act_ru_task
?
解釋:
TS :完成檢查的時(shí)間。
ERRORS :檢查時(shí)候發(fā)生錯(cuò)誤和警告的數(shù)量。
DIFFS :0表示一致,1表示不一致。當(dāng)指定--no-replicate-check時(shí),會(huì)一直為0,當(dāng)指定--replicate-check-only會(huì)顯示不同的信息。
ROWS :表的行數(shù)。
CHUNKS :被劃分到表中的塊的數(shù)目。
SKIPPED :由于錯(cuò)誤或警告或過大,則跳過塊的數(shù)目。
TIME :執(zhí)行的時(shí)間。
TABLE :被檢查的表名。
在主庫(kù)里添加pt-table-checksum檢查的權(quán)限(從庫(kù)可以不授權(quán))后,進(jìn)行數(shù)據(jù)一致性檢查操作,會(huì)在操作的庫(kù)(實(shí)例中是huanqiu、huanpc)下產(chǎn)生一個(gè)checksums表!
這張checksums表是pt-table-checksum檢查過程中產(chǎn)生的。這張表一旦產(chǎn)生了,默認(rèn)是刪除不了的,并且這張表所在的庫(kù)也默認(rèn)刪除不了,刪除后過一會(huì)兒就又會(huì)出來。
要想刪除的話,一定要先把pt-table-checksum檢查前添加的權(quán)限收回!checksums表一旦產(chǎn)生,不僅這張表默認(rèn)刪除不了,連同它所在的庫(kù),要是想刪除它們,只能如上操作先撤銷權(quán)限。
總結(jié)
以上是生活随笔為你收集整理的percona-toolkit--pt-table-checksum的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日常问题———安装新版zookeeper
- 下一篇: Xtrabackup备份与恢复