中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步

本文主要給大家簡(jiǎn)單講講MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步,相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補(bǔ)充一下,這里就不涉獵了,我們就直奔主題吧,希望MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步這篇文章可以給大家?guī)硪恍?shí)際幫助。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站制作、旌德網(wǎng)絡(luò)推廣、小程序制作、旌德網(wǎng)絡(luò)營銷、旌德企業(yè)策劃、旌德品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供旌德建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.rwnh.cn

一. 部署percona tookit

  1. 下載安裝包
    ~]# wget https://www.percona.com/downloads/percona-toolkit/3.0.5/binary/redhat/7/x86_64/percona-toolkit-3.0.5-1.el7.x86_64.rpm

  2. 安裝
    ~]# yum install percona-toolkit-3.0.5-1.el7.x86_64.rpm

二. 一致性檢測(cè)工具pt-table-checksum

1. 一致性檢測(cè)原理

pt-table-checksum是percona-toolkit系列工具中的一個(gè),用于檢測(cè)主從數(shù)據(jù)庫中的一致性。一次只工作在一張表上,會(huì)將主庫上的表切割成一個(gè)一個(gè)的chunk,這種切割要依賴于表上的index。所以在檢測(cè)時(shí)不需要大量的內(nèi)存和前期工作,而且還可以在數(shù)據(jù)尖峰是通過指數(shù)衰減算法,快速選擇適合的chunk大小,減輕云服務(wù)器壓力。將表切割成一個(gè)一個(gè)的chunk接下來會(huì)對(duì)chunk進(jìn)行checksum,并記錄下來。并對(duì)比從庫上的checksum是否一致,從而判斷數(shù)據(jù)是否一致。并且在檢測(cè)過程中會(huì)自動(dòng)判斷master負(fù)載,以及slave延遲,一旦超過閾值就會(huì)停止下來。對(duì)于線上的環(huán)境影響不大。而且他還可以隨時(shí)停止,只需在重啟時(shí)加入--resume就會(huì)從上次的檢測(cè)重新開始。接下來介紹其詳細(xì)過程。

1) 表結(jié)構(gòu)的檢查

表結(jié)構(gòu)的檢查也稱之為單行數(shù)據(jù)checksum值的計(jì)算,并獲取每一列的數(shù)據(jù)類型,把所有數(shù)據(jù)類型都轉(zhuǎn)化為字符串,然后用concat_ws()函數(shù)進(jìn)行連接,由此計(jì)算出該行的checksum值。checksum默認(rèn)采用crc32計(jì)算。

2) 數(shù)據(jù)塊checksum的計(jì)算

pt-table-sync會(huì)智能分析表上的索引,然后把表的數(shù)據(jù)split成若干個(gè)chunk,計(jì)算的時(shí)候以chunk為單位。可以理解為把chunk內(nèi)所有行的數(shù)據(jù)拼接起來,再計(jì)算crc32的值,即得到該chunk的checksum值。所以它把checksum結(jié)果存儲(chǔ)到統(tǒng)計(jì)表,然后把執(zhí)行過的sql語句記錄到binlog中,任務(wù)就算完成。然后從云服務(wù)器會(huì)讀取到binlog的SQL語句依次執(zhí)行,并將checksum保存在表中。

2. 校驗(yàn)

1)授權(quán)

Create database pt CHARACTER SET utf8;
GRANT UPDATE,INSERT,DELETE,SELECT, PROCESS, SUPER, REPLICATION SLAVE ON . TO 'checksums'@'192.168.239.135' identified by 'check_pass';
GRANT ALL ON pt.* TO 'checksums'@'192.168.%';
在這里我們創(chuàng)建了一個(gè)數(shù)據(jù)庫,用于存儲(chǔ)一致性檢測(cè)生成的數(shù)據(jù)。主從同步工具pt-table-sync根據(jù)此數(shù)據(jù)庫中的數(shù)據(jù)查找有不一致的數(shù)據(jù),并同步。其中135為主,136為從。

