Mysql在線安全變更工具 gh-ost的使用
gh-ost(GitHub Online Schema Translater)是一個(gè)用于安全地進(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ù)的情況下,避免短時(shí)間內(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
基本命令:
以下是一個(gè)使用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
這個(gè)命令將向
your_table表中添加一個(gè)名為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í)行遷移;如果不加這個(gè)選項(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)建臨時(shí)表
- 臨時(shí)表的結(jié)構(gòu):
gh-ost首先會創(chuàng)建一個(gè)新的臨時(shí)表,并按照你的 ALTER 語句的定義,將原有表的結(jié)構(gòu)復(fù)制到臨時(shí)表中 - 開始復(fù)制數(shù)據(jù):臨時(shí)表一旦創(chuàng)建,
gh-ost即可開始將原始表中的現(xiàn)有數(shù)據(jù)逐行復(fù)制到臨時(shí)表中。
3. 數(shù)據(jù)復(fù)制與變更監(jiān)控
逐行復(fù)制:
gh-ost以增量的方式逐行將原始表的數(shù)據(jù)復(fù)制到臨時(shí)表,這個(gè)復(fù)制過程是漸進(jìn)的,確保了對數(shù)據(jù)庫的負(fù)載最低。使用事務(wù)隔離:在數(shù)據(jù)復(fù)制的過程中,
gh-ost使用REPEATABLE READ事務(wù)隔離級別。這意味著在數(shù)據(jù)復(fù)制期間,原始表的讀取是一個(gè)快照,不會受到其他事務(wù)的影響。監(jiān)控二進(jìn)制日志(binlog):
- 同時(shí),
gh-ost啟動一個(gè)線程,實(shí)時(shí)監(jiān)控 MySQL 的 binlog,捕獲所有對原始表的變更(包括 INSERT、UPDATE、DELETE)。 - 這允許
gh-ost捕獲到在數(shù)據(jù)復(fù)制過程中對原始表的任何更新。
- 同時(shí),
4. 實(shí)時(shí)同步變更
處理變更:
- 任何在數(shù)據(jù)復(fù)制過程中對原始表的變更(例如:INSERT 或 UPDATE)都會被
gh-ost監(jiān)控到并記錄在 binlog 中。 gh-ost會將這些變化實(shí)時(shí)應(yīng)用到臨時(shí)表中(不會等到復(fù)制完成后,再處理變更數(shù)據(jù)),確保臨時(shí)表里的數(shù)據(jù)與原始表保持同步。
- 任何在數(shù)據(jù)復(fù)制過程中對原始表的變更(例如:INSERT 或 UPDATE)都會被
最終更新操作:
- 對于原始表的更新操作,如果在復(fù)制到某一行時(shí),該行數(shù)據(jù)已經(jīng)被修改,
gh-ost將依賴于二進(jìn)制日志來更新臨時(shí)表,以阻止出現(xiàn)數(shù)據(jù)不一致的情況。
- 對于原始表的更新操作,如果在復(fù)制到某一行時(shí),該行數(shù)據(jù)已經(jīng)被修改,
5. 表切換
完成復(fù)制與更新:
- 一旦所有的數(shù)據(jù)都已復(fù)制,并且所有的二進(jìn)制日志變更均已同步到臨時(shí)表,
gh-ost將進(jìn)行最后的檢查。
- 一旦所有的數(shù)據(jù)都已復(fù)制,并且所有的二進(jìn)制日志變更均已同步到臨時(shí)表,
原子重命名:
gh-ost進(jìn)行原子操作,將原始表重命名為備份名稱(例如:your_table_old),然后將臨時(shí)表重命名為原始表的名稱(例如:your_table)。- 這一過程確保在任何時(shí)刻,數(shù)據(jù)庫中的數(shù)據(jù)都是一致的,并且整個(gè)遷移操作對外界是透明的。
6. 清理與回滾
- 刪除舊表:如果配置允許,
gh-ost可以安全刪除舊表,以釋放資源。 - 回滾機(jī)制:
- 如果在遷移過程中發(fā)生錯(cuò)誤,
gh-ost會提供回滾功能,能夠安全地將數(shù)據(jù)庫恢復(fù)到原始狀態(tài),從而確保錯(cuò)誤不會影響數(shù)據(jù)庫的運(yùn)作和數(shù)據(jù)的完整性。
- 如果在遷移過程中發(fā)生錯(cuò)誤,
總結(jié)
gh-ost 通過以上步驟實(shí)現(xiàn)了在線、安全、逐漸的 MySQL 數(shù)據(jù)遷移。其設(shè)計(jì)保證了在整個(gè)過程中,數(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數(shù)據(jù)庫如何導(dǎo)入導(dǎo)出(備份還原)
這篇文章主要介紹了MySQL數(shù)據(jù)庫如何導(dǎo)入導(dǎo)出(備份還原),需要的朋友可以參考下2015-10-10
mysql學(xué)習(xí)筆記之完整的select語句用法實(shí)例詳解
這篇文章主要介紹了mysql學(xué)習(xí)筆記之完整的select語句用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql select語句各種常見參數(shù)、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
MySQL 索引的優(yōu)缺點(diǎn)以及創(chuàng)建索引的準(zhǔn)則
這篇文章主要介紹了MySQL 索引的優(yōu)劣以及創(chuàng)建索引的準(zhǔn)則,幫助大家更好的理解和使用MySQL 索引,感興趣的朋友可以了解下2020-09-09
為什么MySQL 使用timestamp可以無視時(shí)區(qū)問題.
這篇文章主要介紹了為什么MySQL timestamp可以無視時(shí)區(qū)問題,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下2020-12-12
在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程
這篇文章主要介紹了在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程,子查詢的使用時(shí)MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-12-12

