真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用percona-toolkit工具檢查及修復(fù)MySQL數(shù)據(jù)庫的主從不一致

下文主要給大家?guī)砣绾问褂胮ercona-toolkit工具檢查及修復(fù)MySQL數(shù)據(jù)庫的主從不一致,希望這些內(nèi)容能夠帶給大家實(shí)際用處,這也是我如何使用percona-toolkit工具檢查及修復(fù)MySQL數(shù)據(jù)庫的主從不一致編輯這篇文章的主要目的。好了,廢話不多說,大家直接看下文吧。

成都創(chuàng)新互聯(lián)是一家集成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站頁面設(shè)計(jì)、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站制作公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗(yàn),以探求精品塑造與理念升華,設(shè)計(jì)最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅(jiān)持講誠信,負(fù)責(zé)任的原則,為您進(jìn)行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。

如何使用percona-toolkit工具檢查及修復(fù)MySQL數(shù)據(jù)庫的主從不一致

pt-table-checksum是Percona-Toolkit的組件之一,用于檢測MySQL主、從庫的數(shù)據(jù)是否一致。其原理是在主庫執(zhí)行基于statement的sql語句來生成主庫數(shù)據(jù)塊的checksum,把相同的sql語句傳遞到從庫執(zhí)行,并在從庫上計(jì)算相同數(shù)據(jù)塊的checksum,最后,比較主從庫上相同數(shù)據(jù)塊的checksum值,由此判斷主從數(shù)據(jù)是否一致。檢測過程根據(jù)唯一索引將表按row切分為塊(chunk),以為單位計(jì)算,可以避免鎖表。檢測時(shí)會自動(dòng)判斷復(fù)制延遲、 master的負(fù)載, 超過閥值后會自動(dòng)將檢測暫停,減小對線上服務(wù)的影響。

pt-table-checksum默認(rèn)情況下可以應(yīng)對絕大部分場景,官方說,即使上千個(gè)庫、上萬億的行,它依然可以很好的工作,這源自于設(shè)計(jì)很簡單,一次檢查一個(gè)表,不需要太多的內(nèi)存和多余的操作;必要時(shí),pt-table-checksum 會根據(jù)云服務(wù)器負(fù)載動(dòng)態(tài)改變chunk大小,減少從庫的延遲。

為了減少對數(shù)據(jù)庫的干預(yù),pt-table-checksum還會自動(dòng)偵測并連接到從庫,當(dāng)然如果失敗,可以指定--recursion-method選項(xiàng)來告訴從庫在哪里。它的易用性還體現(xiàn)在,復(fù)制若有延遲,在從庫checksum會暫停直到趕上主庫的計(jì)算時(shí)間點(diǎn)(也通過選項(xiàng)--設(shè)定一個(gè)可容忍的延遲最大值,超過這個(gè)值也認(rèn)為不一致)。

  • 為了保證主數(shù)據(jù)庫服務(wù)的安全,該工具實(shí)現(xiàn)了許多保護(hù)措施:
    • 自動(dòng)設(shè)置 innodb_lock_wait_timeout 為1s,避免引起
    • 默認(rèn)當(dāng)數(shù)據(jù)庫有25個(gè)以上的并發(fā)查詢時(shí),pt-table-checksum會暫停。可以設(shè)置 --max-load 選項(xiàng)來設(shè)置這個(gè)閥值
    • 當(dāng)用 Ctrl+C 停止任務(wù)后,工具會正常的完成當(dāng)前 chunk 檢測,下次使用 --resume 選項(xiàng)啟動(dòng)可以恢復(fù)繼續(xù)下一個(gè) chunk