2)校驗(yàn)(Master云服務(wù)器運(yùn)行)

pt-table-checksum --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --set-vars innodb_lock_wait_timeout=120 --databases newtable -u'checksums' -p'checksums' -h292.168.239.135
#-h -u -p -P -S -d 連接信息
#--nocheck-replication-filters 檢測(cè)中忽略mysql 配置參數(shù)binlog_ignore_db等。
#--nocheck-binlog-format 不檢測(cè)日志格式,默認(rèn)是使用statement 格式,如果binlog的日志與默認(rèn)不同將會(huì)檢測(cè)失敗。所以我們會(huì)關(guān)閉binlog格式的檢測(cè)
#--replicate 指定checksum 存儲(chǔ)的db和表, 如test.checksum
#--chunk-size, --chunk-size-limit 用于指定檢測(cè)塊的大小。 可控性更強(qiáng),Number of rows to select for each checksum query。默認(rèn)是1000。對(duì)于--chunk-size-limit來說,他可以避免當(dāng)主云服務(wù)器為空,而從服務(wù)數(shù)據(jù)很大時(shí)造成的從延時(shí)過大。
#--lock-wait-timeout innodb 鎖的超時(shí)設(shè)定, 默認(rèn)為1
#--max-load : Examine SHOW GLOBAL STATUS after every chunk, and pause if any status variables are higher than their thresholds
#--replicate-check-only 只輸出數(shù)據(jù)不一致的信息。
#--resume: pt-table-checksum停止后,使用此參數(shù)可以接著停止的地方開始。

注意:
pt-table-checksum前提假設(shè)主從的表和表結(jié)構(gòu)是一致的,如果不一致pt-table-checksum會(huì)失敗

三. 數(shù)據(jù)同步工具pt-table-sync

pt-table-sync是MySQL數(shù)據(jù)同步工具,并不僅僅是同步主從數(shù)據(jù),任意主機(jī)上的表都可以同步。
pt-table-checksum只是校驗(yàn),所以它把checksum結(jié)果存儲(chǔ)到統(tǒng)計(jì)表,然后把執(zhí)行過的sql語句記錄到binlog中,任務(wù)就算完成。
pt-table-sync則不同,工作流程如下:

  • a) 連接到主庫:pt工具連接到主庫,然后自動(dòng)發(fā)現(xiàn)主庫的所有從庫。默認(rèn)采用show full processlist來查找從庫,但是這只有在主從實(shí)例端口相同的情況下才有效
  • b) 在主庫上對(duì)每一個(gè)chunk,在校驗(yàn)時(shí)加上for update鎖。一旦獲得鎖,就記錄下當(dāng)前主庫的show master status值。在從庫上執(zhí)行select master_pos_wait()函數(shù),等待從庫sql線程執(zhí)行到show master status得到的位置。以此保證,主從上關(guān)于這個(gè)chunk的內(nèi)容均不再改變。
  • c) 對(duì)這個(gè)chunk執(zhí)行checksum,然后與主庫的checksum進(jìn)行比較
  • d) 如果checksum相同,說明主從數(shù)據(jù)一致,就繼續(xù)下一個(gè)chunk
  • e) 如果checksum不同,說明該chunk有不一致。深入chunk內(nèi)部,逐行計(jì)算checksum并比較
  • f) 如果發(fā)現(xiàn)某行不一致,則標(biāo)記下來。繼續(xù)檢測(cè)剩余行,直到這個(gè)chunk結(jié)束
  • g) 對(duì)找到的主從不一致的行,采用replace into(如果數(shù)據(jù)不存在則插入,存在則更新,避免了主鍵約束)語句,在主庫執(zhí)行一遍以生成該行全量的binlog,并同步到從庫,這會(huì)以主庫數(shù)據(jù)為基準(zhǔn)來修復(fù)從庫;對(duì)于主庫有的行而從庫沒有的行,采用replace在主庫上插入(必須不能是insert);于從庫有而主庫沒有的行,通過在主庫執(zhí)行delete來刪除(pt-table-sync強(qiáng)烈建議所有的數(shù)據(jù)修復(fù)都只在主庫進(jìn)行,而不建議直接修改從庫數(shù)據(jù);但是也有特例,后面會(huì)講到)。
  • h) 直到修復(fù)該chunk所有不一致的行。繼續(xù)檢查和修復(fù)下一個(gè)chunk
  • i) 直到這個(gè)從庫上所有的表修復(fù)結(jié)束。開始修復(fù)下一個(gè)從庫

