溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MYSQL 修改表結(jié)構(gòu) gh-ost

發(fā)布時(shí)間:2021-07-16 09:22:53 來(lái)源:億速云 閱讀:254 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“MYSQL 修改表結(jié)構(gòu) gh-ost ”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“MYSQL 修改表結(jié)構(gòu) gh-ost ”吧!

PT工具在MYSQL中的使用其實(shí)已經(jīng)好像有“半個(gè)世紀(jì)了”,其出名的原因主要是因?yàn)閜t-osc,如果你不知道,那你真的用過(guò)MYSQL,其實(shí)還有另外兩家 FB-OST , GH-OST.

實(shí)際上PT-OSC 雖然使用了這么多年,他也存在一些問(wèn)題 

PT-OSC

MYSQL 修改表結(jié)構(gòu) gh-ost

1 有些操作中,會(huì)引起高負(fù)載的寫操作

2 在原表和新表切換的過(guò)程中更名,可能有失敗的可能(雖然這樣的情況不多,但可能存在)

3 要求多,主鍵(具有唯一性的),表有外鍵的時(shí)候需要添加參數(shù),并且很可能還是有問(wèn)題,可能會(huì)導(dǎo)致主從延遲,表中不建議由其他trigger ,PTOSC使用的就是 update , insert , delete triggers 來(lái)解決原表和新表之間的數(shù)據(jù)同步的問(wèn)題。

4 對(duì)于大表,主業(yè)務(wù)表,還是不敢再業(yè)務(wù)時(shí)間來(lái)做,也是要到非業(yè)務(wù)或低峰期,來(lái)做。

雖然有這么多那么多的問(wèn)題,但也是用了很多年。FB-OST 沒(méi)有研究但原理也是類似的。(FB-OST)

MYSQL 修改表結(jié)構(gòu) gh-ost

GH-OST 其實(shí)是這三者里面,原理不一樣的,有點(diǎn)開腦洞, 開發(fā)者是一個(gè)DBA,擁有15年的經(jīng)驗(yàn)。

MYSQL 修改表結(jié)構(gòu) gh-ost

以下為開發(fā)者,在GITHUB 大會(huì)上的自我介紹

在考慮上面兩個(gè)工具的缺點(diǎn)后,我使用了binary log ,雖然也我這里面也收到了FB-OST 的啟發(fā),但我這里的設(shè)計(jì)比上面提到的工具的優(yōu)點(diǎn),主要就是我的新表的數(shù)據(jù)來(lái)源不是來(lái)自于tigger 而是來(lái)自于binlong。 大家可以想一下,如果我同事更改15個(gè)表,要產(chǎn)生多少trigger,多少了connections 要被消耗,系統(tǒng)的工作負(fù)載會(huì)非常的重,MYSQL 不喜歡這樣,而使用了binlog他不管修改多少表,他對(duì)于MYSQL 來(lái)說(shuō)就是一個(gè)序列化的事情,MYSQL 喜歡序列化的事情,這樣不會(huì)對(duì)系統(tǒng)產(chǎn)生更多的負(fù)載。

總結(jié)使用BINOG 有以下的優(yōu)點(diǎn)

1 binlary logs 可以從任意的地方來(lái)讀取,GH-OST 相當(dāng)于一個(gè)從節(jié)點(diǎn)

2 gh-ost  控制了整個(gè)數(shù)據(jù)流,避免突然的無(wú)法控制的增量寫

3 gh-ost 已經(jīng)與master 節(jié)點(diǎn)工作負(fù)載解耦

4 gh-ost 的設(shè)計(jì)是依照順序?qū)懙脑瓌t,完全避免了鎖,對(duì)于操作的

   server 來(lái)說(shuō)就是一個(gè)single connection

5 數(shù)據(jù)的增量計(jì)算方法簡(jiǎn)單

MYSQL 修改表結(jié)構(gòu) gh-ost

上面的三個(gè)圖很好的詮釋了gh-ost 為什么比其他的工具要強(qiáng)的原因,可以從從庫(kù)來(lái)讀取數(shù)據(jù),在寫到master ,我也可以在master 上讀,然后在master 上寫,還可以在slave 上讀,在slave 上改。

并且gh-ost還可以做真實(shí)的測(cè)試,而不是dry-run

MYSQL 修改表結(jié)構(gòu) gh-ost

另外一個(gè)優(yōu)點(diǎn)是GH-OST 在執(zhí)行的時(shí)候,可以根據(jù)master的狀態(tài)來(lái)停止正在執(zhí)行的任務(wù),而等到master的負(fù)載變得正常后,在根據(jù)BINLOG繼續(xù)來(lái)處理之前的延遲的工作。所以GH-OST 是一個(gè)安全的,值得信任的工具。

MYSQL 修改表結(jié)構(gòu) gh-ost

(完)

——————————————————————————————

當(dāng)然,這個(gè)工具也很具有中國(guó)的特色

MYSQL 修改表結(jié)構(gòu) gh-ost

———————————————————————————————

要使用這個(gè)工具本身要本身的MYSQL是一定要支持binlog,必須打開

log-bin=mysql-bin

binlog-format=ROW

log-slave-updates=ON

下面是一個(gè)小的實(shí)驗(yàn)

gh-ost -allow-on-master -assume-rbr -exact-rowcount

-critical-load Threads_running=400 -critical-load-hibernate-seconds 60

-database employees -max-load Threads_running=100

-nice-ratio 0.1  -chunk-size 5000 -ask-pass -table employeess

-user ghost -host 192.168.198.81

