您好,登錄后才能下訂單哦!
本篇內(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
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)
GH-OST 其實(shí)是這三者里面,原理不一樣的,有點(diǎn)開腦洞, 開發(fā)者是一個(gè)DBA,擁有15年的經(jīng)驗(yàn)。
以下為開發(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)單
上面的三個(gè)圖很好的詮釋了gh-ost 為什么比其他的工具要強(qiáng)的原因,可以從從庫(kù)來(lái)讀取數(shù)據(jù),在寫到master ,我也可以在master 上讀,然后在master 上寫,還可以在slave 上讀,在slave 上改。
并且gh-ost還可以做真實(shí)的測(cè)試,而不是dry-run
另外一個(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è)安全的,值得信任的工具。
(完)
——————————————————————————————
當(dāng)然,這個(gè)工具也很具有中國(guó)的特色
———————————————————————————————
要使用這個(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
添加一個(gè)大字段是沒(méi)有問(wèn)題的。
在程序里面,下面這段是從binlog 中將需要同步的 U D I 操作進(jìn)行挑揀
創(chuàng)建隱藏的魔鬼表
通過(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ò)程中,修改一些配置
例如上例子中的,可以用下面的例子,將一些參數(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)注釋一些特別行的作用
–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í)!
免責(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)容。