上述例子可以分成两个或多个小transactions.
例如:
1>;update large_tab set col1=0
2>;where col2 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命令代替上述语句完成相同功能。
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
同样,若想保存log到介质上,则dump transaction 后不加with truncate_only 选项。若执行dump transaction with truncate_only,应该先做dump database 动作。
批量数据拷贝
在使用bcp把数据拷入数据库时,我们可以把这个大的transaction变成几个小的transactions处理,避免log剧增。
开放trunc log on chkpt 选项
1>;use master
2>;go
1>;sp_dboption database_name,trunc,true
2>;go
1>;use database_name
2>;go
1>;checkpoint
2>;go
bcp... -b 100 (on unix)
bcp... /batch_size=100(on vms)
关闭trunc log on chkpt选项,并dump database。
在这个例子中,一个批执行100行拷贝。也可以将bcp输入文件分成两或多个分开的文件,在每个文件执行后做dump transaction 来避免log 满。
若bcp使用快速方式(无索引,无triggers),这样操作不记log,换句话说,log 只记载空间分配情况。在这种情况下,要先做dump database(为恢复数据库用)。若log太小,可置trunc log on chkpt 选项,这样在每次checkpoint后清除log。
八、Threshold 和transaction log 管理
SQL Server提供阈值管理功能,它能帮助用户自动监视数据库log设备段的自由空间。
在使用Sybase数据库管理系统(SQL Server)开发企业应用系统时,或者开发好的数据库应用系统投入实际运行后,由于用户不断地增加或者修改数据库中的数据,用户数据库的自由存储空间会日益减少。特别是数据库日志,增长速度很快。一旦自由空间用尽,SQL Server在缺省情况下挂起所有数据操纵事务,客户端应用程序停止执行。这样有可能会影响企业日常业务处理流程。Sybase SQL Server System10提供自动监视数据库自由存贮空间的机制——阈值管理,当数据库使用剩余空间低于一定值时,通过执行一个自定义的存储过程,来控制自由空间。在空间用完之前,采取相应措施,这样有利于业务处理顺利进行。如果能充分利用SQL Server的阈值管理功能,用户能使一些数据库管理工作自动化,规程化。所以,在此我们将SQL Server这一重要功能介绍给读者。
SQL Server的阈值管理允许用户为数据库的某个段上的自由空间设置阈值和定义相应的存储过程。当该段上的自由空间低于所置阈值时,SQL Server自动运行相应存储过程。与阈值相对应的存储过程由用户定义,SQL Server不提供。一般来说,数据库管理员可通过这些存储过程来完成一些日常管理事务,例如:
备份数据库,清理日志和删除旧数据
备份数据库日志
扩展数据库空间
拷贝出表中的内容,清理日志,等等。
(一)段(Segment)
SQL Server的阈值管理是基于段(Segment)的,因此,让我们先回顾一下段的概念。每个数据库创建时,它有三个缺值段:(1)System段;(2)default段;(3) logsegment段。以后,还可以为该数据库增加用户自定义段。将来所有的数据库对象都建立在这些段上,要么是系统定义的段,要么是用户定义的段。数据库的系统表存放在System段上。在没有指明段时,建立的对象存放在default段上。数据库的事务日志放在logsegment段上,该段是通过使用建立数据库( Create database )命令的log on 选项来定义的。
(二)最后机会阈值(Last_chance Threshold)
缺省情况下,SQLServer监测日志段的自由空间,当自由空间量低于事务日志能成功转储的需要时,SQL Server运行sp_ thresholdaction过程。此自由空间量称为最后机会阈值( Last_chance threshold ),它由SQL Server计算得来,并且用户不能改变。
sp_thresholdaction必须由用户编写,SQL Server不提供。另外,如果最后机会阈值越出,那么在日志空间释放前,SQL Server一直挂起所有事务。但可以使用sp_dboption对某一数据库来改变这一行为。设置abort tran on log full选项为true,可使得最后机会越出时,SQL Server撤回所有还未被注册的事务。
