DB2和mysql活动日志满了会自动回滚最早未提交的事务吗?

如下场景:一个事务1插入了或者更新了少量的数据但是一直没有提交,活动日志使用率慢慢的增长到90%甚至99%,最后一个事务N正好把活动日志用满,这个时候数据库会怎么处理?将事务1回滚掉,活动日志使用率立即降下来了,事务N成功commit还是事务N报错:活动日志满,然后被回滚,事务1仍旧没有被回滚呢?

让我们做个测试:

当前的活动日志大小和个数设置:
 [db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 get db cfg for test |grep -i log
 Log file size (4KB)                         (LOGFILSIZ) = 1024
 Number of primary log files                (LOGPRIMARY) = 13
 Number of secondary log files               (LOGSECOND) = 12
 
然后设置LOGPRIMARY=6 LOGSECOND=0
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 get db cfg for test show detail |grep -i log
 Log retain for recovery status                          = NO
 User exit for logging status                            = YES
 Catalog cache size (4KB)              (CATALOGCACHE_SZ) = 300                        300                       
 Log buffer size (4KB)                        (LOGBUFSZ) = 2150                       2150                      
 Log file size (4KB)                         (LOGFILSIZ) = 1024                       1024                      
 Number of primary log files                (LOGPRIMARY) = 6                          6                         
 Number of secondary log files               (LOGSECOND) = 0                          0 
 


事务1:
db2 +c "insert into log_test values(1,'未提交的最早的事务‘)"

事务2:

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep 'Log space'
Log space available to the database (Bytes)= 25042659
Log space used by the database (Bytes)     = 285

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "begin atomic declare i int default 0;while(i <10000) do insert into log_test values (i,'中间提交的事务');set i=i+1;end while;end"
DB20000I  The SQL command completed successfully.
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep 'Log space'                                                              Log space available to the database (Bytes)= 24046227
Log space used by the database (Bytes)     = 996717

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "begin atomic declare i int default 0;while(i <10000) do insert into log_test values (i,'中间提交的事务');set i=i+1;end while;end"
DB20000I  The SQL command completed successfully.
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep 'Log space'                                                              Log space available to the database (Bytes)= 23049795
Log space used by the database (Bytes)     = 1993149

....

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep 'Log space'                                                              Log space available to the database (Bytes)= 8102587
Log space used by the database (Bytes)     = 16940357

...

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep 'Log space'                                                              Log space available to the database (Bytes)= 3120147
Log space used by the database (Bytes)     = 21922797

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep 'Log space'                                                              Log space available to the database (Bytes)= 254787
Log space used by the database (Bytes)     = 24788157
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "begin atomic declare i int default 0;while(i <10000) do insert into log_test values (i,'中间提交的事务');set i=i+1;end while;end"
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0964C  The transaction log for the database is full.  SQLSTATE=57011

随着插入的数据越多,available to the database (Bytes)值会越来越小,而Log space used by the database (Bytes)越来越大,到最后一个插入就报错SQL0964C  The transaction log for the database is full.  SQLSTATE=57011了,,其实最早没有提交的事务1并没有被数据库回滚,是可以查到这条数据的。
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "select * from log_test where id=88888888 with ur"

ID          NAME                                                                                                                                                                 
   88888888 未提交的最早的事务 

我们把这个最早的Log force掉,就看到可用的活动日志释放掉了

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep -i 'oldest'
Appl id holding the oldest transaction     = 16360
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "force applications(16360)"
DB20000I  The FORCE APPLICATION command completed successfully.
DB21024I  This command is asynchronous and may not be effective immediately.

[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "get snapshot for database on test" |grep 'Log space'
Log space available to the database (Bytes)= 21123760
Log space used by the database (Bytes)     = 3919184
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ 
   

MYSQL:
查看日志设置大小,每个50M,一个两个Log文件,DB2测试的一共4M*6=24M
mysql> SHOW VARIABLES LIKE 'innodb_log_file%';
+---------------------------+----------+
| Variable_name             | Value    |
+---------------------------+----------+
| innodb_log_file_size      | 50331648 |
| innodb_log_files_in_group | 2        |
+---------------------------+----------+
2 rows in set (0.00 sec)

mysql>
 
事务1:
mysql> create table log_test(id int,name varchar(1000));
Query OK, 0 rows affected (0.02 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into log_test values(1,'未提交的最早的事务');
Query OK, 1 row affected (0.00 sec)

事务2:

delimiter //
drop procedure if exists insert_log_test;
create procedure insert_log_test()
begin
    declare i int;
    set i = 0;
     start transaction;
    while i < 1000000 do
        insert into log_test values (i,'中间提交的事务+++++++++**********++++++++');
        insert into log_test values (i,'中间提交的事务+++++++++**********++++++++');
       insert into log_test values (i,'中间提交的事务+++++++++**********++++++++');
       insert into log_test values (i,'中间提交的事务+++++++++**********++++++++');
        set i = i + 1;
    end while;
    commit;

end//
delimiter ;

事务2:
先证明事务1没有提交
mysql> select * from log_test;
Empty set (0.00 sec)

mysql> set transaction_isolation='READ-unCOMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from log_test;
+----------+-----------------------------+
| id       | name                        |
+----------+-----------------------------+
| 88888888 | 未提交的最早的事务          |
+----------+-----------------------------+
1 row in set (0.00 sec)

然后开始插入数据。
mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 14.57 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 15.63 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 16.85 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 15.07 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 15.42 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 14.68 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 14.99 sec)

mysql> select count(*) from log_test;
+----------+
| count(*) |
+----------+
| 28000001 |
+----------+
1 row in set (13.32 sec)

mysql> set transaction_isolation='READ-COMMITTED';    
Query OK, 0 rows affected (0.02 sec)

mysql> select count(*) from log_test;
+----------+
| count(*) |
+----------+
| 28000000 |
+----------+
1 row in set (12.27 sec)

插入了280000W行,还是没有触发活动日志满,说明未提交的redo log也会被覆盖,那bufferpool会把这条未提交的数据刷到磁盘吗?如果一直不刷会不会造成bufferpool满了?
mysql> show engine innodb status;

BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 186438
Buffer pool size   8192
Free buffers       1
Database pages     8189
Old database pages 3041

我们再插入400W条,看看这几个数据有什么变化
mysql> call insert_log_test();
Query OK, 0 rows affected (1 min 15.13 sec)

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 186438
Buffer pool size   8192
Free buffers       1024
Database pages     7166
Old database pages 2625

看起来bufferpool也是安全的,看来对MYSQL的日志和刷data逻辑还是不理解,查资料看到这段解释就明白了:

  redo日志文件组的容量是有限的,我们需要循环使用redo日志文件组中的文件,这就需要判断某些redo日志占用的磁盘空间是否可以覆盖了,即它对应的脏页是否已经刷新到了磁盘中。全局变量checkpoint_lsn,用来表示当前系统中可以被覆盖的redo日志总量是多少,初始值是8704,如果某个页被刷新到了磁盘上,它对应的redo日志就没用了,可以被覆盖,则checkpoint_lsn+1,这个过程称为执行一次checkpoint操作。

因为MYSQL的undo log和redo Log是放在不同的文件里的,所以即便一个事务一直不提交,redo log也可以覆盖删除,如果需要回滚那直接用undo Log来回滚就可以了,从这个问题看,MYSQL是比DB2设计理念先进复杂的,DB2经常会遇到一个很log的事务不提交造成活动日志写满了的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据课程L5——网站流量项目的实时业务系统搭建

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握网站流量项目的 Flume—>Kafka 连通; ⚪ 掌握网站流量项目的实时业务系统搭建; 一、Flume—>Kafka 连通 1. 实现步骤 1. 启动三台服务器。 2. 启动 Zookeeper 集群。 执行指…

2023国赛 B题论文 基于多波束测深技术的海洋探测建模与分析

因为一些不可抗力&#xff0c;下面仅展示小部分论文&#xff0c;其余看文末 一、问题重述 1.1 问题背景 海洋测深是测定水体深度与海底地形的重要任务&#xff0c;有两种主要技术&#xff1a;单波束测深与多波束测深。单波束适用于简单任务&#xff0c;但多波束可提供更精确…

【2023高教社杯】B题 多波束测线问题 问题分析、数学模型及参考文献

【2023高教社杯】B题 多波束测线问题 问题分析、数学模型及参考文献 1 题目 1.1 问题背景 多波束测深系统是利用声波在水中的传播特性来测量水体深度的技术&#xff0c;是在单波束测深的基础上发展起来的&#xff0c;该系统在与航迹垂直的平面内一次能发射出数十个乃至上百个…

【C刷题】day1

一、选择题 1.正确的输出结果是 int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n"&#xff0c;x, y); return 0; } 【答案】&#xff1a; 3&#xff0c;8 【解析】&#xff1a; 考点&#xff1a; &#xff…

Linux DirtyPipe权限提升漏洞 CVE-2022-0847

Linux DirtyPipe权限提升漏洞 CVE-2022-0847 漏洞描述 CVE-2022-0847-DirtyPipe-Exploit CVE-2022-0847 是存在于 Linux内核 5.8 及之后版本中的本地提权漏洞。攻击者通过利用此漏洞&#xff0c;可覆盖重写任意可读文件中的数据&#xff0c;从而可将普通权限的用户提升到特权…

(其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】

❓ 剑指 Offer 67. 把字符串转换成整数 难度&#xff1a;中等 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为…

Mybatis复杂查询及动态SQL

文章目录 一. 较复杂的查询操作1. 参数占位符#{}和${}2. SQL注入3. like查询4. resultType与resultMap5. 多表查询5.1. 一对一表映射5.2. 一对多表映射 二. 动态SQL1. if标签2. trim标签3. where标签4. set标签5. foreach标签 本篇中使用的数据表即基础映射类都是基于上一篇博客…

【C++进阶】多态

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

Linux相关用法(时刻更新)

杂指令 用法 ssh root(用户名)(云服务器公网ip)adduser Shensk(用户名)passwd Shensk(用户名)userdel -r Shensk(用户名)whoamipwdls,cd,mkdir,touch,rmdir,rm指令 用法 ls [-a,-l,-d] 路径cd 路径(-,~,..,/) *目录mkdir [-p] 路径 *目录 touch 路径 …

Unity实现2D游戏跟随摄像机(平滑移动)

文章目录 玩家角色脚本字段跟随逻辑 完整代码其他相关文章连接 玩家角色 首先创建一个可用的玩家角色&#xff0c;写好移动逻辑&#xff0c;如果要使用在Unity商店中购买的资源&#xff0c;可以点击Window菜单栏> Package Manager选项&#xff0c;来打开Package Manager窗口…

python基础语法(一)

目录 常量和表达式变量和类型变量是什么变量的语法定义变量使用变量 变量的类型整形浮点数(小数)字符串布尔其他 变量为什么会有这么多类型动态类型特征 常量和表达式 python中有许多和C语言相同的知识,但是也有一些不同的知识,比如: print(1 2 - 3)打印12-3的结果 print(1 …

应急响应-Windows挖矿实战

0x00 主机表现 windows主机cpu拉满&#xff0c;主机卡顿&#xff0c;初步判断为中了挖矿病毒 0x00 处置 通过cpu拉满状态&#xff0c;定位初步的进程文件&#xff0c; 通过进程得到的文件上传沙箱&#xff0c;结果显示为恶意文件&#xff0c; 定位到文件夹&#xff0c; 存…

【C++ Core Guidelines解析】深入理解现代C++的特性和原理

文章目录 &#x1f468;‍⚖️《C Core Guidelines解析》的主要观点&#x1f468;‍&#x1f3eb;《C Core Guidelines解析》的主要内容&#x1f468;‍&#x1f4bb;作者介绍 &#x1f338;&#x1f338;&#x1f338;&#x1f337;&#x1f337;&#x1f337;&#x1f490;&a…

蚂蚁开源编程大模型,提高开发效率

据悉&#xff0c;日前蚂蚁集团首次开源了代码大模型 CodeFuse&#xff0c;而这是蚂蚁自研的代码生成专属大模型&#xff0c;可以根据开发者的输入提供智能建议和实时支持&#xff0c;帮助开发者自动生成代码、自动增加注释、自动生成测试用例、修复和优化代码等kslouitusrtdf。…

3D封装技术发展

长期以来&#xff0c;芯片制程微缩技术一直驱动着摩尔定律的延续。从1987年的1um制程到2015年的14nm制程&#xff0c;芯片制程迭代速度一直遵循摩尔定律的规律&#xff0c;即芯片上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。但2015年以后&#xff0c;芯片制…

ffmpeg-android studio创建jni项目

一、创建native项目 1.1、选择Native C 1.2、命名项目名称 1.3、选择C标准 1.4、项目结构 1.5、app的build.gradle plugins {id com.android.application }android {compileSdk 32defaultConfig {applicationId "com.anniljing.ffmpegnative"minSdk 25targetSdk 32…

使用Vue + axios实现图片上传,轻松又简单

目录 一、Vue框架介绍 二、Axios 介绍 三、实现图片上传 四、Java接收前端图片 一、Vue框架介绍 Vue是一款流行的用于构建用户界面的开源JavaScript框架。它被设计用于简化Web应用程序的开发&#xff0c;特别是单页面应用程序。 Vue具有轻量级、灵活和易学的特点&#xf…

AI系统论文阅读:SmartMoE

提出稀疏架构是为了打破具有密集架构的DNN模型中模型大小和计算成本之间的连贯关系的——最著名的MoE。 MoE模型将传统训练模型中的layer换成了多个expert sub-networks&#xff0c;对每个输入&#xff0c;都有一层special gating network 来将其分配到最适合它的expert中&…

【C#实战】控制台游戏 勇士斗恶龙(3)——营救公主以及结束界面

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;最近开始正式的步入学习游戏开发的正轨&#xff0c;想要通过写博客的方式来分享自己学到的知识和经验&#xff0c;这就是开设本专栏的目的。希望…

中国电信研究院发布《5G+数字孪生赋能城市数字化应用研究报告》

9月5日&#xff0c;中国电信研究院战略发展研究所联合中关村智慧城市产业技术创新战略联盟在2023年中国国际服务贸易交易会数字孪生专题论坛正式对外发布《5G数字孪生赋能城市数字化应用研究报告》。 会上&#xff0c;中国电信研究院战略发展研究所副所长季鸿从数字中国…