MySQL主從複製一致性檢驗和同步修復

2021-02-08 簡單且充實

Master和Slave可能會出現數據不一致:

- 寫入Master時使用了對複製不安全的語句(如:CURRENT_USER(), UUID())

- 不正確的故障轉移(failover)流程

- 開發者直接寫入Slave

- 持續的升級更新(Rolling upgrades)

- 混合使用事務引擎和非事務引擎的表

- 跳過了複製事件 (SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N)

- 使用臨時表(Temporary Tables)

- 複製過濾(Replication Filters)

- 使用含LIMIT且沒有order by的更新語句(update/delete with LIMIT clause without order by)

1. pt-table-checksum可在線進行主從複製一致性檢驗

步驟如下:

1)在Master上創建用於檢驗的mysql用戶

mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'ptcheck'@'192.168.1.190' IDENTIFIED BY '123456';

Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

在用戶根目錄創建.my.cnf保存用戶和密碼:

[root@centos190 www]# cat ~/.my.cnf

[client]

user=ptcheck

password=123456

2)使用pt-table-checksum進行主從複製一致性檢查

pt-table-checksum的一些參數說明:

DSN h='192.168.1.190',u='ptcheck',p='123456',P=3306

--databases 指定校驗的庫,多個庫使用逗號分隔

--tables 指定檢查的表,多個表使用逗號分隔

--ignore-tables 忽略對某些表的檢查,多個表使用逗號分隔

--nocheck-replication-filters 忽略replication-do-db規則

--replicate=percona.checksums 在percona庫下創建checksums表,並將數據寫入

--recursion-method 指定複製檢查的方式,默認為processlist,使用非3306埠的時候為hosts.推薦手動指定dsn.

METHOD USES

=========== ==================

processlist SHOW PROCESSLIST

hosts SHOW SLAVE HOSTS

dsn=DSN DSNs from a table

none Do not find slaves

*只檢查資料庫testdb的表t1和tbl.

[root@centos190 www]# pt-table-checksum h='192.168.1.190',u='ptcheck',p='123456',P=3306 --databases testdb --tables t1,tbl --nocheck-replication-filters --create-replicate-table --replicate=test.checksums

TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE

02-27T01:28:25 0 1 7 1 0 1.720 testdb.t1

02-27T01:28:26 0 1 13 1 0 0.662 testdb.tbl

註:--create-replicate-table僅在第一次檢測的時候使用,第二次檢測使用--no-create-replicate-table或是乾脆不使用這個參數.

*對除tbl表之外其他表的一致性檢查

[root@centos190 www]# pt-table-checksum h='192.168.1.190',u='ptcheck',p='123456',P=3306 --databases testdb --ignore-tables tbl --nocheck-replication-filters --no-create-replicate-table --replicate=pts.checksums

TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE

02-27T01:30:11 0 1 7 1 0 1.711 testdb.t1

02-27T01:30:13 0 1 8 1 0 1.641 testdb.test

*使用用戶根目錄下.my.cnf保存的用戶和密碼:

[root@centos190 www]# pt-table-checksum --databases testdb --replicate=pts.checksums h=192.168.1.190,P=3306

TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE

02-27T01:31:03 0 1 7 1 0 0.687 testdb.t1

02-27T01:31:04 0 1 13 1 0 0.765 testdb.tbl

02-27T01:31:06 0 1 8 1 0 1.745 testdb.test

*使用dsn方式做一致性檢查

創建保存從庫dsn信息的數據表

mysql> create schema if not exists pts;

mysql> use pts;

mysql> CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );

插入從庫的dsn信息:從庫dsn格式為: 『h=replica_host,u=repl_user,p=repl_pass』

mysql> insert into dsns (parent_id,dsn) values(1, 'h=192.168.1.192,u=ptcheck,p=123456,P=3306');

mysql> insert into dsns (parent_id,dsn) values(1, 'h=192.168.1.193,u=ptcheck,p=123456,P=3306');

pt-table-checksums使用dsn的方式為:

--recursion-method dsn=h=host,D=percona,t=dsns

[root@centos190 www]# pt-table-checksum --databases testdb --replicate=pts.checksums --recursion-method=dsn=D=pts,t=dsns h=192.168.1.190,P=3306

TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE

02-27T01:46:44 0 1 7 1 0 1.739 testdb.t1

02-27T01:46:46 0 1 13 1 0 1.688 testdb.tbl

02-27T01:46:48 0 1 8 1 0 1.686 testdb.test

備註:在運行pt腳本之前使用export PTDEBUG=1,可以獲得運行的debug信息.

2. 使用pt-table-sync同步修復主從不一致的表數據

pt-table-sync只同步數據表的數據,不同步表的結構.

基本用法:

./pt-table-sync master-host slave-host

./pt-table-sync --replicate master-host

./pt-table-sync --sync-to-master slave-host

