您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySQL innodb事務(wù)的實(shí)現(xiàn)方式”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“MySQL innodb事務(wù)的實(shí)現(xiàn)方式”吧!
【1】Redo Log
在Innodb存儲(chǔ)引擎中,事務(wù)日志是通過(guò)redo和innodb的存儲(chǔ)引擎日志緩沖(Innodb log buffer)來(lái)實(shí)現(xiàn)的,當(dāng)開(kāi)始一個(gè)事務(wù)的時(shí)候,會(huì)記錄該事務(wù)的lsn(log sequence number)號(hào); 當(dāng)事務(wù)執(zhí)行時(shí),會(huì)往InnoDB存儲(chǔ)引擎的日志
的日志緩存里面插入事務(wù)日志;當(dāng)事務(wù)提交時(shí),必須將存儲(chǔ)引擎的日志緩沖寫(xiě)入磁盤(pán)(通過(guò)innodb_flush_log_at_trx_commit來(lái)控制),也就是寫(xiě)數(shù)據(jù)前,需要先寫(xiě)日志。這種方式稱為“預(yù)寫(xiě)日志方式”,
innodb通過(guò)此方式來(lái)保證事務(wù)的完整性。也就意味著磁盤(pán)上存儲(chǔ)的數(shù)據(jù)頁(yè)和內(nèi)存緩沖池上面的頁(yè)是不同步的,是先寫(xiě)入redo log,然后寫(xiě)入data file,因此是一種異步的方式。通過(guò) show engine innodb status\G 來(lái)觀察之間的差距
-- 建立一張表z,然后建立一個(gè)往表導(dǎo)入數(shù)據(jù)的存儲(chǔ)過(guò)程load_test。通過(guò)命令show engine innodb status觀察當(dāng)前的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是因?yàn)樾枰貜?fù)調(diào)用,避免主鍵重復(fù)insert報(bào)錯(cuò)。 SET i=i+1; END WHILE; COMMIT; END; $$
......
---
LOG
---
Log sequence number 20499052099 當(dāng)前的LSN
Log flushed up to 20499052099 表示刷新到redo log的LSN
Pages flushed up to 20499052099 表示刷新到磁盤(pán)的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
----------------------
......
看來(lái)Log sequence number和Log flushed up以及Pages flushed u3個(gè)還是一樣的。
再多導(dǎo)入點(diǎn)數(shù)據(jù),重新開(kāi)啟另外一個(gè)窗口看看innodb狀態(tài)
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的結(jié)果就不一樣了,Log sequence number > Log flushed up > Pages flushed up > Last checkpoint,所以從這里也可以看出,先寫(xiě)redo日志,再寫(xiě)數(shù)據(jù)文件
在實(shí)際寫(xiě)比較頻繁的productiion上面,這3個(gè)值都會(huì)是不一樣的。
【2】Undo
undo的記錄正好與redo的相反,insert變成delete,update變成相反的update,redo放在redo file里面。而undo放在一個(gè)內(nèi)部的一個(gè)特殊segment上面,存儲(chǔ)與共享表空間內(nèi)(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放在一個(gè)目錄之下
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:有的時(shí)候network會(huì)斷掉,要多執(zhí)行幾次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不是物理恢復(fù),是邏輯恢復(fù),因?yàn)樗峭ㄟ^(guò)執(zhí)行相反的dml語(yǔ)句來(lái)實(shí)現(xiàn)的。而且不會(huì)回收因?yàn)閕nsert和upate而新增加的page頁(yè)的。
undo頁(yè)的回收是通過(guò)master thread線程來(lái)實(shí)現(xiàn)的。
驗(yàn)證row模式下,生產(chǎn)的binlog傳到從庫(kù)上面,大概需要多久!
導(dǎo)出
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
導(dǎo)入
time /usr/local/mysql56/bin/mysql --socket=/data56/mysql.sock -uroot -p123456 -P3307 < /root/adb.sql
在從庫(kù)上面檢查:
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,有延時(shí)的情況出現(xiàn),可見(jiàn)在row模式下,import6G的單調(diào)insert的sql的時(shí)候,有延時(shí)。
感謝各位的閱讀,以上就是“MySQL innodb事務(wù)的實(shí)現(xiàn)方式”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)MySQL innodb事務(wù)的實(shí)現(xiàn)方式這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。