2、工作過程

  • 1、連接到主庫:pt工具連接到主庫,然后自動(dòng)發(fā)現(xiàn)主庫的所有從庫。默認(rèn)采用show full processlist來查找從庫,但是這只有在主從實(shí)例端口相同的情況下才有效。
  • 3、查找主庫或者從庫是否有復(fù)制過濾規(guī)則:這是為了安全而默認(rèn)檢查的選項(xiàng)。你可以關(guān)閉這個(gè)檢查,但是這可能導(dǎo)致checksum的sql語句要么不會同步到從庫,要么到了從庫發(fā)現(xiàn)從庫沒有要被checksum的表,這都會導(dǎo)致從庫同步卡庫。
  • 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語句。
  • 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é)果存儲到master_crc master_count列中。
  • 19、調(diào)整下一個(gè)chunk的大小。
  • 20、等待從庫追上主庫。如果沒有延遲備份的從庫在運(yùn)行,最好檢查所有的從庫,如果發(fā)現(xiàn)延遲最大的從庫延遲超過max-lag秒,pt工具在這里將暫停。
  • 21、如果發(fā)現(xiàn)主庫的max-load超過某個(gè)閾值,pt工具在這里將暫停。
  • 22、繼續(xù)下一個(gè)chunk,直到這個(gè)table被chunk完畢。
  • 23-24、等待從庫執(zhí)行完checksum,便于生成匯總的統(tǒng)計(jì)結(jié)果。每個(gè)表匯總并統(tǒng)計(jì)一次。
  • 25-26、循環(huán)每個(gè)表,直到結(jié)束。
    校驗(yàn)結(jié)束后,在每個(gè)從庫上,執(zhí)行如下的sql語句即可看到是否有主從不一致發(fā)生:
    select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR 
    ISNULL(master_crc) <> ISNULL(this_crc) \G

3、環(huán)境

IPPort主機(jī)名作用
192.168.1.1013306node1master
192.168.1.1023306node2slave
  • 注意事項(xiàng):
    • 為了減少不必要的麻煩,確保你的 ptuser@'xxx' 用戶能同時(shí)登陸主庫和從庫;
    • 只能指定一個(gè)host,必須為主庫的IP;
    • 在檢查時(shí)會向表加S鎖;
    • 如果master和slave的binlog日志不是STATEMENT格式,要用--no-check-binlog-format選項(xiàng)
    • 運(yùn)行之前需要從庫的同步IO和SQL進(jìn)程是YES狀態(tài)。
    • 表要有主鍵索引或唯一鍵索引

4、下載

打開官網(wǎng):https://www.percona.com/downloads/percona-toolkit/LATEST/
選擇軟件版本:Version,一般默認(rèn)最新版即可;
選擇系統(tǒng)版本:Software,也可以源碼編譯;我的CentOS6
系統(tǒng)架構(gòu):Hardware;我的64位;

我的下載為:
https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/6/x86_64/percona-toolkit-debuginfo-3.0.13-1.el6.x86_64.rpm
https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/6/x86_64/percona-toolkit-3.0.13-1.el6.x86_64.rpm

5、安裝

yum install percona-toolkit-3.0.13-1.el6.x86_64.rpm -y
yum install percona-toolkit-debuginfo-3.0.13-1.el6.x86_64.rpm -y
  • CentOS6.*依賴:

    perl-DBD-MySQL
    perl-DBI
    perl-IO-Socket-SSL
    perl-Net-LibIDN
    perl-Net-SSLeay
    perl-Time-HiRes
  • CentOS7.*依賴:
    perl-Compress-Raw-Bzip2
    perl-Compress-Raw-Zlib
    perl-DBD-MySQL
    perl-DBI
    perl-Digest
    perl-Digest-MD5
    perl-IO-Compress
    perl-IO-Socket-IP
    perl-IO-Socket-SSL
    perl-Mozilla-CA
    perl-Net-Daemon
    perl-Net-LibIDN
    perl-Net-SSLeay
    perl-PlRPC

查看安裝的文件:

