InnoDB row id邊界溢位驗證

2021-08-27 12:29:53 字數 1213 閱讀 2841

背景跟同學聊到

row_id

乙個邊界問題,這裡詳細說明下。

innodb

表若沒有定義主鍵,會使用系統的乙個預設遞增

row_id (dict_sys->row_id)

作為主鍵。每次插入一行加

1,到達最大值迴圈復用。

需要注意的是,雖然

dict_sys->row_id

被定義為乙個

unsigned long long,

但由於這個主鍵值只有

6個位元組,因此最大值是

2^48

。row_id

超過這個值還是會遞增,只是寫入的時候只取低位,可以認為是做取模操作。

問題

這就涉及到乙個問題,乙個長期執行的

mysql

裡,如果頻繁插入刪除行(像日誌類的表),即使最終表規模不是很大,仍可能會出現值

row_id

重用。而我們知道作為主鍵值,是不能重複的。

假設出現這種情況,在乙個表裡,新插入的一行的

row_id

與某乙個年代久遠的行的

row_id

出現衝突,會腫麼樣?

驗證

其實本來這裡只需要乙個結論。本文的目的還是跟大家**一種驗證的方法。有了上面的資訊,我們可以考慮設計如下的復現步驟:

1)建立一張無主鍵空表

2)  gdb

設定dict_sys->row_id為1

3)  

往空表插入若干行

4)  gdb

設定dict_sys->row_id

為2^48

5)   

再插入若干行

6)   

看結果

結論

可以看到,行

(1),(2)

被覆蓋了。

比較合理點的方案應該是像

mysql

的表內自增主鍵一樣,報個

duplicate-key error.

InnoDB row id邊界溢位驗證

背景 跟同學聊到row id乙個邊界問題,這裡詳細說明下。innodb表若沒有定義主鍵,會使用系統的乙個預設遞增row id dict sys row id 作為主鍵。每次插入一行加1,到達最大值迴圈復用。需要注意的是,雖然dict sys row id 被定義為乙個unsigned long lo...

HTML CSS之邊界合併和邊界溢位

1.邊界合併只出現在塊級元素中,並且只會在上下邊距出現 2.塊級元素垂直上下邊距相遇,取較大的值 3.如果出現負邊距,這麼兩個元素的邊距就是上下邊距帶符號的和,如果負邊距的絕對值大於正邊距,就會出現重疊,後面的元素疊在前面的元素上 有上面的3點,下面我們就來一點一點的證明 1,2可以一起證明 正常情...

棧溢位,記憶體溢位

對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...