Sybase数据库ASE事务日记的治理技术详解
SYBASE ASE 事务日记
SYBASE ASE的每一个数据库,不管是系统数据库(master,model, sybsystemprocs, tempdb),仍是用户数据库,都有自己的transaction log,每一个库都有syslogs表。Log 记录用户对数据库修改的操作,因此若是不用命令清除, log会一直增加直至占满空间。清除log可用dump transaction 命令;或开放数据库选项trunc log on chkpt,数据库会每隔一段距离自动清除log。治理好数据库log是用户操作数据库必需考虑的一面。
下面就几个方面谈谈log及其治理:
一、ASE 如何记录及读取日记信息
咱们明白,ASE是先记log的机制。Server Cache Memory中日记页老是先写于数据页:
Log pages 在commit ,checkpoint,space needed 时写入硬盘。
Data pages 在checkpoint,space needed 时写入硬盘。
系统在recovery 时读每一个database 的syslogs 表的信息,回退未完成的事务(transaction)(数据改变到事务前状态);完成已提交的事务(transaction)(数据改变成事务提交后的状态)。在Log中记下checkpoint点。如此保证整个数据库系统的一致性和完整性。
二、Transaction logs 和checkpoint 进程
checkpoint 命令的功能是强制所有“脏”页(自上次写入数据库设备后被更新过的页)写入数据库设备。自动的checkpoint 距离是由ASE 依照系统活动和系统表sysconfigures中的恢复距离(recovery interval)值计算出的。通过指定系统恢复所需的时刻总量,恢复距离决定了checkpoint 的频率。
若是数据库开放trunc log on chkpt选项,那么ASE在数据库系统执行checkpoint 时自动清除log。但用户自己写入执行的checkpoint命令并非清除log,即便 trunc log on chkpt选项开放。只有在trunc log on chkpt选项开放时,ASE自动执行checkpoint动作,才能自动清除log 。那个自动的checkpoint动作在ASE中的进程叫做checkpoint进程。当trunc log on chkpt选项开放时,checkpoint进程每隔60秒左右清除log,而不考虑recovery interval设置时刻的距离。
三、Transaction log 的大小
没有一个十分严格的和确切的方式来确信一个数据库的log应该给多大空间。对一个新建的数据库来讲,log大小为整个数据库大小的20%左右。因为 log记录对数据库的修改,若是修改的动作频繁,那么log的增加十分迅速。因此说log空间大小依托于用户是如何利用数据库的。例如:
update,insert和delete 的频率
每一个transaction 中数据的修改量
ASE系统参数recovery interval 值
log是不是存到介质上用于数据库恢复
还有其它因素阻碍log大小,咱们应该依照操作估量log大小,并距离一个周期就对log
进行备份和清除。
四、检测log 的大小
假设log 在自己的设备上,dbcc checktable (syslogs) 有如下信息:
例:***NOTICE:space used on the log segment is ,%
***NOTICE:space free on the log segment is ,%
依照log剩余空间比例来决定是不是利用dump transaction 命令来备份和清除log。
用快速方式来判定transaction log 满的程度。
1>use database_name
2>go
1>select data_pgs (8,doampg)
2>from sysindexes where id=8
3>go
Note:this query may be off by as many as 16 pages.
在syslogs 表用sp_spaceused 命令。
五、log 设备
一样来讲,应该将一个数据库的data和log寄存在不同的数据库设备上。如此做的益处:
能够单独地备份(back up)transaction log
避免数据库溢满
能够看到log空间的利用情形。[dbcc checktable (syslogs)]
能够镜像log设备
六、log 的清除
数据库的log是不断增加的,必需在它占满空间之前清除。前面已经讨论过,清除log 能够开放数据库选项trunc log on chkpt,使数据库系统每隔一段时刻距离自动清除log,还能够执行命令dump transaction 来清除 log on chkpt 选项同dump transaction with truncate_only 命令一样,只是清除log而不保留log到备份设备上。因此若是只想清除log而不做备份,能够利用trunc log on chkpt 选项及dump transaction with
truncate_only,dump transaction with no_log 命令。假假想备份,应做dump transaction database_name to dumpdevice。
七、治理大的transactions
有些操作是大量量地修改数据,log增加速度十分快,如:
大量数据修改
删除一个表的所有记录
基于子查询的数据插入
批量数据拷贝
下面讲述如何利用这些transaction 使log 不至溢满:
大量数据修改例:
1>update large_tab set col_1=0
2>go
假设那个表专门大,那么此update动作在未完成之前就可能使log满,引发1105错误(log full)而且执行这种大的transaction所产生的exclusive table lock,阻止其他用户在update期间修改那个表,这可能引发死锁。为幸免这些情形,咱们能够把那个大的transaction分成几个小的 transactions,并执行dump transaction 动作。
上述例子能够分成两个或多个小transactions.
例如:
1>update large_tab set col1=0
2>where col2< DIV>
3>go
1>dump transaction database_name with truncate_only
2>go
1>update large_tab set col1=0
2>where col2>=x
3>go
1>dump transaction database_name with truncate_only
2>go
假设那个transaction 需要备份到介质上,那么不用with truncate_only 选项。假设执行dump transaction with truncate_only,应该先做dump database 命令。
删除一个表的所有记录:
例:
1>delete table large_tab
2>go
一样,把整个table的记录都删除,要记很多log,咱们能够用truncate table命
令代替上述语句完成相同功能。truncate的数据如何恢复
1>truncate table large_tab
2>go
如此,表中记录都删除,而利用truncate table 命令,log只记录空间回收情形,而不是记录删除表中每一行的操作。
基于子查询的数据插入
例:
1>insert new_tab select col1,col2 from large_tab
2>go
一样的方式,对那个大的transaction,咱们应该处置为几个小的transactions。
1>Insert new_tab
2>select col1,col2 from large_tab where col1<=y
3>go
1>dump transaction database_name with truncate_only
2>go
1>insert new_tab
2>select col1,col2 from large_tab where col1>y
3>go
1>dump database database_name with truncate_only
2>go
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论