SYBASE公司是世界著名的数据库厂家,其关系数据库产品SYBASE SQL Server在 中国大中型企事业单位中拥有大量的用户。笔者在多年的使用过程中,总结出SYBASE数据库管理和维护的一些经验,现拿出来与大家分享。
  我们知道,SYBASE SQL Server用事务(Transaction)来跟踪所有数据库的变化。事务是SQL Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs)。事务日志自动记录每个用户发出的每个事务。日志对于数据库的数据安全性、完整性至关重要,我们进行数据库开发和维护必须熟知日志的相关知识。
  一、SYBASE SQL Server 如何记录和读取日志信息
  SYBASE SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时,SQL Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录到日志后,它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中,直到别的数据页需要该内存时,该数据页才被写到磁盘上。若事务中的某条语句没能完成,SQL Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。
  二、日志设备
  Log和数据库的Data一样,需要存放在数据库设备上,可以将Log和Data存放在同一设备上,也可以分开存放。一般来说,应该将一个数据库的Data和Log存放在不同的数据库设备上。这样做有如下好处:一是可以单独地备份Backup 事务日志;二是防止数据库溢满;三是可以看到Log的空间使用情况。
  所建Log设备的大小,没有十分精确的方法来确定。一般来说,对于新建的数据库,Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修改的频繁程度。如果数据库修改频繁,则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外,还有其它因素影响Log大小,我们应该根据实际操作情况估计Log大小,并间隔一段时间就对Log进行备份和清除。
三、日志的清除
  随着数据库的使用,数据库的Log是不断增长的,必须在它占满空间之前将它们清除掉。清除Log有两种方法:
  1.自动清除法
  开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份。
  2.手动清除法
  执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志:
  dump transaction  with truncate_only  如短信过滤的SMSS数据
库,使用命令(dump transaction smss with truncate_only)
  dump transaction  with no_log
  通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。为了尽量确保数据库的一致性,你应将它作为“最后一招”。
  以上两种方法只是清除日志,而不做日志备份,若想备份日志,应执行“dump transaction database_name to dumpdevice”命令。
  四、管理庞大的事务
  有些操作会大批量地修改数据,如大量数据的修改(Update)、删除一个表的所有数据(Delete)、大量数据的插入(Insert),这样会使Log增长速度很快,有溢满的危险。下面笔者给大家介绍一下如何拆分大事务,以避免日志的溢满。
  例如执行“update tab_a set col_a=0”命令时,若表tab_a很大,则此Update动作在未完成之前就可能使Log溢满,引起1105错误(Log Full),而且执行这种大的事务所产生的独占锁(Exclusive Table Lock),会阻止其他用户在执行Update操作期间修改这个表,这就有可能引起死锁。为避免这些情况发生,我们可以把这个大的事务分成几个小的事务,并执行“dump transaction”动作。
  上例中的情况就可以分成两个或多个小的事务: 
  update tab_a set col_a=0 where col_b>x
  go
  dump transaction database_name with truncate_only
  go
  update tab_a set col_a=0  where col_b <=x
  go
  dump transaction database_name with truncate_only
  go
  这样,一个大的事务就被分成两个较小的事务。
  按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上,则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令,应该先执行“dump database”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。
