betway必威亚洲官网 4

betway必威亚洲官网事务日志概述,快速生成扩展表默认数据的脚本

 

declare @total int;
declare @count int;
set @count=0;
SELECT @total=COUNT(1) FROM TB_JJ;

create table #T
(
  rid int PRIMARY KEY,
  sys_guid NVARCHAR(40)
);

INSERT INTO #T SELECT ROW_NUMBER() over (order by sys_guid) as rid,sys_guid FROM TB_JJ;

WHILE @count<@total
BEGIN
    set @count=@count+10000;
    INSERT INTO TB_JJ_Info(sys_guid) SELECT sys_guid FROM #T where rid<=@count;    
    DELETE FROM #T where rid<=@count;
END
DROP TABLE #T;

 在上一章备份与恢复里了解到事务日志的重要性,这篇重点来了解事务日志。
事务日志记录了数据库所有的改变,能恢复该数据库到改变之前的任意状态。在sql
server实例每次启动时都会去检查数据文件与日志文件的一致性。
包括日志记录的任何已提交的数据必须体现在数据文件上,未被标记为已提交的将禁止写入数据文件,日志还存储了收到客户端回滚事务请求,sqlserver出错如死锁等,日志产生一个rollback命令。

 

  如果一个检查点checkpoint 在事务提交前发生,
它将会把未提交的更改写入磁盘,随后sql server服务在提交前被停止,
恢复过程将会找出未提交事务对数据的改动,该过程必须撤销反映在事务日志中的改动,回滚所有不完整事务称为恢复的撤销(undo)阶段。

session A session B
truncate table tab1;  

start transaction;

 
  start transaction;

select * from tab1;
Empty set

 
  insert into tab1 values (1,"1");
  insert into tab1 values (2,"2");
  insert into tab1 values (3,"3");
  commit;

select * from tab1;
Empty set

 

update tab1 set col2 ="22" where col1>=2;

2 rows affected

 

select * from tab1;
+——+——+
| col1 | col2 |
+——+——+
| 2 | 22 |
| 3 | 22 |
+——+——+

 

   但一个事务日志记录被写入到磁盘,实际上被更改的数据可能还未来得及写入数据页,对于事务日志写操作是异步的,数据页的写操作也是异步的,但数据页不需要立即完成,因为日志包含了用来重做这些写操作的所有信息。

 

  在日志里有个名词叫“优先写日志”。是指:缓存管理器能够保证日志写入磁盘优先于相应的数据改变写入磁盘,这叫优先写日志。一旦某个数据页发生改变,相应的日志项的LSN将会被写入该数据页的页头,缓存管理器能够保证日志页以特定的顺序写入磁盘,使得无论故障在何时发生,sqlserver
能清楚知道在系统故障之后应该处理哪些日志块。如下图所示

 

  如果事务在提交时,sql
server服务突然停止,数据还未来得及写入数据页(注意不是磁盘),当服务启动,该事务必须前滚,根据事务日志所指示的更改来重做事务,这称为恢复的重做(redo)阶段。

 

  1.4 日志文件redo与undo

结论:虽然事务A看不到事务B做的修改,但是修改也会影响事务B已经提交的数据,且修改发生后,被修改的记录(尽管是其他事务提交的),也会变为对该事务可见

   事务日志是在数据库创建或改变时与数据库关联起来的一个或多个文件。
任务改变数据库的操作都会在事务日志中写入描述这些改变的记录,包括要改变的页码,增加或删除的数据值,事务信息,起止的日期和时间信息等。通过dbcc
log可以看到如下信息

 

  在前面“sql server
日志文件结构及误操作数据找回”中讲过每个物理日志文件是分成多个虚拟日志单元,虚拟日志单元没有固定大小,且数量不固定。可以通过dbcc
loginfo来观察虚拟日志文件的关键属性。当我们在当前数据库下运行dbcc
loginfo,会为每个VLF返回一行记录。

 

betway必威亚洲官网 1

use test
dbcc loginfo

 

-- 验证文件是否有足够的可用空间可供删除
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;

 

  1.6 虚拟日志文件VLF

 

  1.5 改变日志文件大小

 

betway必威亚洲官网 2

innodb为实现MVCC所使用的内部快照,RR(REPEATABLE
READ)隔离级别下在第一次查询时创建read view,RC(READ
COMMITTED)隔离级别下会在每次查询时创建read view
以下测试在RR隔离级别下,数据库版本为5.7.20
1.

    betway必威亚洲官网 3

3.

  1.3 日志文件与重启恢复
  在sqlserver错误日志 error log
里会报告每个数据库重启恢复的进展,它会告诉我们每一个数据库有多少事务被前滚,多少事务被回滚,
有时被称为“崩溃”恢复,因为sqlserver崩溃或服务异常停止,需要恢复过程在服务重启时运行。
如果sqlserver里 事务日志与数据文件一致,则重启服务很快。

 

  上面是查看了test库日志文件里的VLF,  Fileld是指物理日志文件ID,这里test只有一个日志文件。
FileSize是文件大小(byte), StartOffset是指起点偏移(byte)。第一个VLF
是包含页头信息而不是日志记录,VLF从第二页开始。Status
表示该VLF是否可被重用,状态2表示该VLF或者是活动的或者是可恢复的,状态0表示该VLF是可复用的或者完全没有被使用过。通过备份事务日志会改变可恢复的VLF到可复用状态也就是状态为0.

 

  betway必威亚洲官网 4

 

  1.1  日志文件与数据文件一致性

 

    数据库管理员为了控制文件在大小,可能有时候要收缩文件空间可以使用dbcc
shrinkdatabase或 
dbcc 
shrinkfile。shrinkdatabase
是收缩指定数据库中的所有数据文件和日志文件大小。shrinkfile
是收缩当前数据库的指定数据文件或日志文件的大小。注意的是不能在备份数据库时收缩数据库。 反之,也不能在数据库执行收缩操作时备份数据库。收缩一般在数据库维护时段可以进行。使用dbcc 
shrinkfile来一个文件一个文件地做比较稳妥。

 

  sql server里每个日志记录都有一个唯一的日志序列号标识LSN,
同一个事务里的所有日志记录是一个连接起来的整体,这样能够容易的定位一个事务的各个部分,从而实现撤销undo或重做redo操作。

另外:

  1.2 优先写日志

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:
网站地图xml地图