幾千萬記錄,資料庫表結構如何平滑變更?
資料量大、併發量高場景,如何在流量低峰期,平滑實施表結構變更?任何脫離業務的架構設計都是耍流氓。
如果是減column,升級程式不使用即可; 如果是修改column,程式相容性容易出問題; |
資料量大、併發量高場景,如何在流量低峰期,平滑實施表結構變更?任何脫離業務的架構設計都是耍流氓。
繼續回答知識星球水友提問。
問題域:資料量大、併發量高場景,如何在流量低峰期,平滑實施表結構變更?
畫外音,一般來說,是指增加表的屬性,因為:
如果是減column,升級程式不使用即可;
如果是修改column,程式相容性容易出問題;
首先,一起看下有哪些常見方案。
畫外音:alter table add column
資料量大的情況下,鎖表時間會較長,造成拒絕服務,一般不可行。
舉個例子,對:
t_user(uid, c1, c2, c3)
想要擴充套件屬性,可以透過增加一個表實現:
t_user_ex(uid, c4, c5, c6)
資料量大的情況下,join效能較差,一般不可行。
同上,檢視效率較低,一般不使用檢視。
畫外音:至少58到家禁止使用檢視。
這個方案可行,但如果預留過多,會造成空間浪費。
對於MySQL而言,這是目前比較成熟的方案,被廣大公司所使用。
畫外音:我呆過的網際網路公司,資料庫均使用MySQL。
下面仍以使用者表擴充套件為例,說下這個工具內部的原理與步驟。
假設:
user(uid, name, passwd)
要擴充套件到:
user(uid, name, passwd, age, sex)
第一步,先建立一個擴充欄位後的新表:
user_new(uid, name, passwd, age, sex)
畫外音:就是被擴充套件後的表。
第二步,在原表user上建立三個觸發器,對原表user進行的所有insert/delete/update操作,都會對新表user_new進行相同的操作;
第三步,分批將原表user中的資料insert到新表user_new,直至資料遷移完成;
第四步,刪掉觸發器,把原表移走(預設是drop掉);
第五步,把新表user_new重新命名(rename)成原表user;
擴充欄位完成,整個過程不需要鎖表,可以持續對外提供服務。
操作過程中需要注意:
變更過程中,最重要的是衝突的處理,一條原則,以觸發器的新資料為準,這就要求被遷移的表必須有主鍵(這個要求基本都滿足);
變更過程中,寫操作需要建立觸發器,所以如果原表已經有很多觸發器,方案就不行(網際網路大資料高併發的線上業務,一般都禁止使用觸發器);
觸發器的建立,會影響原表的效能,所以這個操作必須在流量低峰期進行;
pt-online-schema-change是DBA必備的利器,比較成熟,在網際網路公司使用廣泛,要了解更詳細的細節,亦可以Google一下。
任何脫離業務的架構設計都是耍流氓。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2660272/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL千萬級大表線上變更表結構MySql
- DBus資料庫表結構變更處理方案資料庫
- 使用SQLServerAudit記錄資料庫變更SQLServer資料庫
- 海量資料處理_表結構變更
- 利用AUDIT檢視資料庫表結構變化資料庫
- MAKT 物料組 變更記錄表
- 256變4096:分庫分表擴容如何實現平滑資料遷移?
- Activiti資料庫表結構資料庫
- QC資料庫表結構資料庫
- 資料庫資料變成樹型結構資料庫
- 物料主記錄的資料結構資料結構
- 如何用PLSQL匯出資料庫存表結構資訊SQL資料庫
- 如何比較兩個資料庫表結構的不同資料庫
- MySQL 對比資料庫表結構MySql資料庫
- Agile PLM資料庫表結構(Oracle)資料庫Oracle
- 資料庫-單表結構-建表語句資料庫
- 資料庫建模或表結構(模型設計)_隨記(二)資料庫模型
- 線性表__資料結構筆記資料結構筆記
- MySQL表結構變更引起的Metadata Lock|如何定位DDL被阻塞MySql
- 如何快速最佳化幾千萬資料量的訂單表
- 14億條記錄,12c 做不到2小時內變更表結構欄位型別?型別
- 【PG結構】Postgresql資料庫資料目錄說明SQL資料庫
- 急!請教資料庫記錄改變了如何通知頁面更新?資料庫
- Sqlite嵌入式資料庫的安裝、建庫、建表、更新表結構以及資料匯入匯出等等詳細過程記錄SQLite資料庫
- 資料結構筆記——線性表(中)資料結構筆記
- 資料結構筆記——線性表(下)資料結構筆記
- Oracle查詢庫中記錄數大於2千萬的所有表Oracle
- 這個資料庫表如何設計的更優雅?資料庫
- mysql 如何複製表結構和資料MySql
- Oracle、MySQL常見表結構變更語句對比OracleMySql
- ECshop 每個資料庫表結構說明資料庫
- var+不可變資料結構 vs val+可變資料結構資料結構
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- 瀚高資料庫記憶體結構資料庫記憶體
- MYSQL資料庫表記錄刪除解決方案MySql資料庫
- zabbix 監控資料庫表記錄數(Discovery方式)資料庫
- 顯示資料庫中所有表的記錄數資料庫
- 織夢資料庫表結構_Dedecms資料庫表和欄位詳細介紹資料庫