[root@node1 ~]# rpm -ql percona-toolkit
/usr/bin/pt-align
/usr/bin/pt-archiver
/usr/bin/pt-config-diff
/usr/bin/pt-deadlock-logger
/usr/bin/pt-diskstats
/usr/bin/pt-duplicate-key-checker
/usr/bin/pt-fifo-split
/usr/bin/pt-find
/usr/bin/pt-fingerprint
/usr/bin/pt-fk-error-logger
/usr/bin/pt-heartbeat
/usr/bin/pt-index-usage
/usr/bin/pt-ioprofile
/usr/bin/pt-kill
/usr/bin/pt-mext
/usr/bin/pt-MongoDB-query-digest
/usr/bin/pt-mongodb-summary
/usr/bin/pt-mysql-summary
/usr/bin/pt-online-schema-change
/usr/bin/pt-pmp
/usr/bin/pt-query-digest
/usr/bin/pt-secure-collect
/usr/bin/pt-show-grants
/usr/bin/pt-sift
/usr/bin/pt-slave-delay
/usr/bin/pt-slave-find
/usr/bin/pt-slave-restart
/usr/bin/pt-stalk
/usr/bin/pt-summary
/usr/bin/pt-table-checksum     # 校驗(yàn)數(shù)據(jù)一致性;
/usr/bin/pt-table-sync         # 修復(fù)不一致數(shù)據(jù);
/usr/bin/pt-table-usage
/usr/bin/pt-upgrade
/usr/bin/pt-variable-advisor
/usr/bin/pt-visual-explain
... ...
[root@node1 ~]#

6、創(chuàng)建演示數(shù)據(jù)

6.1、主庫master:

root@node1 10:56:  [(none)]> create database pt_check;
Query OK, 1 row affected (0.04 sec)

root@node1 10:57:  [(none)]> use pt_check
Database changed
root@node1 10:58:  [pt_check]> create table test1(id int auto_increment primary key,name varchar(20) not null);
Query OK, 0 rows affected (0.86 sec)

root@node1 11:03:  [pt_check]> insert into test1 values(null,'will');
Query OK, 1 row affected (0.00 sec)

root@node1 11:03:  [pt_check]> insert into test1 values(null,'jim');
Query OK, 1 row affected (0.00 sec)

root@node1 11:03:  [pt_check]> insert into test1 values(null,'tom');
Query OK, 1 row affected (0.05 sec)

root@node1 11:03:  [pt_check]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node1 11:04:  [pt_check]>

6.2、從庫slave:

root@node1 11:03:  [pt_check]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node1 11:04:  [pt_check]> delete from pt_check.test1 where id='2';
Query OK, 1 row affected (0.02 sec)

root@node2 12:23:  [(none)]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  3 | tom  |
+----+------+
2 rows in set (0.00 sec)

root@node2 12:23:  [(none)]>

6.3、創(chuàng)建校驗(yàn)用戶

  • master
root@node1 12:28:  [pt_check]> GRANT CREATE,INSERT,SELECT,DELETE,UPDATE,LOCK TABLES,PROCESS,SUPER,REPLICATION SLAVE ON *.* TO 'ptuser'@'192.168.1.101' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

root@node1 12:29:  [pt_check]>  flush privileges;
Query OK, 0 rows affected (0.00 sec)

root@node1 12:29:  [pt_check]> select Host,User  from mysql.user;
+----------------+---------------+
| Host           | User          |
+----------------+---------------+
| localhost      | root          |
| localhost      | mysql.session |
| localhost      | mysql.sys     |
| 172.16.156.%   | rep           |
| %              | java          |
| 192.168.1.101 | ptuser        |
+----------------+---------------+
9 rows in set (0.00 sec)

root@node1 12:29:  [pt_check]>
  • slave
root@node2 12:48:  [(none)]> select Host,User  from mysql.user;
+----------------+---------------+
| Host           | User          |
+----------------+---------------+
| localhost      | root          |
| localhost      | mysql.session |
| localhost      | mysql.sys     |
| 172.16.156.%   | rep           |
| %              | java          |
| 192.168.1.101 | ptuser        |
+----------------+---------------+
8 rows in set (0.00 sec)

root@node2 12:48:  [(none)]>
  • 權(quán)限解釋:
    • select     //查看所有庫的表,原理可加 explain選項(xiàng)查看
    • process    //自動(dòng)發(fā)現(xiàn)從庫信息,show processlist
    • super      //set binlog_format='statement'
    • replication slave   //show slave hosts

7、pt-table-checksum校驗(yàn)

