sybase日志处理

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: https://www.360docs.net/doc/8114015382.html,/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 语句按间隔发生,以使事务日志不致增长到超过预期的大小。
*当不维护日志备份序列时,指定简单恢复模式。

详情请参考 MS SQL Server 2000 联机丛书:
目录--> SQL Server构架-->数据库构架-->物理数据库构架-->事务日志构架-->收缩事务日志
目录--> SQL Server构架-->数据库构架-->物理数据库构架-->事务日志构架-->截断事务日志





Trackback: https://www.360docs.net/doc/8114015382.html,/TrackBack.aspx?PostId=6490


日志问题普及篇


作者:aladdin 发表时间:2002/12/06 03:57pm

以下资料源于https://www.360docs.net/doc/8114015382.html,
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 来清除log.trunc 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变成几个小的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撤回所有还未被注册的事务。

(三)阈值管理

系统缺省建立最后机会阈值,由用户编写缺省阈值处理存储过程( sp_thresholdaction ),来控制自由空间。除此之外,还可以使用以下存储过程管理阈值:

sp_addthreshold 建立一个阈值

sp_dropthreshold 删除一个阈值

sp_helpthreshold 显示阈值有关的信息

sp_dboption 改变阈值的“挂起或取消”行为和取消阈值管理

sp_helpsegment 显示某个段上空间大小和自由空间大小的信息

(四)增加阈值(sp_addthreshold)

它用于创建阈值( threshold )来监测数据库段中空间的使用。如果段中自由空间低于指定值,SQL Server运行有关的存储过程。增加阈值的命令语法为:
sp_addthreshold database, segment, free_pages, procedure

其中:

database——要添加阈值的数据库名。必须是当前数据库名称。

segment——其自由空间被监测的段。当指定“default“ 段时要用

引号。

free_pages——阈值所指的自由空间页数。当段中自由空间低于该标准时,SQL Server运行有关存储过程。

procedure——当segment中的自由空间低于free_pages时,SQL server 执行该存储过程。该过程可以放置在当前SQL Server或Open server的任意数据库中。但是,超出阈值时,不能执行远程SQL Server上的存储过程。

例如:sp_addthreshold pubs2, logsegment, 200, dump_transaction

其中,存储过程定义为:

create procedure dump_transaction
@ dbname varchar (30),
@ segmentname varchar (30),
@ space_left int,
@ status int
as
dump transaction @dbname to "/dev/rmtx"

那么,当日志段上可用空间小于200页时,SQL Server运行存储过程dump_transaction,将pubs2 数据库的日志转储到另一台设置上。

sp_addthreshold不检查存储过程存在已否。但当阈值越出时,如果存储过程不存在,SQL Server把错误信息送到错误日志( errorlog )中。系统允许每个数据库有256个阈值,而同一段上二个阈值之间的最小空间为128页。其存储过程可以是系统存储过程,也可是在其它数据库里的存储过程,或者Open Server远过程调用。

(五)删除阈值(sp_dropthreshold)

它删除某个段的自由空间阈值,但是不能删除日志段的最后机会阈植。删除阈值的命令语法为:

sp_dropthreshold database_name,segment_name,free_pages

其中三个参数分别为:阈值所属数据库名,阈值所监测的自由空间的段名,和自由空间页。例如:

sp_dropthreshold pubs2, logsegment, 200
删除pubs2库中logsegment段的阈值200。

(六)显示阈值(sp_helpthreshold)

它报告当前数据库上与所有阈值有关的段,自由空间值,状态以及存储过程或报告某一特定段的所有阈值。显示阈值的语法为:

sp_helpthreshold [segment_name]

其中segment_name是当前数据库上一个段的名字。

例如:

sp_helpthreshold logsegment 显示在日志段上的所有阈值
sp_helpthreshold 显示当前数据库上所有段上的全部阈值
(七)sp_dboption的新选择

abort xact when log is full

当日志段的最后机会阈值被超越时,试图往该日志段上记日志的用户进程将被挂起还是被撤回?缺省情况下系统挂起所有进程。但是可以使用sp_aboption改变它。执行sp_dboption salesdb,"abort xact when log is full",true 命令后,一旦日志满了,则数据库修改事务将会被回滚。

disable free space acctg

