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

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

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

十年建站經(jīng)驗, 網(wǎng)站建設(shè)、成都網(wǎng)站制作客戶的見證與正確選擇。創(chuàng)新互聯(lián)公司提供完善的營銷型網(wǎng)頁建站明細報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

PT工具在MYSQL中的使用其實已經(jīng)好像有“半個世紀了”,其出名的原因主要是因為pt-osc,如果你不知道,那你真的用過MYSQL,其實還有另外兩家 FB-OST , GH-OST.

實際上PT-OSC 雖然使用了這么多年,他也存在一些問題 

PT-OSC

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

1 有些操作中,會引起高負載的寫操作

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

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

4 對于大表,主業(yè)務表,還是不敢再業(yè)務時間來做,也是要到非業(yè)務或低峰期,來做。

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

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

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

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

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

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

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

1 binlary logs 可以從任意的地方來讀取,GH-OST 相當于一個從節(jié)點

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

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

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

   server 來說就是一個single connection

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

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

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

并且gh-ost還可以做真實的測試,而不是dry-run

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

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

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

(完)

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

當然,這個工具也很具有中國的特色

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

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

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

log-bin=mysql-bin

binlog-format=ROW

log-slave-updates=ON

下面是一個小的實驗

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

添加一個大字段是沒有問題的。

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

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

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

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

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

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

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

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

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

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

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

最后說說幾個重要的參數(shù)

  -allow-master-master  在主庫中運行

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

  -assume-master-host string  當你目前的情況事主主的情況,

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

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

 -concurrent-rowcount  計算需要copy的行

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

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

  -critical-load-interval-millis 設(shè)置當達到臨界值后,間隔多長時間在進行重試   

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

  -discard-foreign-keys 忽略外鍵,當操作時需要注意的是如果表有外鍵則新表是不會建立外鍵的   

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

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

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

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

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

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

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

   -throttle-control-replicas  檢測那些從庫需要進行檢測延遲

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

gh-ost \

–allow-on-master \

–max-load=Threads_running=25 \ 當超過threads_runing閾值就停止

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

–throttle-control-replicas=”192.168.56.144″ \  對這個從庫檢測

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

–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)建該文件時,工作立即停止

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

當這個文件存在的時候,不允許切換發(fā)生,當這個文件消失,才可以開始進行表的切換

–execute

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

網(wǎng)站題目:MYSQL修改表結(jié)構(gòu)gh-ost
文章轉(zhuǎn)載:http://www.rwnh.cn/article32/jipepc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、、網(wǎng)站排名靜態(tài)網(wǎng)站、移動網(wǎng)站建設(shè)定制開發(fā)

廣告

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

小程序開發(fā)
花莲市| 炉霍县| 翼城县| 兰州市| 高台县| 周宁县| 壶关县| 若尔盖县| 甘洛县| 水城县| 托克逊县| 拉孜县| 响水县| 潮安县| 鹿邑县| 绥江县| 连江县| 岳池县| 新和县| 石门县| 忻城县| 晋城| 桂阳县| 扎兰屯市| 综艺| 嘉义县| 民和| 建水县| 呼和浩特市| 兴化市| 略阳县| 即墨市| 洛隆县| 原阳县| 施秉县| 新兴县| 邢台县| 清水河县| 达孜县| 龙陵县| 昌黎县|