>

乐百家数据库:MySQL的redo log结会谈SQL Server的lo

- 编辑:乐百家599手机首页 -

乐百家数据库:MySQL的redo log结会谈SQL Server的lo

  由于dbcc log是未公开的授命,所以未找到相关认证, 如下图所示 包罗了当下序号号,操作类型,事务号等相关新闻。

   但三个事情日志记录被写入到磁盘,实际上被改正的数量恐怕还今后得及写入数据页,对于专门的学问日志写操作是异步的,数据页的写操作也是异步的,但数目页不要求马上到位,因为日志包涵了用来重做那么些写操作的具有新闻。

是因为各种事情提交或回滚都会招致三次log flush,每便事务提交需等候日志被写入磁盘才算成功,由此日志写入磁盘延迟直接影响专门的学问的执行时间。

日志用于Undo

    在询问为了Undo,日志所起的效用早前,我们第风度翩翩能够领会一下怎么需求职业存在回滚:

  • 因为职业恐怕停业,大概死锁等原因,要是期待事情不违反原子性而引致数据库分化样的话,则须要经过回滚将曾经局部试行的事情回滚掉。
  • 据书上说业务要求,假如在少数关乎业务战败等景况下,回滚数据。

 

 

SELECT * FROM sys.[fn_dblog](NULL,null)

 

乐百家数据库 1

 

 

sqlserver跟mysql不一样,lsn不是redo log的总量

乐百家数据库 2

乐百家数据库 3

 

 二. ApexSQL Log工具

  由于dbcc log数据不太直观,现通过第三方工具ApexSQL Log来查看,该工具得以看见对上边表的创始,插入,更新,删除的操作记录,在数据库日志文件里还标记了序曲时间表,以致操作由哪位客商实践的,对于每叁个操作,能够见见更实际的更新信息。

    那是刚刚操作的二条记下如下图所示

    乐百家数据库 4

  选中insert 该行能够找到该语句做undo (撤废回滚 旧值覆盖)和redo(提交 新值覆盖)

  乐百家数据库 5

-- Undo   INSERT (0000001E:00000047:0013) done at 2018-07-29 09:49:55.570 by hsr-PChsr in transaction 0000:00000301 (Committed)
BEGIN TRANSACTION
DELETE FROM [dbo].[Test] WHERE /*** WARNING: WHERE CLAUSE FOR THIS STATEMENT WAS GENERATED FOR A TABLE WITH NO PRIMARY KEY AND NO CLUSTERED INDEX ***/[ID] = 1 AND [name] = N'aaaa' COLLATE Chinese_PRC_CI_AS
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END

--Redo    INSERT (0000001E:00000047:0013) done at 2018-07-29 09:49:55.570 by hsr-PChsr in transaction 0000:00000301 (Committed)
INSERT INTO [dbo].[Test] ([ID], [name]) VALUES (1, N'aaaa' COLLATE Chinese_PRC_CI_AS)

-- 下面ID=1的语句做四做操作
update Test set name='cccc' where ID=1
update Test set name='dddd' where ID=1
update Test set name='eeee' where ID=1
delete from  Test  where ID=1

 下列记录了相应的操作,trial restricted 大概是因为该软件须要付费。

乐百家数据库 6

  总计: 使用truncate table 来删除操作是不会记录日志的,且不或许做undo操作。日志记录与实际纠正的数据量有关,每一条记下的改换都会保留日志记录。sql server日志里面能读到数码改良前的值和退换后的值。

 

参谋文献:

  sq lserver二〇一三实行与管理实战指南

  1.2 优先写日记

截断(Truncated)是将VLF从Recoberable 状态调换成 reused 状态

 

乐百家数据库 7

乐百家数据库 8

  1. Transcation rollback
  2. crash recovery
  3. create a database snapshot
  4. running dbcc checkdb
  5. transaction log backup
  6. database full backup or differential backup
  7. transcation replication
  8. change data capture
  9. database mirroring
  10. a checkpoint in the simple recovery mode
  11. processing a DML trigger(on sql server 2000)
  12. manually looking in the log(dbcc log or fn_log)

MySQL的redo log结议和SQL Server的log结构相比较

innodb 存款和储蓄引擎 mysql技艺内部景况

log buffer依据早晚准则将内部存款和储蓄器中的log block刷写到磁盘,那个准则是

1、事务提交时

2、当log buffer 中有贰分一的内部存款和储蓄器空间已经被使用时

3、checkpoint时

跟sqlserver一样

 

 

mysql的重做日志的logblock是512字节,跟磁盘的扇区同样,重做日志写入能够确认保障原子性,无需double write技能

 

mysql的重做log record,由于innodb存款和储蓄引擎的存款和储蓄管理是依据页的,所以其重做日志格式也是依照页面包车型客车,跟SqlServer一样

 

重装日志记录通用页头格式
1、redo_log_type:重做日志类型
2、space:表空间id
3、page_no:页的偏移量

 

P302  lsn记录的是重做日志的总的数量,其单位是字节

current lsn>flushed lsn>checkpoint lsn

 

