1. 基本概念篇 1.1 什么是Sybase Adaptive Server Enterprise (ASE)? Sybase Adaptive Enterprise Server (ASE)是由Sybase公司提供的具有高性能、高可靠性和易维护性的一个关系数据库管理系统。 1.2 Sybase 具有哪些Server以及这些Server的用途?
Adaptive Server Adaptive Server是Sybase公司提供的适应性核心数据库服务器,用于管理整个数据库系统,包括用户、数据、资源等的管理和控制。
Backup Server 在备份和恢复时执行数据库的 dump 和 load.
XP Server 执行扩展存储过程
Monitor Server 为性能调试分析采集数据
Historical Server 保存来自Monitor Server 的数据,以备将来分析. 1.3 什么是登录帐户? 登录帐户是指能够登录到Adaptive Server数据库服务器的用户。登录帐户是成为数据库用户的前提和基础。ASE 安装完成后自动建立一个登录帐户sa. sa 的初始口令为空. sa 具有SA和SSO的角色.具有SSO的登录帐户可以添加其他登录帐户。 1.4 什么是角色,Sybase具有哪些常用的系统角色以及这些系统角色的作用? 角色是授予指定用户的一组权限.角色允许登录的用户执行必要的管理及安全任务。
Sybase具有的系统角色包括: System Administrator (SA) System Security Officer (SSO) Server Operator (OPER)
数据库选项与配置参数和set设置的选项类似,只是范围不同: • 配置参数影响服务器范围的行为 • 数据库选项影响数据库的行为 • set 选项影响当前对话或存储过程
数据库有如下选项: 1. allow nulls by default 2. auto identity 3. dbo use only 4. ddl in tran 5. identity in nonunique index 6. read only 7. single user 8. unique auto_identity index 9. abort tran on log full 10. no chkpt on recovery 11. no free space acctg 12. select into/bulkcopy/pllsort 13. trunc log on chkpt
从上图中看到,在Sybase Central图形化管理工具右边所列出的条目就是所有可以以图形化的方式监测的数据库服务器的性能指标。 (2) isql –p 在使用isql登录数据库服务器时,加-p选项,那么之后执行的每一条SQL语句都可以得到它的执行时间,这里所记的是CPU的时钟时间。 (3) reorg 该命令用于优化DOL表的表空间及其索引。使用方法,请参考如何执行reorg 系列命令来优化DOL表及其索引 (4) optdiag 该命令用于显示数据库服务器中的表和索引的统计值信息。使用方法,请参考如何执行optdiag命令来监控表和索引的物理使用情况 2. Set 命令 (1) statistics io 执行方法: 1> set statistics io on 2> go 之后所执行的任何SQL语句,执行完毕后,都会得到物理读、写,逻辑读、写的次数 (2) statistics time 执行方法: 1> set statistics time on 2> go 之后所执行的任何SQL语句,执行完毕后,都会得到执行时间,以CPU的时钟时间记时。 (3) showplan 执行方法: 1> set showplan on 2> go 之后所执行的任何SQL语句,执行完毕后,显示由调优器所选择的执行计划,包括执行步骤,索引的使用,I/O的使用状况等等。 (4) showplan and noexec 执行方法: 1> set showplan,noexec on 2> go 之后所执行的任何SQL语句,不需要执行,就直接显示由调优器所选择的执行计划,包括执行步骤,索引的使用,I/O的使用状况等等。
3. 系统存储过程 (1) 进程行为查看类 ① sp_who 请参看如何查看当前数据库中的进程信息 ② sp_lock 请参看如何查看当前数据库中锁发生的情况 ③ sp_object_stats 执行方法: 1> sp_object_stats “00:20:00”,20 2> go 以上例子将输出在当前执行这条语句的数据库中,在20分钟内锁竞争最激烈的前20张表 ④ sp_showplan 执行方法: 1> sp_showplan 20, null, null, null 2> go 以上例子输出20号进程所执行的SQL语句的执行计划。 (2) 空间使用类 ① sp_spaceused 执行方法: 1> sp_spaceused table_name 2> go 输出指定表的空间使用情况。 ② sp_helpartition 执行方法: 1> sp_helpartition table_name 2> go 输出指定表的分区使用情况 ③ sp_estspace 执行方法: 1> sp_estspace table_name,nr_of_rows 2> go 输出指定表(table_name)中如果存在指定行数(nr_of_rows)的数据,估计的空间使用情况。 ④ sp_helpsegment 执行方法: 1> sp_helpsegment seg_name 2> go 输出指定段的使用情况。 ⑤ sp_helpcache 执行方法: 1> sp_helpcache cache_name 2> go 输出指定缓存的使用情况。 (3) 系统配置类 ① sp_configure 请参看如何执行sp_configure 系统存储过程来查看系统参数 ② sp_cacheconfig 请参看如何配置用户自定义命名缓存以及缓冲池 ③ sp_poolconfig 请参看如何配置用户自定义命名缓存以及缓冲池 (4) 任务行为查看类 ① sp_sysmon 请参看如何使用sp_sysmon存储过程来查看当前数据库的性能情况 ② sp_monitor 执行方法: 1> sp_monitor 2> go 输出CPU,I/O使用情况 4. dbcc trace命令 (1) dbcc trace(3604,302,310) 执行方法: 1> dbcc trace(3604,302,310) 2> go 输出更为详细的SQL语句执行计划 2.4 开发数据库应用时需要开发人员重点关注的几个问题? 通常,开发一个应用包括如下几个阶段或步骤: 1. 弄清业务需求,定义业务规则 2. 规划应用开发环境,特别是定义软件规范说明 3. 完成数据库的逻辑和物理设计 4. 应用程序设计(编程和调试) 5. 运行与维护 在程序设计时,要注意如下两个问题: 1. 对于复杂的业务规则应放在服务器上去实现,而不是在客户机上实现,这样做将使程序设计更省力,且效果更好。 2. 由客户机程序将“批”发送到服务器,要求在程序结构中包含对错误的处理和对事务的管理能力。 2.5 如何在Windows 平台上启动和关闭Sybase数据库服务器? 有两种常用方式: 1. 使用Sybase工具:Sybase Central 打开Sybase Central-->找到所需要启动的Sybase数据库服务器的名称-->鼠标右键单击该名称,出现弹出框 启动:-->单击”start” 关闭:-->单击”stop” 2. 使用Windows操作系统提供的服务管理 打开“Control Panel”中的“Service”--> 找到所需要启动的Sybase数据库服务器的服务名称-->鼠标右键单击该名称,出现弹出框 启动:-->单击”start” 关闭:-->单击”stop” 2.6 如何在UNIX平台上启动和关闭Sybase数据库服务器? 启动: 使用SYBASE用户在操作系统提示符下执行: startserver –f RUN_servername 关闭: isql登录到数据库服务器,执行: 1> shutdown 2> go 注:如果需要关闭备份服务器,执行: 1> shutdown SYB_BACKUP 2> go 2.7 如何使用交互式管理工具isql? 在UNIX操作系统平台,使用SYBASE用户执行该命令;或者在Windows平台的DOS窗口中执行该命令。具体命令的通常使用方法如下所示: isql –Uuser_name –Ppassword –Sserver_name 其中user_name:登录帐户名,例如sa password:登录帐户的口令,例如sa的口令123456 server_name:数据库服务器的名称或者是在Dsedit使用程序中定义的相应 的服务器名称,例如SYB125 正确使用这个命令后,会进入1>提示符,而没有任何错误、信息提示。 2.8 如何在Windows操作系统上安装Open Client12.0 1. 选择Open Client的正版。 2. 安装Open Client时,如果安装程序提示是否覆盖相关.DLL文件时,一定选择NO。 3. 编辑客户端win98/win95的autoexec.bat和configure.sys文件(在其中添加自动执行SYBASE设置环境变量的批处理文件sybase.bat,以及添加SYBASE的路径,DLL路径,BIN路径)。 #假设SYBASE安装在C:\SYBASE (1) 编辑autoexec.bat: path='c:\sybase;c:\sybase\ocs-12_0\dll;c:\sybase\ocs-12_0\bin'; call c:\sybase\sybase.bat (2) 编辑config.sys: shell=c:\windows\command.com /p /e:2048 files=50 2.9 如何使用图形化管理工具Sybase Central? 这里主要介绍windows平台的java版的Sybase Central和windows版的Sybase Central。 Sybase Central是一个用于管理数据库及相关产品的简单易用的图形化管理工具。它能够帮助您管理数据库服务器,数据库对象以及执行一些系统管理的任务,同时为每一个任务都能够提供便于参考的循序渐进的图形化的步骤说明,使得系统管理员在管理过程中游刃有余。 下面介绍使用方法。 java版的Sybase Central------- 1.打开Sybase Central图形化界面: 在“开始”菜单中寻找: 开始-->程序-->Sybase-->Sybase Central Java 版,鼠标单击 Sybase Central Java 版,出现以下界面:
2.连接数据库服务器 鼠标单击菜单中:Tools-->Connect,出现以下连接窗口:
输入登录帐户名,口令,选择需要连接的数据库服务器名称,之后鼠标单击“OK”按钮,即可看到如下界面:
现在您就可以对您的数据库服务器进行需要的管理工作了。
windows版的Sybase Central---- 1.打开Sybase Central图形化界面: 在Sybase产品的安装目录下执行"E:\sybase\Sybase Central 3.2\win32\scview.exe"(这里Sybase产品安装在e:\sybase目录下),出现以下界面:
5.重启机器 2.21 如何配置用户自定义命名缓存以及缓冲池? 定义命名缓存: 在isql环境中执行: 1> sp_cacheconfig cache_name,size 2> go 例: 1> sp_cacheconfig cache_a,”100K” 2> go 其中: size:命名缓存的大小,单位可以是P/K/M/G,默认单位为K。 上例中创建了一个100K的命名缓存cache_a。 (注:该命令还提供其它参数,如定义命名缓存的类型等。若需使用,请参阅资料《Reference Manual》) 定义缓冲池: 在isql环境中执行: 1> sp_poolconfig cache_name,mem_size,config_pool 2> go 例: 1> sp_poolconfig cache_a,”100M”,”16K” 2> go 其中: mem_size:缓冲池的大小,单位可以是P/K/M/G,默认单位为K,最小指定值为512K。 config_pool:I/O大小,可以为2K,4K,8K,16K 上例中创建一个大小为100M的缓冲池,其I/O大小为16K。 (注:该命令的其它用法,请参阅资料《Reference Manual》) 2.22 如何扩展数据库? 扩展数据空间: alter database db_name on device_name
扩展日志空间: alter database db_name log on device_name 2.23 如何设置数据库为单用户模式? use master go sp_dboption db_name, “single user”, true go use db_name go checkpoint go 2.24 如何把数据库设置为自动截断事务日志? use master go sp_dboption db_name, “trunc log on chkpt”, true go use db_name go checkpoint go 2.25 为了可以在用户事务中执行数据定义语言,应如何设置数据库选项? use master go sp_dboption db_name, “ddl in tran ”, true go use db_name go checkpoint go 2.26 如何设置数据库选项可以在用户表中自动添加序号生成器? use master go sp_dboption db_name, “auto identity”, true go use db_name go checkpoint go 2.27 如何为数据库创建数据库用户? 语法:sp_adduser loginame [, name_in_db [, grpname]]
举例: 1.sp_adduser margaret 将"margaret"增加为数据库用户。他的数据库用户名与Adaptive Server 的登录名(login name)相同, 并且属于缺省组"public"。
举例: 1.sp_changegroup fort_mudge, albert 用户"albert"现在成为"fort_mudge"组的成员。 2.30 如何查看数据库空间的大小? 举例: 1.查看全部数据库的大小: sp_helpdb name db_size owner dbid created status -------------- -------- ----- ---- -------------- ------------------ master 5.0 MB sa 1 Jan 01, 1900 no options set model 2.0 MB sa 3 Jan 01, 1900 no options set pubs2 2.0 MB sa 6 Sep 20, 1995 no options set sybsystemprocs 16.0 MB sa 4 Sep 20, 1995 trunc log on chkp tempdb 2.0 MB sa 2 Sep 20, 1995 select into/bulkcopy Displays information about all the databases in Adaptive Server.
2.查看指定数据库的大小 sp_helpdb pubs2
name db_size owner dbid created status ----- ------- ----- ---- ------------ ---------------------- pubs2 2.0 MB sa 4 Mar 05, 1993 abort tran when log full device_fragments size usage free kbytes ----------------- ------ ------------ ------------- master 2.0 MB data and log 576 name attribute_class attribute int_value char_value comments ------- --------------- ------------- --------- ----------- -------- pubs2 buffer manager cache binding 1 pubs2_cache NULL Displays information about the pubs2 database. 2.31 如何改变数据库的属主? 语法:sp_changedbowner loginame [, true ]
举例: 1.sp_changedbowner albert 用户 "albert"成为当前数据库的属主。 2.32 如何执行sp_configure 系统存储过程来查看系统参数? 1.查看全部参数的配置: isql -Usa –P –Ssevername 1> sp_configure 2> go
2.查看指定参数(如:查看“用户连接数”) isql -Usa –P –Ssevername 1> sp_configure “number of user connections” 2>go 2.33 如何为当前的Sybase数据库服务器设置最大可用内存? 在ASE12.5中,当前SYBASE数据库服务器可用的最大内存由参数“max memory”配置,其含义是ASE SERVER可分配的最大共享内存(pre-ASE12.5,使用参数total memory)。ASE12.5采用动态分配内存机制,在安装时由于没有什么进程、任务需要用到内存,此时系统分配的共享内存是很小(可用sp_configure “total physical memory”查看当前的内存使用情况)。因此即使我们将“max memory”配置到很大的值,比如2G、4G,但ASE SERVER在实际需要时并不一定能分到“max memory”指定的内存。因此,在安装时,必须先将“allocate max shared memory”设置为1(在SERVER启动时就划分”max memory”的值的内存),再启动SERVER,如果启动正常,那么说明“max memory”的值是系统可以接受,此时可以把“allocate max shared memory”设置为0,让ASE SERVER动态分配内存;如果启动失败,则要查看操作系统有关内存的配置参数是否正确设置。 2.34 影响数据库服务器内存配置的基本参数 设置Adptive Server12.5的内存配置时,使用sp_configure命令,用具体值指定每一项内存需求,例如过程缓存和缺省数据缓存的大小。以下3个参数影响内存的分配(不同于以前版本): max memory 该参数是以2K为单位的数值,决定可以分配给Adaptive Server的最大内存数。为动态参数,改变后不必重起Adaptive server。
allocate max shared memory 该参数有0和1两个值。决定sybase server启动时,是否一次分配给Adaptive server 的内存为max memory指定大小。值为1时启动sybase server,一次分配max memory大小的内存;值为0时启动sybase server,一次只分配按实际参数配置所需要的内存。例如,max memory为500MB,若设置该参数为0(缺省值), Adaptive Server的具体配置参数和核心所需内存仅100M,则Adaptive server启动后只从OS获取100MB内存,仅当动态参数改变需要额外内存时才考虑从OS获取所需内存,最大不超过max memory大小;若设置该参数为1,则Adaptive Server在启动时一次即获取500MB内存,而不管空闲内存是多少。
Dynamic allocation on demand 该参数用以确定有新的内存请求时,是立即获得内存资源还是仅在需要时分配。是动态参数,取值范围为0和1。例如,假设number of user connections原值为50,改为150,因每个用户连接需要112K内存,则(150-50)个用户需要使用的内存数量为11MB(100 x 112/1024)。若设置该参数值为1,当有第51个连接需求时,才分配一个连接需要的内存,也就是说是随着真正的需要逐渐获取连接所需内存,直到150个连接局限;如果设置该参数值为0,Adaptive Server立即为用户连接分配(150-50)个用户需要的11MB内存。 2.35 如何为当前的Sybase ASE 12.5设置可用的数据缓存? total data cach size以K字节显示当前有效的数据缓存大小,为只读参数,只能使用sp_configure查看,不能配置。配置数据缓存,必须使用sp_cacheconfig。ASE12.5的 default data cache必须手动重配,默认值8M不能满足性能需要。注意该参数为静态参数,必须重起ASE。 示例:为Adaptive Server配置100MB数据缓存 sp_cacheconfig “ default data cache”,”100M” 2.36 如何为当前的Sybase ASE 12.5设置可用的过程缓存? 参数procedure cach size(以2k为单位)决定了过程缓存的大小,该参数使用sp_configure配置,为动态参数。 示例:为Adaptive Server配置100MB过程缓存 sp_configure “procedure cache size”,”100M” 2.37 如何为当前的Sybase数据库服务器设置可用的最大数据库设备数量? Number of device参数控制了Adaptive Server能够使用的数据库设备的数目。 示例:最多允许使用100个逻辑设备 sp_configure “number of devices”, 100 2.38 如何为当前的Sybase数据库服务器设置可用的最大锁数? Adaptive Server中的所有进程共享一个公共的锁缓冲池,所需要的锁的数目取决于正在运行的操作的数目和性质。Number of locks参数控制了Adaptive Server上进程可用的锁的数目。如果所有配置的锁都已经用尽,Adaptive Server会显示一个服务器级的错误消息。另外,缓冲池锁会占用内存。 例如:允许最多使用100,000个锁 sp_configure “number of locks”, 100000 2.39 如何为当前的Sybase数据库服务器设置可用的最大用户连接数? 参数number of user connections用于设置可以同时连接到Adaptive Server的最大用户数。其中,用户连接包括用任何登录名(login)所做的登录连接,一个特定登录名(login)同时的多次登录被认为是多个连接。 例如:最多允许同时的100个用户连接 sp_configure “number of user connections”, 100 2.40 如何备份数据库? 当遇到介质故障时(如磁盘老化损坏),仅当你有数据库的定期备份及后继的事务日志备份的情况下才可恢复该数据库。要完全恢复,必须定期使用dump database 命令备份数据库并结合dump transaction命令备份日志。Dump database命令允许动态执行,即转储/备份数据库期间允许其他用户对该数据库中的数据进行更改,这使得定期备份数据库更加方便。 示例:使用单一磁带设备进行转储/备份: 在UNIX操作系统中: dump database pubs2 to "/dev/nrmt4" 在Windows NT操作系统中 dump database pubs2 to "\\.\tape0" 你也可以把数据库备份/转储到一个操作系统文件中。例如,在NT操作系统环境中: dump database pubs2 to "d:\backups\backup1.dat" 2.41 如何进行数据库的增量备份? 可以使用dump transaction命令(或其缩写dump tran)对事务日志进行例行的增量备份。Dump transaction与许多操作系统提供的增量备份类似。它复制并且备份事务日志,提供自上一次数据库备份或者事务日志转储以来对数据库所进行的所有改变的记录。Dump transaction复制/备份完日志后,会截断其中不活动的部分。 Dump transaction比完全数据库备份所花费的时间和存储空间要少,一般更为常用。注意,只有将数据库的数据和日志分别存储在不同的数据库逻辑设备上时,才可以运行dump transaction。示例: 在UNIX操作系统中: dump transaction pubs2 to "/dev/nrmt4" 在Windows NT操作系统中 dump transaction to "\\.\tape0" 你也可以把数据库备份/转储到一个操作系统文件中。 例如,在NT操作系统环境中: dump transaction pubs2 to "d:\backups\backup1.dat" 2.42 如何恢复数据库? 建议执行的步骤: 获取故障设备上每个数据库的当前日志转储(使用dump transaction的no_truncate选项) 检查设备上每个数据库的空间使用情况 收集完故障设备上所有数据库的这些信息后,删除每个受故障设备影响的数据库 删除故障设备 初始化新设备 重新创建数据库,每次创建一个 将数据库的备份装载到每个数据库 按事务日志转储创建时的顺序加载每个事务日志转储 online database YOUR_DB_NAME 2.43 如何截断数据库的事务日志? 事务日志填满数据库中的日志空间后,可能不能使用转储事务日志的办法备份并且清除原来存在的日志,因为转储日志这个动作本身也需要记录日志。 这时候,可以首先使用dump transaction database_name with truncate_only命令,该命令只是截断/清除事务日志,并不生成实际的备份。 如果不能奏效,可以使用dump transaction database_name with no_log命令。该命令也是仅仅清除既有的事务日志,不生成实际的备份文件,且该命令本身不记日志。 如果该命令还不能奏效,应当使用alter database命令为此数据库的日志分配额外的空间,随后执行dump transaction。 2.44 如何恢复数据库到某一具体时间? 可以将数据库恢复到事务日志中的指定时间点。为此,使用load transaction的until_time选项。该功能在诸如用户不小心从数据库中删除了一个重要表时很有用;可用util_time选项将对包含此表的数据库的改变恢复到表被删除前的状态。 要在数据库破坏后有效使用until_time,用户必须知道错误发生的确切时间,然后把包含误操作的事务日志转储出来,再如示例一样进行装载。示例: load transaction database_name from “/dev/nrmt5” with until_time = “Mar 26 1997 12:35:59:650PM” 注意:这样装载事务日志后,AdaptiveServer重新启动数据库日志序列,在可以转储另一个事务日志之前,需要转储数据库。 2.45 如何把表、索引等数据库对象的定义从数据库中导出来? 使用defncopy.exe程序可以把指定的视图、规则、缺省值、触发器或者存储过程的定义从数据库导出到操作系统文件中,或者从操作系统文件导入到数据库中。它位于$SYBASE/OCS-12_5/bin中。 示例1:在ABC服务器上,将定义从new_proc文件拷入stagedb数据库中,使用sa帐户,口令为空: defncopy –U sa -P –S ABC in new_proc stagedb 示例2:在SYBASE服务器上,将sp_calccomp和sp_vacation对象的定义从employees数据库库拷入dc.out文件中,消息和提示以法语显示: defncopy -S SYBASE –U sa -P –z French out dc.out emploees spcalccomp sp_vacation 2.46 如何把整个数据库中所有用户表的数据全部导出来? bcp命令一次只可以把一个表的数据导出来。要想把所有用户表的数据都导出来,可以生成一个包含多行bcp命令的批处理文件,其中的每行bcp命令导出一个表。 以下是生成这个批处理文件的示例: a) 编辑一个文本文件select.sql,内容如下: set nocount on use pubs2 go select "bcp pubs2.." + name + " out " + name + ".bcp -Usa -P -c " from sysobjects where type="U" go b) 如果是unix环境, 执行: isql -Usa -P -b -i select.sql -o bcpout chmod +x bcpout 如果是Windows, 执行: isql -Usa -P -b -i select.sql -o bcpout.bat c) 把bcpout中out换为in即可得到bcpin的批处理命令文件 2.47 如何执行快速bcp操作? 当使用bcp命令向数据表中导入数据时,表上的索引和触发器会影响数据导入的速度。在这样的表上使用bcp时,bcp自动使用慢速模式,也就是将在日志中记录数据的插入,导致事务日志快速增长。 要想避免这种情况,可以先把目标表上的索引和触发器全部删除,并且把数据库bulk copy/select into开关打开,再使用bcp命令向该表中导入数据。 2.48 如何查看当前数据库中的进程信息? 可以使用存储过程sp_who查看Adaptive Server中的所有进程的信息。Sp_who返回结果的解释如下: fid 进程所属于的组,在配置了并行处理的环境中有意义,否则为0 spid 进程号。系统管理员可以在T-SQL命令kill中用该号来停止进程 Status 进程状态,正在运行或者休眠 Loginname 启动进程的用户登录名或者别名,对于系统进程该项是NULL Origname 如果loginname是别名,则origname显示真实登录名,否则与loginname 显示同一信息。 Hostname 数据库驻留的服务器名称 Blk_spid 阻塞进程的ID(如果有的话)。阻塞进程(可能受影响或者拥有排他锁)是占有其他进程所需资源的进程。 Dbname 该进程访问的数据库 Cmd 该进程正在执行的命令和进程。条件语句(if 或while循环)的求值将返回cond。 Block_xloid 标识出阻塞事务的唯一的锁所有者ID。 2.49如何查看当前数据库中锁发生的情况? 可以使用存储过程sp_lock查看AdaptiveServer当前运行状态中锁的分配和使用情况。 2.50 如何更改用户表的锁模式? 可以使用alter table 命令来更改现有用户表的锁模式。 示例:把titles表的锁模式改为数据行锁: alter table titles lock datarows 另外,一个表的锁模式可以使用sp_help table_name查看。 2.51 如何执行optdiag命令来监控表和索引的物理使用情况? Optdiag程序用以显示数据库中关于表和字段的统计信息,也可以将更新的统计信息装载到系统表中。该程序位于$SYBASE\ASE-12_5\bin中。 示例1 :显示pubs2数据库中所有用户表的统计信息,并将输出内容放入pubs2.opt中: optdiag statistics pubs2 –Usa –Ppasswd –o pubs2.opt 示例2:显示titles表的统计信息: optdiag statistics pubs2..titles –Usa -Ppwsswd –o titles.opt 示例3:显示titles表中price列的二进制统计信息: optdiag binary statistics pubs2..titles.price –Usa –Ppasswd –o price.opt 2.52 如何执行reorg 系列命令来优化Dol表及其索引? Reorg命令根据使用的选项,回收页上未使用的空间、删除行转移或将表中的所有行重新写入新页。通过整理表空间,可以有效改善表访问的性能。 可以使用的参数有: reclaim_space 回收由删除和更新操作所留下的未使用空间。对于表中的各个数据页,如果有已经提交删除或者行缩短更新操作产生未使用空间,该参数将连续重写当前这些行,使未使用空间保留在页尾;如果页中已没有行,则释放该页。 forwarded_rows 删除前移行 compact 组合reclaim_space和forwarded_rows的功能 Rebuild 如果指定了表名,则将表中的所有行重写到新的页;如果指定了索引名,reorg将重建所以。 示例1:回收titles表中的未使用的页空间 reorg reclaim_space titles 示例2:回收索引titleind中的未使用页空间 reorg reclaim_space titles titleind 注意:reorg rebuild要求将数据库选项select into/bulkcopy/pllsort设置为true,并在数据库中运行checkpoint 2.53 如何使用sp_sysmon存储过程来查看当前数据库的性能情况? 存储过程sp_sysmon可以对指定时间段内Adaptive Server的活动情况进行十分详细的统计分析,并输出统计报告,系统管理员可以从输出报告中掌握到Adaptive Server的运行状况和配置参数的运行效果。输出报告的解读,请参阅性能和调优手册。 示例1:统计未来10分钟内Adptive Server的运行情况: sp_sysmon “00:10:00” 示例2:分别通过begin_sample 和end_sample指定要分析的时间区间的其实端点和终结端点,其间可能发生了很多事务和操作。 sp_sysmon begin_sample ――开始对运行数据采样 … sp_sysmon end_sample ――结束采样,输出统计报告
使用sp_dboption,能设置以下数据库选项: • abort tran on log is full • allow null by default • dbo use only • ddl in tran • disable free space acctg • no chkpt on recovery • read only • select into/bulkcopy • single user • trunc log on chkpt 查看数据库的选项设置情况,使用sp_helpdb存贮过程。 三、数据库选项的用途
(2)trunc log on chkpt 该选项表示每当checkpoint检查进程执行时(通常每分钟12次以上),事务日志被载截,即将已提交的事务日志删除。但是,该选项设置成true以后,人工执行checkpoint操作时都不载截事务日志。在开发数据库应用时,防止日志增长太快.可以将该选项设置成true,所以它很有用。
(3)abort tran on log full 该选项决定当指定数据库日志段最后机会阀值被超越时,正在运行的事务的处理办法。缺省值为false,也就是说事务被暂停挂起,直到空间空余出来再恢复。本选项设置为true时,在日志存储空间空余出来之前,所有用户的需要写事务日志的查询将被去掉。
(4)allow nulls by default 该选项置为true,将列的缺省状态从not null改为null,这与ANSI标准一致。T-SQL中列的缺省状态为not null,即不允许列为空值。但用户可在列定义时指定该列为null状态。allow nulls by default true与缺省状态相反。
(5)dbo use only 该选项设置为true时,只有数据库拥有者才能使用该数据库。
(6)ddl in tran 该选项设置为true时,用户在事务中可以使用某些数据库定义语言的命令,例如:Create table,grant和alter table命令。•只有ddl in tran选项设置为true时,下述命令才可在用户自定义事务内部使用: alter table create table drop rule create default create trgger drop table create index create view drop trigger create procedure ceate default drop view create rule drop index grant create Schera drop procedure revoke 下述命令在任何情形下都不能在用户自定义事务内部使用。 alter database load database truncate table create database load transation update statistics disk init recorfigure drop database select into 另外,系统过程sp_helpdb,sp_helpdevice,sp_helpindex,sp_helpjoins,sp_helpserver和sp_spaceused,由于在执行时产生临时表,也不能在用户自定义事务中使用。再者,用户自定义事务中不能使用修改master数据库的系统过程。
(7)no free space acctg 该选项抑制剩余空间计帐及非日志段阀值活动的执行,由于不再计算这些字段的剩余空间,所以将加速恢复时间。关于该选项,在阀值管理部分,已有详细介绍。
(8)no chkpt on recovery 当保持最新的数据库备份时,此项设置为true。此时,存在一个基本库和一个辅助库。首先,基本库转储到辅助库中。然后,基本库的事务日志间断地转储并装载到辅助库中
(10)single user 该选项设置为true时,每次只能有一个用户访问该数据库。 3.5 Index & Performance 在应用系统中,尤其在联机事务处理系统中,对数据检索及处理速度已成为衡量应用系统成败标准。而采用索引来加快数据处理速度也成为广大数据库用户所接受的优化方法。 索引的使用效果不仅仅依赖于ASE的优化策略,在相当程度上也依赖于应用程序的设。怎样正确地使用索引,不能一概而论,究竟是让索引满足程序设计的需要,或是程序设计遵循已建立的索引,这两者是相符相承的。只有正确地使索引与程序结合起来,才能产生最佳的优化方案。 建立索引的目地是为了优化检索速度,如果检索所需要的时间过长,便有理由怀疑是否索引不存在或者优化器没有使用索引。尚若是索引不存在,那么就要取决于用户是否愿意用空间来换取时间,使用索引来解决检索速度慢的问题。如果优化器未使用表上已有的索引,那么要分析为什么,关于这一点将在后一点篇幅来说明如果update的效率很低,很可能是由于表上有太多的索引需要维护,从而浪费了时间。
如果数据库开放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进程每隔0秒左右清除log,而不考虑recovery interval设置时间的间隔。
四、检测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,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 的清除 数据库的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。
sp_thresholdaction必须由用户编写,ASE不提供。另外,如果最后机会阈值越出,那么在日志空间释放前,ASE一直挂起所有事务。但可以使用sp_dboption对某一数据库来改变这一行为。设置abort tran on log full选项为true,可使得最后机会越出时,ASE撤回所有还未被注册的事务。
abort tran when log is full 当日志段的最后机会阈值被超越时,试图往该日志段上记日志的用户进程将被挂起还是被撤回?缺省情况下系统挂起所有进程。但是可以使用sp_aboption改变它。执行sp_dboption salesdb,"abort tran when log is full",true 命令后,一旦日志满了,则数据库修改事务将会被回滚。
举例:Unix平台后备pubs2数据库 启动ASE和BACKUP SERVER isql -Usa -Pxxxxxx -SSYBASE dump database pubs2 to "/sybase/dump/pubs2_db.990705" go dump transaction pubs2 to "/dev/nrct0" capacity=1500000,file="pubs2_log.990705" with init(capacity取值为磁带容量的70%左右,以K为单位) go 3.9 使用dump transaction with no_log的危险性 在命令参考手册中的dump transaction with no_log条目下,有一条警告信息告诉你,你应该把这条命令作为没有其它办法时的最后一招才使用它。但是“最后一招”究竟是什么意思呢?当你使用这条命令时会怎样呢?那你应使用哪条命令来代替它呢?最后,若这条命令如此有问题,为什么Sybase却要提供它呢?
在本技术报告文件中,通过一些特定的实例对新的加锁机制进行了阐述,而这些实例都是使其并发性及其性能得到了很大的提高。应该注意到,为了使本文件内容更加集中,所提供的材料都是在很高层次上的。有关更详细的信息,请参看如下的文件: New Functionality in Sybase Adaptive Server Enterprise 11.9.2[1],本文件是ASE 11.9.2 文档系列之一,该资料详尽介绍了本版本中所包含的全部新功能。 When (and When not to) Use Data-Only Locking [2]( by Ian Smart),在这本由笔者撰写的资料中包含了本文献中所引用实例的详细分析、测试数据和硬件/软件配置。 3.10.1 所支持的加锁机制
应用系统更新行时,如果同时使用了填充因子(fillfactor)或每页最大行数(max_rows_per_page),在这一话题是插入一行时,特别是在特定的位置(即热点--"hot spot”)插入时,这些方法就变得几乎没有价值。无论何时在一个没有群聚性索引的表(即所谓“堆”表--"heap”)中进行插入时,这种插入总是插到表的最后一页中去。在Sybase ASE 11.0之中,Sybase公司提供了允许用户在分区表中把这种插入蔓延分散到跨分区里去。然而,在采用这种方式解决问题的同时,这种方法不能处理由于空间开销而不能使用堆的情况,也不能解决那些因为查询原因要把数据按着添加的顺序存放的表的问题。
随着在Adaptive Server Enterprise 11.9.2版本中增加了“追加行”的逻辑,仅对数据加锁和锁存技术的采用,使得索引访问与空间分配得以协调,从而明显提高了性能。现在通过执行这样的任务,就能够不需要再采用依靠数据库加锁的一系列复杂的传统事务就能进行表的追加。
在推出Adaptive Server Enterprise 11.9.2产品之前,在Sybase公司提供了最高性能的关系性数据库服务器产品的同时,也存在着一组特定的加锁问题限制了用户可能获得的性能。这些问题主要对那些不是针对该产品所专门设计的应用系统有所影响,可能需要在工作中逐步靠近Sybase产品,或者进行代价昂贵的性能改善以使应用系统更符合Sybase的技术特性。
随着Adaptive Server Enterprise 11.9.2新版产品的普遍上市,Sybase公司正在向广大用户提供已被证明能够解决加锁争用冲突问题的解决方案。他们既能使用户在现存的应用系统中同样达到以前所达到的非常高超的性能水平,同时又向用户提供了一系列可以解决所可能遇到的加锁争用冲突问题的解决方案。
若日志段在日志设备上,则会返回如下信息: checking syslogs The total number of data page in the table is 1. NOTICE:Space used on the log segment is 0.20 Mbytes, 0.13%. NOTICE:Space free on the log segment is 153.4Mbytes,99.87%. DBCC execution Completed.If dbcc printed error messages, Contact a user with SA role. 若日志不在它自己的设备上,则会显示下列信息: NOTICE:Notification of log space used/free. Can not be reported because the log segment is not on its own device. 例2. dbcc checktable (titles) The total number of data page in this table is 3. Table has 18 data rows. DBCC execution Completed. If DBCC printed error messages. contact a user with SA role. checkdb选项 运行checkdb选项同checktable检查的内容一样,但它是对一指定数据库中的每张表都做这样的检查。若未指定数据库名,checkdb检查当前的数据库。checkdb返回的信息,也同于checktable。
checkalloc选项 checkalloc是检查指定数据库,看其所有正确分配的页和尚未分配的页的情况。若未指定数据库名,则checkalloc检查当前数据库。checkalloc会返回已分配的和使用的空间数量。checkalloc的缺省模式为nofix,要使用fix选项,必须把数据库置于单用户模式。 例: dbcc checkalloc (pubs2) . . . alloc page 0 (#of extent=32 used pages=68 ref pages=68) alloc page 256 (# of extent=32 used pages=154 ref pages=154) alloc page 512 (# of extent=28 used pages=184 ref pages=184) alloc page 768 (# of extent=1 used pages=1 ref pages=1) total (# of extent=93 used pages=407 ref pages=407) in this database. DBCC execution completed.If dbcc printed error message, Contact a user with System Adminstrator (SA) role. tablealloc选项 tablealloc检查指定的表以确保所有页都被正确地分配。它是checkalloc的缩小版本。对单张表进行相同的完整性检查。使用tablealloc可以生成三种类型的报表:full,optimized和fast。full选项相当于表一级的checkalloc;它报告各种类型的分配错误。optimized选项基于表的对象分配映像(OAM)页里列出的分配页生成报告。它并不报告,也不能整理OAM页里没有列出的在分配页上没有引用的扩展(extent)。如果没有指明类型,或使用了null,则optimized选项是缺省的设置。fast选项,并不生成分配报告,但生成一个被引用但并没有在扩展里分配的页的额外的报告。fix|nofix选项决定tablealloc 是否整理表中发现的分配错误。对于所有的表,缺省为fix,但系统表除外,它们的缺省为nofix。要对系统表使用fix选项,必须首先将数据库置成单用户模式。 例: dbcc tablealloc(titles) 显示信息如下: The default report option of OPTIMIZED is used for this run. The default fix option of FIX.is used for this run. . . . Total #of extent=3 Alloc page 256 (# of extent=1 used pages=2 ref pages=2). Alloc page 256(# of extent=1 used pages=2 ref pages=2) Alloc page 256 (# of extent=1 used pages=2 ref pages=2) Total (# of extent=3 used pages=8 ref pages=8) in this database. indexalloc 选项 indexalloc检查指定的索引,确保所有的页都被正确地分配,它是checkalloc的缩小版本,对单独一条索引指定同样的完整性检查。其中各选项与tablealloc相同。
reindex选项 reindex选项通过运行dbcc checktable的“fast”执行方式检查用户表上索引的完整性。如果它检测出索引有问题则会删除并重建索引。在ASE的排列顺序改变之后,SA或表属主应该执行这一选项。此选项不能在用户定义的事务中运行。 例: dbcc reindex (titles) 返回信息:One or more indexes corrupt.They will be rebuilt. fix_text选项 ASE的字符集由单字节转变为多字节后,fix_text选项用于升级文本值。ASE的字符集由单字节转变为多字节字符集会使文本数据的管理更加复杂。由于文本值可能较大足以覆盖若干页,ASE必须能处理(通过页约束)可能横跨页的字符。为做到这点,服务器需要在每一文本页上添加一些信息。SA或表属主必须在文本数据的每一个表上运行dbcc fix_text,以计算所需要的新页数。
查看客户端字符集: 在isql环境中执行: 1> select @@client_csname 2> go
3.12.3 错误处理
为什么会出现字符集转换失败?
1. 当字符存在于客户端字符集中但在服务器字符集中不存在时,Adaptive Server的字符集转换将报告转换错误,反之亦然。 用户会碰到下面的错误消息: Msg 2402,Severity 16 (EX_USER): Error converting client characters into server's character set. Some character(s) could not be converted. 转换错误会阻止插入与更新语句的执行。如果发生此情况,请检查数据中有问题的字符并替换它们。
2. 当客户端发送数据时Adaptive Server遇到转换错误,它用ASCII码的问号(?)代替可疑字符所占字节,但查询批处理继续进行直到完成为止。 语句完成后,Adaptive Server将发送一下消息: Msg 2403,Severity 16 (EX_USER): WARNING! Some character(s) could not be converted into client's character set. Unconverted bytes were changed to question marks (`?')。
4.1 为什么数据库事务日志满了,使用dump tran with no_log仍不能截断日志? 有两种情况,可能出现这个问题。一是应用系统给ASE发送了一个用户自定义事务,一直未提交,这个最早活跃事务阻碍系统截断日志。二是客户端向ASE发送了一个修改数量大的事务,清日志时,该事务还正在执行之中,此事务所涉及的日志只能等到事务结束后,才能被截掉。 对于第一种情况,只要督促用户退出应用或者提交事务,系统管理员便可清掉日志。因为给AS E发送Dump transaction with no-log或者with truncate-only,它截掉事务日志的非活跃部分。所谓非活跃部分是指服务器检查点之间的所有已提交或回退的事务。而从最早的未提交的事务到最近的日志记录之间的事务日志记录被称为活跃的。从此可以看明,打开的事务能致使日志上涨,因为在最早活跃事务之后的日志不能被截除。 对于第二种情况,道理也同上。只是在处理它时,需慎重从事。如果这个大事务已运行较长时间,应尽量想法扩大数据库日志空间,保证该事务正常结束。若该事务被强行回滚,ASE需要做大量的处理工作,往往是正向执行时间的几倍,系统恢复时间长,可能会影响正常使用的时间。 4.2 如何后备数据量大于2GB的数据库 当在后备数据量大于2GB的数据库时,可能会遇到以下错误: o I/Oerror: o operating system error,server device /backup/data. code 27 messages o file too large.
这是由于后备文件的大小超出了操作系统的用户最大文件限制。而有些操作系统不支持大于2GB的文件,这时可以使用Backup Server将一个数据库后备到多个文件中。 • dump database pubs2 to "/usr/sybase/pubs2_dump.1" • stripe on "/usr/sybase/pubs2_dump.2" • stripe on "/usr/sybase/pubs2_dump.3" • go • 这种方法还可以提高后备及恢复的速度,但注意恢复也必须用相应多的设备。例如: 1>load database pubs2 from "/usr/sybase/pubs2_dump.1" 2>stripe on "/usr/sybase/pubs2_dump.2" 3>stripe on "/usr/sybase/pubs2_dump.3" 4>go 4.3 如何更改ASE名称(在UNIX、OPENVMS平台上) 在SYBASE产品中没有特定的函数或者存储过程用来更改ASE Server的名称,因此,只能手工修改某些参数或者配置来完成此任务。
结果与结论: 1. 经过修改的程序可以正确的BCP OUT出大于2G的文件。 2. 由于采用管道方式做BCP OUT,性能略有下降。 3. 需要注意,BCP IN 超过2G的大文件,也需要使用管道的方式。所以调用BCP IN 的C 程序也需要修改。 4.5 如何将ASE SERVER移植到同种平台(相同操作系统)的系统上 提示: N1 这里所列出的所有步骤,并不需要按顺序执行,只是表明了在实验中成功完成这项任务的顺序。 N2 SYBASE 提示您保留直至今日的ISQL脚本,包括建立login、create database、disk init等等。使用这些脚本会使您完成这项任务更加容易。这些脚本也可以通过master中系统表的内容来重新生成,可能会繁琐一些。 N3 成功的关键在于目标系统中系统表的字段与源系统中相应系统表的字段相同。特别是:syslogins与sysdatabases中的'suid 以及 'dbid';sysusages中所有行的segmap、lstart以及size。 请在数据源系统上执行以下操作: 对所有的数据库进行数据一致性检查(DBCC),并后备所有的用户数据库。 保留master 数据库中数据表的内容,使用select * from table_name命令: sysdevices,sysusages,sysdatabses syslogins,sysservers,syssvrroles,sysloginroles,sysremotelogins 对于sysusages 表,请使用以下命令: select * from sysusages order by dbid,lstart 对于sysdatabases 表,请使用以下命令: select * from sysdatabases order by dbid 使用bcp命令拷贝(2)中所列出的系统表内容。 Unix:bcp master..table_name out file_name -Usa -Psa_password -c Vms:bcp master..table_name out file_name /username="sa"/sa_password/char 保留sp_configure命令的执行结果 请在目标系统上执行以下操作: 安装并配置新的ASE和Backup Server。 确认所指定的master、tempdb、sybsystemprocs大小至少等于数据源系统上相应数据库的大小,同时确认与数据源系统相同的语言模块以及字符集。 启动ASE,使之处于正常工作状态。参照数据源系统的配置(4中保留的执行结果)修改目标系统配置与之相同,并确认'device'参数值至少等于源系统此参数值。 在model、sybsystemprocs数据库中任意执行几个动作以判断数据库工作正常。请不要添加用户、角色、修改系统表。 重启ASE以测试新配置有效。 执行以下操作: 1> use master 2> go 1> sp_configure "allow updates",1 2> go 重启ASE。 使用bcp命令拷贝(2)中所列出的系统表内容。 Unix:bcp master..table_name in file_name -Usa -Psa_password -b 1 -c Vms:bcp master..table_name in file_name /user="sa"/sa_password/char/batch=1 建数据库设备,大小至少等于源系统中相应数据库的大小。 运行create database和alter database的脚本(或者使用命令行)。注意create、alter顺序要与源系统create、alter顺序一致,并使用与之相同的参数。完成后请对比源系统与目标系统中的sysdatabases、sysusages,使之完全相同,否则要重新做12这步工作。(请参照N3提示)注意: 在10.0以及更高版本中segmap字段在做了数据库load之后会被修改。 在确定需要相同的dbid时,则要采用与在源系统中create、alter相同的顺序,在目标系统中做create、alter,并且使用相同的参数值。而这种需求仅仅是当数据库中某些objects要参考不同的数据库中的objects才会采用的。另外,这种需求只有在每一个数据库中都被采用,完成的结果才会使得sysusages表中的segment、lastart、size字段,或者是fragment与源系统中数值相同。运行以下命令,与原系统的输出进行比较: select * from sysusages order by lstart load用户数据库并执行dbcc检测。 执行以下操作: 1> sp_configure "allow updates",0 2> go 重启ASE。 后备master库以及用户数据库。 4.6 如何扩展master数据库空间 master数据库只能扩展在master设备上.那么当master设备已经没有足够的空间可使用时,请按以下步骤操作: (此操作过程是以UNIX操作系统为例.SYBASE安装路径为/sybase) 1.备份master数据库 启动backup server,进入isql环境执行: 1>dump database master to '/sybase/master.dump' 2>go shutdown SQL/ASE Server 1>shutdown 2>go 2.创建新的足够大的master设备 $buildmaster -d<master_device> -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 4.7 Invalid tdslength value
Error such as: 00:00000:00000:2001/03/22 16:10:07.80 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1310740 00:00000:00000:2001/03/22 16:10:20.87 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1376277 00:00000:00000:2001/03/22 16:10:51.27 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1441814 00:00000:00000:2001/03/22 16:15:38.22 kernel ksmask__rpacket: Invalid tdslength value 21536, kpid: 1507351 It can be a heavy network traffic. Indicated that this message is an informational message that comes from the network. Possible causes may be: the size of the packet that the server has received is different to the size that was sent by the client, ksmask__rpacket: The SQL Server does not validate the size of incoming TDS network packets. Bad incoming data may cause waiting processes to hang as the server waits for a very large amount of data on a network socket. When a corrupt TDS packet has been received, due to tcpip sending begining of another TDS packet before finishes sending the current TDS packet, the server terminates the process and outputs the above message. Kernel error "ksmask__rpacket: Invalid tdslength" indicates that tcp/ip has sent a corrupt TDS packet to sqlsvr. Troubleshooting the error: -max network packet size -additional network memory -any changes made to network recently
Increasing the network memory could be a solution. I can think of a situation where there is no memory left so the server is unable to store the new packets. This could lead to invalid tdslength. There are some cases where increasing network packet size and the additional network memory solved the problem. In other cases, no further action was required as the message did not re-appear. You can use sp_configure to increase the max network packet size and additional network memory, and also check if there's any issue with the network. max network packet size:取决于应用中需要发送的数据包的大小。 additional network memory= max network packet size+ max network packet size*0.02 (并且使此数值为2048的倍数。) 4.8 如何将master设备从UNIX的文件系统移到裸分区
1. Turn off asynch io 1> sp_configure "allow sql server async i/o", 0 2> go You will need to reboot your server for this to take affect. 2. Mirror the master device to the new raw partition. 1> disk mirror name = "master", 2> mirror = "absolute path to new master raw partition" 3> go 2. Unmirror master (this will permanantly break the mirror to the master device (If you want to expirement, you can set mode = retain and remirror a few times. See Reference Manual for syntax). 1> disk unmirror name = "master", 2> side = "primary", 3> mode = remove 4> go 3. Shut down your SQL Server. In your run server file, there is a "-d" flag that has the path to your old master device. Change this to the path for the new master device. 4. Restart your server and turn on asynch io. 1> sp_configure "allow sql server async i/o", 1 2> go 5. Shutdown and restart your server one more time to enable the asynch io. Verify that your server is using asynch io by looking at the start up sequence in the errorlog.
NOTE: It is best to perform this task with the server in single user mode. You can do this while you recycle your server to disable asynch io in step 1 above by adding a "-m" to your run server file. Be sure to remove the flag when you are finished. 4.9 如何生成bcp命令文件(以pubs2为例) 本文适应于isql 11.*, 可通过isql -v得到版本 • 编辑一个文本文件select.sql,内容如下: set nocount on use pubs2 go select "bcp pubs2.." + name + " out " + name + ".bcp -Usa -P -c " from sysobjects where type="U" go • 如果是unix, 执行: isql -Usa -P -b -i select.sql -o bcpout chmod +x bcpout • 如果是Windows, 执行: isql -Usa -P -b -i select.sql -o bcpout.bat 将select.sql中的out换为in, 重复以上步骤即可得到bcp in的命令文件 4.10 如何动手修改interfaces文件
可以修改的信息其实主要就是主机地址和端口号,所以,如果需要,只要按照以上格式修改其中信息即可。 4.11 关于tempdb的优化 缺省情况下,tempdb数据库是放置在master设备上,容量为2M,而临时数据库是活动最为平凡的数据库常常被用来排序、创建临时表、重格式化等操作,所以tempdb的优化应该受到特别的关注。 第一步:将临时数据库与高速缓冲进行绑定。 由于临时表的创建、使用,临时数据库会频繁地使用数据缓存,所以应为临时数据库创建高速缓存,从而可以使其常驻内存并有助于分散I/O: 1、创建命名高速缓存 sp_cacheconfig “tempdb_cache”,”10m”,”mixed” 2、重新启动server 3、捆绑临时数据库到tempdb_cache高速缓存 sp_bindcache “tempdb_cache”, tempdb 4、若有大的I/O,配置内存池 第二步:优化临时表 大多数临时表的使用是简单的,很少需要优化。但需要对临时表进行复杂的访问则应通过使用多个过程或批处理来把表的创建和索引分开。以下两种技术可以改善临时表的优化 1、在临时表上创建索引 1) 临时表必须存在 2) 统计页必须存在(即不能在空表上创建索引) 2、把对临时表的复杂的使用分散到多个批处理或过程中,以便为优化器提供信息 下面的这个过程需要进行优化: create proc base_proc as select * into #huge_result from auths select * from article, #huge_result where article.author_code= #huge_result.author_code and sex=”0” 使用两个过程可以得到更好的性能 1) create proc base_proc as select * into #huge_result from auths exec select_proc 2) create proc select_proc as select * from article,#huge_result where article.author_code=#huge_result.author_code and sex=”0” 说明:在同一个存储过程或批处理中,创建并使用一个表时,查询优化器无法决定这个表的大小。 4.12 ASE12.5.x的一条有用的命令: disk resize syntax:
disk resize name='device_name', size=additional_space
After using this command,you could alter database on the device that you just resize to add dev additional_space .Then we need not use command of 'disk init'.
4.13 如何更改字符集为cp936 (这里SYBASE的安装路径为c:\sybase) 1.c:\>cd \sybase\charsets\cp936 2.c:\sybase\charsets\cp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936 3.在SQL环境中 1>select name,id from syscharsets 2>go 找到name为cp936对应的id(假设为117) 4.1>sp_configure "default character set id",117 2>go 5.重启server两次 (注:第一次启动后,server会自动宕掉,需要第二次重启后才能使用)
• CASE 1: basis_dlock: file '/sybase/master.dat' already in use by a SQL Server kernel kdconfig: unable to read primary master device kernel kiconfig: read of config block failed 检查server是否已经启动( showserver, ps -u sybase 或NT service ) • CASE 2: dopen: open '/sybase/master.dat' failed, permission denied kernel kdconfig: unable to read primary master device kernel kiconfig: read of config block failed 检查master设备文件的所有者及权限
• CASE 3: ninit: All master network listeners have failed. Shutting down 检查network ip 及 port配置 ( netstat -a )
• CASE 4: kernel:kscsinit: connectivity library error. Operation: cs_ctx_alloc(). o 检查操作系统参数是否已经修改并重新启动操作系统 (参见安装手册) 若操作系统异常宕机,ASE未启动而$SYBASE/<server_name>.krg已经存在, 删除该文件
[ERROR] Can't allocate space for object 'syslogs' in database 'master' because the 'system' segment is full. If you ran out of space in syslogs, dump the transaction log. Otherwise, use ALTER DATABASE or sp_extendsegment to increase the size of the segment. [WORKAROUND] 1.在RUN_servername的文件中添加标识 : -T3607 (编辑RUN_servername文件,在文件末尾添加以上标识) 2.启动ASE (要直接运行文件RUN_servername,且该运行窗口在执行以下操作时不能关闭) 3.截断日志 1>dump tran master with no_log 2>go 4.停止ASE服务 1>shutdown 2>go 5.删除RUN_servername文件末尾的标识 : -T3607 6.重新启动ASE
5.1.4 SQL Server 10.x配置内存过大、Server不能启动时怎么办? SQL Server使用的内存与机器的内存总数有一定的比例关系。如果Server使用内存太小,影响到SQL Server的性能,但内存配置过大超过一定比例时,导致SQL Server不能启动。 在ISQL中,用sp_configure “memory”可以看到你的Server现在使用的内存大小。这个数字单位为Page,每一个Page为2K。参数memory在启动Server时被读入内存。所以memory被修改之后,必须shutdown Server,再重新启动Server,新的参数才生效。 1>sp_configure "memory",number_of_memory 2>go 1>reconfigure with override 2>go 1>shutdown with nowait 2>go 如果新的内存配置太大,SQL Server不能启动,那么必须修改Master设备上的内存配置参数。 在$SYBASE/install目录下,使用buildmaster命令 $buildmaster -d/path/master.dat -y cmemsize = XXX 其中XXX为内存页数。如果新的内存大小合适,SQL Server可以启动。 5.2 数据库被挂起 5.2.1 如何解决数据库被挂起的问题(error 926) 现象:Error 926 Severity Level 14 Error Message Text Database 'xx' cannot be opened - it has been marked SUSPECT by recover Explanation (1) 当你使用Transact_SQL命令操作这个数据库的数据时, 出现这个信息, 这是一个严重的错误, 如果你要使用这个数据库的数据, 必须改正这个错误. (2) 启动Backup Server, 后备master数据库
提示2: 在使用disk reinit命令时,将覆盖SYBASE DEVICE(请参照以下语法),安全的做法是size值使用裸分区或系统文件的大小的最大值。如果使用的是UNIX裸分区,即使你不能确认SYBASE DEVICE最初大小是不是最大值,都要使用裸分区大小的最大值。 步骤: 获得将要被恢复的SYBASE DEVICE的信息。 这些信息被用来重建sysdevices,sysusages以及sysdatabases。 从error log的server启动信息中获得SYBASE DEVICE的设备名、指定路径。 使用裸分区或系统文件的大小的最大值作为SYBASE DEVICE的 大小。 以上信息也可以通过最近的sysdevices系统表的内容来获得。如果 对此信息怀有疑问,还是使用以上的方法比较稳妥。 做操作系统级的SYBASE DEVICE后备。UNIX操作系统,使用"dd"命令实现。 配置一个新的ASE Server。在以后的步骤中会用到这个新的master。 如果需要,请再配置一个Backup Server。 用单用户模式启动Server。 运行disk reinit,用来重建sysdevices系统表,而没有重新初始化SYBASE DEVICE。 语法如下: disk reinit name="device_name", physname="physical_name", vdevno=virtual_device_number, size=number_of_blocks 完成后,请查看error log。 确认重建的sysdevices系统表中信息正确: ——select * from sysdevices 比较表中的信息是否与error log或者保留的sysdevices中的信息相同。 运行disk refit,用来重建sysdevices以及sysdatabases。 用法如下: use master go disk refit go 查看error log中是否有错误提示。 当disk refit完成后,会自动shut down ASE Server。 确认重建的系统表的信息是否正确: ——单用户模式启动ASE Server ——select * from sysusages、select * from sysdatabases ——sysusages系统表看起来是否正确?可以和以前保留的的信息进行比较。如果没有这种可能,那么应该保证不出现显而易见的错误。例如:是否缺少dbid;是否缺行;是否对于一个数据库来说只有segmap=4(表示为日志行)的行等等。 ——sysdatabases系统表看起来是否正确?是不是没有显而易见的错误? 11、 启动ASE Server,查看是否所有的数据库都已经正常恢复。 对所有的库做dbcc检查。 对所有库做后备。 请参考《Trouble Shooting Guide》 5.3.3 如何恢复master数据库
ASE can't setup and has no valid dump of master 1、编辑RUN_servername 在命令行最后加入:-T3607 2、单用户模式启动ASE $cd install $startserver -f RUN_servername -m 3、bcp out系统表 $bcp master..sysdevices out /directory.spec/devs -Usa -P -c $bcp master..sysdatabases out /directory.spec/dbs -Usa -P -c $bcp master..sysusages out /directory.spec/usages -Usa -P -c $bcp master..syslogins out /directory.spec/logins -Usa -P -c $bcp master..sysconfigures out /directory.spec/configures -Usa -P -c $bcp master..syscharsets out /directory.spec/charsets -Usa -P -c 4、shutdownASE 5、创建新master设备 $buildmaster -d<path_to_new_master_device> -s<new_master_device_size> (new_master_device_size以2K为单位) 6、编辑RUN_servername 将指定master设备指定为新创建的master设备,并删除在第1步中增加的参数。 7、删除/directory.spec/dbs、/directory.spec/usages文件中有关master、tempdb、model的内容。 8、单用户模式启动ASE $cd install $startserver -f RUN_servername -m 9、 bcp in系统表 $ bcp master..sysdevices in /directory.spec/devs -Usa -P -b 1 -c $bcp master..sysdatabases in /directory.spec/dbs -Usa -P -b 1 -c $bcp master..sysusages in /directory.spec/usages -Usa -P -b 1 -c $bcp master..syslogins in /directory.spec/logins -Usa -P -b 1 -c $bcp master..sysconfigures in /directory.spec/configures -Usa -P -b 1 -c $bcp master..syscharsets in /directory.spec/charsets -Usa -P -b 1 -c 10、shudown ASE 11、执行installmaster脚本 $isql -Usa -P < $SYBASE/scripts/installmaster 12、启动ASE 5.3.4 如何移植master设备 以下步骤说明了如何将master设备移植到不同的磁盘上。在执行此项任务的同时,请参看SYBASE的相关文档(Technical Documents#1324 entitled "Segment Remapping with Load database When Moving a Database")。请注意,在执行buildmaster之前,要停止ASE的应用。
成功的关键在于,新建的sysusages系统表中每一行内容与旧的sysusages系统表内容相符。 对master库做dbcc检查,并后备master库。 执行select * from table_name命令,并保留其输出内容。其中,table_name包括:sysdevices、sysusages、sysdatabases。同样,可以使用bcp命令来实现。 执行sp_configure命令,并保留其输出内容。 拷贝$SYBASE/server_name.cfg文件,以做保留。 Shut down SQL/ASE Server。 执行以下命令,创建一个新的master设备: UNIX:buildmaster -d<master_device> -ssize VMS:buildmaster /disk=<master_device> /size=size (size以页为单位,1页=2K) 编辑RUN_server_name文件,-d(UNIX)或/device(VMS)参数指向新建的设 备名。 单用户模式启动SQL/ASE Server: UNIX:startserver -f RUN_sever_name -m VMS:startserver /server=server_name /masterrecover 执行select * from sysdevices命令,并保留其输出内容。 确认新建的sysusages系统表中每一行内容与旧的sysusages系统表内容相符,而且在配置好Server之后,没有做过alter database,那么系统表sysusages的内容是正确的。如果做过alter database,则要按原来的顺序执行这些脚本,如果没有脚本,就要到保存的sysusages系统表的信息中找到alter database的参数。 Shutdown SQL/ASE Server,并用单用户模式启动Server,查看sysusages系统表内容是否正确。 如果所配置的Backup Server名称不是SYB_BACKUP,则要执行: 1> sp_configure "allow updates",1 2> go 1> update sysservers set srvnetname="name in interfaces file" where srvname="SYB_BACKUP" 2> go 装载master库。如果新master设备的大小与旧设备大小不同,则Server会Shut down。请注意新的系统表将会被重写,而且你需要调整Sysdevices系统表中master设备的大小。请执行以下两步: 用单用户模式启动Server. 如果新设备大小与旧设备大小不同,请执行: 1> sp_configure "allow updates",1 2> go 1> update sysdevices set high=nnnn where name="master" 2> go 其中nnnn是以页(2K)为单位的master设备的大小,此值可以从保留的sysdevices系统表的信息中找到。如果所建的设备比旧设备大,请执行:1)创建一个与master设备差不多大的数据库,这样做的目的是重新初始化分配页,使得整个master设备可用。2)删除这个数据库。 重启Server。 后备master数据库。 注意: 在装载master库之前要确定ASE此时的字符集和语言模块与后备master库时的字符集和语言模块相同。 在执行此任务之前和完成以后使用sp_helpsort查看字符集与语言模块是否相同。 5.3.5 如何重建sybsystemprocs系统数据库 依照以下步骤可以实现移动sybsystemprocs系统数据库以及设备的任务。同时这个过程也可以用来扩建sybsystemprocs系统数据库。
以下过程中所提到的语法结构,可以参看SYBASE相关资料。
SYBASE提醒您,在修改系统表时,ASE要以单用户模式运行,同时要以"sa"用户登录。 保留驻留在sybsystemprocs系统数据库中自定义的存储过程脚本。 单用户模式启动ASE,执行: 1> sp_configure "allow updates",1 2> go 1> reconfigure with override(10.0版本以上,省略此步) 2> go 删除sybsystemprocs系统数据库: 1> use master 2> go 1> drop database sybsystemprocs 2> go 在重建sybsystemprocs系统数据库之前,不要创建任何其他数据库。 删除sysdevices系统表中有关sybsystemprocs系统数据库的信息: 1> begin tran 2> delete from sysdevices where name="sysprocsdev" 我们假定sysprocsdev是默认的sybsystemprocs系统数据库设备名。 3> select * from sysdevices 确定删除是否正确有效,如果正确,执行: 4> commit tran 否则,执行: 4>rollback 重启ASE. 创建sybsystemprocs系统数据库设备: 1> disk init name="sysprocsdev",physname="physical_path",vdevno=4,size=25600 2> go 其中size是以页为单位(512页=1M)。 sybsystemprocs系统数据库设备的vdevno应该是4,ASE在单用户模式下4不能被重新利用,所以如果以上语句执行时出现问题,请重启ASE。 sybsystemprocs系统数据库: 1> create database sybsystemprocs on sysorocsdev=50 2> go 在sysdatabases系统表中,sybsystemprocs系统数据库的dbid=4,如果在重建 sybsystemprocs系统数据库之前,没有创建任何其他数据库。 以多用户模式启动ASE,并执行: 1> sp_configure "allow updates",0 2> go 3> reconfigure with override(10.0版本以上,省略此步) 4> go 运行installmaster脚本: %isql -Usa -Psa_password -Sserver_name -n -iinstallmaster -o< output_file installmaster脚本在$SYBASE/scripts路径下。 重建sybsystemprocs系统数据库中的用户自定义存储过程 。 5.3.6 如何挽救 corrupt table 中的数据 [此文仅供参考] */设置数据库隔离级别: sp_setsuspect_granularity [dbname[,{"database"|"page"}[,"read_only"]]] 强制脱机数据库/数据页联机: sp_forceonline_db dbname,{"sa_on"|"sa_off"|"all_users"} sp_forceonline_page dbname,pgid,{"sa_on"|"sa_off"|"all_users"} 获取有关脱机数据库/页的信息: sp_listsuspect_db sp_listsuspect_page [dbname] How to patch a corrupt table and save its data platform: general product: ASE written by: Hunter Liu last update time : Dec.17,1998
(1) isql -Usa -P to log into sql server and enter following commands 1> sp_role "grant","sybase_ts_role",sa 2> go 1>quit 2>go (2) relogin into sql server with sa (3) enter these commands in isql: 1> use your_database 2 > go 1> select first ,root ,indid from sysindexes 2> where id=object_id("table_name") 3>go choose a line from the output of which the indid is neither 0 nor 1, and pick up the value of its root. this is the root page number of this index btree,next we will use root_page_number to represent it and indid for its index id. (4) find a page number which is on the data pages chain 1>dbcc prtipage(database_name,table_name, indid,root_page_number) 2>go (4.1) read the last line of this dbcc output ,it is like: index row at offset XX points to page XXXX. take the page number xxxx and issue above command again : 1>dbcc prtipage(database_name,table_name,indid,XXXX) 2>go repeat this step until the dbcc output looks like this: leaf row at offset xxxxx points to data page nnnnn,row number xxxx. this meens that we reach the leaf-level pages of this index btree, so you choose a line from its output and read out the page number, which is a data page of this table. (5) from the data page (nnnn), you walk along the data page chain of this table until we get to the begin, the first page of its database chain. 1>dbcc pglinkage(supportdb,nnnn,0,2,0,0) 2>go the last number of this page number list is the first page of this table. make sure the object id displayed is correct. (6) update the first column of this table in sysindexes 1>update sysindexes set first=new_first_page where id=object_id('table_name') 2> and indid=0 3>go (7) use select count(*) from table_name to test our work. (8) select * into new_table from table_name. (9) drop the old corrupt table. 5.3.7 Recovering the master Database or Master Device under ASE 12.5 This TechNote describes the new procedure you need to use to load the master database, or recover from master database or device corruption in Adaptive Server Enterprise 12.5. The disaster recovery procedures differ from pre-12.5 servers.
Contents 1. Background 2. Before You Begin 3. Loading an Older Copy of master Database 4. Recreating the master Database 5. Recreating the Master Device 6. Manually Setting the Backup Server Name
Section 1. Background Starting with Adaptive Server version 12.5, there is no buildmaster program to build the master device. Rather, this functionality has been incorporated into the dataserver (unix) and sqlsrvr (Windows) programs. The server now allows you to create master devices and databases with 2K, 4K, 8K or 16K logical page sizes. Due to these and other changes, you cannot use the instructions provided in the ASE Troubleshooting and Error Messages Guide (EMTSG) for disaster recovery tasks like recovering the master database or device. This TechNote explains how to perform disaster recovery in the 12.5.x server. It is applicable to ASE 12.5.0.1 IR and higher versions. Note: The EMTSG instructions still apply to the pre-12.5 servers.
Section 2. Before You Begin This document describes three key maintenance and disaster recovery tasks: • Loading an older copy of your master database. This assumes that both the master device and master database are intact and free from corruption. • Recovering from a corrupted master database. This assumes that the master device is intact. • Recreating a master device and all its databases. Some points to note before using this information: • This material applies only to ASE 12.5.x and higher. It has been verified with ASE 12.5.0.1 Interim Release (IR), and it is recommended that you use the procedures with this release (or later). For 12.0 and prior versions, use the instructions provided in the ASE Troubleshooting and Error Messages Guide, "System Database Recovery." • This material assumes that your Adaptive Server was installed with your platform's default sort order. If you have installed a non-default sort order, you must ensure that your (restored) server uses the correct sort order and character set to reflect that in the dump. Refer to the ASE Troubleshooting and Error Messages Guide, "System Database Recovery," section titled "Valid Dump with Non-Default Sort Order" for details; and note that in Step 3 of that section, the sybinit utility has been replaced by the dsedit/dscp utilities. • All SQL command examples in this document use Transact-SQL syntax. All command-line examples are unix commands; Windows users can find the equivalent NT syntax in ASE Utility Programs for Windows and Windows NT. • Starting with 12.5, the dataserver command allows a space between option and parameter. • The examples in this document assume that - the dataserver binary is located in $SYBASE/bin/dataserver - the master device is $SYBASE/d_master.dat Replace this location and device name with those appropriate for your site. • The server must be in single-user mode (that is, started with the -m flag) to load the master database. In this mode only the master database can be loaded. • You can only load a dump of master that matches your server level. Loading an older version dump to a newer server is not permitted. • You can use these procedures regardless of which version of the server you were using when you created your old master device. The server will find and correct any placement differences between the old and recreated databases. • After the load completes but before shutting down, the server does some post-processing to reconcile the newly loaded sysdatabases and sysusages tables against the information in the master device. At this time the server may print a variety of error messages regarding failures to use or find the master database, and/or attempts to insert duplicate keys or duplicate rows to sysusages. Ignore these messages; they occur only during the reconciliation phase, and will not affect the server's operation after it shuts down and is restarted. Section 3. Loading an older copy of master database Use the following steps if your master database and the master device are intact, and you simply wish to load an older dump of your master database. Note: Be sure to read Section 2, Before You Begin. Step 1: Put the Server in Single-user Mode Shut down and restart the server with the -m flag, which places the server in single-user mode and sets up to load the master database: % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -m Step 2: Establish the Backup Server Name This step is necessary to ensure that Adaptive Server has access to its backup server for dumps and loads. Follow the instructions detailed in Section 6, Manually Setting the Backup Server Name. Step 3. Load the master Database Issue the following isql command: 1> load database master from "master_db_dump" 2> go Adaptive Server shuts itself down after the load is complete.
Section 4. Recreating the master Database Use this procedure when the current master device is usable, but you are unable to use the server because of master database corruption. These steps enable you to create a new master database and reload it from backup. Step 1. Create a New master Database The approach to creating the new master database depends on the extent and nature of the corruption. Three different scenarios are possible: • Basic recreation, which is sufficient if only the data in master was affected. The server reads the master device to determine page and device sizes. • Recreating when the device's configuration area is corrupted. You will need to provide page and device sizing information. • Recreating when the master database allocation pages are also corrupted. All corrupt or unallocated extents on the device are allocated to master. Basic Recreation of master Database This command instructs the server to read the device's configuration area to obtain page size and device size and determine where to place the master database: % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -w master The server creates a master of the same size, and in the same locations on disk, as the database it is replacing. It will NOT have the old database's data! Instead, it contains a default set of data that you will replace later via load database. The default data includes information about any databases existing on the master device (but no other devices). It also has minimal system information, including a login for sa with a null password. This process produces a large number of "upgrade" messages tracking the progress of database creation which are helpful in troubleshooting any problems. They are "upgrade" messages because the server creates a new master database by "upgrading" the device. Note: If the configuration area is corrupt or unavailable, this command returns the message: "The configuration area in device 'xxx' appears to be corrupt. The server needs this data to boot, and so cannot continue." If this occurs, continue with the instructions below. Recreation with a corrupt configuration area The "Basic Recreation" process above may fail if the device's configuration area has become corrupt. If so, you must supply sizing information. You will need two parameters: the page size (you need to know what this was), and the device size, which you can determine directly from the device: % ls -l $SYBASE/d_master.dat Divide the size shown by the page size (2048, say) to obtain the number of server pages, by 1024 to obtain KB, or by 1048576 to obtain MB. Provide this information on the command line as follows: % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -w master -z page_size -b device_size For example, if your page size is 2K and the device size is 51204 server pages (100 MB, plus 8K space for the configuration area), the command looks like this: % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -w master -z 2k -b 51204 You may also specify the device size as Kb, Mb, or Gb; for example, "-b 100M". Recreation when master database allocation pages are corrupted If the above procedures for recreating the master database fail, the database's allocation pages are corrupt. (This may happen, for instance, if the database device was inadvertently written over by a completely different file.) In this case, you can force the server to allocate all corrupted or unallocated extents to the master database: % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -w master -f This allocates ALL corrupted or otherwise unrecognizable extents to the master database. Depending on the extent of your master device corruption, and how much free space it originally had, this will probably leave master much larger than it needs to be, causing it to occupy space that used to belong to other databases like model, tempdb, and sybsystemdb. We will consider recovering from that situation later. Note: You may combine the -f, -b, and -z options as necessary. Step 2. Restart the Server in Single-user Mode The server shuts down after recreating the master database. Restart it with the -m flag, which places the server in single-user mode and sets up to load the master database: % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -m Step 3: Account for Missing Databases (if you used the -f option) Note: You only need this step if you used the -f option in Step 1 to recreate the master database due to allocation page corruption. If you did not use -f, proceed to Step 4. Recall that the -f command line option could make the new master larger than needed at the expense of other required databases on the master device. You will need to check for these databases before proceeding. This step has many possible permutations, so you must know what databases should be on the master device to perform this step. For example, if you had moved tempdb to a different device, you will not need tempdb on the master device. If upgrading, you may well have created sybsystemdb on a device other than master; if so, you will not need to account for sybsystemdb. Log in as sa, and check the databases currently on the master device: 1> select name from sysdatabases 2> go Do you see all the databases that should be on the master device? If so, skip the rest of this step. Otherwise, you will need to determine which databases are missing and how big they should be, then obtain the free space needed to recreate these databases. The following isql script obtains the required space by removing it from the end of the master database. In order, it • establishes how many logical pages the missing databases need • subtracts that number from the pages that master occupies • removes disk usage entries for parts of master above that limit • restricts the highest logical chunk of master such that its total size leaves the required number of pages free. You will need to provide the required space value, denoted as "@needed_mb". Note: This sample script is provided to assist you with the disaster recovery task. It is not officially supported by Sybase. 1> declare @needed_mb int, @needed_pages int, @master_end int, 2> @pgspermb int 3> select @pgspermb = (1048576 / @@maxpagesize) 4> select @needed_mb = 12 -- replace '12' with required space value 5> select @needed_pages = @needed_mb * @pgspermb 6> select @master_end = sum(size) - @needed_pages 7> from master.dbo.sysusages 8> where dbid = 1 9> if (@master_end > (6 * @pgspermb)) 10> begin 11> delete master.dbo.sysusages 12> where lstart > @master_end 13> update master.dbo.sysusages 14> set size = @master_end - lstart 15> where dbid = 1 16> and lstart = (select max(lstart) from master.dbo.sysusages 17> where dbid = 1) 18> end 19> else 20> begin 21> print "Can't take enough space from the master database!" 22> print "Need to find %1! pages", @needed_pages 23> print "That would leave master with %1! pages", @master_end 24> print "Cannot continue." 25> end 26> go Note: If the procedure fails, your master device is not big enough to hold all the databases you are trying to create. Check the required MBs of space that you specified. If it is correct, it may be necessary to create a new master device using the instructions in Section 5, Recreating the Master Device. You now have enough space to recreate your required databases. Create them one at a time. For example: 1> create database model on default = 3 2> go Repeat for each database. Then shut down the server, and restart it in single-user mode using step 2 above. Step 4. Establish the Backup Server Name This step is necessary to ensure that Adaptive Server has access to its backup server for dumps and loads. Follow the instructions detailed in Section 6, Manually Setting the Backup Server Name. Step 5. Load the master Database Issue the following isql command: 1> load database master from "master_db_dump" 2> go Unlike during a normal database load, the server may need to perform a lot of extra work, because master contains information about the identity and location of your other databases; that information may have changed for this master device, and the server must check and update it as necessary. At the end of this step, the server contains correct disk usage information about the master device. This may differ from the information in sysusages in the dump, so the server will find and correct both the size and location information for the databases. Any entries for parts of databases that don't actually exist on master will be removed. During post-processing from the load, you may see one or more errors from the server. Read Section 1, Before You Begin, for more information about these errors. After checks and validations are complete, the server will shut down. You may now restart it normally. Step 6. Did you recreate any databases in step 3 above? If you recreated databases using the procedure in step 3 above, load those databases. You must restart the server without the -m flag in order to accomplish this.
Section 5. Recreating the Master Device Use these steps when the disk that used to contain your master device is not accessible, and you need to start over with a new device. This situation is somewhat similar to the scenario in Section 4 above in which the master device becomes so corrupt that you need to use the -f option, because you will need to know what databases used to be on your master device and how big they were so you can validate and recreate them as necessary. Step 1. Create your new master device When creating the new master device, make sure you use the same page size as your old master device and make the new device at least as large as the old one. The following example creates a device with a 2048-byte logical page size, and total size 100 Megabytes + 8 Kilobytes (the 8 KB is extra space for the configuration area.) % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -z 2k -b 51204 Use the -s option with this command to specify the server name. You can also specify the "-b" size in Kb, Mb, or Gb. In the above example you would use "-b 100.00782M". Without one of the K, M, or G modifiers, the default device size is expressed in server virtual pages, 2048 bytes each. At device creation, the server issues large numbers of "upgrade" messages tracking its progress; these messages help troubleshoot any problems. They are upgrade messages because the server creates a new installation by doing an "upgrade" of a device that it has just created. When finished, the server shuts down. You now have a master database containing minimal system information, including an sa login whose password is null, and minimally sized master, model, tempdb, and sybsystemdb databases. Step 2. Put the Server in Single-user Mode Shut down and restart the server with the -m flag, which places the server in single-user mode and sets up to load the master database: % $SYBASE/bin/dataserver -d $SYBASE/d_master.dat -m Step 3. Establish the Backup Server Name This step is necessary to ensure that Adaptive Server has access to its backup server for dumps and loads. The new master database contains a default Backup Server entry of SYB_BACKUP for srvnetname, which is probably wrong. Since the sp_addserver procedure is not available at this time, log in to the server as sa and update sysservers directly: 1> update master.dbo.sysservers 2> set srvnetname = "backup_server_name" 3> where srvname = "SYB_BACKUP" 4> go (1 row affected) Step 4. Load the master Database Issue the following isql command: 1> load database master from "master_db_dump" 2> go The server inspects the master device and makes any corrections needed in the newly loaded sysdatabases and sysusages. These corrections affect only the master device, since that is the only device that changed -- the server assumes that all your other devices are undamaged and need not be inspected. After this step, it is possible that your new master device contains database entries for databases that also exist on other devices in your system. This may happen if you moved tempdb to a different device, or created sybsystemdb on a different device. The server recognizes and handles this situation: if it finds pre-existing entries for those databases on other devices, it presumes that the existing entries are correct and does not change them. During post-processing from the load, you may see one or more errors from the server. Please read Section 2, Before You Begin, for more information about these errors. After the checks and validations are complete the server shuts down. You may now restart it normally. Step 5. Check that the Databases on Master Device Are Correct When you created a new master device in step 1 above, the server created only its default set of databases, with minimal data. You will almost certainly need to load dumps of the databases (notably model) that used to be there. Are the databases on your new master device large enough to hold the dumps you will be loading into them? Are all the necessary databases present? Is there any obsolete data that you need to clean up? Log in as sa and inspect the databases on your system: 1> declare @pgspermb int 2> select @pgspermb = 1048576 / @@maxpagesize 3> select "db name"=db_name(dbid), dbid, "size"=sum(size) / @pgspermb 4> from master.dbo.sysusages 5> group by dbid 6> go This command shows you all the databases present on your system, and their total size. Note that the size column in the output is expressed in Megabytes. Does this list contain any entries where database name is null? These sysusages entries don't have any matching entries in sysdatabases; they are unnecessary and should be deleted. (You may be specially susceptible to this if you upgraded from pre-12.0 versions, and created sybsystemdb on the older version; sybsystemdb will have a different dbid than the default dbid.) To remove these entries, use a script like the following: 1> exec sp_configure "allow updates", 1 2> go 1> delete sysusages 2> where db_name(dbid) is null 3> go 1> exec sp_configure "allow updates", 0 2> go Are any databases missing? Create those databases. Are the databases large enough? If not, alter them to be at least large enough to hold the dumps. (It is okay if they are too large; the server simply clears the excess space.)
Section 6. Manually Setting the Backup Server Name This procedure updates the sysservers table and is needed to ensure that Adaptive Server can access the correct backup server to carry out dumps and loads. Use it with the instructions for Sections 3 and 4. Execute the following isql commands in Adaptive Server: 1> use master 2> go 1> select srvname, srvnetname from sysservers 2> where srvname = "SYB_BACKUP" 3> go There are three possible outcomes to this query. Take the appropriate action below depending on the outcome:
Outcome Action ASE returns a single row and srvnetname contains the correct Backup Server name No action is needed. ASE returns a single row but the srvnetname is not the correct Backup Server name Issue the following isql command: 1> update sysservers 2> set srvnetname = "backup_server_name" 3> where srvname = "SYB_BACKUP" 4> go where backup_server_name is the name of the Backup Server as it appears in the interfaces file. ASE returns 0 rows Issue the following isql command: 1> sp_addserver SYB_BACKUP, null, 2> backup_server_name 3> go
5.3.8 如何只用数据库设备文件生成新的数据库服务器 本例的环境: OS: Win2000 professional (中文) ASE: Adaptive Server Enterprise 12.0 for NT(中文) 原有数据库服务器: PDS_CJ 数据设备文件:c:\sybase\data\master_RDS_CJ.dat 30M c:\sybase\data\sybprocs_RDS_CJ.dat 80M 目的: 将通过现有的2个数据库设备在相同的平台下的其他的机器上创建数据库服务器,而不用syconfig.exe(服务器配置)程序来创建服务器。 新建服务器名称:RDS_CJ 步骤: 一、配置新的数据库服务器: 1。拷贝原有数据库设备文件到新的机器上: copy master_PDS_CJ.dat 为 master_RDS_CJ.dat copy master_PDS_CJ.dat 为 master_RDS_CJ.dat 2。拷贝或新建RUN文件: copy RUN_PDS_CJ.bat > RUN_RDS_CJ.bat 编辑 RUN_RDS_CJ.bat 将所有 PDS_CJ 替换为 RDS_CJ(指定MASTER设备和SERVER名) RUN文件样本: rem rem Adaptive Server Information: rem name: PDS_CJ rem master device: c:\sybase\data\master_PDS_CJ.dat rem master device size: 15360 rem errorlog: c:\sybase\ASE-12_0\install\errorlog_PDS_CJ rem interfaces: c:\sybase\ini rem c:\sybase\ASE-12_0\bin\sqlsrvr.exe -dc:\sybase\data\master_PDS_CJ.dat -sPDS_CJ -ec:\sybase\ASE-12_0\install\errorlog_PDS_CJ -ic:\sybase\ini -Mc:\sybase\ASE-12_0 3。添加ASE的服务器明: 用dsedit工具添加接口(interfaces)文件的条目 4。启动新配的服务器:(此时系统存储过程库仍无法使用) 通过执行RUN文件的方式启动服务器。(-T3604) 5。修改数据库中的信息: 1> select * from sysdevices where name="sysprocsdev" 2> go low high status cntrltype name phyname mirrorname ----------------------------------------------------------------------------------------- 16777216 16818175 16386 0 sysprocsdev c:\sybase\data\sybprocs_PDS_CJ.dat NULL 1> sp_configure "allow update",1 2> go 1> update sysdevices set phyname="c:\sybase\data\sybprocs_RDS_CJ.dat" where name="sysprocsdev" 2> go (1 row affected) 1> update sysservers set srvname="RDS_CJ" where srvname="PDS_CJ" 2> go 1> shutdown 2> go 6. 启动服务器 通过执行RUN文件的方式启动服务器(不加 -T3604了),新服务器配置完成。
举例1: Unix平台检查pubs2数据库的一致性 单用户模式启动Server: $SYBASE/install startserver -f RUN_server_name -m vi dbcc_db.sql use master go sp_dboption pubs2,"single user",true go use pubs2 go checkpoint go dbcc checkdb(pubs2) go dbcc checkalloc(pubs2,fix) go dbcc checkcatalog(pubs2) go use master go sp_dboption pubs2,"single user",false go use pubs2 go checkpoint go quit go isql -Usa -Pxxxxxx -SSYBASE <dbcc_db.sql >dbcc_db.out grep Msg dbcc_db.out 举例2: Unix平台检查pubs2数据库中titles表的一致性 vi dbcc_table.sql use pubs2 go dbcc checktable(titles) go dbcc tablealloc(titles) go isql -Usa -Pxxxxxx -SSYBASE < dbcc_table.sql > dbcc_table.out grep Msg dbcc_table.out