Mysql在線安全變更工具 gh-ost的使用
gh-ost
(GitHub Online Schema Translater)是一個用于安全地進(jìn)行 MySQL 數(shù)據(jù)庫表結(jié)構(gòu)變更的工具,專門為在線數(shù)據(jù)庫遷移而設(shè)計(jì)。它的主要優(yōu)點(diǎn)是可以在不中斷業(yè)務(wù)的情況下,不影響數(shù)據(jù)庫的可用性和性能,進(jìn)行表結(jié)構(gòu)的修改。
主要特點(diǎn)
在線遷移:
gh-ost
允許在高負(fù)載的生產(chǎn)環(huán)境中進(jìn)行表結(jié)構(gòu)的更改,而不需要鎖定表,確保數(shù)據(jù)庫的可用性。漸進(jìn)式復(fù)制:通過逐步復(fù)制行,
gh-ost
可以在針對大量數(shù)據(jù)的情況下,避免短時間內(nèi)的負(fù)載高峰。安全性:它具備自動回滾功能,如果遷移過程中出現(xiàn)問題,可以安全地回滾到原始狀態(tài)。
編程和操作簡便:工具使用簡單、直觀,與 MySQL 客戶端兼容,支持使用 SQL 語句進(jìn)行表結(jié)構(gòu)的更改。
多種配置選項(xiàng):支持多種選項(xiàng)用于配置操作,例如并行遷移、最大移動速度等。
使用場景
- 發(fā)布新字段:添加新的列而不影響應(yīng)用的訪問。
- 修改現(xiàn)有字段類型:安全地改變列的數(shù)據(jù)類型,比如從
VARCHAR
到TEXT
。 - 重命名列:而不影響運(yùn)行中的系統(tǒng)。
基本用法
安裝:可以通過
github
下載可執(zhí)行文件,或使用Homebrew
(在 macOS 上)進(jìn)行安裝。brew install gh-ost
基本命令:
以下是一個使用gh-ost
進(jìn)行表結(jié)構(gòu)變更的基本示例:gh-ost \ --max-load=Threads_running=25 \ --critical-load=Threads_running=1000 \ --host=127.0.0.1 \ --user=username \ --password=your_password \ --database=your_database \ --table=your_table \ --alter="ADD COLUMN new_col INT DEFAULT 0" \ --execute
這個命令將向
your_table
表中添加一個名為new_col
的新列,字段類型為INT
,默認(rèn)值為 0。
配置選項(xiàng)
--max-load
:指定允許的最大負(fù)載。--critical-load
:指定觸發(fā)回滾的負(fù)載。--host
,--user
,--password
:數(shù)據(jù)庫連接信息。--database
,--table
:要修改的數(shù)據(jù)庫和表名。--alter
:指定 ALTER 語句。--execute
:表示執(zhí)行遷移;如果不加這個選項(xiàng),則只進(jìn)行干運(yùn)行(dry run),不實(shí)際執(zhí)行。
gh-ost 數(shù)據(jù)遷移流程
1. 準(zhǔn)備與初始化
- 安裝與配置:確保你的 MySQL 數(shù)據(jù)庫已啟用二進(jìn)制日志(binlog),并安裝
gh-ost
工具。 - 參數(shù)設(shè)置:使用合適的參數(shù)啟動
gh-ost
,包括連接信息、要遷移的表、變更語句等。
2. 創(chuàng)建臨時表
- 臨時表的結(jié)構(gòu):
gh-ost
首先會創(chuàng)建一個新的臨時表,并按照你的 ALTER 語句的定義,將原有表的結(jié)構(gòu)復(fù)制到臨時表中 - 開始復(fù)制數(shù)據(jù):臨時表一旦創(chuàng)建,
gh-ost
即可開始將原始表中的現(xiàn)有數(shù)據(jù)逐行復(fù)制到臨時表中。
3. 數(shù)據(jù)復(fù)制與變更監(jiān)控
逐行復(fù)制:
gh-ost
以增量的方式逐行將原始表的數(shù)據(jù)復(fù)制到臨時表,這個復(fù)制過程是漸進(jìn)的,確保了對數(shù)據(jù)庫的負(fù)載最低。使用事務(wù)隔離:在數(shù)據(jù)復(fù)制的過程中,
gh-ost
使用REPEATABLE READ
事務(wù)隔離級別。這意味著在數(shù)據(jù)復(fù)制期間,原始表的讀取是一個快照,不會受到其他事務(wù)的影響。監(jiān)控二進(jìn)制日志(binlog):
- 同時,
gh-ost
啟動一個線程,實(shí)時監(jiān)控 MySQL 的 binlog,捕獲所有對原始表的變更(包括 INSERT、UPDATE、DELETE)。 - 這允許
gh-ost
捕獲到在數(shù)據(jù)復(fù)制過程中對原始表的任何更新。
- 同時,
4. 實(shí)時同步變更
處理變更:
- 任何在數(shù)據(jù)復(fù)制過程中對原始表的變更(例如:INSERT 或 UPDATE)都會被
gh-ost
監(jiān)控到并記錄在 binlog 中。 gh-ost
會將這些變化實(shí)時應(yīng)用到臨時表中(不會等到復(fù)制完成后,再處理變更數(shù)據(jù)),確保臨時表里的數(shù)據(jù)與原始表保持同步。
- 任何在數(shù)據(jù)復(fù)制過程中對原始表的變更(例如:INSERT 或 UPDATE)都會被
最終更新操作:
- 對于原始表的更新操作,如果在復(fù)制到某一行時,該行數(shù)據(jù)已經(jīng)被修改,
gh-ost
將依賴于二進(jìn)制日志來更新臨時表,以阻止出現(xiàn)數(shù)據(jù)不一致的情況。
- 對于原始表的更新操作,如果在復(fù)制到某一行時,該行數(shù)據(jù)已經(jīng)被修改,
5. 表切換
完成復(fù)制與更新:
- 一旦所有的數(shù)據(jù)都已復(fù)制,并且所有的二進(jìn)制日志變更均已同步到臨時表,
gh-ost
將進(jìn)行最后的檢查。
- 一旦所有的數(shù)據(jù)都已復(fù)制,并且所有的二進(jìn)制日志變更均已同步到臨時表,
原子重命名:
gh-ost
進(jìn)行原子操作,將原始表重命名為備份名稱(例如:your_table_old
),然后將臨時表重命名為原始表的名稱(例如:your_table
)。- 這一過程確保在任何時刻,數(shù)據(jù)庫中的數(shù)據(jù)都是一致的,并且整個遷移操作對外界是透明的。
6. 清理與回滾
- 刪除舊表:如果配置允許,
gh-ost
可以安全刪除舊表,以釋放資源。 - 回滾機(jī)制:
- 如果在遷移過程中發(fā)生錯誤,
gh-ost
會提供回滾功能,能夠安全地將數(shù)據(jù)庫恢復(fù)到原始狀態(tài),從而確保錯誤不會影響數(shù)據(jù)庫的運(yùn)作和數(shù)據(jù)的完整性。
- 如果在遷移過程中發(fā)生錯誤,
總結(jié)
gh-ost
通過以上步驟實(shí)現(xiàn)了在線、安全、逐漸的 MySQL 數(shù)據(jù)遷移。其設(shè)計(jì)保證了在整個過程中,數(shù)據(jù)的一致性和準(zhǔn)確性,以及對生產(chǎn)系統(tǒng)的影響最小。利用事務(wù)隔離和二進(jìn)制日志捕獲,gh-ost
確保所有變更都在遷移過程中得以有效處理,最終實(shí)現(xiàn)平滑的表結(jié)構(gòu)更新。
到此這篇關(guān)于Mysql在線安全變更工具 gh-ost的使用的文章就介紹到這了,更多相關(guān)Mysql gh-ost內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql創(chuàng)建存儲過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法分析
這篇文章主要介紹了mysql創(chuàng)建存儲過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對比分析了通過存儲過程新增字段相關(guān)操作技巧,需要的朋友可以參考下2018-12-12MySql如何按照日期進(jìn)行分組統(tǒng)計(jì)
這篇文章主要介紹了MySql如何按照日期進(jìn)行分組統(tǒng)計(jì)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

解決MySQL innoDB間隙鎖產(chǎn)生的死鎖問題

MySql事務(wù)及ACID實(shí)現(xiàn)原理詳解