undo只是逻辑日志,只是将数据库逻辑恢复生机到原本的规范,全部改革都被逻辑撤废,事务分配的新的贰个段,表空间会叠合

顾客实施rollback时,会将插入的事务实行回滚,可是表空间并不会为此减弱(跟sqlserver同样卡塔 尔(英语:State of Qatar)。

 

mysql的MVCC由分享表空间ibdata1的undo回滚段实现,读取undo里面包车型大巴行版本音讯

 

每做三个undo操作都会时有发生redo,因为undo也要长久化

 

f

1乐百家数据库 9

f

2乐百家数据库 10

f

3乐百家数据库 11

f

4乐百家数据库 12

f

5乐百家数据库 13

f

6乐百家数据库 14

f

7乐百家数据库 15

f

 

 

sqlserver 

 

事务对数据库中年晚年是修改都会分解成几个四个原子层级的条目款项被记录到漫长存款和储蓄中,那么些条约正是所谓的日志记录(Log Record卡塔 尔(阿拉伯语:قطر‎,大家得以经过fn_dblog来查阅那么些条目。如图2所示。

乐百家数据库 16

图2.Fn_dblog

 

    各类日志记录都会被背授予四个唯后生可畏的种种编号,这几个号码大小为10字节,由三有的组成,分别为:

  •     VLF顺序号(4字节)
  •     Log Block顺序号(4字节)
  •     Log Block内的顺序编号(2字节卡塔 尔(阿拉伯语:قطر‎

 

    因而,由于VLF是持续递增的(同贰个VLF被复用会促成编号改动卡塔 尔(英语:State of Qatar),因而LSN序号也是延绵不断递增的。因而,通过上边的LSN结构简单开掘,即使比VLF更加小的粒度实际不是直接对应LOG RECO翼虎D,而是LOG Block。Log Block是日记写入长久化存款和储蓄的纤维单位,Log Block的分寸从512字节到60K不等,那决议于事务的尺寸,那贰个在内部存储器还未有被写入持久化存款和储蓄的Log Block也正是所谓的In-Flight日志。以下五个要素决定Log Block的高低:

  • 专门的学业提交或回滚
  • Log Block满60K会强制Flush到长久化存款和储蓄,以管教WAL

    因而当叁个事务十分的大时(比方说大规模update卡塔尔国,每60K就能化为一个Log Block写入漫长化存款和储蓄。而对此大多小事务,提交或回滚就能够称呼八个Block写入长久化存储,因而依赖作业的朗朗上口,LOG Block的抑扬顿挫也会分裂。值得狐疑的是,因为磁盘上分红单元的分寸是2的N次方,因而最相近LOG BLOCK的尺寸应该是64K,而SQL Server为啥不把Log Block设定为64K吧。那样能够更优化IO。

    VLF和Log Block和Log Record的涉及如图3所示。

    乐百家数据库 17

    图3.三者之间的涉嫌

   

    从比较高的层级明白了日志之后,我们再细致询问日志中应当积攒的重大音信,每条Log Record中都带有上面大器晚成都部队分第风流倜傥消息:

  • LSN
  • Log Record的Context
  • Log Record所属的职业ID(所有的客商业务都会存在工作ID卡塔 尔(英语:State of Qatar)
  • Log Record所占的字节
  • 同一个职业中上一条Log Record的LSN(用于Undo卡塔 尔(英语:State of Qatar)
  • 为Undo所保留的日志空间

    当然,那一个只是是日记的一小部分内容。通过Log Record所记录的内容,就可见正确的笔录对数据库所做的修正。

 

Create database TestLog
go
use TestLog
go
Create Table Test(ID int,name nvarchar(50))
GO
Insert into Test Values(1,'aaaa')
update Test set name='bbbb' where ID=1
Go
dbcc traceon (3604)
go
dbcc log (TestLog,3)

  1.4 日志文件redo与undo

In sample recovery model,Every checkpiont will check is there any vlf could be truncated, truncated the recoverable lsn and move the min lsn

  当逻辑日志的后面达到物理日志的前边时,新的日志记录将回绕到大意日志文件的始端继续向后写(那是因为日志备份会截断使日志空间重用卡塔 尔(英语:State of Qatar)。

  1.6 虚构日志文件VLF

引发Log 读的操作

  下图是日记文件的流程图,当日志备份后设想日志1和捏造日志2会被截断,设想日志3变为了逻辑日志的上马,当设想日志3和编造日志4在接受后,再次备份时,由于日记文件是三个转圈的文书,这个时候又从虚拟日志1开端。
   图1  日志文件的外观

   事务日志是在数据库创立或改换时与数据库关联起来的一个或多个文本。 职责更改数据库的操作都会在工作日志中写入描述这一个更换的笔录,包蕴要退换的页码,扩充或删除的数据值,事务新闻,起止的日子和岁月音信等。通过dbcc log可以见到如下音讯

数码拉长大小与VLF增进数据
1-64M:4个VLF
64M-1G:8个VLF
1G以上:16个VLF

本文由乐百家数据库发布,转载请注明来源:乐百家数据库:MySQL的redo log结会谈SQL Server的lo