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