Trackback: tb.blog.csdn/TrackBack.aspx?PostId=92837
假设test2为数据库名称
日志已经很大的时候用
方法一
此方法适用于7.0和2000。
1、在查询分析器中执行:
exec sp_detach_db 'DB_Name'
2、在我的电脑中将日志的物理文件xxx_Log.LDF改名。
3、在查询分析器中执行:
exec sp_attach_single_file_db 'DB_Name','C:\Program Files\Microsoft SQL Server\MSSQL\Data\DB_Name.MDF'
4、如果上一步成功,将步骤2中改名后的文件删除。如果上一步不成功,改回原来的文件名,
用sp_attach_db将数据库附加到服务器,然后用方法二。
方法二
6.X中
DUMP TRANSACTION test2 with NO_LOG
DUMP TRANSACTION
test2 with TRUNCATE_ONLY
将上面的语句多次执行,直到日志缩小。
7.0和2000中
backup log test2 with NO_LOG
backup log test2 with TRUNCATE_ONLY
DBCC SHRINKDATABASE(test2)
将上面的语句多次执行,直到日志文件缩小。
上面的方法治标不治本,标本兼治要用下面的方法。
方法三:
--6.X和7.0中改为日志处于截断模式,2000中恢复模型改为简单恢复
exec sp_dboption 'test2','trunc. log on chkpt.','on'
-
-7.0和2000中设为自动收缩,6.x中不用执行。
exec sp_dboption 'test2','autoshrink','on'
通常用于测试环境。
方法四:
--7.0中改为日志不处于截断模式,2000中恢复模型改为完全恢复
exec sp_dboption 'test2','trunc. log on chkpt.','off'
--7.0和2000中设为自动收缩,6.x中不用执行。
exec sp_dboption 'test2','autoshrink','on'
建立作业,每半个小时一次日志备份,每天一次完全数据库备份。
7.0和2000中:在Log收缩到正常大小后,将autoshrink选项设置为off。
通常用于真实环境。
在产品化系统中将autoshrink选项设置为开启状态并非明智之举(除非您真的需要这样做),这是因为,当您的系统正在忙于完成其它任务时,autoshrink选项可能会同时启动,从而降低系统运行速度。然而,对于那些数据库管理员无暇估计并且数据库尺寸有可能在您毫无察觉的情况下超出控制范围的桌面或远程系统来说,开启这一选项却是一种非常有效的措施。
收缩事务日志
在下列情况下,日志文件的物理大小将减少:
*执行 DBCC SHRINKDATABASE 语句时。
*执行引用日志文件的 DBCC SHRINKFILE 语句时。
*自动收缩操作发生时。
日志收缩操作依赖于最初的日志截断操作。日志截断操作不减小物理日志文件的大小,但减小逻辑日志的大小,并将没有容纳逻辑日志任何部分的虚拟日志标记为不活动。日志收缩操作会删除足够多的不活动虚拟日志,将日志文件减小到要求的大小。
按下面任一方式控制事务日志的大小:
*在维护日志备份序列时,调度 BACKUP LOG 语句按间隔发生,以使事务日志不致增长到超过预期的大小。
truncate的数据如何恢复
*当不维护日志备份序列时,指定简单恢复模式。
详情请参考 MS SQL Server 2000 联机丛书:
目录--> SQL Server构架-->数据库构架-->物理数据库构架-->事务日志构架-->收缩事务日志
目录--> SQL Server构架-->数据库构架-->物理数据库构架-->事务日志构架-->截断事务日志
Trackback: tb.blog.csdn/TrackBack.aspx?PostId=6490
日志问题普及篇
作者:aladdin    发表时间:2002/12/06 03:57pm
以下资料源于sybase
SSYBASE SQL Server 的每一个数据库,无论是系统数据库(master,model, sybsystemprocs, tempdb),还是用户数据库,都有自己的transaction
log,每个库都有syslogs表。Log记录用户对数据库修改的操作,所以如果不用命令清除, log会一直增长直至占满空间。清除log可用dump transaction 命令;或者开放数据库选项trunc log on chkpt,数据库会每隔一段间隔自动清除log。管理好数据库log是用户操作数据库必须考虑的一面。
  下面就几个方面谈谈log及其管理:
  一、SQL Server 如何记录及读取日志信息
  我们知道,SQL Server是先记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 间隔是由SQL Server 根据系统活动和系统表sysconfigures中的恢复间隔(recovery interval)值计算出的。通过指定系统恢复所需的时间总量,恢复间隔决定了checkpoint 的频率。
  如果数据库开放trunc log on chkpt选项,则SQL Server在数据库系统执行checkpoint时自动清除log。但用户自己写入执行的checkpoint命令并不清除log,即使trunc log on chkpt选项开放。只有在trunc log on chkpt选项开放时,SQL Server自动执行checkpoint动作,才能自动清除log 。这个自动的checkpoint动作在SQL Server中的进程叫做checkpoint进程。当trunc log on chkpt选项开放时,checkpoint进程每隔0秒左右清除log,而不考虑recovery interval设置时间的间隔。
  三、Transaction log 的大小
  没有一个十分严格的和确切的方法来确定一个数据库的log应该给多大空间。对一个新建的数据库来说,log大小为整个数据库大小的20%左右。因为log记录对数据库的修改,如果修改的动作频繁,则log的增长十分迅速。所以说log空间大小依赖于用户是如何使用数据库的。
  例如:
update,insert和delete 的频率
每个transaction 中数据的修改量
SQL Server系统参数recovery interval 值
log是否存到介质上用于数据库恢复
  还有其它因素影响log大小,我们应该根据操作估计log大小,并间隔一个周期就对log进行备份和清除。
  四、检测log 的大小
  若log 在自己的设备上,dbcc checktable (syslogs) 有如下信息:
例:***NOTICE:space used on the log segment is 12.87Mbytes,64.35%
***NO
TICE:space free on the log segment is 7.13Mbytes,35.65% 
  根据log剩余空间比例来决定是否使用dump transaction 命令来备份和清除log。
  用快速方法来判断transaction log 满的程度。
1>use database_name
2>go
1>select data_pgs (8,doa mpg)
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 来清除unc 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 loc,阻止其他用户在update期间修改这个表,这可能引起死锁。为避免这些情况,我们可以把这个大的transaction分成几个小的transactions,并执行dump transaction 动作。
  上述例子可以分成两个或多个小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变成几个小的transacti理,避免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 
< -b 100 (on unix)
< /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的阈

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。