-alter 'add COLUMN add_column varchar(2000)'

-verbose -execute 2>&1 | tee gh-ost.log

MYSQL 修改表結(jié)構(gòu) gh-ost


MYSQL 修改表結(jié)構(gòu) gh-ost

添加一個(gè)大字段是沒(méi)有問(wèn)題的。

在程序里面,下面這段是從binlog 中將需要同步的 U D I 操作進(jìn)行挑揀

MYSQL 修改表結(jié)構(gòu) gh-ost

創(chuàng)建隱藏的魔鬼表

MYSQL 修改表結(jié)構(gòu) gh-ost

MYSQL 修改表結(jié)構(gòu) gh-ost

通過(guò)閱讀部分源碼,這里密碼的insert 是采用 insert DUPLICATE KEY  方式來(lái)進(jìn)行數(shù)據(jù)的插入。

其實(shí)從設(shè)計(jì)上來(lái)想,作者的想法是很有意思的,因?yàn)榭截愒淼臄?shù)據(jù)到結(jié)束的這段時(shí)間,是不能應(yīng)用這段時(shí)間的在這個(gè)表的修改,但BINLOG 里面是可以記錄百分之百的對(duì)這張表的數(shù)據(jù)的變動(dòng)的記錄,則只要從開始拷貝表的時(shí)間點(diǎn)開始,到結(jié)束拷貝后,在將binlog 里面的數(shù)據(jù)進(jìn)行提取,然后在新表上操作,待完成后在更換兩個(gè)表rename,達(dá)到與原來(lái)加trigger的目的一樣的效果。利用BINLOG的順序性,穩(wěn)定性,準(zhǔn)確性等特點(diǎn),將trigger性能問(wèn)題化解。

另外更有意思的是gh-ost 可以在程序操作的過(guò)程中,修改一些配置

MYSQL 修改表結(jié)構(gòu) gh-ost

例如上例子中的,可以用下面的例子,將一些參數(shù)打入到正在運(yùn)行的命令中

echo 'dml-batch-size=100' | nc -U /tmp/gh-ost.employees.employeess.sock

最后說(shuō)說(shuō)幾個(gè)重要的參數(shù)

  -allow-master-master  在主庫(kù)中運(yùn)行

  -allow-nullable-unique-key  如果是表中唯一索引是不允許有NULL得情況,這里如果情況存在,則給這個(gè)值,程序可以繼續(xù)運(yùn)行

  -assume-master-host string  當(dāng)你目前的情況事主主的情況,

  -assume-rbr  設(shè)置此標(biāo)志可避免重新啟動(dòng)復(fù)制,并且您可以繼續(xù)使用gh-ost而無(wú)需超級(jí)特權(quán)

  -chunk-size int 每次要處理的行數(shù)

 -concurrent-rowcount  計(jì)算需要copy的行

  -critical-load  設(shè)置最大的閾值

  -critical-load-hibernate-seconds 當(dāng)達(dá)到負(fù)荷值后,系統(tǒng)將停止操作多少秒

  -critical-load-interval-millis 設(shè)置當(dāng)達(dá)到臨界值后,間隔多長(zhǎng)時(shí)間在進(jìn)行重試   

  -cut-over 選擇新舊表之間的切換類型

  -discard-foreign-keys 忽略外鍵,當(dāng)操作時(shí)需要注意的是如果表有外鍵則新表是不會(huì)建立外鍵的   

  -dml-batch-size 在單個(gè)任務(wù)中處理DML的數(shù)量是多少,默認(rèn)10

  -exact-rowcount  取得精確的表的行數(shù)

  -initially-drop-ghost-table  如果是多次運(yùn)行,已經(jīng)留存上次存在的ghost表,選擇這個(gè)參數(shù),會(huì)在操作時(shí)將之前沒(méi)有清理的表清理掉,慎用    

  -initially-drop-old-table 和上邊的表一樣,刪除上次操作留下的老表 

  -initially-drop-socket-file  如果需要類似上邊需要,在系統(tǒng)運(yùn)行期間打入更改參數(shù)的情況,那就需要指定這個(gè)參數(shù)

    -nice-ratio float  在每次操作之間需要等待的時(shí)間

   -throttle-additional-flag-file 保存throttle的設(shè)置的路徑

   -throttle-control-replicas  檢測(cè)那些從庫(kù)需要進(jìn)行檢測(cè)延遲

最后用一個(gè)命令結(jié)束,根據(jù)命令來(lái)注釋一些特別行的作用

gh-ost \

–allow-on-master \

–max-load=Threads_running=25 \ 當(dāng)超過(guò)threads_runing閾值就停止

–chunk-size=1000 \  1000行批處理

–throttle-control-replicas=”192.168.56.144″ \  對(duì)這個(gè)從庫(kù)檢測(cè)

–max-lag-millis=1500 \ 從延遲的時(shí)間的閾值

–user=”ghost” \

–password=”ghost” \

–host=192.168.56.145 \

–database=”mysqlslap” \

–table=”t1″ \

–verbose \

–alter=”add column whatever6 varchar(50)” \

–cut-over=default \

–default-retries=120 \

–switch-to-rbr \

–panic-flag-file=/tmp/ghost.panic.flag \ 創(chuàng)建該文件時(shí),工作立即停止

–postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \

當(dāng)這個(gè)文件存在的時(shí)候,不允許切換發(fā)生,當(dāng)這個(gè)文件消失,才可以開始進(jìn)行表的切換

–execute

到此,相信大家對(duì)“MYSQL 修改表結(jié)構(gòu) gh-ost ”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI