首页 文章 精选 留言 我的

精选列表

搜索[mysql],共10000篇文章
优秀的个人博客,低调大师

小工具查看MYSQL数据文件块和类型

通过学习姜大师的INNODB 存储引擎,获得了块的格式的标识位,同时看到书上有他自己写的一个工具能够查看数据块的类型, 那么既然知道了标识位,我使用C语言也写了一个功能类似的小工具,不要在生产环境,可用于学习和研究 后期会加入更多想到的有用的功能。其实程序非常简单,我就在一个文件里面就完成了,因为不大所以没有分为多个文件。 工具包含2个选项 限于INNODB 数据文件 -t Only Total blocks types in ibdata! -d Blocks types detail in ibdata! -t 是一个综述。 -d 是每个块的类型。 *************************************************** USEAGE: mysqlblock datafile -t/-d This small tool used in study and test database,not uesd on online database! This tool is used to find how many blocks and types in specified datafile,Exp:how many undo block in d ata file! QQ:22389860 *************************************************** -t Only Total blocks types in ibdata! -d Blocks types detail in ibdata! *************************************************** FILE SIZE IS : 524288000 Total Block Status : Total block : 32000,Total size is: 500.000000 MB Total undo block : 11072,Total size is: 173.000000 MB Total index node block : 0,Total size is: 0.000000 MB Total insert buffer free blocks: 0,Total size is: 0.000000 MB Total data(leaf node) block : 20348,Total size is: 317.937500 MB Total new allocate blocks : 576,Total size is: 9.000000 MB Total insert buf bitmap blocks : 2,Total size is: 0.031250 MB Total system blocks : 0,Total size is: 0.000000 MB Total transaction system blocks: 0,Total size is: 0.000000 MB Total file space header blocks : 0,Total size is: 0.000000 MB Total extrenl disc blocks : 2,Total size is: 0.031250 MB Total LOB blocks : 0,Total size is: 0.000000 MB Total Unkown blocks : 0,Total size is: 0.000000 MB 程序我放到了百度云盘,有兴趣的可以下载试试,在LINUX下 传到服务器给予执行权限即可以执行。 [root@hadoop1 mysqldata]#chmod 755 mysqlblock [root@hadoop1 mysqldata]# ./mysqlblock mysqldata3 -t 云盘地址 http://pan.baidu.com/s/1num76RJ 作者微信:

优秀的个人博客,低调大师

MySQL innoDB 间隙锁产生的死锁问题 | 京东云技术团队