*基於checksums信息對Slave 192.168.1.192同步testdb.tbl表數據

[root@centos190 www]# pt-table-sync --execute --replicate=pts.checksums --databases=testdb --tables=tbl --sync-to-master h=192.168.1.192,u=root,p=123456

*基於checksums信息對所有的Slave同步testdb.tbl表不一致的數據

[root@centos190 www]# pt-table-sync --execute --replicate=pts.checksums --databases=testdb --tables=tbl h=192.168.1.190,u=root,P=3306 --ask-pass

Enter password for 192.168.1.190:

*全量同步修復Slave的testdb.tbl表數據

pt-table-sync --execute --sync-to-master h=192.168.1.193,u=root,p=123456 --databases=testdb --tables=tbl

或是

pt-table-sync --execute --sync-to-master h=192.168.1.193,D=testdb,t=tbl,u=root,p=123456

*災難修復,直接同步主從資料庫testb

pt-table-sync --execute --sync-to-master h=192.168.1.193,P=3306,u=root,p=123456 --database testdb

或使用--print獲得操作的SQL語句,檢查後手動在Slave執行操作:

[root@centos190 www]# echo "SET SQL_LOG_BIN=0;" > ./SQLChanges.sql

[root@centos190 www]# pt-table-sync --print --sync-to-master h=192.168.1.193,P=3306,u=root,p=123456 --databases testdb >> ./SQLChanges.sql

[root@centos190 www]# echo "SET SQL_LOG_BIN=1;" >> ./SQLChanges.sql

[root@centos190 www]# mysql -h 192.168.1.193 -uroot -p testdb < SQLChanges.sql