这个选择取消数据库中的阈值管理,但不影响最后机会阈值。执行:sp_dboption saledb, "disable free space acctg",true 它取消对非日志段上自由空间的统计。取消后,对系统有以下影响:

SQL Server仅计算日

志段上的自由空间

日志段上的阈值继续处于活动状态

在数据段上,系统表不改变,并且sp_spaceused得到的值是该选择被取消时刻的值

数据库段上的阈值失效

恢复加快

(八)阈值的触发过程

频繁的插入和删除可能会使数据库段中的空间波动,阈值可能被多次超越,SQL Server使用系统变量@@thresh_hysteresis,避免连续触发阈值存储过程。它的值由SQL Server设定。在system 10.0中,@@thresh_hysteresis是64页。

如图所示:



因此,增加一个阈值,它必须与下一个最近的阈值相距至少2*@@thresh_hysteresis页。

一个阈值被触发,需要以下几个条件成立:

必须到达阈值

阈值处于活动状态(即它被建立后或者自由空间达到阈值减于@@thresh_hysteresis)

只有自由空间减少阈值才触发,如果自由空间增加,它永远不触发

***************************************************************************************************************************
****************************************************************************************************************************

Sybase master 库日志满了应该如何清除呢?可以通过以下的方法对master库进行管理,如果确实没有足够的空间了,可以考虑对 master库进行扩容操作。


1、简单的情况下 dump trans with no_log 就可以了,master库一般不会满。

1> use master

2> go

1> checkpoint

2> go

1> dump tran master with no_log

2> go

00:00000:00011:2006/02/22 14:53:38.06 server WARNING: *************************

**

00:00000:00011:2006/02/22 14:53:38.06 server Attempt by user 1 to dump xact on

db master with NO_LOG

00:00000:00011:2006/02/22 14:53:38.06 server Attempt by user 1 to dump xact on

db master with NO_LOG was successful

00:00000:00011:2006/02/22 14:53:38.06 server WARNING: *************************

**


2、如果是windows平台,则找到RUN_your_server_name.bat

如果是Unix平台,则找到RUN_your_server_name文件

编辑上面的启动文件,在行尾加上 -T3067

然后使用启动文件启动数据库,启动后

dump tran master with truncate_only

go

1)备份master数据库

dump database master to \'备份路径及文件名\'

2)停止sybase服务

shutdown

3)编辑sybase服务启动文件(在unix下一般是“RUN_服务名”的文件,在windows下一般是“RUN_服务名.bat”的批处理文件)。在启动文件的命令行最后加上 -T3607)

4)使用启动文件启动服务后,再dump tran master with truncate_only

5)这时dump清理日志一般多会成功。然后在停止shutdown服务,去掉-T3607,以正常方式启动服务

3、不行的话,则需要建立一设备来进行扩展或按以下方式重建:

1)备份master数据库

启动backup server,

进入isql环境执行:

1>dump database master to \'/sybase/master.dump\'

2>go

(如果 不行的话 dump 日志 with no_log)

shut down SQL/ASE Server

1>shutdown

2>go

2)创建新的足够大的master设备

$buildmaster -d -ssize(size以2K为单位)

例:$buildmaster-d/sybase/data/master.dat -s102400

3)修改RUN_servername文件

编辑RUN_server_name文件,-d参数指向新建的设备名。

4)单用户模式重启server

$startserver -f RUN_servername -m

5)执行installmaster脚本

6)由备份文件装载master数据库

1>load database master from \'/sybase/master.dump\'

2>go

7)修改sysdevices信息

sp_configure \'allow updates\', 1

go

begin tran

go

update sysdevices set high = 102399 , phyname = \'e:\\sybase\\data\\master_test.dat\' where name = \'master\'

go

(102399=200*512-1 master设备大小为200M)

commit tran

go

8)扩展master数据库

1>alter database master on master设备名称=size(此值以M为单位)

2>go

例:alter database master on master=10

将master数据库在master设备上扩展10M

这个操作比较危险,注意先做好备份(比如 GHOST)

***********************************************************************************************
*************************************************************************************************

