文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

小编给大家分享一下如何解决通过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自增列的不一致问题”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