我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL innodb事务的实现方式

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL innodb事务的实现方式

这篇文章主要讲解了“MySQL innodb事务的实现方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL innodb事务的实现方式”吧!

 【1】Redo Log
 在Innodb存储引擎中,事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现的,当开始一个事务的时候,会记录该事务的lsn(log sequence number)号; 当事务执行时,会往InnoDB存储引擎的日志
 的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”,
 innodb通过此方式来保证事务的完整性。也就意味着磁盘上存储的数据页和内存缓冲池上面的页是不同步的,是先写入redo log,然后写入data file,因此是一种异步的方式。通过 show engine innodb status\G 来观察之间的差距


 -- 建立一张表z,然后建立一个往表导入数据的存储过程load_test。通过命令show engine innodb status观察当前的redo日志情况

create table z(a int, primary key(a))engine=innodb;

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`load_test`$$
CREATE PROCEDURE load_test(COUNT INT)
BEGIN
  DECLARE i INT UNSIGNED DEFAULT 0;
  START TRANSACTION;
  WHILE i < COUNT DO
	REPLACE INTO z SELECT i;  -- 用replace是因为需要重复调用,避免主键重复insert报错。
   	SET i=i+1;
	END WHILE;
 COMMIT;
END;
$$


 

......
---
LOG
---
Log sequence number 20499052099  当前的LSN
Log flushed up to   20499052099  表示刷新到redo log的LSN
Pages flushed up to 20499052099  表示刷新到磁盘的lsn
Last checkpoint at  20499052099  
0 pending log writes, 0 pending chkp writes
373 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 137363456; in additional pool allocated 0
Dictionary memory allocated 1270857
Buffer pool size   8191
Free buffers       7562
Database pages     612
Old database pages 205
Modified db pages  0
Pending reads 0
......


mysql> call test.load_test(100000);
Query OK, 0 rows affected, 1 warning (6.28 sec)

mysql> show engine innodb status\G
...... 
---
LOG
---
Log sequence number 20504734913
Log flushed up to   20504734913
Pages flushed up to 20504734913
Last checkpoint at  20504734913
0 pending log writes, 0 pending chkp writes
398 log i/o's done, 0.38 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
...... 
看来Log sequence number和Log flushed up以及Pages flushed u3个还是一样的。

再多导入点数据,重新开启另外一个窗口看看innodb状态
mysql> call test.load_test(1000000);
mysql> show engine innodb status\G
......
---
LOG
---
Log sequence number 20527044411
Log flushed up to   20525763843
Pages flushed up to 20517902997
Last checkpoint at  20504829471
0 pending log writes, 0 pending chkp writes
432 log i/o's done, 1.26 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------

这次看到的show engine innodb status的结果就不一样了,Log sequence number > Log flushed up > Pages flushed up > Last checkpoint,所以从这里也可以看出,先写redo日志,再写数据文件
在实际写比较频繁的productiion上面,这3个值都会是不一样的。

【2】Undo 
undo的记录正好与redo的相反,insert变成delete,update变成相反的update,redo放在redo file里面。而undo放在一个内部的一个特殊segment上面,存储与共享表空间内(ibdata1或者ibdata2中)。
py_innodb_page_info.py
下载地址: wget http://david-mysql-tools.googlecode.com/svn-history/r15/trunk/py_innodb_page_type/py_innodb_page_info.py
[root@mysql data56]# python /root/py_innodb_page_info.py /data56/ibdata1 
Traceback (most recent call last):
  File "/root/py_innodb_page_info.py", line 3, in <module>
    import mylib
ImportError: No module named mylib
[root@mysql data56]# 
还需要下载 mylib.py和include.py文件,并和py_innodb_page_info.py放在一个目录之下

wget http://david-mysql-tools.googlecode.com/svn-history/r15/trunk/py_innodb_page_type/mylib.py
wget http://david-mysql-tools.googlecode.com/svn-history/r15/trunk/py_innodb_page_type/include.py
ps:有的时候network会断掉,要多执行几次wget去下载。