7.1、pt-table-checksum參數(shù)解釋

  • --replicate-check:執(zhí)行完 checksum 查詢在percona.checksums表中,不一定馬上查看結(jié)果呀 —— yes則馬上比較chunk的crc32值并輸出DIFFS列,否則不輸出。默認(rèn)yes,如果指定為--noreplicate-check,一般后續(xù)使用下面的--replicate-check-only去輸出DIFF結(jié)果。
  • --nocheck-replication-filters :不檢查復(fù)制過濾器,建議啟用。后面可以用--databases來指定需要檢查的數(shù)據(jù)庫。
  • --no-check-binlog-format      : 不檢測日志格式。這個(gè)選項(xiàng)對于 ROW 模式的復(fù)制很重要,因?yàn)閜t-table-checksum會在 Master和Slave 上設(shè)置binlog_format=STATEMENT(確保從庫也會執(zhí)行 checksum SQL),MySQL限制從庫是無法設(shè)置的,所以假如行復(fù)制從庫,再作為主庫復(fù)制出新從庫時(shí)(A->B->C),B的checksums數(shù)據(jù)將無法傳輸。(沒驗(yàn)證)
  • --replicate-check-only :不在主從庫做 checksum 查詢,只在原有 percona.checksums 表中查詢結(jié)果,并輸出數(shù)據(jù)不一致的信息。周期性的檢測一致性時(shí)可能用到。
  • --replicate=    :把checksum的信息寫入到指定表中,如果沒有指定,默認(rèn)是 percona.checksums ;建議直接寫到被檢查的數(shù)據(jù)庫當(dāng)中。
  • --databases=,-d :要檢查的數(shù)據(jù)庫,逗號分隔;--databases-regex 正則匹配要檢測的數(shù)據(jù)庫,--ignore-databases[-regex]忽略檢查的庫。Filter選項(xiàng)。
  • --tables=,-t  
    :要檢查的表,逗號分隔。如果要檢查的表分布在不同的db中,可以用--tables=dbname1.table1,dbnamd2.table2的形式。同理有--tables-regex,--ignore-tables,--ignore-tables-regex。--replicate指定的checksum表始終會被過濾。
  • --tables=       :指定需要被檢查的表,多個(gè)用逗號隔開
  • h=192.168.1.101 :Master的地址
  • u=ptuser        :用戶名
  • p=123456        :密碼
  • P=3306          :端口
  • --create-replicate-table 選項(xiàng)會自動(dòng)創(chuàng)建 percona.checksums 表,但也意味著賦予額外的 CREATE TABLE權(quán)限給 percona_tk@'xxx' 用戶。默認(rèn)yes
  • --no-check-replication-filters 表示不需要檢查 Master 配置里是否指定了 Filter。 默認(rèn)會檢查,如果配置了 Filter,如 replicate_do_db,replicate-wild-ignore-table,binlog_ignore_db 等,在從庫checksum就與遇到表不存在而報(bào)錯(cuò)退出,所以官方默認(rèn)是yes(--check-replication-filters)但我們實(shí)際在檢測中時(shí)指定--databases=,所以就不存在這個(gè)問題,干脆不檢測;
  • --empty-replicate-table:每個(gè)表checksum開始前,清空它之前的檢測數(shù)據(jù)(不影響其它表的checksum數(shù)據(jù)),默認(rèn)yes。當(dāng)然如果使用--resume啟動(dòng)檢測數(shù)據(jù)不會清空。當(dāng)啟用--noempty-replicate-table即不清空時(shí),不計(jì)算計(jì)算chunk,只計(jì)算。
  • --recursion-method:發(fā)現(xiàn)從庫的方式。pt-table-checksum 默認(rèn)可以在主庫的 processlist 中找到從庫復(fù)制進(jìn)程,從而識別出有哪些從庫,但如果使用是非標(biāo)準(zhǔn)3306端口,會導(dǎo)致找不到從庫信息。此時(shí)就會自動(dòng)采用host方式,但需要提前在從庫 my.cnf 里面配置report_host、report_port信息,如:

    report_host = MASTER_HOST
    report_port = 13306

    最終極的辦法是dsn,dsn指定的是某個(gè)表(如 percona.dsns ),表行記錄是改主庫的(多個(gè))從庫的連接信息。適用以下任一情形:

  • 主庫不能自動(dòng)發(fā)現(xiàn)從庫
  • 不想在從庫添加額外配置(因?yàn)橐貑ⅲ?/li>
  • 主從檢測連接用戶信息不一樣
  • 多個(gè)從庫時(shí)只想驗(yàn)證指定從庫的一致

