1 Checksum
1.1 checksum原理
checksum table的原理是對錶中的數據進行一行一行的較驗和計算,在執行checksum命令時,表會被加一個讀鎖(read lock),所以對於大表,這是一個很耗時的過程。html
讀鎖:又叫S鎖/共享鎖;當MySQL的一個進程爲某一表開啓讀鎖以後,其餘的進程包含自身都沒有權利去修改這表表的內容。可是全部的進程仍是能夠讀出表裏面的內容的。可是不能實現更新。python
1.2 語法
在數據庫中輸入checksum table 庫.表;mysql
說明:checksum沒法對錶結構,表屬性等進行檢查,只對表中的數據進行檢驗;git
2 mysqldiff
mysqldiff該工具是官方mysql-utilities工具集的一個腳本,能夠用來對比不一樣數據庫之間的表結構,或者同個數據庫間的表結構,並生成差別SQL語句。mysqldiff 是經過對象名稱(有表,索引,視圖,圖表,缺省值,規則,觸發器,用戶,函數,存儲過程等)來進行比較的;github
2.1 mysqldiff安裝
#wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz #tar xf mysql-utilities-1.6.5.tar.gz #cd mysql-utilities-1.6.5 #python setup.py build #python setup.py install #mysqldiff --version
2.2 語法
語法示例:sql
#mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4數據庫
這個語法有兩個用法:服務器
db1.object1:db2.object1:若是指定了具體表對象,那麼就會詳細對比兩個表的差別,包括表名、字段名、備註、索引、大小寫等全部的表相關的對象。socket
db3:db4:若是隻指定數據庫,那麼就將兩個數據庫中互相缺乏的對象顯示出來,不比較對象裏面的差別。這裏的對象包括表、存儲過程、函數、觸發器等。函數
2.3 主要參數
- --server1:配置server1的鏈接。
- --server2:配置server2的鏈接。
- --character-set:配置鏈接時用的字符集,若是不顯示配置默認使用character_set_client。
- --width:配置顯示的寬度。
- --skip-table-options:保持表的選項不變,即對比的差別裏面不包括表名、AUTO_INCREMENT(自增)、ENGINE(存儲引擎)、CHARSET(配置鏈接時用的字符集)等差別。
- -v, --verbose:控制顯示多少信息。例如,- v =冗長,-vv=更詳細,-vvv=調試;
- -d DIFFTYPE,--difftype=DIFFTYPE:差別的信息顯示的方式,有[unified|context|differ|sql],默認是unified。若是使用sql,那麼就直接生成差別的SQL,這樣很是方便。
輸出類型,也就是difftype選項值:
(1)unified (默認)顯示統一的格式輸出;
(2)context以上下文格式輸出;
(3)differ以differ-style 格式輸出;
(4)sql以生成轉換SQL語句輸出;
- --changes-for=:修改對象。例如--changes-for=server2,那麼對比以sever1爲主,生成的差別的修改也是針對server2的對象的修改。
- --show-reverse:在生成的差別修改裏面,同時會包含server2和server1的修改。
2.4 對比效果
注意:發現運行時須要用戶有spuer權限,不然沒法運行,後面的工具都是如此;
示例1:
1)表test1和test2對比,顯示test2的不一樣,以及對test2的sql修改
1 mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 --difftype=sql study.test1:study.test2
注意:以SQL輸出的限制有:
1.對於分區表,若是分區表有差別,將對全部的改變生產。
2.ALTER TABLE 語句,顯示通過並省略分區差別。
3.事件重命名不支持。
4.不支持事務定義的條款。
5.不支持MySQL Cluster 的SQL擴展特性。
示例2:
(2)輸出類型對比,輸出類型,也就是difftype選項值:
1.unified (默認)顯示統一的格式輸出;
2.context以上下文格式輸出;
3.differ以differ-style 格式輸出;
4.sql以生成轉換SQL語句輸出;
1.輸出類型(默認)--difftype=unified; mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 study.test1:study.test2 2.輸出類型--difftype=context; mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 --difftype=context study.test1:study.test2 3.輸出類型--difftype=differ; mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 --difftype=differ study.test1:study.test2 4.輸出類型--difftype=sql; mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 --difftype=sql study.test1:study.test2
示例3:
若是須要生成SQL文件,加上輸出就能夠;
mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 --difftype=sql study.test1:study.test2 > output.sql
3 mysqldbcompare
mysqldbcompare該工具是官方mysql-utilities工具集的一個腳本,能夠用來檢查不一樣數據庫之間的數據一致性,檢查內容包括數據庫字符集、表結構、數據內容,只要有一個不同,則檢查不經過。
數據庫中的對象包括:表、視圖、觸發器、存儲過程、函數和事件。每個對象類型計數可使用-vv選項顯示。
3.1 mysqldbcompare安裝
#wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz #tar xf mysql-utilities-1.6.5.tar.gz #cd mysql-utilities-1.6.5 #python setup.py build #python setup.py install #mysqldiff --version
說明:mysqldiff和mysqldbcompare都是mysql-utilities工具集的腳本,故只要一次安裝便可,兩個命令都有;
3.2 語法
語法示例:
#mysqldbcompare --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1:db2
Mysqldbcompare和mysqldiff語法結構類似,能夠參照mysqldiff;
3.3 主要參數
- --server1:MySQL服務器1配置。
- --server2:MySQL服務器2配置。若是是同一服務器,--server2能夠省略。
- db1:db2:要比較的兩個數據庫。若是比較不一樣服務器上的同名數據庫,能夠省略:db2。
- --all:比較全部兩服務器上全部的同名數據庫。--exclude排除無需比較的數據庫。
- --run-all-tests:運行完整比較,遇到第一次差別時不中止。
- --changes-for=:修改對象。例如--changes-for=server2,那麼對比以sever1爲主,生成的差別的修改也是針對server2的對象的修改。
- -d DIFFTYPE,--difftype=DIFFTYPE:差別的信息顯示的方式,有[unified|context|differ|sql],默認是unified。若是使用sql,那麼就直接生成差別的SQL。
- -v, --verbose:控制顯示多少信息。例如,- v =冗長,-vv=更詳細,-vvv=調試;
- --show-reverse:在生成的差別修改裏面,同時會包含server2和server1的修改。
- --skip-table-options:保持表的選項不變,即對比的差別裏面不包括表名、AUTO_INCREMENT、ENGINE、CHARSET等差別。
- --skip-diff:跳過對象定義比較檢查。所謂對象定義,就是CREATE語句()裏面的部分,--skip-table-options是()外面的部分。
- --skip-object-compare:默認狀況下,先檢查兩個數據庫中相互缺失的對象,再對都存在對象間的差別。這個參數的做用就是,跳過第一步,不檢查相互缺失的對象。
- --skip-checksum-table:數據一致性驗證時跳過CHECKSUM TABLE。
- --skip-data-check:跳過數據一致性驗證。
- --skip-row-count:跳過字段數量檢查。
- --disable-binary-logging 若是服務器上啓用二進制日誌,不想比較日誌這步,可使用選項來禁用。
3.4 對比效果
示例1:
庫study和study1對比,顯示study1的不一樣,以及對study1的sql修改 mysqldbcompare --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 --difftype=sql --run-all-tests study:study1
4 pt-table-checksum
pt-table-checksum其原理是在主庫執行基於statement的sql語句來生成主庫數據塊的checksum,把相同的sql語句傳遞到從庫執行,並在從庫上計算相同數據塊的checksum,最後,比較主從庫上相同數據塊的checksum值,由此判斷主從數據是否一致。檢測過程根據惟一索引將表按row切分爲塊(chunk),覺得單位計算,能夠避免鎖表。檢測時會自動判斷複製延遲、 master的負載, 超過閥值後會自動將檢測暫停,減少對線上服務的影響。
4.1 安裝
#yum -y install perl-DBI perl-devel perl-DBD-MySQL perl-IO-Socket-SSL.noarch perl-Time-HiRes perl perl-Digest-MD5 perl-TermReadKey #wget https://www.percona.com/downloads/percona-toolkit/3.0.11/binary/tarball/percona-toolkit-3.0.11_x86_64.tar.gz #tar xf percona-toolkit-3.0.11_x86_64.tar.gz #cd percona-toolkit-3.0.11 #perl Makefile.PL #make #make install
4.2 經常使用參數
- --nocheck-replication-filters :不檢查複製過濾器,建議啓用。後面能夠用--databases來指定須要檢查的數據庫。
- --no-check-binlog-format : 不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。
- --replicate-check-only :只顯示不一樣步的信息。
- --replicate= :把checksum的信息寫入到指定表中,建議直接寫到被檢查的數據庫當中。
- --create-replicate-table 選項會自動建立 percona.checksums 表
- --databases= :指定須要被檢查的數據庫,多個則用逗號隔開。
- --tables= :指定須要被檢查的表,多個用逗號隔開
- --empty-replicate-table:每一個表checksum開始前,清空它以前的檢測數據(不影響其它表的checksum數據),默認yes。固然若是使用--resume啓動檢測數據不會清空。當啓用--noempty-replicate-table即不清空時,不計算計算chunk,只計算。
- --recursion-method:發現從庫的方式;
- h= :Master的地址
- u= :用戶名
- p=:密碼
- P= :端口
4.3 注意事項
1)第一次運行的時候須要加上--create-replicate-table參數,生成checksums表!!若是不加這個參數,那麼就須要在對應庫下手工添加這張表了,表結構SQL以下:
create database db5; use db5; CREATE TABLE checksums ( db char(64) NOT NULL, tb1 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, PRIMARY KEY (db, tb1, chunk), INDEX ts_db_tb1 (ts, db, tb1) ) ENGINE=InnoDB;
2)受權
(1)根據測試,須要一個即能登陸主庫,也能登陸從庫的帳號;
(2)只能指定一個host,必須爲主庫的IP;
(3)在檢查時會向表加S鎖(讀鎖/共享鎖);
(4)運行以前須要從庫的同步IO和SQL進程是YES狀態(show slave status\G;)。
4.4 pt-table-checksum使用梳理
(1)對特定表一致性進行檢查 pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.checksums
--create-replicate-table --databases=study --tables=test1 h=192.168.122.65,u=jin,p=123456,P=3306
解釋:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only會顯示不一樣的信息。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :因爲錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
(2)對特定數據庫的一致性進行檢查 pt-table-checksum --nocheck-replication-filters --replicate=percona.checksums --no-check-binlog-format
--databases=’study,study1’ h=192.168.122.65,u=jin,p=123456,P=3306
4.5 pt-table-sync用法梳理
若是經過pt-table-checksum 檢查找到了不一致的數據表,那麼如何同步數據呢?即如何修復MySQL主從不一致的數據,讓他們保持一致性呢?
這時候能夠利用另一個工具pt-table-sync。
pt-table-sync: 高效的同步MySQL表之間的數據,他能夠作單向和雙向同步的表數據。他能夠同步單個表,也能夠同步整個庫。它不一樣步表結構、索引、或任何其餘模式對象。因此在修復一致性以前須要保證他們表存在。
(1)參數解釋:
- --replicate= :指定經過pt-table-checksum獲得的表,這2個工具差很少都會一直用。
- --databases= : 指定執行同步的數據庫。
- --tables= :指定執行同步的表,多個用逗號隔開。
- --sync-to-master :指定一個DSN,即從的IP,他會經過show processlist或show slave status 去自動的找主。
- h= :服務器地址,命令裏有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
- u= :賬號。
- p= :密碼。
- --print :打印,但不執行命令。
- --execute :執行命令。
(2) 示例語句
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.checksums
--databases=study --tables=test1 h=192.168.122.65,u=jin,p=123456,P=3306
pt-table-sync --replicate=percona.checksums h=192.168.122.65,u=jin,p=123456 h=192.168.122.67,u=jin,p=123456 --print --execute
建議:
修復數據的時候,最好仍是用--print打印出來的好,這樣就能夠知道那些數據有問題,能夠人爲的干預下。
否則直接執行了,出現問題以後更很差處理。總之仍是在處理以前作好數據的備份工做。
如上修復後,再次檢查,發現主從庫數據已經一致了!
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.checksums
--databases=study --tables=test1 h=192.168.122.65,u=jin,p=123456,P=3306
問題說明:
在上面的操做中,在主庫裏添加pt-table-checksum檢查的權限(從庫能夠不受權)後,進行數據一致性檢查操做,會在操做的庫(實例中是study、study1)下產生一個checksums表!
這張checksums表是pt-table-checksum檢查過程當中產生的。這張表一旦產生了,默認是刪除不了的,而且這張表所在的庫也默認刪除不了,刪除後過一下子就又會出來。
參考連接:
https://www.cnblogs.com/kevingrace/p/6261091.html