系统集成备忘(Sybase 12.5测试之一)
1 概述
70年代,随着大型共享数据库应用的普及,美国SYBASE公司基于当时的关系代数理论所提出的数据库关系模型,开发了Sybase数据库系统;
Sybase是基于SQL(Structured Query Language)的著名关系模型数据库系统,是世界上最流行的DBMS软件之一;它能在多种计算机硬件平台上运行,并能通过连网形成分布式数据库环境;
SQL Server是指运行在主机上,能提供SQL语言查询、修改或控制数据库中内容等操作的一个服务进程,形象地把它理解为一个数据库服务器;一般地数据库服务器有Data Server 和 Backup Server两个服务进程组成。数据库就是一系列表格(关系)所描述的客观世界中事实的集合;Sybase中的系统数据库基本包括有:master、model、sysprocs、tempdb,其它为用户库。
Sybase Adaptive Server Enterprise 12.5是Sybase公司开发的智能型数据库。

现场Sybase数据库系统结构

1.1 参考资料
《SYBASE 数据库维护 快速参考手册 Version 1.1》,SYBASE公司出版

2 基础操作、配置和维护
2.1 安装Sybase 12.5
包括安装前环境配置、安装过程说明、安装成功测试、卸载等。
(详细请参考V1.00》)

2.2 访问SQL Server
在安装配置好的Sybase服务器,可以通过以下操作开始访问SQL Server进行数据的查询和控制等操作:
? % isql –U用户名 –S服务名
password: //该处输入该明户的密码

2.3 Sybase的启动和关


2.3.1 启动Sybase数据库
在$SYBASE/ASE-12_5/install目录下执行startserver命令启动Sybase数据库,如:
%$SYBASE/ASE-12_5/install/startserver -f RUN_服务名
%$SYBASE/ASE-12_5/install/Startserver –f RUN_服务名_BAKUP

2.3.2 关闭Sybase数据库
使用isql命令登录Sybase数据库系统,在查询sysservers表查看可关闭的服务,如
isql –Usa -Sjoli
Password:
1> select * from sysservers
2> go
一般需要关闭的服务有:系统备份服务、系统主服务
在isql提示里先关闭系统备份服务(默认为SYB_BACKUP),再关闭主服务(默认可以不输入主服务名),如:
1>shutdown SYB_BACKUP
2>go
1>shutdown
2>go

2.4 Sybase用户管理
2.4.1 创建登录用户(login)
sp_addlogin login_name,passwd[,defaultdb[,deflanguage[,fullname]]]
例子:
1> sp_addlogin joli,joli,joli_db
2> go


2.4.2 删除登录用户(login)
例子:
1> sp_droplogin test
2> go
2.4.3 创建数据库用户(user)
sp_adduser login_name[,name_in_db[,grpname]]
例子:
1> sp_adduser joli,joli
2> go
2.4.4 删除数据库用户(user)
例子:
1> sp_dropuser test
2> go
2.4.5 修改该用户为该数据库dbo
例子:
1>use joli_db
3> sp_changedbowner joli

2.4.6 查看数据库用户信息
sp_displaylogin [login_name]
sp_helpuser
例子:
1> sp_helpuser
2> go
1> sp_displaylog joli
2> go
1> sp_who
2> go

2.4.7 修改用户口令
如果是修改sa口令,可用sa用户登录,然后执行以下命令修改
1>sp_password “旧命令 | null”,”new_password”
2>go
如果不是sa用户,则使用希望修改口令的user登录数据库,然后执行
1> sp_password 旧命令,新命令
2> go

2.4.8 修改系统缺省设备
? 关闭创建数据库master缺省设备:
? 1>exec sp_diskdefault "master","defaultoff"
? 指定user_db_dev为缺省设备:
? 1>exec sp_diskdefault "user_db_dev","defaulton"


2.5 创建、删除、修改Sybase设备、数据库
2.5.1 创建设备
例子:
1> disk init
2> name="joli_dev",
3> physname="/opt/sybase/joli/joli_dev.dat",
4> vdevno=9,
5> size=51200
6> go

说明:
物理设备名称为:joli_dev
物理设备文件路径为:/opt/Sybase/joli/joli_dev.dat
设备编号(该号不能重复)为:9
大小(单位为2K)为:100M
(一般为用户数据库创建一个数字设备后,再单独为用户数据库创建一个日志设备)

2.5.2 镜像设备
例子:
1> disk mirror
2> name="joli_dev",
3> mirror="/opt/sybase/joli/joli_dev_mirror.dat"
4> go