背景 线上经常偶发死锁问题,当时处理一张表,也没有联表处理,但是有两个mq入口,并且消息体存在一样的情况,频率还不是很低,这么一个背景,我非常容易怀疑到,两个消息同时近到这一个事务里面导致的,但是是偶发的,又模拟不出来什么场景会导致死锁,只能进行代码分析,问题还原的方式去排查问题。 业务代码简化成下面 begin update test set yn = 0 where dm_code = "3"; SELECT * from test where dm_code = '3' INSERT INTO demand_flow_followers (dm_code, erp ) values ('3', 'a') , ('3', 'b') , ('3', 'c') 也就是说先update ,select , insert 这么一个顺序 表中存在dm_code ,erp 唯一索引如果不存在索引 第一行update 会导致行锁升级为表锁,反而不会导致问题出现,但是并发太差 结论 先说结论: session1 session2 开启事务 update 开启事务 update insert insert出现死锁 重点: 无论哪个事务insert,两个事务必须都update 完成,只要满足这个条件,两个insert执行的时候就会报死锁 原因:我先按照自己的理解解释下: innodb的行锁,存在间隙锁,为啥要去有索引,如果没有索引,第一个update 就直接进行了表锁,这样导致另外一个事务无法进入,就只能进行等待了。 有索引的情况下: 两个事务都执行update,都拿到了[当前值,+∞) 的锁(记录锁+间隙锁),(update的时候,无数据命中) 第一个insert时,希望等待另外一个事务释放锁。第二个事务希望第一个事务释放锁,因此出现了死锁问题 相关知识梳理 InnoDB有三种行锁的算法: 1.Record Lock:是加在索引记录上的。 2.Gap Lock(间隙锁):对索引记录间的范围加锁,或者加在最后一个索引记录的前面或者后面 3.Next-Key Lock:前两种锁的结合,锁定一个范围,并且锁定记录本身,主要目的是解决幻读的问题。 间隙锁主要是防止幻象读,用在Repeated-Read(简称RR)隔离级别下。在Read-Commited(简称RC)下,一般没有间隙锁(有外键情况下例外,此处不考虑)。间隙锁还用于statement based replication 间隙锁有些副作用,如果要关闭,一是将会话隔离级别改到RC下,或者开启 innodb_locks_unsafe_for_binlog(默认是OFF)。 间隙锁(无论是S还是X)只会阻塞insert操作。 CREATE TABLE `test` ( `id` bigint(20) NOT NULL, `k` bigint(20) DEFAULT '0', PRIMARY KEY (`id`), KEY `idx_k` (`k`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 INSERT into test values(2,2),(5,5),(10,10) select @@global.tx_isolation, @@tx_isolation; RR隔离级别 delete from test where k=5; session2 insert into test (id,k) values (3,3) insert into test (id,k) values (4,4) insert into test (id,k) values (6,6) insert into test (id,k) values (7,7) insert into test (id,k) values (8,8) insert into test (id,k) values (9,9) 上面都报错:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 这个证明id (3,5)都被间隙锁锁住了 insert into test (id,k) values (1,1) insert into test (id,k) values (11,11) delete from test where id in (1,11) (3,5) 区间之外都可以执行insert,delete操作 可以看到,delete k=5的记录阻塞了k=3、4、5、6、7、8、9记录的插入操作,事实上,除了对于k=5这条记录上record lock之外,innoDB对于delete和update在辅助索引(非主键索引)上的条件时会对扫过的记录上间隙锁,为了防止幻读,会锁住k=5这条记录的前面一条记录(id=2,k=2)到后面一条记录(id=10,k=10)之间的区间,即锁住k在区间(2,10)的范围(如果没有后一条记录,一直锁到正无穷),至于在边界k=2及k=10上,由于索引内是按照主键排序的,不会锁住(id<2,k=2)但是会锁住(id>2,k=2),同理不会锁住(id>10,k=10)但是会锁住(id<10,k=10). insert into test (id,k) values (1,2) ok insert into test (id,k) values (11,2) no insert into test (id,k) values (11,9) no insert into test (id,k) values (11,10) ok insert into test (id,k) values (1,10) no insert into test (id,k) values (11,10) ok 由于索引内是按照主键排序的,不会锁住(id<2,k=2)但是会锁住(id>2,k=2),同理不会锁住(id>10,k=10)但是会锁住(id<10,k=10). 值得注意的是,delete和update在唯一索引(primary key/unique key)上更新存在的记录时只会上行级记录锁(record key),而在唯一索引上更新不存在的记录时同辅助索引一样会上间隙锁;在上例中,delete id=5只会在(id=5,k=5)这条记录上上X锁,而delete id=7却会锁住(id>5&&id<10)这个区间。 线上问题还原 session1 session2 begin begin update test set k = 20 where id = 20 update test set k = 20 where id = 20 INSERT into test values(25,25) | INSERT into test values(25,25) 重点: insert 之前两个回话都执行完update SQL 错误 [1213] [40001]: Deadlock found when trying to get lock; try restarting transaction 解决办法: 避免更新或者删除不存在的记录,虽然更新存在的记录也会产生间隙锁,但是间隙锁锁住的范围会更小; 更新不存在的记录会锁住意想不到的区间范围,极其容易导致死锁问题 这些仅仅是解决问题的一个小的技巧,不能从根本上解决问题,如果想从根本上解决就从代码级别上加锁,这样避免了这种问题,但是同时并发就小了,根据自己的实际情况进行定夺方案 作者:京东零售 吴法刚 来源:京东云开发者社区 转载请注明来源

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册