mysql 自增字段原理 MySQL自增字段暴增

2021-10-19 18:36:12 字數 1457 閱讀 5464

找了點資料:

從網上看到一篇文章,mysql在檢測到表中有損壞的記錄時,會自動修復,為了保證資料的完整性,mysql會以空格(0x20)寫進磁碟來完成修復。根據欄位的型別,自增字段的長度不同,所允許的最大值也不同。見下:

int(10) unsigned型別最大值十進位制為4294967295,十六進製制ffffffff;

mediumint(8) unsigned型別最大值十進位制為16777215,十六進製制ffffff;

smallint(6) unsigned型別最大值十進位制為65535,十六進製制ffff;

tinyint(3) unsigned型別最大值十進位制為255,十六進製制ff

mail中的自增字段是int(10),也就是0x20202020,轉換成10進製就是538976288,超過了4294967295這個值,此時,系統會以最大值顯示。問了下具體的操作人員,確實做了資料庫修復的操作。

摘自後附資料

結論一(關於mysql確定和更新某個自增字段最大值的方式):

第 一次對某個表建立並填充好結構檔案.frm,索引檔案.myi和資料檔案.myd的資料後,首先讀取索引檔案.myi中關於這個自增字段的最大值,並且放 入記憶體進行計數,以後所有的自增欄位最大值都**於這個記憶體計數器;隔一段時間重新讀取資料檔案中對應欄位的確切最大值,並和記憶體的值做比較,然後用兩者 中的最大值更新記憶體的數值和索引檔案的數值。

結論二(關於不同的異常修復時對自增欄位最大值的影響):

在myisam的儲存結構中,資料 庫資料的異常不一定會導致立刻啟動自我修復;並且這種修復不是全面的修復,大多數情況下,它僅僅對資料檔案.myd進行修復,而這種修復並不對索引產生即 時的影響(換句話說,自增字段也不會受到即時的影響);只有當使用者要求進行修復的時候,才會全面更新索引(比如輸入sql語句:repair table __table_name__)。而一旦更新了索引(無論是手動還是自動更新),對自增字段的影響有可能是爆發性的呈現。

結論一的解釋:

在 試驗時,我發現假如終止mysql程序後再重新啟動,tid這個自增鍵值的最大值是直接讀取索引檔案cdb_threads.myi確定,而不管是否和數 據檔案cdb_threads.myd中的tid最大值是否一致。並且發現,1,只要索引檔案損壞並且無法自我修復,這個表就有可能無法讀取甚至導致 mysql程序當掉。2,索引檔案並不經常更新,而是有規律的隔段時間寫入。

結論二的解釋:

我的測試方法很簡單,在mysql執行時直接 修改資料檔案的尾部。用phpmyadmin開啟表的前幾頁資料,正常;我直接跳到最後一頁,這時候mysql提示出錯,要修復這個表,重新整理了兩下,自我 修復完畢,此時出現一條tid:2105376的無用記錄,然而插入新記錄時,tid賦予的下乙個值仍然是3201;只有當我顯式的命令修復過後,才賦予 tid下乙個值為2105377。

所以,朋友的那個論壇資料庫,07年已經出現了異常,然而直到08年12月,才執行了自我修復,然而這種修復在當時沒有影響到索引,而是根據前面的結論,繼續潛伏一段時間後,才顯出tid暴增的問題。

Mysql自增字段

1.關鍵字 auto increment 2.自增用法 例 create table animals id mediumint not null auto increment,name char 30 not null,primary key id 3.關於自增 q 怎麼獲得當前的自增的最大值?q ...

mysql自增字段重排

由於刪除了某些記錄行,所以自增字段不連續了。重排或歸零的方法 方法1 truncate table 你的表名 這樣不但重新定位自增的字段,而且會將表裡的資料全部刪除,慎用!方法2 delete from 你的表名 dbcc checkident 你的表名,reseed,0 重新定位自增的字段,讓它從...

mysql建立自增字段

1 建立 時新增 create table tablename id int auto increment primary key,2 建立 後新增 alter table tablename add id int auto increment primary key 3 設定主鍵 alter ta...