MySQL千萬級大表線上變更表結構
我接觸過很多公司的資料庫架構都缺乏有效合理的設計,如果早期的設計不合理,後期隨著表資料量的增加就不可避免的進行表結構變更。
分享一例MySQL千萬級大表線上變更表結構的案例。處理問題的思路和角度各有不同,希望這篇文章可以拋磚引玉。
一、問題背景
MySQL資料庫儲存的是結構化的資料型別,資料表記錄從上萬到上千萬上億,在公司業務不允許停服務的情況下,線上變更表結構是個很頭疼的事情。
當單表記錄數過大時,增刪改查效能都會急劇下降,線上變更表結構是不得不做的事,那麼如何在不停機不影響業務的情況下進行表結構變更?
二、難點問題
-
單例項情況下,單表量級達到千萬以上,如何確保修改欄位而不鎖表?
-
主從情況下,單表量級達到千萬以上,如何確保修改欄位而不鎖表?
-
如何對大表進行分庫分表儲存,來實現高效、穩定的資料讀寫?
三、問題分析思路
問題一:單表量級達到千萬以上,如何確保修改欄位而不鎖表?
單例項情況,建議使用 pt-online-schema-change 或者 gh-ost 工具,二者均不會產生鎖表,前者透過觸發器實現,後者透過解析 binlog 實現。
問題二:主從情況下,單表量級達到千萬以上,如何確保修改欄位而不鎖表?
主從情況,如果使用 pt-online-schema-change 工具,要在主庫做變更;如果使用 gh-ost 工具,主從均可。
問題 三:如何對大表進行分庫分表儲存,來實現高效、穩定的資料讀寫?
-
分割槽:表分割槽之後依靠引擎儲存去保證;
-
分表:業務邏輯涉及的更多一些,這種情況下單庫也相對好辦;
-
分庫:最大的問題就是分散式事務,目前市場有很多開源中介軟體可以選擇,但未必能夠滿足需求,需要進行選擇。
其實在資料庫架構初期就要判斷是否會出現大表以及資料的生命週期。對於海量資料,可以分為歷史資料和現行資料考慮儲存方式:
-
歷史資料:可以從現行資料表中進行定期剝離,後續只是進行查詢,完全可以將歷史資料轉存到歷史庫。
-
現行資料:對於頻繁訪問的資料,一般是整個系統的效能瓶頸點,可以考慮 SSD 的硬碟,這樣能保證既有業務的快速響應。
對於資料生命週期的管理還是需要考慮業務實際場景:
資料庫架構作為架構設計中的業務架構、應用架構、資料架構和執行架構中的架構之一,應該是與其他架構設計邏輯整合的一起的,不能把落地實現的所有功能都交給資料庫。
在實踐中比如不用儲存過程、不用外來鍵、儘量單表操作,這些應儘量交給應用層面去做,在應用層面進行邏輯處理;為什麼要放在應用層?,因為做這種處理的伺服器一般可以較好的進行擴充套件,提高響應能力,減少資料庫層面壓力。
四、線變更表結構方案有哪些?
-
直接 ALTER TABLE
-
oak-online-alter-table
-
5.7 新增 online rename index
-
pt-online-schema-change
-
gh-ost
-
自定義指令碼
五、生產環境下,變更 Mysql 的表結構步驟是什麼?
1.確認表的後設資料資訊;
2.對需求裡的改表語句進行稽核,如果存在不規範的地方進行修正。
3.確認當前節點是主節點還是從節點。
4.確認主從狀態是否正常。
5.根據資料量、業務場景、業務容忍度,選擇變更的方案以及預估需要的時間。
6.確定操作時間點,如果資料量大,建議在低峰進行。
7.釋出變更通知,告知應用觀察對應業務。
8.變更過程中,留意 MySQL 監控和機器監控,觀察主從狀態、主從連線數、主從機器負載。
9.變更過程出現問題,及時 KILL 相關操作。
10.變更順利完成,進行資料校驗。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997824/viewspace-2766605/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 幾千萬記錄,資料庫表結構如何平滑變更?資料庫
- Oracle、MySQL常見表結構變更語句對比OracleMySql
- 海量資料處理_表結構變更
- mysql線上修改表結構大資料表的風險與解決辦法歸納MySql大資料
- MySQL表結構變更引起的Metadata Lock|如何定位DDL被阻塞MySql
- DBus資料庫表結構變更處理方案資料庫
- MySQL 千萬級資料表 partition 實戰應用MySql
- 如何優化MySQL千萬級大表,我寫了6000字的解讀優化MySql
- Mysql匯出表結構、表資料MySql
- MySQL 複製表結構MySql
- mysql表結構複製MySql
- MYSQL建立多張表,相同表結構,不同表名MySql
- MySQL修改表結構到底會不會鎖表?MySql
- 線上更改MySQL表結構工具gh-ost的特點介紹MySql
- Mysql匯出表結構及表資料 mysqldump用法MySql
- mysql 複製表資料,表結構的3種方法MySql
- 【變更】線上庫的變更操作
- mysql表結構自動生成golang structMySqlGolangStruct
- mysql表結構同步工具SchemaSync使用初探MySql
- mysql複製表結構和資料MySql
- MySQL 對比資料庫表結構MySql資料庫
- MySQL InnoDB表--BTree基本資料結構MySql資料結構
- 恢復MySQL InnoDB表結構的方法MySql
- PHP+MySQL 千萬級資料處理案例(二) 分表的意義PHPMySql
- mysql中複製表結構的方法小結MySql
- Oracle表結構轉換SqlSERVER表結構 指令碼OracleSQLServer指令碼
- PHP 結合 MySQL 千萬級資料處理PHPMySql
- 【Mysql】Mysql從frm檔案裡恢復表結構MySql
- MySQL的count(*)的優化,獲取千萬級資料表的總行數MySql優化
- MySQL的事件溯源Event Sourcing表結構MySql事件
- mysql 如何複製表結構和資料MySql
- MySQL大表設計MySql
- 快速drop mysql大表MySql
- MAKT 物料組 變更記錄表
- 表管理之三:表與表結構的管理
- Oracle 12c 能否在2小時內線上完成一張14億條記錄的表結構欄位型別變更Oracle型別
- MySQL之表聯結MySql
- oracle 11g線上重構表Oracle