四. 實(shí)驗(yàn)示例

1. 實(shí)驗(yàn)環(huán)境

  • 主機(jī)IP : 192.168.239.135 192.168.239.136
  • 主機(jī)系統(tǒng) :  centos7.2
  • MySQL版本 :  5.5.56
    兩臺(tái)主機(jī)已經(jīng)配置好主從,其中135為主,136為從
    MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步

2. 主從數(shù)據(jù)一致性檢查

  • 1)授權(quán)(master主機(jī)上)
    mysql> CREATE DATABASE pt;      #創(chuàng)建數(shù)據(jù)庫pt用于存放checksum的值
    mysql> GRANT UPDATE,INSERT,SELECT,PROCESS,SUPER,REPLICATION SLAVE ON . 'checksum'@'192.168.%' IDENTIFIED BY "check_pass";    #創(chuàng)建checksum用戶用于執(zhí)行檢測(cè),以及分配檢測(cè)時(shí)要用的權(quán)限。
    mysql> GRANT ALL ON pt.* TO checksum@'192.168.%';       #checksum用戶要將checksum的值寫入pt數(shù)據(jù)庫中所以需要分配權(quán)限給checksum用戶。
    權(quán)限解釋:
    select     //查看所有庫的表,原理可加 explain選項(xiàng)查看
    process    //show processlist
    super      //set binlog_format='statement'
    replication slave   //show slave hosts

    注意 : 在master上執(zhí)行一致性檢測(cè)時(shí),master會(huì)通過show processlist查看slave主機(jī),并通過連接master的賬號(hào)和密碼連接slave,所以master上一致性檢測(cè)的賬號(hào)在slave上一定要有。

  • 2)在master上執(zhí)行一致性檢測(cè)
    首先我們需要人為創(chuàng)造不一致,在slave中刪除一條記錄
    MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步
    執(zhí)行一致性檢測(cè)(主從上都可執(zhí)行)
    ~]# pt-table-checksum --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --databases=hellodb -u 'checksum' -p 'check_pass' -h 192.168.239.135
                       TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
    03-14T16:25:21               0      1                  8              1       0           0.011 hellodb.classes
    03-14T16:25:21               0      0                 14             1       0           0.017 hellodb.coc
    03-14T16:25:21               0      0                 7               1       0           0.032 hellodb.courses
    03-14T16:25:21               0      0                15              1       0          0.015 hellodb.scores
    03-14T16:25:21               0      0                25              1       0          0.016 hellodb.students
    03-14T16:25:21               0      0                4                1       0          0.018 hellodb.teachers
    03-14T16:25:21               0      0                0                1       0          0.016 hellodb.toc

    顯示數(shù)據(jù)解釋
    TS : 完成檢測(cè)表時(shí)的時(shí)間,不顯示年份。
    ERRORS : 在checksum時(shí)發(fā)生的錯(cuò)誤和警告的次數(shù)
    DIFFS : 主從之間chunk不同的個(gè)數(shù),如果不為0,表明主從數(shù)據(jù)有不一致的。
    ROWS : 檢測(cè)表時(shí)一個(gè)chunk有多少行。如果使用了-where選項(xiàng),一個(gè)表中的chunk可能不同
    CHUNKS : 表被切割成了多少個(gè)chunk
    SKIPPED : 由于某種原因跳過檢測(cè)chunk的數(shù)量
    TIME : checksum此表所花的時(shí)間。
    TABLE : 被checksum的表明
    由上可知classes表中有數(shù)據(jù)不一致。