说明:
创建设备joli_dev的镜像,镜像后的镜像设备为/opt/sybase/joli/joli_dev_mirror.dat。
检查某设备是否被镜像,可使用“sp_helpdevice 设备名”查看。

2.5.3 终止设备镜像
终止设备可分为:终止主设备和终止次设备两类,同时还可选择是临时性终止还是

永久性终止。(如果是永久终止,还需要在操作系统上删除物理设备文件)
disk unmirror
name="设备名"
[,side=”{primary|secondary}]”
[,mode={retain|remove}]
//终止主/次设备:primary/secondary (缺省次)
//临时/永久终止:retain/remove (缺省临时)

例子:
1)临时终止主设备
1> disk unmirror
2> name="joli_dev",
3> side="primary",
4> mode=retain
5> go
2)永久终次主设备
1> disk unmirror
2> name="joli_log_dev",
3> side="primary",
4> mode=remove
5> go

? 恢复临时终止的镜像:
例子:
1> disk remirror
2> name="joli_dev"
3> go

2.5.4 删除设备
需要确定该设备上没有数据库。
例子:
1> sp_dropdevice test_dev
2> go
再删除操作系统设备文件。

2.5.5 查看设备状态
例子:
1> sp_helpdevice [设备名]
2> go
说明:
可查看设备是否镜像(相关镜像类型、是否有临时取消镜像等)等配置。

2.5.6 创建数据库
例子:
1> create database joli_db on joli_dev=50 log on joli_log_dev=20
2> go

说明:
创建用户数据库joli_db,该数据库数据存储在设备joli_dev设备上,可使用大小为50M;日志存储在joli_log_dev设备上,可使用大小为20M。

2.5.7 扩展数据库:
alter database db_name on device_name=size,device_name=size log on device_name=size,device_name=size
例子:
1> alter database joli_db on joli_dev=10 log on joli_log_dev=5
2> go
说明:
数据库joli_db在设备数字joli_dev上扩展10M,在日志设备joli_log_dev上扩展5M。

2.5.8 删除数据库:
drop database db_name
例子:
3> drop database joli_db
4> go

2.5.9 上线数据库
例子:
1> online database db_name
2> go

2.5.10 检查数据库状态
? 一般性检查
1>sp_helpdb
2>go
? 系统性检查
所有库检查:
1> dbcc checkdb
2> go
指定用户数据库检查:
1> dbcc checkalloc(joli_db)
2> go

2.6 Sybase日志管理
在创建用户数据库的时候,应尽量为事务日志创建独立的日志设备(一般创建为数据库大小的20%),这样可以单独备份事务日志、防止数据库溢满、可以看到事务日志的占用情况及可以镜像等。
dump transaction db_name with truncate_only //不备份事务日志,直接清除。
dump transaction db_name with no log
dump transaction db_name to “路径/名字” //备份事务日志
? 检查log大小
1> dbcc checktable(syslogs)
2> go
快速查看log大小
1> select data_pgs(8,doa mpg)
2> from sysindexes where id=8
3> go

2.7 修改Sybase系统缺省参数
可修改$SYBASE/ASE-12_5目录 “服务名.cfg”文件,重新启动Sybase服务来修改Sybase系统参数。
也可使用Sp_configure来修改部分动态参数。
? 查询当前所有的参数配置
1>sp_configure
2>go
? 查询可动态修改的参数
1>sp_configure “abcdef”


2>go
? 查询特定参数的配置情况
1>sp_configure “参数名
2>go”
? 修改可动态配置的参数
1> sp_configure “参数名”,值
2> go

一般可视情况酌情修改以下参数:
cache size、number of open databases、number of open objects、number of open indexes、partition groups、number of large i/o buffers、number of devices、default network packet size、max network packet size、number of remote connections、number of remote logins、number of worker processes。

