在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

如何解决通过shell脚本模拟MySQL自增列的不一致问题

117次阅读
没有评论

共计 2113 个字符,预计需要花费 6 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下如何解决通过 shell 脚本模拟 MySQL 自增列的不一致问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

  MySQL 的自增列问题其实很有意思,在重启数据库之后,会按照 max(id)+ 1 的方式来计算,这样一个看起来有些别扭的实现方式在早期版本就饱受诟病,在 MySQL 5.7 都没有解决掉,终于在 8.0 松口了,计划在这个版本中修复。

  而重启会带来自增列一类的潜在问题,而如果不重启其实也有可能会有自增列的不一致问题。和两个参数 table_definition_cache 和 table_open_cache 还是密切相关的。

 
主要的原因是什么呢,引用阿里数据库内核团队的解释(https://www.kancloud.cn/taobaomysql/monthly/67171):一方面 InnoDB 表自增值是存储在表对象中的,表对象又是放在缓存中的,如果表太多而不能全部放在缓存中的话,老的表就会被置换出来,这种被置换出来的表下次再使用的时候,就要重新打开一遍,对自增列来说,这个过程就和实例重启类似,需要
select max(id) + 1 算一下自增值。

  表对象缓存大小由  table_definition_cache  系统变量控制,最小值为 400,表缓存相关的另一个系统变量是 table_open_cache,这个控制的是所有线程打开表的缓存大小,这个缓存放在 server 层。

  我在查看了 5.6.14 的环境之后,发现这个值已经提升到了 500,而在 MySQL 5.7 中,提升到了 1400,可见这方面了下了大功夫。

  MySQL 5.6.14 的参数值情况

# 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 中的参数值情况:

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  | 阿里的同学给出了 testcase 的伪代码,我就来实现以下,给出 shell 版本的测试脚本。

首先我们可以模拟一下这个测试的基线,把两个变量都修改为 400.

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

然后使用如下的 shell 脚本,仔细来看,脚本逻辑很简单了。

生成 500 个表,然后插入一条数据,修改自增列值,然后查询表里的数据,使得数据能够刷出,稍作等待,查看 show create table 的结果。

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 中,发现这类问题竟然还复现不了了,至于是代码层级做了修复还是和其它参数有关,就需要深入一下了。

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 自增列的不一致问题”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计2113字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 欧美日韩一区在线观看 | 7878成人国产在线观看 | 国产福利影院 | 无套内射极品少妇chinese | 52色撸99热99 | 亚洲欧美网 | 欧美日本中文字幕 | 日本高清不卡中文字幕 | 无码av中文一区二区三区桃花岛 | 精品久久久久久久 | 国产又黄又潮娇喘视频 | 另类专区另类专区亚洲 | 台湾综合色 | 一区视频在线 | 欧美大屁股熟妇bbbbbb | 精品久久久久成人码免费动漫 | 亚洲精品无码专区久久久 | 特级黄色影片 | 黄网站色 | 伊人色综合久久天天人手人婷 | 成人影院免费在线观看 | 欧美美女视频网站 | 久热草视频 | 日韩亚洲一区二区三区 | 无码a∨高潮抽搐流白浆 | 精品久久久中文字幕二区 | 亚洲最大天堂无码精品区 | 蜜桃一区二区三区 | 精品国产一二三区 | 男女下面一进一出好爽视频 | 亚洲麻豆精品 | 国产乱插| 欧美在线观看不卡 | 在线播放的网站 | 午夜日韩在线 | 亚洲人成电影网站 | 久艹精品 | 成人永久免费视频 | 久久成人小视频 | 福利视频影院 | 亚洲精品专区一区二区欧美 |