自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

幾千萬(wàn)記錄,數(shù)據(jù)庫(kù)表結(jié)構(gòu)如何平滑變更?

開發(fā) 開發(fā)工具 其他數(shù)據(jù)庫(kù)
數(shù)據(jù)量大、并發(fā)量高場(chǎng)景,如何在流量低峰期,平滑實(shí)施表結(jié)構(gòu)變更?任何脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì)都是耍流氓。

 


繼續(xù)回答知識(shí)星球水友提問。

 

問題域:數(shù)據(jù)量大、并發(fā)量高場(chǎng)景,如何在流量低峰期,平滑實(shí)施表結(jié)構(gòu)變更?

畫外音,一般來說,是指增加表的屬性,因?yàn)椋?/p>

  • 如果是減column,升級(jí)程序不使用即可;
  • 如果是修改column,程序兼容性容易出問題;

首先,一起看下有哪些常見方案。

(1) 方案一:在線修改表結(jié)構(gòu)。

畫外音:alter table add column

數(shù)據(jù)量大的情況下,鎖表時(shí)間會(huì)較長(zhǎng),造成拒絕服務(wù),一般不可行。

(2) 方案二:通過增加表的方式擴(kuò)展屬性,通過外鍵join來查詢。

舉個(gè)例子,對(duì):

  1. t_user(uid, c1, c2, c3) 

想要擴(kuò)展屬性,可以通過增加一個(gè)表實(shí)現(xiàn):

  1. t_user_ex(uid, c4, c5, c6) 

數(shù)據(jù)量大的情況下,join性能較差,一般不可行。

(3) 方案三,通過增加表的方式擴(kuò)展,通過視圖來屏蔽底層復(fù)雜性。

同上,視圖效率較低,一般不使用視圖。

畫外音:至少58到家禁止使用視圖。

(4) 方案四,揍產(chǎn)品經(jīng)理,阻止她修改需求。...

(5) 方案五,提前預(yù)留一些reserved字段,加列可復(fù)用這些字段。

這個(gè)方案可行,但如果預(yù)留過多,會(huì)造成空間浪費(fèi)。

(6) 方案六,pt-online-schema-change

對(duì)于MySQL而言,這是目前比較成熟的方案,被廣大公司所使用。

畫外音:我呆過的互聯(lián)網(wǎng)公司,數(shù)據(jù)庫(kù)均使用MySQL。

下面仍以用戶表擴(kuò)展為例,說下這個(gè)工具內(nèi)部的原理與步驟。

假設(shè):

  1. user(uid, name, passwd) 

要擴(kuò)展到:

  1. user(uid, name, passwd, age, sex) 

第一步,先創(chuàng)建一個(gè)擴(kuò)充字段后的新表:

  1. user_new(uid, name, passwd, age, sex) 

畫外音:就是被擴(kuò)展后的表。

第二步,在原表user上創(chuàng)建三個(gè)觸發(fā)器,對(duì)原表user進(jìn)行的所有insert/delete/update操作,都會(huì)對(duì)新表user_new進(jìn)行相同的操作;

第三步,分批將原表user中的數(shù)據(jù)insert到新表user_new,直至數(shù)據(jù)遷移完成;

第四步,刪掉觸發(fā)器,把原表移走(默認(rèn)是drop掉);

第五步,把新表user_new重命名(rename)成原表user;

擴(kuò)充字段完成,整個(gè)過程不需要鎖表,可以持續(xù)對(duì)外提供服務(wù)。

操作過程中需要注意:

  • 變更過程中,最重要的是沖突的處理,一條原則,以觸發(fā)器的新數(shù)據(jù)為準(zhǔn),這就要求被遷移的表必須有主鍵(這個(gè)要求基本都滿足);
  • 變更過程中,寫操作需要建立觸發(fā)器,所以如果原表已經(jīng)有很多觸發(fā)器,方案就不行(互聯(lián)網(wǎng)大數(shù)據(jù)高并發(fā)的在線業(yè)務(wù),一般都禁止使用觸發(fā)器);
  • 觸發(fā)器的建立,會(huì)影響原表的性能,所以這個(gè)操作必須在流量低峰期進(jìn)行;

pt-online-schema-change是DBA必備的利器,比較成熟,在互聯(lián)網(wǎng)公司使用廣泛,要了解更詳細(xì)的細(xì)節(jié),亦可以Google一下。

任何脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì)都是耍流氓。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2010-08-06 14:29:14

DB2數(shù)據(jù)庫(kù)并置

2010-09-10 13:37:30

表分區(qū)SQL Server

2018-09-11 17:13:23

MySQ數(shù)據(jù)庫(kù)重復(fù)記錄

2009-02-02 13:16:23

修復(fù)數(shù)據(jù)表MySQL

2011-05-18 13:16:21

MySQL數(shù)據(jù)庫(kù)鎖定

2011-08-04 15:55:25

SQL Server數(shù)

2011-08-04 13:31:50

數(shù)據(jù)庫(kù)記錄更改日志觸發(fā)器

2011-07-29 11:20:51

MySQL數(shù)據(jù)庫(kù)字段重復(fù)

2023-09-14 23:05:57

? ?MySQL數(shù)據(jù)庫(kù)

2011-08-25 13:41:50

SQL Server 變更跟蹤

2010-05-24 13:14:19

創(chuàng)建MySQL

2023-03-29 07:02:46

開源項(xiàng)目工具

2011-05-17 11:23:02

Oracle數(shù)據(jù)庫(kù)

2014-07-09 14:23:20

WordPress數(shù)據(jù)庫(kù)表

2011-03-07 13:30:53

Oracle數(shù)據(jù)庫(kù)

2009-02-02 16:50:34

數(shù)據(jù)庫(kù)表的鎖定MySQL

2020-12-09 11:38:16

數(shù)據(jù)庫(kù)測(cè)試環(huán)境

2011-03-29 09:26:35

Oracle數(shù)據(jù)庫(kù)

2011-09-01 14:00:11

SQL Server 存儲(chǔ)過程顯示表結(jié)構(gòu)

2010-04-28 18:25:51

Oracle數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)