2.8 修改数据库个例配置
每个在设备上创建的数据库,都可设置如下参数:
abort tran on log full、 allow nulls by default、 auto identity、 dbo use only、 ddl in tran、 disable alias access、 identity in nonunique index、 no chkpt on recovery、 no free space acctg、 read only、 select into/bulkcopy/pllsort、 single user、 trunc log on chkpt、 trunc. log on chkpt.、 unique auto_identity index
可通过sp_dboption [db_name,"option_name",{true|false}]命令来修改这些参数的配置。
例子:
1> use master
2> go
1> sp_dboption joli_db,"trunc log on chkpt",true
2> go
说明:
检查点时,清除以前的日志。如果设置为off,则一直保留日志,继续增长,直到使用dump transaction命令。

2.9 网络服务配置
? UNIX
在$SYBASE目录下,interfaces文件提供用户服务名的配置。一般通过执行命令dsedit来做修改。
执行dsedit后,根据提示,一步一步的添加、修改即可完成配置。
? Windows
启动dsedit,选择server object->add,向server中新添一个数据源,在其属性“server address”中输入IP,Port(注意,IP地址和端口号间用“,”分隔,比如192.168.2.98,4100)。

2.10 检查数据库的版本
1> Select @@version
2> go

2.11 数据库坏页最小影响维护
在数据库发生可疑坏时,会脱机整个数据库(缺省),可以设置只脱机该可疑页(系统数据库不能改变)。
sp_setsuspect_granularity [dbname [,{"database"|"page"}[,"read_only"]]]
sp_setsuspect_threshold [dbname [,threshold]]
(必须具有sa_role且在master数据库中使用)
? 查看、修改数据库当前脱机设置
1) 查看设置为数据库脱机还是页脱机
1> sp_setsuspect_granularity joli_db
2> go
2) 设置数据库为页脱机
1>p_setsuspect_granularity joli_db,”page”
3) 查看设置的最大脱机页(缺省最大可可疑20页,超出该20页,一样会脱机数据库)
1> sp_setsuspect_threshold joli_db
2>go
4) 修改数据库最大可脱机页为300
1> sp_setsuspect_threshold joli_db,300
2>go
? 显示可疑页:sp_listsuspect_db
? 详细显示数据库可疑页信息:sp_listsuspect_page [dbname]
? 使数据库所有页联机联机:sp_forceonline_db dbname,{"sa_on"|"sa_off"|"all_users"}
? 使指定页联:sp_forceonline_page dbname,pgid {"sa_on"|"sa_off"|"all_users"} (//必须sa_sole

在master中执行。)
2.12 其他常用维护
1) 可以执行命令$SYBASE/sybcent32/scjview使用图形界面进行维护。
2) 查看$SYBASE/ASE-12_5/install目录下的日志文件(*.log)。
3) 使用一些过程:sp_reportstats、sp_helpdb、sp_helpsegment segment_name(system,log,default)(sp_helpsegment logsegment检查可用于日志增长的空间)、sp_spaceused(sp_spaceused syslogs检查日志大小)、dbcc checkdb & dbcc checkcatalog & dbcc checkalloc、sp_lock等;也可以查询一些系统表:syslogs、master .. sysdevices、master .. sysusages、syssegments、sysindexes、sysdatabases等。
4) 查看当前启动的服务:showserver。
5) >dbcc traceon (3604) 将信息显示在控制台和写入errorlog文件。;>go;>dbcc memusage;>go;>dbcc traceoff (3604);>go
use xxdb
checkpoint
sp_dboption mydb,"single user","true"
设置单用户模式
sp_logiosize "8k"
设置I/O为8K缓冲池

3 备份设置
3.1 备份到磁盘
? 本地磁盘备份
例子:
1> dump database joli_db to “备份目标绝对路径/备份文件名”
2> go

还可使用如下命令进行远程备份
dump database_name to “/u01/data/0102.dmp” at remote_server
dump transaction database_name to “/u01/log/0102.dmp” at remote_server

3.2 备份到磁带
dump database database_name to “/dev/nrmt4” with init //初始化(设备被覆盖)
dump database database_name to “/dev/nrmt4” //默认 noinit nounload
dump database datbase_name to “/dev/nrmt4” with unload //磁带回卷并卸下
dump database 数据库名 to “/dev/rmt/0”
dump transaction 数据库名 to “dev/rmt/0” with no_truncate

3.3 恢复数据库
? load database 数据库名 from “dev/rmt/0”

3.4 建立自动备份
可先把Sybase数据库备份到本地磁盘,压缩后再备份到磁带上。
1) 创建一个本地目录或者远程目录的备份设备。
2) 创建一备份用户。
3) 编写备份脚本,并指定自动备份定时crontab任务。



