undolog 是binlog_msyql日志-binlog-undolog-redolog
MySQL日志系統redo log、binlog、undo log 區別與作用
日志系統主要有redo log(重做日志),undo log(回滾日志)和binlog(歸檔日志)。
redo log是InnoDB存儲引擎層的日志,binlog是MySQL Server層記錄的日志,屬于邏輯日志,
是以二進制的形式記錄的是這個語句的原始邏輯
二者的主要區別:
1) redo log是屬于innoDB層面,binlog屬于MySQL Server層面的
2) redo log是物理日志,記錄該數據頁更新的內容;binlog是邏輯日志,記錄的是這個更新語句的原始邏輯
3) binlog可以作為恢復數據使用,主從復制搭建,redo log作為異常宕機或者介質故障后的數據恢復使用
一、三個日志的主要介紹:
1)、重做日志(redo log)
確保事務的持久性,放置發生故障的時間點,尚有臟數據未寫入磁盤,在重啟mysql的時候,根據redo log
進行重做,刷盤,從而達到事務持久性的作用。
2)、回滾日志(undo log)
保存了事務發生之前數據的一個版本,即那些被事務影響修改的數據,會被記錄,可以用來事務回滾操作,用來保證事務
的原子性。
3)、二進制日志(binlog)
用于復制,在主從復制中,從庫利用主庫上的binlog進行重播,實現主從同步,用戶數據庫基于時間點的還原。
二、一個更新語句的執行過程分析
update T set c=c+1 where ID=2;
1) 執行器先找引擎取 ID=2 這一行。ID 是主鍵,引擎直接用樹搜索找到這一行。如果 ID=2 這一行所在的數據頁本來就
在內存中,就直接返回給執行器;否則,需要先從磁盤讀入內存,然后再返回
2)執行器拿到引擎給的行數據,把這個值加上 1,比如原來是 N,現在就是 N+1,得到新的一行數據,再調用引擎接口寫
入這行新數據
3)引擎將這行新數據更新到內存中,同時將這個更新操作記錄到 redo log 里面,此時 redo log 處于 prepare 狀態。
然后告知執行器執行完成了,隨時可以提交事務
4) 執行器生成這個操作的 binlog,并把 binlog 寫入磁盤。
5) 執行器調用引擎的提交事務接口,引擎把剛剛寫入的 redo log 改成提交(commit)狀態,更新完成。
三、 innodb_flush_log_at_trx_commit 的設置作用
0: 由mysql的main_thread每秒將存儲引擎log buffer中的redo日志寫入到log file,并調用文件系統的sync操作,將日志刷新到磁盤。
1:每次事務提交時,將存儲引擎log buffer中的redo日志寫入到log file,并調用文件系統的sync操作,將日志刷新到磁盤。
2:每次事務提交時,將存儲引擎log buffer中的redo日志寫入到log file,并由存儲引擎的main_thread 每秒將日志刷新到磁盤。
測試演示:
drop table if exists test_flush_log;
create table test_flush_log(id int,name char(50))engine=innodb;
drop procedure if exists proc;
delimiter $$
create procedure proc(i int)
begin
declare s int default 1;
declare c char(50) default repeat('a',50);
while s<=i do
start transaction;
insert into test_flush_log values(null,c);
commit;
set s=s+1;
end while;
end$$
delimiter ;
調用測試: 本機2.844s
set @@global.innodb_flush_log_at_trx_commit=2;
truncate test_flush_log;
call proc(100);
調用測試: 本機5.380s
set @@global.innodb_flush_log_at_trx_commit=1;
truncate test_flush_log;
call proc(100);
總結
以上是生活随笔為你收集整理的undolog 是binlog_msyql日志-binlog-undolog-redolog的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看pg 用户组_PostgreSQL
- 下一篇: python框架怎么学_Python框架