相關焦點

  • 【乾貨】-MySQL主從複製(Master-Slave)實踐
    如果配置了多個從伺服器或者多個主伺服器又涉及到相應的負載均衡問題,關於負載均衡具體的技術細節還沒有研究過,今天就先簡單的實現一主一從的主從複製功能。Mysql主從複製的實現原理圖大致如下(來源網絡):MySQL之間數據複製的基礎是二進位日誌文件(binary log file)。
  • Mysql(Mariadb)資料庫主從複製
    master的二進位日誌文件的變化,如果發現master二進位日誌文件發生變化,則會把變化複製到自己的中繼日誌中,然後slave的一個SQL線程會把相關的「事件」執行到自己的資料庫中,以此實現從資料庫和主資料庫的一致性,也就實現了主從複製。
  • MySQL主從同步延遲的原因及解決辦法
    ,並解析成具體操作,來實現主從的操作一致,而最終數據一致;(2)、主從形式mysql主從複製 靈活● 一主一從● 主主複製● 一主多從---擴展系統讀取的性能,因為讀是在從庫讀取的;● 多主一從---5.7開始支持● 聯級複製三、主從同步的延遲等問題、原因及解決方案
  • 基於 Docker 搭建 MySQL 主從複製
    本篇博文相對簡單,因為是初次使用Docker,MySQL的主從複製之前也在Centos環境下搭建過,但是也忘的也差不多了,因此本次嘗試在Docker中搭建。根據網上教程走還是踩了一些坑,不過所幸最終搭建成功,因此記錄下來,避免以後踩了重複的坑。
  • 5、Linux雲計算課程系列-MySQL主從同步及Amoeba的讀寫分離
    Author:XIEGE微信公眾號:網際網路工程(gh_1330095f1c05)一.MySQL Replication 概述  MySQL Replication 俗稱MySQL AB複製、主從複製、主從同步,是MySQL官方推薦的數據同步技術。
  • MySQL基礎應用-主從複製實現
    本文描述了MySQL主從複製的兩種情形:1.新建MySQL主從複製集群。2.已經運行了一段時間的MySQL且有大量數據的時候新增從節點。網上很多文章參差不齊,本文提供了一定意義上的規範部署操作。文末提供了MySQL的一鍵部署腳本以及MySQL5.7的常用優化參數。
  • mysql主從同步
    說起這個mysql主從同步,也有另外一種說法就是讀寫分離,相信大傢伙多少都了解一點,可能都不是很深入的了解,接下來我將帶領大家去進一步了解這個,
  • 使用mysqlreplicate命令快速搭建 Mysql 主從複製
    MySQL的Replication(英文為複製)是一個多MySQL資料庫做主從同步的方案,特點是異步複製,廣泛用在各種對
  • 技術分享 | MySQL 主從複製中創建複製用戶的時機探討
    背景該問題來自某客戶,據描述,他們在部署 MySQL 主從複製時,有時候僅在主庫上創建複製用戶,有時候主從實例上都會去分別創建複製用戶,發現這兩種方式都可以成功建立複製。針對這一現象,進行了一輪驗證,來觀察採用不同方式創建複製用戶對主從複製的影響。
  • 【mycat系列一】基於 Docker 搭建 MySQL 主從複製的詳細教程
    mysql-slave1:/etc/mysql/my.cnf別忘記,重啟slave1容器,使配置生效docker restart mysql-slave12、配置同步複製帳號下一步在Master資料庫創建數據同步用戶,授予用戶 slave REPLICATION SLAVE權限和REPLICATION CLIENT權限,用於在主從庫之間同步數據
  • 【Mysql源碼分析】基於行的複製實現之「主從關係建立」
    由於涉及到主從的內容比較多,需要拆分成多篇內容來概述,這章先從基礎知識和主從關係建立開始講起。還會出一篇文章詳細講解從主同步。1.了解什麼是SBR、RBR、MBR?2.了解下主從配置該如何配置?3.了解主從關係如何建立?
  • 主從資料庫複製+Springboot項目中配置主從資料庫讀寫分離
    1.2 主從複製的原理:master將資料庫的改變記錄在二進位日誌中,salve同步這些二進位日誌,並根據日誌執行操作。1.4 MS模式主從資料庫的配置:開始複製之前,如果主資料庫已有內容,應先將主資料庫當前的內容同步到從資料庫中。可以新建一個用戶專門用於複製,將複製權限Replication Slave賦給該用戶。
  • 高性能Mysql主從架構的複製原理及配置詳解
    主從複製配置有兩臺MySQL資料庫伺服器Master和slave,Master為主伺服器,slave為從伺服器,初始狀態時,Master和slave中的數據信息相同,當Master中的數據發生變化時,slave也跟著發生相應的變化,使得master和slave的數據信息同步,達到備份的目的。
  • Oracle / MySQL資料庫高可用方案三大難點問題
    就說一下最簡單的mysql主從複製方案吧,供大家參考一下。現在常用的MySQL高可用方案,十有八九是基於MySQL的主從複製(replication)來設計的,包括常規的一主一從、雙主模式,或者半同步複製(semi-sync replication)。我們常常把MySQL replication說成是MySQL同步(sync),但事實上這個過程是異步(async)的。
  • 跨雲遷移過程中的數據同步及一致性校驗實踐(一)
    通常,我們將跨雲遷移劃分為三個階段: 數據同步階段、數據規整階段(清理測試時產生的髒數據)和數據割接階段。數據同步階段主要是需要解決兩個問題,首先是將數據複製到新平臺,並且讓應用程式在新平臺運行,這也是跨雲遷移的核心;其次就是利用真實數據對應用程式進行測試,確認應用程式在目標平臺可以符合預期地運行。
  • MySQL 主從同步架構中你不知道的「坑」(完結篇)
    (    -> id varchar(10) not null,    -> name varchar(10) not null    -> );Query OK, 0 rows affected (0.04 sec) mysql> insert into test01 values('zhang'
  • mysql資料庫之安裝、主從搭建、備份恢復
    資料庫主從環境搭建:  上面主要講解了如何安裝一個單機版的mysql資料庫,但是實際在生產環境中,我們一般都是要安裝主從架構的資料庫。也就是業務連接的是mycat伺服器地址,所有的select、update、delete等請求,由mycat來分析然後自動的發給後端的主資料庫伺服器和從資料庫伺服器。目前只介紹一下主從環境的搭建;# 先按照上面的操作,在兩臺ECS上面分別搭建mysql 5.7.29的資料庫。
  • Mysql數據實時同步實踐
    我們想到了MySQL主從複製時使用的binlog日誌,它記錄了所有的 DDL 和 DML 語句(除了數據查詢語句select、show等),以事件形式記錄,還包含語句所執行的消耗時間下面來看一下MySQL主從複製的原理,主要有以下幾個步驟:master(主庫)在每次準備提交事務完成數據更新前,將改變記錄到二進位日誌(binary log)中slave(從庫)發起連接,連接到master,請求獲取指定位置的
  • MySQL 主從複製模式太難部署,我用 Docker 五分鐘就搞定它!
    ,最後 I/O Thread 和SQL Thread 將進入睡眠狀態,等待下一次被喚醒。$ vim /home/apps/mysql-master/config/my.cnfserver_id=1# 開啟二進位日誌log-bin=mysql-binread-only=0# 需要同步的資料庫binlog-do-db=rapid-cloudbinlog-do-db=rapid-cloud-test# 需要忽略的資料庫
  • MySQ 資料庫主從同步安裝與配置詳解(Master/Slave)
    MySQL5.6 資料庫主從同步安裝與配置詳解(Master/Slave)本篇文章主要介紹了MySQL5.6 資料庫主從同步安裝與配置詳解,具有一定的參考價值,有興趣的可以了解一下。>binlog-ignore-db=mysqlbinlog-do-db=ufind_db複製代碼這裡的server-id用於標識唯一的資料庫,這裡設置為2,在設置從庫的時候就需要設置為其他值。