成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何解決通過shell腳本模擬MySQL自增列的不一致問題

小編給大家分享一下如何解決通過shell腳本模擬MySQL自增列的不一致問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比崇明網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式崇明網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋崇明地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。

   MySQL的自增列問題其實很有意思,在重啟數(shù)據(jù)庫之后,會按照max(id)+1的方式來計算,這樣一個看起來有些別扭的實現(xiàn)方式在早期版本就飽受詬病,在MySQL 5.7都沒有解決掉,終于在8.0松口了,計劃在這個版本中修復(fù)。

   而重啟會帶來自增列一類的潛在問題,而如果不重啟其實也有可能會有自增列的不一致問題。和兩個參數(shù)table_definition_cache和table_open_cache還是密切相關(guān)的。

  主要的原因是什么呢,引用阿里數(shù)據(jù)庫內(nèi)核團(tuán)隊的解釋(https://www.kancloud.cn/taobaomysql/monthly/67171):一方面InnoDB表自增值是存儲在表對象中的,表對象又是放在緩存中的,如果表太多而不能全部放在緩存中的話,老的表就會被置換出來,這種被置換出來的表下次再使用的時候,就要重新打開一遍,對自增列來說,這個過程就和實例重啟類似,需要 select max(id) + 1 算一下自增值。

  表對象緩存大小由 table_definition_cache 系統(tǒng)變量控制,最小值為400,表緩存相關(guān)的另一個系統(tǒng)變量是table_open_cache,這個控制的是所有線程打開表的緩存大小,這個緩存放在server層。

   我在查看了5.6.14的環(huán)境之后,發(fā)現(xiàn)這個值已經(jīng)提升到了500,而在MySQL 5.7中,提升到了1400,可見這方面了下了大功夫。

  MySQL 5.6.14的參數(shù)值情況

# mysqladmin var|grep table_open_cache
| table_open_cache                           | 256
| table_open_cache_instances                 | 1  
# mysqladmin var|grep table_definition_cache
| table_definition_cache                     | 500

MySQL 5.7中的參數(shù)值情況:

mysql> show variables like 'table_definition_cache';
| Variable_name          | Value |
| table_definition_cache | 1400  |


mysql> show variables like 'table_open_cache';
| Variable_name    | Value |
| table_open_cache | 2000  | 阿里的同學(xué)給出了testcase的偽代碼,我就來實現(xiàn)以下,給出shell版本的測試腳本。

首先我們可以模擬一下這個測試的基線,把兩個變量都修改為400.

SET GLOBAL table_definition_cache = 400;
SET GLOBAL table_open_cache = 400;

然后使用如下的shell腳本,仔細(xì)來看,腳本邏輯很簡單了。

生成500個表,然后插入一條數(shù)據(jù),修改自增列值,然后查詢表里的數(shù)據(jù),使得數(shù)據(jù)能夠刷出,稍作等待,查看show create table的結(jié)果。

for i in {1..500}
do
mysql   test_new <<EOF
CREATE TABLE t$i(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(30), PRIMARY KEY(id)) ENGINE=InnoDB;
INSERT INTO t$i(name) VALUES("InnoDB");
ALTER TABLE t$i AUTO_INCREMENT = 100;
EOF
done

for i in {1..500}
do
mysql    test_new <<EOF
SELECT * FROM t$i;
EOF
done

sleep 10;

for i in {1..3}
do
mysql   test_new <<EOF
SHOW CREATE TABLE t$i;
EOF
done

測試完成之后,來查看自增列的值情況.

在5.6.14中效果很明顯。

Table   Create Table
t1      CREATE TABLE `t1` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(30) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

而在5.7中,發(fā)現(xiàn)這類問題竟然還復(fù)現(xiàn)不了了,至于是代碼層級做了修復(fù)還是和其它參數(shù)有關(guān),就需要深入一下了。

Table   Create Table
t1      CREATE TABLE `t1` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(30) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=latin1

看完了這篇文章,相信你對“如何解決通過shell腳本模擬MySQL自增列的不一致問題”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享文章:如何解決通過shell腳本模擬MySQL自增列的不一致問題
文章鏈接:http://jinyejixie.com/article44/pgioee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、網(wǎng)站收錄、手機(jī)網(wǎng)站建設(shè)網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
当雄县| 万源市| 陆良县| 广水市| 南汇区| 三亚市| 五峰| 阿坝| 陈巴尔虎旗| 黄梅县| 四会市| 遂溪县| 汝阳县| 太仆寺旗| 南康市| 双鸭山市| 韶山市| 内乡县| 兴城市| 泾阳县| 奉贤区| 江门市| 鄂托克前旗| 呼图壁县| 平利县| 兴文县| 满城县| 东兰县| 阿拉善盟| 区。| 北京市| 建平县| 岳阳县| 彭水| 察隅县| 敖汉旗| 淮滨县| 三亚市| 斗六市| 马边| 福泉市|