[root@mysql ~]#  python /root/py_innodb_page_info.py /data56/ibdata1

Total number of page: 8960:
Insert Buffer Free List: 1035
Insert Buffer Bitmap: 1
System Page: 134
Transaction system Page: 1
Freshly Allocated Page: 4010
Undo Log Page: 1556
File Segment inode: 5
B-tree Node: 2217
File Space Header: 1
[root@mysql ~]# 
[root@mysql ~]#

undo不是物理恢复,是逻辑恢复,因为它是通过执行相反的dml语句来实现的。而且不会回收因为insert和upate而新增加的page页的。
undo页的回收是通过master thread线程来实现的。

验证row模式下,生产的binlog传到从库上面,大概需要多久!
导出
time /usr/local/mysql56/bin/mysqldump --socket=/data56/mysql.sock -uroot -p123456 -P3307 --extended-insert=false --all-databases> /root/adb.sql
[root@mysql ~]# time /usr/local/mysql56/bin/mysqldump --socket=/data56/mysql.sock -uroot -p123456 -P3307 --extended-insert=false --all-databases> /root/adb.sql
Warning: Using a password on the command line interface can be insecure.


real    5m10.757s
user    2m42.137s
sys     0m11.346s

导入
time /usr/local/mysql56/bin/mysql --socket=/data56/mysql.sock -uroot -p123456 -P3307 < /root/adb.sql
在从库上面检查:
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.88.49.119
                  Master_User: repl
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql56-bin.000008
          Read_Master_Log_Pos: 513272653
               Relay_Log_File: mysql56-relay-bin.000019
                Relay_Log_Pos: 103964146
        Relay_Master_Log_File: mysql56-bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 418536570
              Relay_Log_Space: 513273109
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 857
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 11901
                  Master_UUID: a6a1d870-80b5-11e2-84d2-00155d016a07
             Master_Info_File: /data56/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: System lock
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)


ps:Seconds_Behind_Master: 857,有延时的情况出现,可见在row模式下,import6G的单调insert的sql的时候,有延时。

感谢各位的阅读,以上就是“MySQL innodb事务的实现方式”的内容了,经过本文的学习后,相信大家对MySQL innodb事务的实现方式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

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

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

MySQL innodb事务的实现方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL innodb事务怎么实现

在MySQL中,InnoDB存储引擎默认支持事务。要实现InnoDB事务,可以按照以下步骤进行:1. 确保数据库使用的是InnoDB存储引擎。可以通过以下命令查询当前使用的存储引擎:```SHOW ENGINES;```确保InnoDB存储
2023-10-09

innodb事务实现原理是什么

InnoDB事务实现原理是通过使用多版本并发控制(MVCC)和日志重做(Redo)来确保事务的原子性、一致性、隔离性和持久性。1. 多版本并发控制(MVCC):InnoDB使用MVCC来实现并发控制,每个事务的读操作都可以获得一个一致性的快
2023-09-15

spring事务实现的方式有哪些

Spring事务的实现方式有以下几种:1. 基于注解的方式:使用@Transactional注解来标识需要被事务管理的方法或类。可以将@Transactional注解放在方法上或者类上,来指定事务的传播行为和隔离级别。2. 基于XML配置的
2023-09-28

MySQL事务实现的方法是什么

在MySQL中,可以使用以下方法来实现事务:使用START TRANSACTION、COMMIT和ROLLBACK语句来开始、提交和回滚事务。START TRANSACTION; -- 开始事务-- 执行一系列的操作COMMIT; -
MySQL事务实现的方法是什么
2024-03-12

Android点击事件的实现方式

在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事。今天我们就汇总一下点击事件的实现方式。 点击事件的实现大致分为以下三种:(1)Activity 实现接
2022-06-06

编程热搜

目录