我比較傾向使用DSN的方式。這個(gè)dsns表只需要在執(zhí)行 pt-table-checksum 命令的云服務(wù)器上能夠訪問到就行。這里糾正一個(gè)認(rèn)識,網(wǎng)上很多人說 pt-table-checksum 要在主庫上執(zhí)行,其實(shí)不是的,我的mysql實(shí)例比較多,只需在某一臺云服務(wù)器上安裝percona-toolkit,這臺服務(wù)能夠同時(shí)訪問主庫和從庫就行了。具體用法見后面實(shí)例。

7.2、在主庫上執(zhí)行數(shù)據(jù)檢查命令

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
Replica node2 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.
[root@node1 ~]#

從庫node2的bbinlog日志為ROW,這可能導(dǎo)致pt-table-checksum中斷復(fù)制??梢灾付?-no-check-binlog-format以禁用此檢查。

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
02-19T18:23:22      0      1        3          0       1       0   0.045 pt_check.test1
[root@node1 ~]#
表示說明:
  • TS     :完成檢查的時(shí)間。
  • ERRORS :檢查時(shí)候發(fā)生錯(cuò)誤和警告的數(shù)量。
  • DIFFS  :不一致的chunk數(shù)量。當(dāng)指定 --no-replicate-check 即檢查完但不立即輸出結(jié)果時(shí),會一直為0;當(dāng)指定 --replicate-check-only 即不檢查只從checksums表中計(jì)算crc32,且只顯示不一致的信息(畢竟輸出的大部分應(yīng)該是一致的,容易造成干擾)。
  • ROWS   :比對的表行數(shù)。
  • CHUNKS :被劃分到表中的塊的數(shù)目。
  • SKIPPED:由于錯(cuò)誤或警告或過大,則跳過塊的數(shù)目。
  • TIME   :執(zhí)行的時(shí)間。
  • TABLE  :被檢查的表名。

看到已經(jīng)檢查出主從數(shù)據(jù)有不一致了,DIFFS下的值為1,怎么不一致呢? 通過指定--replicate=test.checksums 參數(shù),就說明把檢查信息都寫到了checksums表中

7.3、master的test.checksums表:

root@node1 09:19:  [(none)]> select * from test.checksums \G
*************************** 1. row ***************************
            db: pt_check
           tbl: test1
         chunk: 1
    chunk_time: 0.005212
   chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
      this_crc: b9a54161
      this_cnt: 3                   # 本機(jī) 3行數(shù)據(jù)
    master_crc: b9a54161
    master_cnt: 3                   # master 3行數(shù)據(jù)
            ts: 2019-02-20 09:18:01
1 row in set (0.00 sec)

root@node1 09:19:  [(none)]>

7.4、slave的test.checksums表:

root@node2 09:20:  [(none)]> select * from test.checksums \G
*************************** 1. row ***************************
            db: pt_check
           tbl: test1
         chunk: 1
    chunk_time: 0.005212
   chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
      this_crc: d49ddeb7
      this_cnt: 2                   # 本機(jī) 2行數(shù)據(jù)
    master_crc: b9a54161
    master_cnt: 3                   # master 3行數(shù)據(jù)
            ts: 2019-02-20 09:18:01
1 row in set (0.01 sec)

root@node2 09:20:  [(none)]>

8、pt-table-sync修復(fù)

8.1、打印數(shù)據(jù)的不同之處

master庫用pt-table-sync命令和--print選項(xiàng)打印出master下的check_sum.test1和slave庫的check_sum.test1的不一致的數(shù)據(jù),如下:

[root@node1 ~]# pt-table-sync --replicate=test.checksums h=192.168.1.101,u=ptuser,p=123456,P=3306 h=192.168.1.102,u=ptuser,p=123456,P=3306 --print
REPLACE INTO `pt_check`.`test1`(`id`, `name`) VALUES ('2', 'jim') /*percona-toolkit src_db:pt_check src_tbl:test1 src_dsn:P=3306,h=192.168.1.101,p=...,u=ptuser dst_db:pt_check dst_tbl:test1dst_dsn:P=3306,h=node2,p=...,u=ptuser lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:20377 user:root host:node1*/;
[root@node1 ~]#
  • pt-table-sync參數(shù)說明:
--replicate=    :指定通過pt-table-checksum得到的表.
--databases=    : 指定執(zhí)行同步的數(shù)據(jù)庫,多個(gè)用逗號隔開。
--tables=       :指定執(zhí)行同步的表,多個(gè)用逗號隔開。
--sync-to-master :指定一個(gè)DSN,即從的IP,他會通過show processlist或show slave status 去自動(dòng)的找主。
h=127.0.0.1     :云服務(wù)器地址,命令里有2個(gè)ip,第一次出現(xiàn)的是Master的地址,第2次是Slave的地址。
u=root          :帳號。
p=123456        :密碼。
--print         :打印,但不執(zhí)行命令。
--execute       :執(zhí)行命令。

8.2、pt-table-sync修復(fù)不同數(shù)據(jù)

接下的操作就是把slave上少的數(shù)據(jù),從master同步過去(master操作);通過(--execute),讓它們數(shù)據(jù)保持一致性:

[root@node1 ~]# pt-table-sync --replicate=test.checksums h=192.168.1.101,u=ptuser,p=123456,P=3306 h=192.168.1.102,u=ptuser,p=123456,P=3306 --execute

9、驗(yàn)證

9.1、使用pt-table-checksum重新校驗(yàn):

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
02-20T10:03:02      0      0        3          0       1       0   0.083 pt_check.test1
[root@node1 ~]#

可以看到再次檢查的時(shí)候,DIFFS已經(jīng)是0了;

9.2、主庫master:

root@node1 10:05:  [(none)]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node1 10:05:  [(none)]>

9.3、從庫slave:

root@node2 10:02:  [(none)]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node2 10:05:  [(none)]>

已經(jīng)跟master上的數(shù)據(jù)一致了。

10、報(bào)錯(cuò)

10.1、用戶權(quán)限問題

沒有創(chuàng)建CREATE表的權(quán)限;

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
02-19T18:08:22 --create-replicate-table failed: DBD::mysql::db do failed: CREATE command denied to user 'ptuser'@'node1' for table 'checksums' [for Statement "  CREATE TABLE IF NOT EXISTS `test`.`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"] at /usr/bin/pt-table-checksum line 12272.
02-19T18:08:22 --replicate table checksums does not exist and it cannot be created automatically.  You need to create the table.
[root@node1 ~]#

10.2、Diffs cannot be detected because no slaves were found

不能自動(dòng)找到從庫,確認(rèn)processlist或host或dsns方式用對了。

10.3、Cannot connect to h=slave1.*.com,p=...,u=percona_user

可以在pt-table-checksum命令前加PTDEBUG=1來看詳細(xì)的執(zhí)行過程,如端口、用戶名、權(quán)限錯(cuò)誤。

10.4、Waiting for the --replicate table to replicate to XXX

問題出在 percona.checksums 表在從庫不存在,根本原因是沒有從主庫同步過來,所以看一下從庫是否延遲嚴(yán)重。

10.5、Pausing because Threads_running=25

反復(fù)打印出類似上面停止檢查的信息。這是因?yàn)楫?dāng)前數(shù)據(jù)庫正在運(yùn)行的線程數(shù)大于默認(rèn)25,pt-table-checksum 為了減少對庫的壓力暫停檢查了。等數(shù)據(jù)庫壓力過了就好了,或者也可以直接 Ctrl+C 終端,下一次加上--resume繼續(xù)執(zhí)行,或者加大--max-load=值。

10.6、字符集問題

對于以上關(guān)于如何使用percona-toolkit工具檢查及修復(fù)MySQL數(shù)據(jù)庫的主從不一致,大家是不是覺得非常有幫助。如果需要了解更多內(nèi)容,請繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會喜歡上這些內(nèi)容的。


網(wǎng)頁題目:如何使用percona-toolkit工具檢查及修復(fù)MySQL數(shù)據(jù)庫的主從不一致
標(biāo)題網(wǎng)址:http://weahome.cn/article/gjoeod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部