**********************************************************************************************
**********************************************************************************************
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 Mem

ory中日志页总是先写于数据页:


 
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 12.87Mbytes,64.35%
***NOTICE: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,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.trunc 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
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>inser

t 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 管理

ASE提供阈值管理功能,它能帮助用户自动监视数据库log设备段的自由空间。这方面的详细讨论见NO.5技术支持杂志。log的管理是灵活而复杂的,我们应该在实践中摸索经验,针对每个数据库的不同情况,不同操作,做不同处理。

2. 如何截断数据库的事务日志?

事务日志填满数据库中的日志空间后,可能不能使用转储事务日志的办法备份并且清除原来存在的日志,因为转储日志这个动作本身也需要记录日志。
这时候,可以首先使用dump transaction database_name with truncate_only命令,该命令只是截断/清除事务日志,并不生成实际的备份。
如果不能奏效,可以使用dump transaction database_name with no_log命令。该命令也是仅仅清除既有的事务日志,不生成实际的备份文件,且该命令本身不记日志。
如果该命令还不能奏效,应当使用alter database命令为此数据库的日志分配额外的空间,随后执行dump transaction。

3. 使用dump transaction with no_log的危险性

在命令参考手册中的dump transaction with no_log条目下,有一条警告信息告诉你,你应该把这条命令作为没有其它办法时的最后一招才使用它。但是“最后一招”究竟是什么意思呢?当你使用这条命令时会怎样呢?那你应使用哪条命令来代替它呢?最后,若这条命令如此有问题,为什么Sybase却要提供它呢?

Sybase技术支持建议你定期

的dump你的transaction log。你必须根据你的数据库中记入日志的活动量的大小以及你的数据库的大小来决定dump的方式。有些地方按月dump transaction;有些地方每夜dump transaction。

若你从未做过dump transaction,transaction log将最终会满。 SQLServer使用log(日志)是出于恢复目的的。 当log满时,服务器将停止事物的继续进行,因为服务器将不能将这些事物写进日志,而服务器不能运行大多数的dump tran命令,因为ASE也需在日志中记录这些命令。

这就是为什么当其它dump tran命令不能执行时no_log可执行的原因。但是想一下dump transaction with no_log被设计执行的环境,将不做并发性检查。

若你在对数据库的修改发生时使用dump transaction with no_log,你就会冒整个数据库崩溃的风险。在多数情况下,它们被反映成813或605错误。为了在数据库被修改时,删除transaction log中的不活跃部分可使用dump transaction with truncate_only。这条命令写进transaction log时,并且它还做必要的并发性检查。这两条命令都有与其相关的警告,在命令参考手册中会看到这些警告。请确保在使用其中任一条命令以前,你已理解这些警告和指示。 Sybase提供dump transaction with no_log来处理某些非常紧迫的情况。为了尽量确保你的数据库的一致性,你应将其作为“最后一招”。
4. 为什么数据库事务日志满了,使用dump tran with no_log仍不能截断日志?
有两种情况,可能出现这个问题。一是应用系统给ASE发送了一个用户自定义事务,一直未提交,这个最早活跃事务阻碍系统截断日志。二是客户端向ASE发送了一个修改数量大的事务,清日志时,该事务还正在执行之中,此事务所涉及的日志只能等到事务结束后,才能被截掉。

对于第一种情况,只要督促用户退出应用或者提交事务,系统管理员便可清掉日志。因为给ASE发送Dump transaction with no-log或者with truncate-only,它截掉事务日志的非活跃部分。所谓非活跃部分是指服务器检查点之间的所有已提交或回退的事务。而从最早的未提交的事务到最近的日志记录之间的事务日志记录被称为活跃的。从此可以看明,打开的事务能致使日志上涨,因为在最早活跃事务之后的日志不能被截除。

对于第二种情况,道理也同上。只是在处理它时,需慎重从事。如果这个大事务已运行较长时间,应尽量想法扩大数据库日志空间,保证该事务正常结束。若该事务被强行回滚,ASE需要做大量的处理工作,往往是正向执行时间的几倍,系统恢复时间长,可能会影响正常使用的时间。

相关文档
最新文档