3. 主從同步

主從實(shí)現(xiàn)同步,往往都是借助pt-table-checksum產(chǎn)生的checksum表來說實(shí)現(xiàn)數(shù)據(jù)同步。

1)手動(dòng)同步

~]# pt-table-sync --print --sync-to-master h=192.168.239.136,u=checksum,p=check_pass --databases=hellodb --replicate=pt.checksums
h=192.168.239.136,u=checksum,p=check_pass 指明需要同步的slave主機(jī),以及登錄的用戶名和密碼
--databases=hellodb:指明同步的數(shù)據(jù)
--replicate=pt.checksums:同步時(shí)使用的checksum數(shù)據(jù)庫。
--sync-to-master:會(huì)通過show slave status去自動(dòng)找主云服務(wù)器同步數(shù)據(jù),如果沒有此參數(shù),我們需要通過h p u同時(shí)指明master和slave,即兩組h p u。
--print:主從不同的數(shù)據(jù)僅打印出來,并不在從上執(zhí)行。
此命令在主從上都可執(zhí)行。輸出信息如下:
MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步
我們只需在從云服務(wù)器上執(zhí)行REPLACE INTO hellodb.classes(classid, class, numofstu) VALUES ('1', 'Shaolin Pai', '10')這條sql語句即可

2)自動(dòng)同步

~]# pt-table-sync --execute --sync-to-master h=192.168.239.136,u=checksum,p=check_pass --databases=hellodb --replicate=pt.checksums
--execute:自動(dòng)修復(fù)主從不同的數(shù)據(jù)
自動(dòng)同步出現(xiàn)如下錯(cuò)誤:
MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步
pt-table-sync在實(shí)現(xiàn)同時(shí)時(shí)并不會(huì)直接在slave上進(jìn)行操作,都是在master上執(zhí)行命令,進(jìn)而影響slave,這種修改數(shù)據(jù)的方式更加安全。所以master需要在slave上有對(duì)應(yīng)的權(quán)限。
上圖顯示master在slave上沒有delete權(quán)限,查看slave分配的權(quán)限,如下圖可知確實(shí)沒有delete權(quán)限,只需在master上將checksum用戶添加delete權(quán)限即可
MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步

在master上修改checksum的權(quán)限,由于主從同步,slave也會(huì)修改對(duì)應(yīng)用戶權(quán)限

mysql GRANT UPDATE,INSERT,SELECT,DELETE,PROCESS,SUPER,REPLICATION SLAVE ON . TO 'checksum'@'192.168.%';

執(zhí)行數(shù)據(jù)同步,再次執(zhí)行checksum檢測(cè),可以看到?jīng)]有不同,而且查看slave中classes數(shù)據(jù)發(fā)現(xiàn)刪除的數(shù)據(jù)又出現(xiàn)了
MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步

MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步

MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步就先給大家講到這里,對(duì)于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會(huì)捕捉一些行業(yè)新聞及專業(yè)知識(shí)分享給大家的。

網(wǎng)頁標(biāo)題:MySQL的一致性如何檢測(cè)及實(shí)現(xiàn)數(shù)據(jù)同步
轉(zhuǎn)載源于:http://www.rwnh.cn/article38/gpocpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站收錄、品牌網(wǎng)站制作、自適應(yīng)網(wǎng)站、做網(wǎng)站標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
綦江县| 公安县| 平定县| 潮安县| 自治县| 崇仁县| 德阳市| 鸡泽县| 鱼台县| 历史| 峡江县| 临颍县| 博罗县| 临澧县| 东方市| 鸡东县| 宁强县| 连平县| 宁乡县| 砚山县| 潮州市| 峨眉山市| 乌苏市| 高碑店市| 寻乌县| 堆龙德庆县| 鹤庆县| 远安县| 简阳市| 绥德县| 石河子市| 类乌齐县| 怀远县| 蕲春县| 长春市| 潞城市| 台前县| 潮安县| 闽清县| 鄂托克旗| 沙河市|