1. 程式人生 > 實用技巧 >MySQL主從資料一致性怎麼校驗

MySQL主從資料一致性怎麼校驗

背景

  新專案要上線了,資料庫採用的MySQL主從同步配置。為了確保上線前遷移的資料一致性,指定了多種預案,為了確保主從資料一致,使用了percona-toolkit 。

 percona-toolkit源自Maatkit和Aspersa工具,這兩個工具是管理mysql的最有名的工具,現在Maatkit工具已經不維護了,請大家還是使用percona-toolkit吧!這些工具主要包括開發、效能、配置、監控、複製、系統、實用六大類,裡面的工具對DBA非常有用,如果能掌握並加以靈活應用,將能極大的提高工作效率。本文主要介紹percona-toolkit(以下簡稱PT)安裝過程及通過其檢查兩個庫的一致性及延遲率。

安裝過程

安裝Perl執行環境

  PT是通過Perl語言編寫的,因此使用時首先要安裝Perl執行環境。

查詢依賴環境,命令如下:

rpm -qa perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL

接下來就是缺啥,安裝啥,用如下命令:

yum install perl-DBI

yum install perl-DBD-MySQL

yum install perl-Time-HiRes

yum install perl-IO-Socket-SSL

PT下載

  筆者通過wget方式獲取PT,發現下載速度很慢,推薦去官網找到下載連結,用下載工具進行下載。

安裝TermReadKey

在安裝PT前,要先安裝TermReadKey,否則會報錯,可以在下面的地址下載:

http://rpmfind.net/linux/RPM/dag/redhat/el5/x86_64/perl-TermReadKey-2.30-1.el5.rf.x86_64.html

執行一下命令,安裝TermReadKey

rpm -ivh perl-TermReadKey-2.30-1.el5.rf.x86_64.rpm

PT安裝

通過以下命令,對PT進行安裝

rpm -ivh percona-toolkit-3.3.0-1.el7.x86_64.rpm

成功安裝的校驗

1. 執行完安裝命令沒有提示出錯

2. 執行pt命令,例如pt-table-checksum,有命令提示

安裝注意事項

若安裝PT過程中報錯,提示

在MySQL8和MySQL5.7下親測,執行以下命令可以解決:

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

yum -y install rsync perl l perl-Digest-MD5

若報錯如下:

執行以下命令:

rpm -ivh mysql-community-libs-compat-8.0.23-1.el7.x86_64.rpm(版本按需調整)

主從是否一致的校驗

首先在各個庫中都要有checksums表

create database percona;

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;

執行以下命令對主從一致性進行檢查

pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.checksums --create-replicate-table --databases=目標庫 --tables=目標表 h=主庫IP,u=主庫使用者,p='主庫密碼',P=3306

看到以下結果,執行成功

結果說明:

ERRORS`:檢查時候發生錯誤和警告的數量。

`DIFFS`0表示一致,1表示不一致。

當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的資訊。`

ROWS`:表的行數。

`CHUNKS`:被劃分到表中的塊的數目。

`SKIPPED`:由於錯誤或警告或過大,則跳過塊的數目。

`TIME`:執行的時間。

`TABLE`:被檢查的表名。