目 录
一. SYBASE的安装1.1 SYBASE 11.9.2 for CNAPS(UnixWare) 安装步骤1.2 ASE 11.9.2 for Linux安装步骤1.3 SQL SERVER 11.0.x FOR SCO OPENSERVER 51.4 在SCO Unixware7.1上安装ASE11.921.5 ASE for IBM AIX 安装文档二. 数据备份2.1 日常后备数据库2.2 如何后备数据量大于2GB的数据库2.3 如何生成bcp命令文件(以pubs2为例)2.4 如何在AIX上后备数据量大于1GB的数据库2.5 使用dump transaction with no_log的危险性2.6 磁带机的备份三. 异常处理3.1 master数据库1105错误的处理方法3.2 SQL Server因配置内存过大不能启动时的处理3.3 解决数据库被标记为“suspect”的方法3.4 解决数据库被挂起的问题3.5 如何查找数据库启动失败原因3.6 如何动手修改interfaces文件3.7 如何更改SQL Server名称(在UNIX、OPENVMS平台上)3.8 如何更改服务器的字符集为cp9363.9 如何恢复master数据库3.10 如何检查数据库中数据的一致性3.11 如何扩展master数据库空间3.12 如何删除坏的用户数据库?(以pubs2为例)3.13 如何移植master设备3.14 如何终止数据库恢复过程3.15 如何重建sybsystemprocs系统数据库3.16 如何做 rebuild log3.17 如何做Rebuild Master(没有后备master库,而使用命令diskreinit,disk refit)3.18 在SYBASE中如何设置用户口令为空3.19 如何扩展master数据库空间四. 性能管理4.1 Backup Server4.2 Backup Server的名字4.3 DBCC4.4 Index & Performance4.5 SQL Server 事务日志4.6 Sybase SQL Server 11的内存缓冲区管理和性能调整4.7 SYBASE SQL Server内存分配4.8 阀值管理(Threshold Management)4.9 如何在NT、UNIX下启动关闭ASE4.10 数据库选项(dboptions)的使用与管理4.11 数据库参数的调整4.12 数据库设备4.13 关于tempdb的优化
1. SYBASE的安装
#################################################################
1.1 SYBASE 11.9.2 for CNAPS(UnixWare) 安
装步骤
########################################################################
一.文件系统和裸设备(RAW DEVICE)的准备:
根据双机方案的不同,文件系统和裸设备的具体建立方式有差别。
因为纯软方案的SavWareHA无需磁盘阵列柜,而非纯软方案则需添加一磁盘阵列柜。
我们采用的各双机方案的相同点是数据库设备最终都建立在裸设备(RAW DEVICE)上;
不同点是在纯软方案中,裸设备是建立在本地硬盘上,而非纯软方案中裸设备是建立在磁盘阵列上,
即在非纯软方案中只需在双机的任何一台机器上执行一次建立裸设备的操作,
而在纯软方案中需在双机上都执行完全相同的建立裸设备的操作。
1.查看/dev/rdsk/目录下的硬盘设备ls -l /dev/rdsk/*s0
类似如 c0b0t0d0s0,基本上一条显示信息对应着一个硬盘。即如有多块硬盘,则硬盘数与 c*b0t0d0s0 的个数相等
(*为1,2,3...整数的替代)。c0b0t0d0s0 为当前工作机的本地硬盘(假设只有一块本地硬盘),其他c*b0t0d0s0为磁盘阵列上的硬盘。
如果只有两块硬盘c0b0t0d0s0(本地),c1b0t0d0s0(磁盘阵列),则在纯软的双机方案中应将用于sybase数据库设备的裸设备建在
c0b0t0d0s0上,而在非纯软的双机方案中应将用于sybase数据库设备的裸设备建在c1b0t0d0s0上。
(以下的安装说明均为在以上条件下的纯软方案为例,[--]中的内容为在非纯软方案下的安装说明)
2.导出原硬盘上的裸设备和文件系统参数选择要使用的硬盘,将其参数导出:
prtvtoc -f vtoc /dev/rdsk/c0b0t0d0s0[-c1b0t0d0s0-]
硬盘参数将被存入文件vtoc中,其中的每一条记录对应着一个裸设备或文件系统,SLICE0表示整个硬盘的大小。
3.编辑vtoc文件#vi vtoc
SLICE TAG FLAGS START SIZE 0 0x5 0x201 63 70766262
1 0x2 0x200 2506140 10249470 2 0x3 0x201 722925 1783215 3 0x0 0x0 0 0
4 0xb 0x200 12755610 10249470 5 0x0 0x0 0 0
6 0xc 0x201 64260 658665 7 0x1 0x201 63 34 8 0xd 0x201 97 15968 9 0x0 0x0 0 0
10 0x9 0x200 16065 4819511 0xa 0x200 23005080 41769012 0xb 0x200 23422770 205632013 0x0 0x0 0 014 0x0 0x0 0 0
15 0xf 0x201 25479090 417690
在此文件中加入内容后变成:
#SLICE TAG FLAGS START SIZE 0 0x5 0x201 63 70766262
1 0x2 0x200 2506140 10249470 2 0x3 0x201 722925 1783215 3 0x0 0x0 0 0
4 0xb 0x200 12755610 10249470 5 0x0 0x0 0 0
6 0xc 0x201 64260 658665 7 0x1 0x201 63 34 8 0xd 0x201 97 15968 9 0x0 0x0 0 0
10 0x9 0x200 16065 4819511 0xa 0x200 23005080 417690
12 0xb 0x200 23422770 205632013 0x0 0x0 0 014 0x0 0x0 0 0
15 0xf 0x201 25479090 41769016 0x4 0x201 26000000 40960017 0x4 0x201 26410000 40960018 0x4 0x201 26820000 40960019 0xb 0x200 27230000 2048000
此文件比上个文件多了SLICE号为16,17,18,19的四行,也就是说要增加4个slice。
当然也可以使用原先SIZE为0的空闲SLICE 号,而不用增加新的SLICE号,如3,5,9等。
可以看到每行有五列,具体意义如下:SLICE:序号,范围是 0--184。
TAG:标志位,0x4 的意思是用户文件系统。
FLAGE:权限标志位。0x200:文件系统,0x201:裸设备(0x201 的意思用户可用unmount文件系统)。
START:起始页。一定不能重叠。SIZE:slice的大小,单位是 512bit 。
4.写回磁盘:
#edvtoc -f vtoc /c0b0t0d0s0[-c1b0t0d0s0-]
即增加了3个(16,17,18)大小均为 200M (用于数据库设备)和 1个(19)大小约为 1G(用于/sybase目录) 的slice。
5.重新启动计算机:#shutdown -y -g0 -i6
启动以后,在/dev/rdsk目录下会多出下面几个文件:
crw------- 1 root sys 7679, 16 Jul 4 16:41 c0b0t0d0s10[-c1b0t0d0s10-]
crw------- 1 root sys 7679, 17 Jul 4 17:42 c0b0t0d0s11[-c1b0t0d0s11-]
crw------- 1 root sys 7679, 18 Jul 4 18:43 c0b0t0d0s12[-c1b0t0d0s12-]
crw------- 1 root sys 7679, 19 Jul 4 18:44 c0b0t0d0s13[-c1b0t0d0s13-]
这就是新增的四个slice(c0b0t0d0s*[-c1b0t0d0s*-]中的*即对应vtoc文件中
的SLICE号的十六进制值)。
6.建立/sybase目录,并加载文件系统。#mkdir /sybase
#mount -F vxfs /dev/rdsk/c0b0t0d0s13[-c0b0t0d0s13-] /sybase#mkdir /sybase/data
7.使用mknod命令把设备文件指定一文件:例如:
#mknod /sybase/data/master.dat b 7679 16说明:
16是slice的序号,其实就是设备c0b0t0d0s10[-c1b0t0d0s10-]。
这样在数据库中要用到裸设备时,直接用/sybase/master就行了,其实就是/dev/rdsk/c0b0t0d0s10[-c1b0t0d0s10-]。
用同样的方法可以把c0b0t0d0s11[-c1b0t0d0s11-],c0b0t0d0s12[-c1b0t0d0s12-]指定到一文件,
但他们的序号是不一样的,分别是17,18。#mknod /sybase/data/systemproc.dat b 7679 17#mknod /sybase/data/systemdb.dat b 7679 18
注意:
.dat文件要先建好,且一定要记住随后将文件(即/dev/rdsk/下的用于数据库设备的文件和/sybase/data/*.dat)的用户和权限
改成数据库用户可以读写的。根据实际安装的类型和要求不同,其中的目录可能要根据实际情况修改。
二.用超级用户root建立SYBASE用户(用scoadmin图形界面)。
Account Manager -> users -> Add New User ... 并指定其home目录为/sybase。
三.修改SYBASE用户的shell文件,即其用户目录下的.profile文件,增加SYBASE,DSQUERY,
PATH,LD_LIBRARY_PATH环境变量。#vi .profile
修改后文件内容如下:
PATH=$PATH:/usr/sbin:/usr/java/bin:.export PATH
eval `$ROOT/$MACH/usr/lib/scoadmin/account/setenv -k $HOME`if [ -f $HOME/.kshrc -a -r $HOME/.kshrc ]; then
ENV=$HOME/.kshrc # set ENV if there is an rc fileexport ENVfi
SYBASE=/sybase (安装目录,一般为SYBASE的用户目录)DSQUERY=SYBASE (数据库服务器的名字)LD_LIBRARY_PATH=$SYBASE/lib
PATH=$SYBASE/bin:$SYBASE/install:$PATH:.
export SYBASE DSQUERY PATH LD_LIBRARY_PATH
四.系统参数调整:
1.最大共享内存调整(先ftp文件stune到/etc/conf/cf.d/目录下):#vi /etc/conf/cf.d/stune编辑后内容如下:NUMREGPT 256NUMSCOPT 32RSTCHOWN 0
CONSOLE_SECURITY 0SHMMNI 200SHMSEG 15
SHMMAX 1073741824 (最大共享内容,根据实际情况修改)SHMALL 2048NPROC 500
ARG_MAX 51200SFNOLIM 400
SFSZLIM 0x7fffffff HFSZLIM 0x7fffffff SDATLIM 0x7fffffff HDATLIM 0x7fffffff SCORLIM 0x7fffffff HCORLIM 0x7fffffff SVMMLIM 0x7fffffff
HVMMLIM 0x7fffffff SSTKLIM 0x7fffffff HSTKLIM 0x7fffffff
2.重建内核:
#/etc/conf/bin/idbuild
3.重新启动计算机:#cd /
#shutdown -y -g0 -i6
4.检查最大共享内存是否调整:#cd /etc/conf/cf.d#more stune.current
检查其中的\"SHMMAX='内存'\"项。
五.安装Sybase:
#mount -F cdfs -r /dev/cdrom/cdrom1 /mnt (mount cdfs文件系统)#su - sybase
$/mnt/sybload -D
Y(确认安装目录,一般为/sybase)L(本地安装)
输入:/mnt/sybimageY
输入code: BKBYBK BKBKBY BFKZBK BKBYBY TMVOVG ZEBQ选择产品序号,\"1\"是必须要安装的,其他可以不选。按两次回车键结束。Y(确认选择的产品)从光盘上拷贝文件...
拷贝结束后,进入root用户($exit):
#umount /mnt (umount cdfs文件系统)
六.修改资源文件
先将文件ase.rs和back.rs ftp至/sybase下或直接修改/sybase/init/sample_resource_files/ase.rs和back.rs文件
再复制到/sybase下:#cd /sybase#vi ase.rs
编辑后文件内容如下:
sybinit.release_directory: /sybase (安装目录,一般为SYBASE的用户目录)
sybinit.product: sqlsrv
sqlsrv.server_name: SYBASE (服务名)sqlsrv.new_config: yes
sqlsrv.do_add_server: yes (自动添加服务)sqlsrv.network_protocol_list: tli tcp (通讯协议)
sqlsrv.network_hostname_list: 168.33.112.196 (IP地址根据实际情况修改)
sqlsrv.network_port_list: 5000 (port口可根据实际情况修改)sqlsrv.master_device_physical_name: /sybase/data/master.datsqlsrv.master_device_size: 70sqlsrv.master_database_size: 30sqlsrv.errorlog: USE_DEFAULTsqlsrv.do_upgrade: no
sqlsrv.sybsystemprocs_device_physical_name: /sybase/data/systemproc.datsqlsrv.sybsystemprocs_device_size: 150sqlsrv.sybsystemprocs_database_size: 100
sqlsrv.sybsystemdb_device_physical_name: /sybase/data/systemdb.datsqlsrv.sybsystemdb_device_size: USE_DEFAULTsqlsrv.sybsystemdb_database_size: USE_DEFAULTsqlsrv.default_backup_server: SYB_BACKUP
#vi back.rs
编辑后文件内容如下:
sybinit.release_directory: /sybase (安装目录,一般为SYBASE的用户目录)
sybinit.product: bsrv
bsrv.server_name: SYB_BACKUP (服务名)
bsrv.do_add_backup_server: yes (自动添加服务)bsrv.network_protocol_list: tli tcp (通讯协议)
bsrv.network_hostname_list: 168.33.112.196 (IP地址根据实际情况修改)bsrv.network_port_list: 5500 (port口可根据实际情况修改)
bsrv.language: USE_DEFAULTbsrv.character_set: USE_DEFAULTbsrv.tape_config_file: USE_DEFAULTbsrv.errorlog: USE_DEFAULT
七.启动SQL_SERVER和BACKUP_SERVER$cd $SYBASE/bin
$srvbuildres -r $SYBASE/ase.rs$srvbuildres -r $SYBASE/back.rs
八.设置sybase自动启动:
在/etc/rc2.d/目录下增加文件S99SYBASE,文件内容如下:
su - sybase -c \"/sybase/install/startserver -f /sybase/install/RUN_SYBASE\"su - sybase -c \"/sybase/install/startserver -f/sybase/install/RUN_SYB_BACKUP\"
这样在每次启动机器的时候,sybase数据库就自动启动了。
注释:#为使用root用户操作,$为使用sybase用户操作。
1.2 ASE 11.9.2 for Linux安装步骤
ASE 11.9.2 for Linux安装步骤
以root 登录:
创建sybase用户及用户组(useradd,groupadd或linuxconf) mount CDROM
#mount /mnt/cdrom (#mount -t iso9660 /dev/cdrom /mnt/cdrom) unload SYBASE产品 (1)选用图形方式
#/mnt/cdrom/sybsetup (2)选用字符方式
# rpm -hiv -prefix /usr/sybase
/mnt/cdrom/RPMS/sybase-common-11.9.2-1.i386.rpm # rpm -hiv -prefix /usr/sybase
/mnt/cdrom/RPMS/sybase-ase-11.9.2-1.i386.rpm 更改sybase用户权限 #cd /usr/sybase
#chown sybase:sybase *
以sybase登录安装 ASE 11.9.2: 改sybase用户环境变量 编辑用户登录文件:
例:bash 用户,编辑bash_profile文件 $ vi bash_profile
SYBASE=/usr/sybase DSQUERY=SYBASE
LD_LIBRARY_PATH=$SYBASE/lib LANG=C
Export SYBASE DSQUERY LD_LIBRARY_PATH LANG install ASE11.9.2 (1) 选用图形方式 $srvbuild
注意:sybase用户要具有对/tmp的写权限 (2) 选用字符方式 --编辑源文件
(/init/sample_resourde_files/srvbuild.adaptive_server.rs,
/init/sample_resourde_files/srvbuild.backup_server.rs) 将源文件拷贝到备用目录/usr/sybase/user中:
$cp /init/sample_resourde_files/srvbuild.adaptive_server.rs /user/ase.rs
$cp /init/sample_resourde_files/srvbuild.adaptive_server.rs /user/backup.rs
编辑ase.rs,backup.rs --运行源文件
$ cd /usr/sybase/bin
$srvbuildres -r /usr/sybase/user/ase.rs $srvbuildres -r /usr/sybase/user/backup.rs 附:如何修改OS内存配置
在root用户登录文件中加入以下语句:
(以bash用户,.bash_profile为例,更改系统内存值为60M) #vi .bash_profile
echo \"62914560\" > /pro/sys/kernel/shmmax
1.3 SQL SERVER 11.0.x FOR SCO
OPENSERVER 5
一. 安装 SCO OpenServer 5.0.2 PATCH (OS5.0.4以上无需此步骤)
OSS437a OSS441a OSS446a
二. 建立SYBASE帐号(使用scoadmin)
修改shell文件,增加SYBASE DSQUERY PATH 环境变量。 1. sh or ksh (.profile): SYBASE = 安装目录
DSQUERY = 数据库服务器的名字(默认为SYBASE) PATH = $SYBASE/bin:$SYBASE/install:$PATH: export SYBASE DSQUERY PATH 或
2. csh (.cshrc)
setenv SYBASE 安装目录
setenv DSQUERY 数据库服务器的名字
set path = ($SYBASE/bin $SYBASE/install $path .)
三. 系统参数调整。
1. 共享内存。
编辑/etc/conf/cf.d/stune 加入:
SHMMAX67108864 (=64M内存) NFILE11000
NOFILES1024 2. 激活异步I/O
将/etc/conf/sdevice.d/aio 文件“N”改为“Y”,
/etc/conf/sdevice.d/suds 文件“N”改为“Y” 3. 编辑/etc/rc2
在文件最后加入/etc/suds_ctrl -a 例:检查SYBASE用户所处组的组号如50(group),则为suds_ctrl -a 50 4. 重建内核 # /etc/conf/cf.d/link_unix 5. 重新启动计算机 # shutdown -y -g0 -i6 四. 安装SYBASE (注3) 1.安装11.0.3 # mount /dev/cd0 /cdrom # su - sybase % /cdrom/sybload -D Y (确认安装目录) L (本地安装) /cdrom/sybimage 输入 CAS# (34个字母,不区分大小写和空格) 选择产品序号(按空回车结束) Y (确认选择的产品) # umount /cdrom 2.安装 Y2K EBF # mount /dev/cd0 /cdrom # su - sybase % tar xvf /cdrom/ebfss/ebf7575.tar % tar xvf /cdrom/ebfcs/ebf7791.tar # umount /cdrom 3.配置 SQL Server % $SYBASE/install/sybinit (注4) 注: 1)以sybase登录,使用id命令可以得到group id或通过 cat /etc/passwd |grep sybase 得到。2)若安装SQL Server 过程中boot server时出现下面错误(可检查errorlog文件):ulinitspinlock:allocate mutexlock failed则是因为在执行suds_ctrl时SYBASE用户组的组号不对,重新 执行suds_ctrl即可。 3)#号为使用root用户进行操作,%号为使用sybase用户操作。 1.4 在SCO Unixware7.1上安装ASE11.92 在SCO Unixware7.1上安装ASE11.92 一. 安装 SCO Unixware7.1 Patch pft7401h pft7406b pft7408c pft7413j pft7424b 二. 建立SYBASE帐号(使用sysadmin) 修改shell文件,增加SYBASE DSQUERY PATH 量。 1. sh or ksh (.profile): SYBASE = 安装目录 DSQUERY = 数据库服务器的名字(默认为SYBASE) PATH = $SYBASE/bin:$SYBASE/install:$PATH:. export SYBASE DSQUERY PATH 或 2. csh (.cshrc) setenv SYBASE 安装目录 setenv DSQUERY 数据库服务器的名字 set path = ($SYBASE/bin $SYBASE/install $path .) 三. 系统参数调整 1. 共享内存 编辑/etc/conf/cf.d/stune 加入: SHMMNI 100 SHMSEG 15 SHMMAX 256000000 SHMALL 2048 环境变 NPROC 500 ARG_MAX 51200 SFNOLIM 400 SFSZLIM 0x7FFFFFFF HFSZLIM 0x7FFFFFFF SDATLIM 0x7FFFFFFF HDATLIM 0x7FFFFFFF SCORLIM 0x7FFFFFFF HCORLIM 0x7FFFFFFF SVMMLIM 0x7FFFFFFF HVMMLIM 0x7FFFFFFF SSTKLIM 0x7FFFFFFF HSTKLIM 0x7FFFFFFF 2. 重建内核 # /etc/conf/bin/idbuild 3. 重新启动计算机 # shutdown -y -g0 -i6 四. 安装SYBASE 1.安装11.92 # mount /dev/cd0 /cdrom # su - sybase % /cdrom/sybload -D Y (确认安装目录) L (本地安装) /cdrom/sybimage 输入 CAS# (34个字母,不区分大小写和空格) 选择产品序号(按空回车结束) Y (确认选择的产品) # umount /cdrom 2.修改资源文件 % cd $SYBASE/init/sample_source_files % cp *ada* ase.rs % cp *back* back.rs 编辑ase.rs和back.rs文件 3.配置 SQL Server 及 Backup Server % srvbuildres -r ase.rs % srvbuildres -r back.rs 注: 1)#号为使用root用户进行操作,%号为使用sybase用户操作。 ######################################################################### 1.5 ASE for IBM AIX 安装文档 #########################################################################原始设备方式: 一. 添加Sybase组和Sybase用户(用smit图形界面): 并根据Sybase CD上的ID号设置Sybase组和Sybase用户的ID号。 二. 调整异步磁盘ID: smit->device mune->asynchronous->change/show chatacteristics ofasynchronous I/O ->async I/O state = available 三. 修改Sybase用户的环境文件(.profile):#su - sybase$vi .profile 修改后文件内容如下: SYBASE=/home/sybase; export SYBASE#./$SYBASE/SYBASE.sh PATH=$SYBASE/ASE-12_0/install:$SYBASE/ASE-12_0/bin:$SYBASE/OCS-12_0/bin:$PATH:.export PATH DSLISTEN=SYBASE; export DSLISTENDSQUERY=SYBASE; export DSQUERYDISPLAY=0:0.0; export DISPLAY SYBASE_ASE=ASE-12_0; export SYBASE_ASESYBASE_OCS=OCS-12_0; export SYBASE_OCS 四. 建裸机设备,并修改owner和group:smit->logical volume manage 添加master和sybsystemproc,其设置项的第1项和第3项分别设置为4和hdisk1。 并执行以下命令:#chown sybase rmaster#chgrp sybase rmaster#chown sybase master#chgrp sybase master #chown sybase rsybsystemproc#chgrp sybase rsybsysyemproc#chown sybase sybsysyemproc#chgrp sybase sybsysyemproc 五. 安装Sybase: 放入安装光盘,进入smit -> mount cdfs文件系统。#su - Sybase install(图形安装) 或 install -c(字符安装) 六. 修改资源文件(ase.rs和back.rs):$vi ase.rs 修改后文件内容如下: sybinit.release_directory: /home/sybasesybinit.product: sqlsrv sqlsrv.server_name: SYBASEsqlsrv.new_config: yessqlsrv.do_add_server: yes sqlsrv.network_protocol_list: tcpsqlsrv.network_hostname_list: ibpssqlsrv.network_port_list: 5000 sqlsrv.master_device_physical_name: /dev/rmastersqlsrv.master_device_size: 110sqlsrv.master_database_size: 50sqlsrv.errorlog: USE_DEFAULT sqlsrv.do_upgrade: no sqlsrv.sybsystemprocs_device_physical_name: /dev/rsybsystemprocsqlsrv.sybsystemprocs_device_size: 110sqlsrv.sybsystemprocs_database_size: 100sqlsrv.default_backup_server: SYB_BACKUP $vi back.rs 修改后文件内容如下: sybinit.release_directory: /home/sybasesybinit.product: bsrv bsrv.server_name: SYB_BACKUPbsrv.do_add_backup_server: yesbsrv.network_protocol_list: tcpbsrv.network_hostname_list: ibpsbsrv.network_port_list: 5001bsrv.language: USE_DEFAULTbsrv.character_set: USE_DEFAULTbsrv.tape_config_file: USE_DEFAULTbsrv.errorlog: USE_DEFAULTsqlsrv.related_sqlsrvr: SYBASEsqlsrv.sa_login: sa sqlsrv.sa_password: USE_DEFAULT 七. 初始化ase: $cd /sybase/ASE12_0/bin$srvbuildres -r /sybse/ase.rs$srvbuildres -r /sybse/back.rs 八. 安装后的配置:$isql -Usa 1>sp_configure 'total memory', 51200 (2k小修改)2>go 1>sp_configure 'number of locks', 502>go 为一单位,根据实际内存大1>sp_configure 'number of user connections', 502>go 1>sp_diskdefault 'master', defaultoff2>go 九. 测试sybase: 9.1 启动ASE和BACKUP SERVER:$cd /home/sybase/ASE-12_0/install$startserver -f RUN_SYBASE $startserver -f RUN_SYB_BACKUP 9.2 检查是否正常运行:$showserver$isql -Usa >select @@version>go 9.3备份: >dump database master to '/sybase/master_dump.yymmdd'>go 9.4 关闭ASE和BACKUP SERVER:$isql -Usa >shutdown SYB_BACKUP>go >shutdown>go 9.5察看错误日志文件。$showserver 注意:#为使用root用户操作,$为使用sybase用户操作。 2. 数据备份 2.1 日常后备数据库 SYBASE 数据库的备份主要是通过 dump 命令来实现的, 分为数据库备份和日志备份。 简单语法格式如下: dump database database_name to device_name dump transaction database_name to device_name 如果使用磁带设备做备份, 还要使用capacity、int选项。 应该多长时间备份一次数据库呢? 这决定于发生系统故障时( 例如磁盘故障 ) 应用系统允许丢失多长时间的数据。如果允许丢失一个小时的数据, 那么可以考虑每天至少备份一次数据库, 并每个小时至少备份一次日志。 备份数据库之前, 应对数据库做 dbcc 检查, 确保备份的数据库是完好的数据库。如果数据库有损坏, 备份时可能不会报错, 但将来可能无法装载(load)。 通常情况下, 只有发生严重故障需要恢复时才进行装载数据库, 但是 SYBASE 建议偶尔对备份的数据库装载到一个测试环境上, 以保证备份工作过程正常并熟悉备份和装载工作过程。 Master 数据库的备份也不能忽略。每次master 数据库的内容有变动时, 应及时备份 master 数据库, 例如增加 login, 增加设备, 增加用户 数据库等。 用户可根据自己的应用制定可行的备份方案。 详细的命令语法及备份方案的详细建议均可在 SYBASE 手册中查到。 举例: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%左右)go 2.2 如何后备数据量大于2GB的数据库 当在后备数据量大于2GB的数据库时,可能会遇到以下错误: · I/Oerror: · operating system error,server device /backup/data. code 27 messages · file too large. 这是由于后备文件的大小超出了操作系统的用户最大文件限制。而有些操作系统不支持大于2GB的文件,这时可以使用Backup Server将一个数据库后备到多个文件中。 1>dump database pubs2 to \"/usr/sybase/pubs2_dump.1\" 2>stripe on \"/usr/sybase/pubs2_dump.2\" 3>stripe on \"/usr/sybase/pubs2_dump.3\" 4>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 2.3 如何生成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的命令文件。 2.4 如何在AIX上后备数据量大于1GB的数据库 当在AIX上后备数据量大于1GB的数据库时,可能会遇到以下错误: I/Oerror: operating system error,server device /backup/data. code 27 messages file too large. 这是由于后备文件的大小超出了操作系统的用户最大文件限制。可通过操作系统管理工具(SMIT), 增大用户最大文件限制。 Smit/user/max file size 2.5 使用dump transaction with no_log的危险性 在命令参考手册中的dump transaction with no_log条目下,有一条警告信息告诉你,你应该把这条命令作为没有其它办法时的最后一招才使用它。但是“最后一招”究竟是什么意思呢?当你使用这条命令时会怎样呢?那你应使用哪条命令来代替它呢?最后,若这条命令如此有问题,为什么Sybase却要提供它呢? Sybase技术支持建议你定期的dump你的transaction log。你必须根据你的数据库中记入日记的活动的量的大小以及你的数据库的大小来决定dump的方式。有些地方按月dump transaction;有些地方每夜dump transaction。 注意:若你正运行SQL Server10.0,你可以用sp_thresholdaction在空间紧缺之前来自动dump tran;另外,此时Backup Server会保证在dump进行时,任务不会被挂起。请在你的SQL Server参考手册中获取更详细的信息。这篇文章的剩余部分将适用于运行系统10以前版本SQL Server的领域。 若你从未dump transaction过,transactionlog将最终会满。 SQLServer使用log(日志)是出于恢复目的的。 当log满时,服务器将停止事物的继续进行,因为服务器将不能将这些事物写进日志,而服务器不能运行大多数的dump tran命令,因为SQLServer也需在日志中记录这些命令。 这就是为什么当其它dump tran命令不能执行时no_log可执行的原因。但是想一下dump transaction with no_log被设计执行的环境。所有对不做并发性检查。 若你在对数据库的修改发生时使用dump transaction with no_log,你就会冒整个数据库崩溃的风险。在多数情况下,它们被反映成813或605错误。为了在数据库被修改时,删除transaction log中的不活跃部分可使用dump transaction with trancate_only。这条命令写进transaction log时,并且它还做不要的并发性检查。这两条命令都有与其相关的警告,在命令参考手册中会看到这些警告。请确保在使用其中任一条命令以前,你已理解这些警告和指示。Syase提供dump transaction with no_log来处理某些非常紧迫的情况。为了尽量确保你的数据库的一致性,你应将其作为“最后一招”。 2.6 磁带机的备份 一般对Sybase库进行备份都用磁带作介质进行,但还有一更好的方法,即先备份到硬盘上然后经压缩, 拷贝到磁带上,这样便于恢复,多了一个备份拷贝,同时也节省了备份时间。具体实现步骤如下: (1)建立磁盘备份设备 运行isql,以sa进入Sybase系统,运行如下内容: sp_addumpdevice \"disk\ go 这样就在Sybase中建立了一个名为\"disk_bkupdevice\"的备份设备,它对应Unix系统下的/tmp/dumpdb文件。(2)创建备份用户 以root身份进入Unix系统,新建用户backupdb,并归属于sybase组。(3)修改相关文件 在/usr/backupdb/.profile中添加以下语句: SYBASE=/usr/sybase DSQUERY=SYBASE_XXXX PATH=$PATH:$SYBASE/bin export SYBASE DSQUERY PATH rm /tmp/backupdb.Z echo\"开始备份SYBASE数据库…\" isql -Usa -Pabcabc -ibackup.sql > /tmp/dbbackup.log echo\"硬盘备份完成,正在压缩备份的数据文件…\" compress /tmp/backupdb echo \"正在将备份的压缩数据拷入磁带…\" tar c8v /tmp/backupdb.Z echo \"备份完成!\" 其中\"abcabc\"为sa用户的口令,backup.sql是一简单的文本文件,内容如下: dump database db_main to disk_bkupdevicego 备份的执行日志被记录在/tmp/dbbackup.log中,当然系统管理员也可通过查看$SYBASE/install/backup.log 获知备份日志。 3. 异常处理 3.1 master数据库1105错误的处理方法 [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, useALTER DATABASE or sp_extendsegmentto increase the size of the segment.[WORKAROUND] 1.在RUN_servername的文件中添加标识 : -T3607 (编辑RUN_servername文件,在文件末尾添加以上标识)2.启动ASE (要直接运行文件RUN_servername,且该运行窗口在执行以下操作时不能关闭) 3.截断日志 1>dump tran master with no_log2>go 4.停止ASE服务1>shutdown2>go 5.删除RUN_servername文件末尾的标识 : -T36076.重新启动ASE 3.2 SQL 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\2>go 1>reconfigure with override2>go 1>shutdown with nowait2>go 如果新的内存配置太大,SQL Server不能启动,那么必须修改Master设备上的内存配置参数。 在$SYBASE/install目录下,使用buildmaster命令 $buildmaster -d/path/master.dat -y cmemsize = XXX 其中XXX为内存页数。如果新的内存大小合适,SQL Server可以启动。 3.3 解决数据库被标记为“suspect”的方法 现象: Error 926 Severity Level 14 Error Message Text Database 'xx' cannot be opened - it has been marked SUSPECT by recover Explanation 当你使用Transact_SQL命令这个数据库的数据时,出现这个信息,这是一个严重的错误,如果你要使用这个数据库的数据,必须改正这个错误。Action 用ISQL登录到SQL Server,须用SA帐号 1>sp_configure \"allow updates\2>go 2>reconfigure with override2>go 1>update master..sysdatabases2>set status =-32768 3>Where name=\"database_name\" database_name是 你 的 数 据 库 名4>go 1>shutdown with nowait 2>go 这时重新启动SQL Server,再有SA帐号注册到SQL Server。 1>update master..sysdatabases2>set status=0 3>Where name=\"database_name\" database_name 是 你 的 数 据 库 名4>go 1>sp_configure \"allow updates\" ,12>go 1>reconfigure with override2>go 如果你的数据库原来有dboption,你需要重新设置这些option。 3.4 解决数据库被挂起的问题 现象:Error 926 Severity Level 14 Error Message Text Database 'xx' cannot be opened - it has been marked SUSPECT byrecover Explanation (1) 当你使用Transact_SQL命令操作这个数据库的数据时, 出现这个信息, 这是一个严重的错误, 如果你要使用这个数据库的数据, 必须改正这个错误. (2) 启动Backup Server, 后备master数据库(这一步很重要!) 1>dump database master to \"/usr/sybase/master.dup\" 2>go (3) 用isql登录到SQL Server, 须用sa帐号 (本文以pubs2数据库为例) 1>sp_configure \"allow updates\ 2>go 1>begin tran 2>go 1>use master 2>go 1>update sysdatabases 2>set status = -32768 3>Where name=\"pubs2\" 4>go 如果得到(1 row affected),则 1>commit 2>go 否则 1>rollback 2>go (4)重新启动SQL Server. 截日志 dump tran MBFEWKDB with no_log 注:SQL Server重新启动之后,当发现数据库本身存在不可恢复的问题时,如数据页损坏等,且没有完好的数据库备份,一定要用bcp...out备份用户数据库数据。此时,以下步骤省略,并按照“如何删除坏的用户数据库”文章删除此数据库。之后重建此数据库,恢复备份。 否则,按以下步骤继续操作: 用sa帐号注册到SQL Server. 1>begin tran 2>go 1>use master 2>go 1>update sysdatabases 2>set status=0 3>Where name=\"pubs2\" 4>go 如果得到(1 row affected),则 1>commit 2>go 否则 1>rollback 2>go 1>sp_configure \"allow updates\" ,0 2>go (5)重新启动SQL Server. (6) 如果你的数据库原来有dboption(例如\"select into\log onchkpt\"等), 你需要重新设置这些option. (7) 当数据库已经恢复可使用状态后,运行dbcc命令检查数据库的一致性(参照“如何检查数据库中数据一致性”文章) (8) 备份用户数据库 例如: 1>dump database pubs2 to \"/usr/sybase/pubs2.dup\" 2>go 3.5 如何查找数据库启动失败原因 在实际环境中,数据库Server无法启动的原因很多,本文仅列出了几种常见的情况,供您参考。 首先,应检查Server的日志文件。不同版本缺省的日志文件如下(其中 UNIX: · 11.0*: $SYBASE/install/errorlog · 11.5* 或 11.9*: $SYBASE/install/ · 12.0*: $SYBASE_ASE/install/ NT: · 11.0* 11.5* 或 11.9*: $SYBASE\\install\\errorlog · 12.0*: $SYBASE\\ASE-12_0\\install\\errorlog CASE 1: basis_dlock: file '/sybase/master.dat' already in use by a SQL Serverkernel kdconfig: unable to read primary master devicekernel kiconfig: read of config block failed 检查server是否已经启动( showserver, ps -u sybase 或NT service ) CASE 2: dopen: open '/sybase/master.dat' failed, permission deniedkernel kdconfig: unable to read primary master devicekernel 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(). 检查操作系统参数是否已经修改并重新启动操作系统 (参见安装手册)若操作系统异常宕机,ASE未启动而$SYBASE/ 3.6 如何动手修改interfaces文件 在一些HP和SUN的机器上,interfaces文件中关于SERVER的信息是以16进制的形式存储的,必须要通过实用程序dscp才能进行修改。 实际上,我们只要了解了这些16进制数据的格式,也可以直接通过vi来更改interfaces文件。 下面以e3000为例,介绍一下interfaces文件的结构和格式: 用vi打开/opt/sybase/interfaces,可以看到这些信息:E3000 master tli tcp /dev/tcp \\x00021a0a9e4d51f80000000000000000 query tli tcp /dev/tcp \\x00021a0a9e4d51f80000000000000000 其中: /x0002 : 保留字,不必修改 1a01 : 16进制端口号,高位在左边,转换成10进制为:6666 9e4d51f8 : 16进制主机地址, 转换成10进制为: 9e -- 158 4d -- 77 51 -- 81 f8 -- 248 即为: 158.77.81.248 可以修改的信息其实主要就是主机地址和端口号,所以,如果需要,只要按照以上格式修改其中信息即可。 3.7 如何更改SQL OPENVMS平台上) Server名称(在UNIX、 在SYBASE产品中没有特定的函数或者存储过程用来更改SQL Server/ASE Server的名称,因此,只能手工修改某些参数或者配置来完成此任务。 需要修改interfaces文件;更改RUN_server_name文件名,并修改其内容,例如:-s(UNIX)、/SERVER(OpenVMS)后面所跟的参数 (server名称);更改配置文件名;更改errorlog文件名(如果需要);如果server名称加在了表sysservers中,需要更 改'srvname'、'srvnetname'列,可使用sp_dropserver、sp_addserver存储过程来实现。 在OpenVMS系统中还要修改RUN_server_name文件中DSLISTEN的逻辑名称,以及在使用startserver过程中/SERVER后面所跟的参数。然后,重启SQL/ASE Server。确认DSQUERY、DSLISTEN环境变量已经更改为所需内容。 另外,如果SQL/ASEServer是被设置为远程服务器,还要修改与此server相关的系统表sysservers中的字段以及interfaces文件。 理论上例如配置文件、RUN脚本、errorlog文件不需要指定server 名称(但是通常习惯指定server名称)。在RUN startup脚本中要指定server名称。 您可以根据以下提纲完成此项任务: 如果server名称加在了表sysservers中,用sp_dropserver删除。Shut down server编辑 interfaces文件 更改RUN_server_name文件名,并修改其内容,-s(UNIX)、/SERVER(OpenVMS)后面所跟的参数(server 名称)更改errorlog文件名(如果需要) 修改DSQUERY、DSLISTEN环境变量(如果需要)更改配置文件名(server_name.cfg、server_name.bak、server_name.nnn),在SYBASE安装路径下 Start server使用sp_addserver重新添加server(如果需要) 如果server是作为远程server使用的,还需要删除并重新添加。 3.8 如何更改服务器的字符集为cp936 (这里SYBASE的安装路径为c:\\sybase) 1.c:\\>cd \\sybase\\charsets\\cp936 2.c:\\sybase\\charsets\\cp936> charset -Usa -Psa_pass -Sserver_name binary.srtcp936 3.在SQL环境中 1>select name,id from syscharsets2>go 找到name为cp936对应的id(假设为117) .1>sp_configure \"default character set id,1172>go 5.重启server两次 (注:第一次启动后,server会自动宕掉,需要第二次重启后才能使用) 3.9 如何恢复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 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、重启ASE 11、执行installmaster脚本 $isql -Usa -P < $SYBASE/scripts/installmaster 3.10 如何检查数据库中数据的一致性 数据库一致性检查(dbcc)提供了一些命令用于检查数据库的逻辑和物理一致性。Dbcc主要有两个功能: 使用checkstorage 或 checktable 及 checkdb 在页一级和行一级检查页链及数据指针。 使用checkstorage, checkalloc, 或 checkverify, tablealloc, 及indexalloc 检查页分配。 在下列情况中需要使用 dbcc 命令: 作为数据库日常维护工作的一部分, 数据库内部结构的完整性决定于sa或dbo 定期地运行 dbcc 检查。 在系统报错以后, 确定数据库是否有损坏。在备份数据库之前, 确保备份的完整性。 如果怀疑数据库有损坏时, 例如, 使用某个表时报出表损坏的信息, 可以使用 dbcc 确定数据库中其他表是否也有损坏。 下面是dbcc的简单用法: dbcc checktable (table_name) 检查指定的表, 检查索引和数据页是否正确链接, 索引是否正确排序, 所有指针是否一致, 每页的数据信息是否合理, 页偏移是否合理。dbcc checkdb (database_name) 对指定数据库的所有表做和checktable 一样的检查。dbcc checkalloc (database_name,fix|nofix) 检查指定数据库, 是否所有页面被正确分配, 是否被分配的页面没被使用。当使用\"fix\"选项时,在检查数据库的同时会自动修复有问题的页面。(若数据库数据量很大,则该过程会持续很长时间。)dbcc tablealloc (table_name,fix|nofix) 检查指定的表, 是否所有页面被正确分配, 是否被分配的页面没被使用。是 checkalloc 的缩小版本, 对指定的表做完整性检查。当使用\"fix\"选项时,在检查数据表的同时会自动修复数据表中有问题的页面。 关于上述命令的其它选项及详细使用方法和checkstorage,checkverify, indexalloc 的详细使用方法, 请参阅有关命令手册。 举例1: Unix平台检查pubs2数据库的一致性 单用户模式启动Server: $SYBASE/install startserver -f RUN_server_name -mvi dbcc_db.sqluse mastergo sp_dboption pubs2,\"single user\go use pubs2go checkpointgo dbcc checkdb(pubs2)go dbcc checkalloc(pubs2,fix)go dbcc checkcatalog(pubs2)go use mastergo sp_dboption pubs2,\"single user\go use pubs2go checkpointgoquitgo isql -Usa -Pxxxxxx -SSYBASE 举例2: Unix平台检查pubs2数据库中titles表的一致性 vi dbcc_table.sqluse pubs2go dbcc checktable(titles)go dbcc tablealloc(titles)go isql -Usa -Pxxxxxx -SSYBASE < dbcc_table.sql > dbcc_table.outgrep Msg dbcc_table.out 3.11 如何扩展master数据库空间 master数据库只能扩展在master设备上.那么当master设备已经没有足够的空间可使用时,请按以下步骤操作: (此操作过程是以UNIX操作系统为例.SYBASE安装路径为/sybase)1.备份master数据库 启动backup server,进入isql环境执行: 1>dump database master to '/sybase/master.dump'2>go Shut down SQL/ASE Server1>shutdown2>go 2.创建新的足够大的master设备 $buildmaster -d -ssize(size以2K为单位) 例:$buildmaster -d/sybase/data/master.dat -s20480 3.修改RUN_servername文件 编辑RUN_server_name文件,-d参数指向新建的设备名。 4.单用户模式重启server $startserver -f RUN_servername -m5.由备份文件装载master数据库 1>load database master from '/sybase/master.dump'2>go 6.扩展master数据库 1>alter database master on master设备名称=size(此值以M为单位)2>go 例:alter database master on master=10将master数据库在master设备上扩展10M 3.12 如何删除坏的用户数据库?(以pubs2为例) 当使用drop database无法删除数据库时,使用本文所示方法可以删除。 (1)使用isql以sa注册SQL server (2)设置允许修改系统表 1>sp_configure \"allow updates\ 2>go (3)把 要删除的用户数据库置为\"suspect\"状态 1>use master 2>go 1>begin tran 2>go 1>update sysdatabases set status=256 2>where name=\"pubs2\" 3>go 如果得到(1 row affected),则 1>commit 2>go 否则 1>rollback 2>go (4)重启server,并用isql以sa注册。 (5)删除数据库 1>dbcc dbrepair(pubs2,dropdb) 2>go (6)恢复允许修改系统表 1>sp_configure \"allow updates\ 2>go 结束。 3.13 如何移植master设备 以下步骤说明了如何将master设备移植到不同的磁盘上。在执行此项任务的同时,请参看SYBASE的相关文档(Technical Documents#1324entitled \"Segment Remapping with Load database When Moving aDatabase\")。请注意,在执行buildmaster之前,要停止SQL Server的应用。 成功的关键在于,新建的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 VMS:buildmaster /disk= 编辑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\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\2> go 1> update sysdevices set high=nnnn where name=\"master\"2> go 其中nnnn是以页(2K)为单位的master设备的大小,此值可以从保留的sysdevices系统表的信息中找到。如果所建的设备比旧设备大,请执行:1)创建一个与master设备差不多大的数据库,这样做的目的是重新初始化分配页,使得整个master设备可用。2)删除这个数据库。重启Server。 后备master数据库。 注意: 在装载master库之前要确定SQL Server此时的字符集和语言模块与后备master库时的字符集和语言模块相同。 在执行此任务之前和完成以后使用sp_helpsort查看字符集与语言模块是否相同。 3.14 如何终止数据库恢复过程 当某一正常运行的大事务(例如:update、delete操作)被终止,且重新启动server后,运行该事务的数据库处于恢复状态,通常这种状态会持续很长时间,当在此恢复过程中没有出现任何异常时,建议用户耐心等待恢复过程完成。同时我们提供以下方法来终止此恢复过程,但请用户注意这些操作将带来数据的不一致性。必要时,希望用户用完整、可靠的数据库备份恢复此数据库。 (1) 启动Backup Server, 后备master数据库(这一步很重要!) 1>dump database master to \"/usr/sybase/master.dup\" 2>go (2) 用isql登录到SQL Server, 须用sa帐号 (本文以pubs2数据库为例) 1>sp_configure \"allow updates\ 2>go 1>begin tran 2>go 1> use master 2> go 1>update sysdatabases 2>set status = -32768 3>Where name=\"pubs2\" 4>go 如果得到(1 row affected),则 1>commit2>go 否则 1>rollback 2>go (3)这时重新启动SQL Server, 再用sa帐号登录到SQL Server. 1>dump tran pubs2 with no_log 2>go 1>begin tran 2>go 1> use master 2> go 1>update sysdatabases 2>set status=0 3>Where name=\"pubs2\" 4>go 如果得到(1 row affected),则 1>commit 2>go 否则 1>rollback 2>go 1>sp_configure \"allow updates\" ,0 2>go (4) 重新启动server (5) 如果你的数据库原来有dboption(例如\"select into\log onchkpt\"等), 你需要重新设置这些option.. (6) 当数据库已经恢复可使用状态后,运行dbcc命令检查数据库的一致性(参照\"如何检查数据库中数据一致性\"文章) (7) 后备用户数据库 例如: 1>dump database pubs2 to \"/usr/sybase/pubs2.dup\" 2>go 3.15 如何重建sybsystemprocs系统数据库 依照以下步骤可以实现移动sybsystemprocs系统数据库以及设备的任务。同时这个过程也可以用来扩建sybsystemprocs系统数据库。 以下过程中所提到的语法结构,可以参看SYBASE相关资料。 SYBASE提醒您,在修改系统表时,SQL Server要以单用户模式运行,同时要以\"sa\"用户登录。 保留驻留在sybsystemprocs系统数据库中自定义的存储过程脚本。单用户模式启动SQL Server,执行:1> sp_configure \"allow updates\2> go 1> reconfigure with override(10.0版本以上,省略此步)2> go 删除sybsystemprocs系统数据库:1> use master2> go 1> drop database sybsystemprocs2> 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 重启SQL Server. 创建sybsystemprocs系统数据库设备:1> disk initname=\"sysprocsdev\2> go 其中size是以页为单位(512页=1M)。 sybsystemprocs系统数据库设备的vdevno应该是4,SQL Server在单用户模式下4不能被重新利用,所以如果以上语句执行时出现问题,请重启SQL Server。 sybsystemprocs系统数据库: 1> create database sybsystemprocs on sysorocsdev=502> go 在sysdatabases系统表中,sybsystemprocs系统数据库的dbid=4,如果在重建 sybsystemprocs系统数据库之前,没有创建任何其他数据库。以多用户模式启动SQL Server,并执行:1> sp_configure \"allow updates\2> go 3> reconfigure with override(10.0版本以上,省略此步)4> go 运行installmaster脚本: %isql -Usa -Psa_password -Sserver_name -n -iinstallmaster -o< output_fileinstallmaster脚本在$SYBASE/scripts路径下。 重建sybsystemprocs系统数据库中的用户自定义存储过程 。 3.16 如何做 rebuild log 注意:这个过程可能会引起数据的不一致性。 (1)赋予sa用户sybase_ts_role的角色isql -Usa -P 1>sp_role \"grant\2>go 1>quit (2)将数据库置为\"bypass recovery\"状态isql -Usa -P 1>sp_configure \"allow updates\2>go 1>use master2>go 1>update sysdatabases set status=-327682>where name=\"database_name\"3>go 1>shutdown with nowait2>go (3)rebuild数据库日志重启Serverisql -Usa -P1>use master2>go 1>dbcc rebuild_log(database_name,1,1)2>go 1>shutdown with nowait2>go (4)重启SQL server1>use master2>go 1>update sysdatabases set status=0 where name=\"database_name\"2>go 1>sp_configure \"allow updates\2>go 1>shutdown with nowait2>go (5)在重启SQL server之后,如果数据库恢复正常,rebuild log工作将会成功完成,否则要恢复数据库备份,使用dump database或bcp命令。 3.17 如何做Rebuild Master(没有后备master 库,而使用命令disk reinit,disk refit) 提示1: 如果有可能,在执行这个任务之前,请先做操作系统级SYBASEDEVICES的后备。UNIX操作系统可使用命令\"dd\"。因为如果disk reinit使用了错误的信息,那么,在执行了disk refit之后就会产生无法弥补的错误。倘若,存在一个SYBASE DEVICES的后备文件,将会给我们一个弥补的机会。例如:当disk reinit 使用了过小的size值,我们还可以重新恢复SYBASE DEVICES文件,重新做disk reint、disk refit。 提示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系统表,而没有重新初始化SYBASEDEVICE。语法如下: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 mastergo disk refitgo 查看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检查。对所有库做后备。 3.18 在SYBASE中如何设置用户口令为空 使用sa登录Server: isql -Usa -Psa_password -Sserver_name 记录当前版本号(以当前版本号12000为例):sp_configure \"upgrade version\"go 修改当前值为492: sp_configure \"upgrade version\go 将某用户口令设置为NULL(以sa为例,当前口令为\"123456\"):sp_password '123456',NULL,sago 重新设置当前版本号: sp_configure \"upgrade version\go 3.19 如何扩展master数据库空间 master数据库只能扩展在master设备上.那么当master设备已经没有足够的空间可使用时,请按以下步骤操作: (此操作过程是以UNIX操作系统为例.SYBASE安装路径为/sybase) 1.备份master数据库 启动backup server,进入isql环境执行: 1>dump database master to '/sybase/master.dump'2>go Shut down SQL/ASE Server 1>shutdown2>go 2.创建新的足够大的master设备 $buildmaster -d -ssize(size以2K为单位) 例:$buildmaster -d/sybase/data/master.dat -s20480 3.修改RUN_servername文件 编辑RUN_server_name文件,-d参数指向新建的设备名。 4.单用户模式重启server $startserver -f RUN_servername -m5.由备份文件装载master数据库 1>load database master from '/sybase/master.dump'2>go 6.扩展master数据库 1>alter database master on master设备名称=size(此值以M为单位)2>go 例:alter database master on master=10将master数据库在master设备上扩展10M 四. 性能管理 4.1 Backup Server 什么是Backup Server? Backup Server是一个基于Open Server的工具。它可以处理SQLServer10。0以及更高版本的数据Dump/Load。因为它是独立于SQL Server的处理过程,完成它的工作不依赖于SQLServer。因此,在联机数据库Dump/Load时,不会降低SQL Server的性能。 网络环境下的Backup Server Backup Server必须与SQL Server放在同一台机器上(如果在OpenVMS上,可以在同一簇内)。你也可以如下图所示的环境,使用分布在网络上的两个Backup Server来完成Dump/Load。这两个Backup Server一个与SQL Server放在同一台机器上另一个可在远程某一节点上。 可以将本地(Local)的数据库Dump到远程(Remote)节点的外部设备 上,或者从Remote节点读取Dump,将数据库Load到本地的SQL Server。 当将本地数据库Dump到远程机器的设备时,由Local Backup Server读取数据库数据,再送到网络另一端的Remote Backup Server,经它将数据写到外部设备上。同样,从远程设备Load时,load Backup Server发出命令给Remote Backup Server,Remote Backup Server读取Dump设备内容并传送到Local Backup Server,由Load Backup Server将读到的数据写到数据库设备。网络上的Dump性能仅受网络传输能力的影响。 Backup Server新的特性,提高了系统Dump/Load的能力 能自动测出设备类型和密度; 支持多个SYBASE Dump到同一设备卷;支持一个SYBASE Dump到多个设备卷。Backup Server支持并行Dump设备 Backup Server支持最大32个Backup设备并行地Dump/Load。亦即可以将一个数据库分成碎片Dump到多个设备上。SQL Server并行Dump/Load的设备数受操作系统能打开的最大文件数和共享内存资源的限制。因此,各种不同硬件平台,不同的操作系统下,并行Dump/Load设备数不同。 多文件(Multi-file),多卷(Multi-volumn)Dump 操作系统文件和Raw Partifion是Single_volumn,Single-file的介质,这就是说这两种设备只能含有一个SYBASE Dump。 QIC磁带和可移动硬盘是Single-file,,Multi-Volumn介质,意味着一个Dump可以跨越多个卷。这些设备不允许叠加,如果你想在同一个设备卷上追加存放多个Dump,系统将提示是否覆盖已有的内容。 DAT,8mm,9-Track磁带是Multi-file,multi-volumn设备。以上三种设备可以包含一个或多个数据库Dump。设备卷上的最后一个Dump可以跨过磁带,继续存放在另一设备带上。Backup Server在网络上的Server名称 网络环境中的所有Server必须在Interfaces文件中有一个注册信息项,包括Server的名字,在网络中的网络节点地址及SYBASE Server用 的网络端口号Backup Server也必须将它的信息放在Interfaces文件中。可以用Sybinit来完成这个工作。并且Backup Server的名字也必须加在master数据库的Sysservers表中。如果你还有一个Remote BackupServer,也需将它的信息放在本地的Interfaces文件中。 Backup Server项在Interfaces文件和Sysservers表中必须有准确的名字。如果在启动Backup Server时用-s选项指定了Backup Server的名字,那么在整个网络中都要用这个名字来标识这个Backup Server。换言之,在Interfaces文件中,不能使用别名来标识某一个Backup Server。 Backup Server使用的设备 Backup Server必须使用不回卷(No Rewind)设备,以便BackupServer能够控制磁带设备的位置。 下表列出了某些硬件平台上的Dump设备名称。其中N代表了设备号。 PlatformTypeDevice Name HP9000NCR 4mm(SCSI and /HPIB)9 track (/SCSI and /HPIB)8mm /SCSI (5 GB and 2.2 GB)4mm/SCSI9 track /SCSI RS6000 /dev/rmt/Num/dev/rmt/Nmndev/nrmtNdev/nrmtN/ dev / nrmtN。[0-127] 8mm DAT /SCSI (5 GB and 2.2/ dev / nrmtN。[0-GB)127QIC /SCSI (1/4?cartridge9 track /SCSI / dev / nrmtN。[0-127]/ dev /nrmtN/ dev / nrarN/ dev / nrstNSee un4 SVR4?on Sun4QIC /SCSI (1/4?cartridge)8mm /SCSI (5 GB and 2.2 GB)9 track Sun4 SVR4(Solaris) 1/4 cartridge 8mm /SCSI (5 GB and 2..2 GB9 track (HSC and /DSSI) page4-10 VAXVMS See pen VMS?on 8mm (/HSC 5 GB and 2 GB and page /DSSI) 4-10 TK50 (HSC and /DSSI)8mm / SCSI9 track 4mm DAT /SCSI4mm DAT /SCSITZ851 See pen VMS?onpage4-10 See XP OSF/1?onpage4-10 AXPVMSAXPOSF/1 Table 4-1:Device names for database dumps to tape 4.2 Backup Server的名字 当使用Backup Server做Dump/Load时,系统会自动地寻找SYB_BACKUP这样的Backup Server名字。这就要求在master库的sysservers表中必须有一条记录来描述这个Server,其srvname为 SYB_BACKUP。在安装Backup Server时,如果使用缺省值,那么安装过程将自动生成一个名字为SYB_BACKUP的Backup Server,同时完成这些操作。 1.master库的sysservers表中增加一条记录如下srvid srvstatus srvname srvnetnamen 0 SYB_BACKUP SYB_BACKUP 2.$SYBASE/interfaces文件中增加一项,servername为SYB_BACKUP,有它自己的网络地址和网络端口号。 3.在$SYBASE/install目录下,创建启动Backup Server名为RUN_SYB_BACKUP的文件。 文件中启动Backup Server命令的-S选项指明BackupServer在网上的名字为SYB_BACKUP。 在做Dump/Load时,系统自动地找SYB_BACKUP作为 BackupServer。再根据(1)中指出的srvnetname到interfaces文件中找到server。但是,如果在安装时未使用SYB_BACKUP作为Backup Server名字。那么安装仅完成以上(2),(3)的操作。例如,你使用 MY_BACKUP作为Backup Server名,则$SYBASE/interfaces中Server名为MY_BACKUP,启动Backup Server命令的-S选项参数为MY_BACKUP。完成(1)的操作,则必须依靠手工完成,在ISQL中,用sa帐号登录。 1>sp_addserver SYB_BACKUP, null, MY_BACKUP2>go 其中SYB_BACKUP为固定参数,MY_BACKUP是你指定的网络上 Backup Server的名字。 4.3 DBCC 我们知道,在数据库系统的开发和应用中,必须保证数据库的完整性和一致性。当数据库出现了严重错误;当我们怀疑数据库受到破坏(如无法用drop命令删除数据库或对象,使用某个表时出现“不可靠数据”的信息等);当用户改变了Server的缺省排序的顺序或改变了字符集而需要检查;当SA对系统做定期检查;这些时候,我们都需要使用数据库一致性检查工具(Database Consistenecy Checker,简称DBCC)。DBCC是一个实用命令集,用来检查一个数据库的逻辑一致性及物理一致性。在开发和应用中,DBCC是我们经常要使用的命令。 DBCC命令的格式如下 dbcc (checktable ((表名|表标识( [, skip_ncindex] ) |checkdb [(数据库名[, skip_ncindex] )] |checkalloc [ (数据库名[, fix | nofix] )] |tablealloc( {表名|表标识}[,{full |optimized |fast |null}[, fix |nofix] ]]) | indexalloc ( {表名|表标识},索引标识[,{full |optimezed | fast | null}[, fix |nofix ]] ) | checkcatalog [ (数据库名)] |dbrepair(数据库名,dropdb ) |reindex({表名|表标识} ) |fix_text({表名|表标识) } dbcc的权限,对于checktable,fix_text和reindex是缺省赋给表的属主,对于checkdb,checkalloc,checkcatalog, dbrepair,indexalloc和tablealloc,是缺省赋给数据库属主的。DBO自动获得DBCC命令和全部选项的权限。该权限不可转授。 此外,dbcc在数据库是活动时运行,除了dbrepair选项和带有fix选项的 dbcc checkalloc以外。 checktable选项 checktable是用来对一个指定的表做检查,确保索引和数据页正确地连接,索引按正确的顺序存储,所有指针的一致性,每页上数据信息的合理性,页偏移的合理性。如果日志段在它自己的(日志)设备上,对syslogs表使用dbcc checktable命令可以报告已使用的和 剩余的日志空间,使用skip_ncindex选项使得dbcc checktable跳过对用户表上非聚簇索引(nonclusteredindex)的检查。缺省是检查所有的索引。 例1.检查日志使用的空间量和未用的空间量: dbcc checktable (syslogs) 若日志段在日志设备上,则会返回如下信息: 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 fixoption 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相同。 checkcatalog选项 checkcatalog选项用于检查系统表内,系统表之间的一致性。例如:它确保在syscolumns表中的每一(数据)类型在systypes表中都有一个相匹配的记录;对于sysobjects中的每个表和视图在syscolumns表中应有关于它们每一列的描述记录;确保在syslogs中的最后一个检查点是有效的。checkcatalog也报告任何已定义的段。若不指定数据库名,则检查当前数据库。 dbrepair选项 dbrepair(数据库名,dropdb)选项是删除一个受破坏的数据库。受破坏的数据库是不能用drop database命令删除的, drop database只能删除正常的数据库,当执行dbrepair命令时,任何用户 (包括执行此命令的用户)都不得使用正被删除的数据库。该选项要在master库中运行。 reindex选项 reindex选项通过运行dbcc checktable的“fast”执行方式检查用户表上索引的完整性。 如果它检测出索引有问题则会删除并重建索引。在SQL Server的排列顺序改变之后,SA或表属主应该执行这一选项。此选项不能在用户定义的事务中运行。 例: dbcc reindex (titles) 返回信息:One or more indexes corrupt.They will be rebuilt. fix_text选项 SQL Server的字符集由单字节转变为多字节后,fix_text选项用于升级文本值。 SQL Server的字符集由单字节转变为多字节字符集会使文本数据的管理更加复杂。由于文本值可能较大足以覆盖若干页, SQL Server必须能处理(通过页约束)可能横跨页的字符。为做到这点,服务器需要在每一文本页上添加一些信息。 SA或表属主必须在文本数据的每一个表上运行dbcc fix_text,以计算所需要的新页数。 总之,DBCC命令所返回的信息能准确地反映数据库及它的各个对象的状态,是我们检测数据库的好帮手。 4.4 Index & Performance 在应用系统中,尤其在联机事务处理系统中,对数据检索及处理速度已成为衡量应用系统成败标准。而采用索引来加快数据处理速度也成 为广大数据库用户所接受的优化方法。 索引的使用效果不仅仅依赖于SQL Server的优化策略,在相当程度上也依赖于应用程序的设计。怎样正确地使用索引,不能一概而论,究竟是让索引满足程序设计的需要,或是程序设计遵循已建立的索引,这两者是相符相承的。只有正确地使索引与程序结合起来,才能产生最佳的优化方案。 建立索引的目地是为了优化检索速度,如果检索所需要的时间过长,便有理由怀疑是否索引不存在或者优化器没有使用索引。尚若是索引不存在,那么就要取决于用户是否愿意用空间来换取时间,使用索引来解决检索速度慢的问题。如果优化器未使用表上已有的索引,那么要分析为什么,关于这一点将在后一点篇幅来说明如果update的效率很低,很可能是由于表上有太多的索引需要维护,从而浪费了时间。 优化器怎样使用索引Table scan 如果表上没有任何索引,那么检索将采用Table Scan方式进行,其所用时间主要依赖于表的大小。 例如: - dbcc checktable 测出表占76923页-系统每秒读取50页 -76923页/50页/秒=1538秒 (大约25分钟) 如果系统有比较大的cathe,某些数据可能由于以前已被读到内存,那么读取数据时间可能会低于估计的时间。 一般情况下,Tablescan检索是由于表上没有ClusteredIndex或者优化器认为,表中将有20%的数据做为结果追回。 使用索引(条件为指定值) 索引中包含指定记录的值及地址,SQL Server不必做全表扫描。 例: select * from title where title_id=\"mc3021\" 当优化器认为读取索引页I/O加读取数据页I/O比做Table Scan效果更好时,检索将使用索引。 使用索引(条件为某范围内值) 例: select * from titles where title_id >\"BU1032\"and title-id <\"mc3032\" 如果数据是排序的(有Clustered索引),索引将被用来限制数据的扫描范围。 使用索引避免检索排序所需要的时间。 例: select * from titlesorder by title_id 对Clustered索引来说,如果索引顺序与Server顺序一致,那么上面的查寻不需要重新排列返回结果。但是,若数据存储本身是升序排列,而查寻要求降序排列,那么索引对加快查寻没有任何作用。 对于Non-Clustered索引,优化器将判断查寻Non_Clustered索引页,找到满足条件的数据进行排序是否比Table Scan更快, 优化器将找出最佳结果。从以上几例可以看出,并非在表上建立了Clustered或on-Clustered索引之后,就一定会被使用, 优化器是否使用索引取决于数据的查寻命令,SQL Server将从几个检索方案中选择最佳的一个。 在什么样的条件下才选择Clustered索引呢? 选择什么样的索引基于用户对数据的检索条件,这些条件体现于where从句和join表达式。如果你的应用与以下情况相符,你可以考虑选择Clustered索引。 · 主键时常作为where子句的条件 · 某一列经常以这样的格式出现在where表达式中(x<=column <=\"y)\" · 某一列非常频繁地被访问 · 某列被用作order by或group by · 某列很少被改写 · 某列常出现在join中。 Non-Clustered常被用在以下情况: · 某列常用于Aggregate函数(如Sum,....) · 某列常用于join,order by,group by。 · 查寻检索出的数据不超过表中数据量的20%。 索引覆盖 检索覆盖是指Non_Clustered索引项中包含查寻所需要的全部信息。这种索引之所以比较快也正是因为索引页中包含了查寻所必须的数据,不需去访问数据页。如果Non-Clustered索引中包含结果数据,那么它的检索速度将快于Clustered索引。覆盖索引的缺点:由于索引项比较多,要占用比较大的空间。而且update操作会引起索引值改变。 SQL Server对索引的限制 · 每个表上最多仅能有一个Clustered索引。 · 如果表上有一个Clustered索引,最多还能有249 Non-Clustered索引。 · 当没有Clustered索引时,则可有250个Non-Clustered索引。 · 索引最多建立在256个列上。 · 当索引被创建时,SQL Server需要120%的附加空间。 索引维护 随着应用系统的运行,数据不断地发生变化,当数据变化达到某一个程度时将会影响到索引的使用。上面讲到,某些不合适的索引影响到SQL Server的性能,这时需要用户自己来维护索引。一种方法是删除老的索引,重新建新的索引。 另外一种方法是保持索引统计有效(使用命令update statistics),在以下情况下需要重新索引。 · 使用数据模式发生了较大变化。 · 某段时间内有极大量的数据插入。 · SQL Server排序改变。 · dbcc发现索引错误。 当重建Clustered索引时,这张表的所有Non-Clustered索引将被重建。 维护索引统计表: 数据库拥有者必须用命令维护统计表。 update statistics table_name [index_name] 索引优化调整 用这条命令可以改善创建索引的性能,减少建索引所用的时间。 sp_configure \"extent i/o buffers\带来的影响是增加了extent i/o buffers大小,在SQL Server使用内存不变情况下,减少了procedure和datacathe,而且同一时刻仅有一个用户能用到extent buffer。 4.5 SQL Server 事务日志 SYBASE 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 间隔是由SQLServer 根据系统活动和系统表sysconfigures中的恢复间隔(recoveryinterval)值计算出的。 通过指定系统恢复所需的时间总量,恢复间隔决定了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 logon 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% ***NOTICE:space free on the log segment is 7.13Mbytes,35.65% 根据log剩余空间比例来决定是否使用dump transaction 命令来备份和清除log。 用快速方法来判断transaction log 满的程度。 1>use database_name2>go 1>select data_pgs (8,doa mpg)2>from sysindexes where id=83>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 withtruncate_only,dump transaction with no_log 命令。若想备份,应做dumptransaction database_name to dumpdevice。 七、管理大的transactions 有些操作是大批量地修改数据,log增长速度十分快,如: 大量数据修改 删除一个表的所有记录 基于子查询的数据插入批量数据拷贝 下面讲述怎样使用这些transaction 使log 不至溢满: 大量数据修改 例 : 1>update large_tab set col_1=02>go 若这个表很大,则此update动作在未完成之前就可能使log满,引起1105错误(logfull)而且执行这种大的transaction所产生的exclusive tableloc,阻止其他用户在update期间修改这个表,这可能引起死锁。为避免这些情况,我们可以把这个大的transaction分成几个小的transactions,并执行dump transaction 动作。 上述例子可以分成两个或多个小transactions. 例如: 1>update large_tab set col1=02>where col2 3>go 1>dump transaction database_name with truncate_only2>go 1>update large_tab set col1=02>where col2>=x3>go 1>dump transaction database_name with truncate_only2>go 若这个transaction 需要备份到介质上,则不用with truncate_only 选项。 若执 行dump transaction with truncate_only,应该先做dump database 命令。 删除一个表的所有记录: 例: 1>delete table large_tab2>go 同样,把整个table的记录都删除,要记很多log,我们可以用truncate table命令代替上述语句完成相同功能。 1>truncate table large_tab2>go 这样,表中记录都删除了,而使用truncate table 命令,log只记录空间回收情况,而不是记录删除表中每一行的操作。 基于子查询的数据插入 例: 1>insert new_tab select col1,col2 from large_tab2>go 同样的方法,对这个大的transaction,我们应该处理为几个小的transactions。 1>Insert new_tab 2>select col1,col2 from large_tab where col1<=y3>go 1>dump transaction database_name with truncate_only2>go 1>insert new_tab 2>select col1,col2 from large_tab where col1>y3>go 1>dump database database_name with truncate_only2>go 同样,若想保存log到介质上,则dump transaction 后不加withtruncate_only 选项。 若执行dump transaction with truncate_only,应该先做dump database 动作。 批量数据拷贝 在使用bcp把数据拷入数据库时,我们可以把这个大的transaction变成几个小的transactions处理,避免log剧增。 开放trunc log on chkpt 选项 1>use master2>go 1>sp_dboption database_name,trunc,true2>go 1>use database_name2>go 1>checkpoint2>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 只记载空间分配情况。在这种情况下,要先做dumpdatabase(为恢复数据库用)。若log太小,可置trunc log on chkpt 选项,这样在每次checkpoint后清除log。 八、Threshold 和transaction log 管理 SQL Server提供阈值管理功能,它能帮助用户自动监视数据库log设备段的自由空间。 log的管理是灵活而复杂的,我们应该在实践中摸索经验,针对每个数据库的不同情况,不同操作,做不同处理。 4.6 Sybase SQL Server 11的内存缓冲区管理和性能调整 由于64位编址的实现和对称式多处理大组装盒的生产,计算机硬件具有越来越大的内存和日趋增长的强大计算处理能力,这为高性能数据库系统提供了令人鼓舞的新机遇。Sybase SQL Server 11能在这种环境下,帮助广大用户充分发挥现有系统的潜力和为将来创建开放的架构。其最显著的特性是支持多用户内存缓冲区结构,使用大块I/O的顺序预存取,和它们同查询优化器的紧密集成,新内存缓冲区管理能极大的改善系统性能。它提供许多工具和手段分析和配置内存缓冲区,以便能获得优良的应用性能。根据用户提供的系统配置,查询优化器能选择最佳的访问计划。这篇文章将介绍这些特性和如何使用它们来提高服务器性能。 一、 引言 32位编址障碍被突破,带来计算机采用超大内存的发展趋势。现在,把大的关键表存放在内存,已经是很现实的事。另外,使用大对称式多处理器计算机,将多个应用运行在同一系统上,可能更经济,合算。而这些应用的要求是各种各样,从可能修改一条记录的联机事务到读取整张表的报表生成,千变万化。SQL Server 11提供新功能,用于配置和优化这些应用,以便充分利用系统资源。 一个典型的数据库系统由存储在磁盘上的永久性数据构成,什么时候要处理这些数据,必须首先将它读到主存,也就是通常所说的数据缓冲区。通常是调用底层操作系统的块I/O 来实现。数据库管理系统需要组织好这些读到内存缓冲区的数据页面,以备将来使用。以后,假如服务器在内存能找到所需页面,就不必做物理I/O,只是进行逻辑I/O,我们称它为命中缓冲区。数据缓冲区就是用于服务器为用户进行数据库各种数据操作。我们知道这两种I/O在访问速度方面有很大的差距,所以,内存缓冲区的性能是影响数据库应用系统的关键因素之一。 数据库系统的内存管理由缓冲区管理程序实现。对于一个用户查询,它通常需要访问一定数量的逻辑页面,页面多少和使用的索引有关。而优化器的主要任务是选择涉及逻辑页面数量最小的访问路径。缓冲区管理程序的目标是为实现所需的逻辑I/O尽可能地减少物理I/O。有些访问路径可能有很多的逻辑I/O,但是物理I/O很少。SQL Server 11的优化器与缓冲区管理程序配合,能识别这种情况,挑选能最佳利用数据缓冲区的索引。 缓冲区管理程序的效率是用“缓冲区命中率”来衡量,它是申请访问的页面在内存缓 冲区中的比例。另一个衡量手段是访问竞争。因为缓冲区管理程序是共享资源,对它的并发访问是由“螺旋锁”(spinlock)机制来控制。在多对称式多处理器结构中,要取得最优的性能,那么减少多处理器为了访问这些区享资源而带来的竞争就特别重要。SQL Server 11就能减少这种竞争,提高系统的可伸缩性。 SQL Server 11增加了许多新特性,它们能极大地帮助数据库管理员支持决策支持和混合负载应用。他们面临的挑战是如何使运行在服务器上的各种应用能获得预料的性能。增加内存通常能提高系统的性能,但是对它们进行有效地管理可以产生最佳效果。SQL Server 11 的缓冲区管理程序,与查询优化器一道,提供新的缓冲区管理策略。这些策略有助于联机事务处理,决策支持和混合负载型应用。 在内存管理方面,SQL Server 11现在提供以下新特点:多数据缓冲区,顺序预取数据页面(使用大块I/O),新添的即取即弃数据缓冲策略,用户对每个缓冲配置的完全控制,和全自动的查询优化器支持,下面我们来详解它们。 二、 多数据缓冲区 SQL Server 11允许用户在内存建立多个缓冲区,换句话说,用于数据缓冲区的内存能被分成许多个命名缓冲区。每个命令缓冲区可以服务于特定的应用(即数据库或者对象),而且每个缓冲区可以按有利于特定应用独立配置,例如,I/O的块大小,缓冲区大小,和涮新标识等等。被捆绑到缓冲区应用或者对象的所有I/O将在该缓冲区里进行。因此如果只配置一个数据缓冲区,将会有下图所示的“螺旋锁”竞争热点: 单MRU-LRU缓冲区 每个缓冲区功能上是完备的,类似于SQL Server 10的数据缓冲区。被捆绑到不同缓冲区的两个应用彼此之间没有对内存的竞争或者是SMP的同步,例如没有螺旋锁竞争。因此计算机处理能力增加,应用处理效率相应增长。 多数据缓冲区 每个缓冲区可以单独配置和调整。缓冲区的分配和调整可以动态地进行,无须重启服务器,这就给数据库管理员提供一个强大的工具,用于随着系统负载的变化,重新分配内存资源。例如,在建立索引或者批量载数据时,可以将表捆绑到大缓冲区,然后,进行联机事务处理时,把它切换到普通缓冲区。查询优化器能识别表捆绑变化,并重新编译受影响的查询计划。 命名缓冲区也能用于调整应用,进一步提高性能。例如,把经常访问的索引页面捆绑到不同的缓冲区。将text和image页面保留在不同的缓冲区,防止它们把普通数据缓冲区填满。对于联机事务处理,由于它们产生大量的日志,因此可以把Syslogs表捆绑到为它特殊配置的缓冲区。多个缓冲区也有利于单处理器系统。 三、 大I/O和顺序预取(sequential pre-fetch) SQL Server 11能执行多种大小的I/O-2K,4K,8K和16K。多个页表可以在一次I/O中读取到,这样可以减少物理I/O的总次数。查询优化中能为扫描大量数据的查询选择顺序预取策略。经多种测试,能提高四成效率。 值得我们提到的是SQL Server 11能对同一对象以不同块大小做I/O。例如,用比读普通数据块大的方式读取正文/图像数据。这样使用不同I/O块大小就允许缓冲区管理充分利用内存。这种策略在混合负载应用中十分有用。 要对表进行大块I/O,首先必须将数据缓冲区配置成大I/O(称为缓冲池),然后将表捆绑到该缓冲区上。16K的缓冲池通常有几个16K缓冲区组成,它们自身形成独立的LRU链,并有自己的涮新点。大I/O不是适合于所有应用。在缓冲区内的所有页面一起移动,它们可能在同时被交换 出内存缓冲区,这可能对一些应用有不良影响。所以,为了防止这种情况,SQL Server 11查询优化器为每个查询选择最佳的块大小。 日志表Syslogs也可以捆绑到自己的缓冲区,并能配置最合适的I/O大小。产生多日志的应用可以考虑将I/O大小置为4K或者更大一些。同日志缓冲区一道,这种策略能极大地提高联机事务处理应用的性能。 四、 即取即弃替换策略(MRU) 通常,在缓冲池中的缓 冲块是采用基于MRU-LRU键结构的先进先出策略,所有块在被替换之前在内存停留相同的时间。这种方法适用于大多数情况,但在某一些情况下,不会重用的页面可能充乱数据缓冲区,打扰其他用户的扫描。为了防止这种情况,SQL Server 11提供即取即弃替换策略,查询优化器定义一些缓冲块可能为重用的,另一些缓冲块为不可能重用的,缓冲区管理器将在内存保留可能重用的数据页面比不可能重用的页面时间长一些。采用这种策略,能提高一部分应用的缓冲区命中率。 例如,SQL Server 11只使用几个缓冲块扫描一张非常大的表。这种扫描就不会打乱内存缓冲区的基本组合,其他并发应用不会受到影响。 不同的缓冲区替换策略 五、混合负载 在客户/服务器结构上,使用计算机能力越来越强的SMP机器,运行负载大小不同的应用,就越来越经济合算。支持混合负载对于任何数据库管理员来说都是一个巨大的挑战。联机事务处理(OLTP)系统要求具有不断增长的吞吐能力,去处理越来越多的小事务,而对于决策支持型(DSS)则要求在分配的时间内完成大作业。系统管理员有许多种不同的策略去支持混合负载,通常,他们把不同的SQL Server分配给不同的应用。在这里,我们是假设在同一个服务器上,同一个数据库中运行在同一台机器上的负载。 六、 联机事务处理(OLTP)和决策支持(DSS)负载 联机事务处理负载的特点是小事务,涉及少数量的表,没有什么联 接,每次修改几条记录。它的关键因素是事务吞吐量。相反,决策支持型应用和报表生成的负载往往涉及全表扫描,经常是多张表联接用去产生排序的求和统计或者是范围统计信息,这些作业通常要求在短时间内完成。它们的要求是响应时间短。 通常,决策支持查询要读取大量的数据。最简单的处理混合负载的办法是两种应用在一天的不同时间运行,很容易安排配置一些缓冲区,并将来自OLTP和DSS应用的对象捆绑分别到这些缓冲区上。一旦OLTP应用处理结束,DSS应用便启动,并使用它们的对象替换内存缓冲区,这些都是动态的,不必重新启动服务器。 但是,如果两种负载要同时并发运行,但是在不同的数据库上,我们可以把两个数据库捆绑到不同的内存缓冲。 七、 查询优化器 基于成本的查询优化与SQL Server 11的特性结合完美无暇。例如,优化器现在可能为某些查询选择大I/O的全表扫描。用户配置缓冲区,优化器为每个查询选择合适的I/O大小和理想的缓冲区替换策略,这些计划可以使用“SET SHOWPLAN ON”来查看。根据应用,优化器可能会对同一张表选择不同I/O大小,和分配缓冲区。例如,它为TEXT和 IMAGE字段选用大I/O,而为它们所基于的表选用2KI/O。优化器也有能力识别这种情况,对于某张表不涉及物理I/O,或者表报描会用去大半内存缓冲区。从而进行明智决策。 SQL Server 11有配置选项用于在不同级别调整内存缓冲区的行为。系统增加了新的命令,每条查询语句可以覆盖优化器策略──用户能自己指定查询所使用的索引,I/O大小和缓冲区替换策略。一旦内存缓冲区有所变动,优化器便重新编译受到影响的存储过程。 八、基于成本的缓冲模型 SQL Server 11优化器有一个新模型为查询估算物理I/O数量。这个模型考虑了缓冲区捆绑,I/O大小和缓冲区替换策略。例如,在数据缓冲区比较小的情况下,采用大I/O做全表扫描比只有10%选择度的非集簇索引要快。 对于连接处理,缓冲区管理特别重要。做连接时,内表需要扫描多次,因此,如果把内表放在内存缓冲区里,物理I/O次数将会减少。优化器会考虑这种情况。优化器也可以为每个查询考虑多达八张表的缓冲区利用情况。 标识列(Identity) SQL Server 10.0在表中提供了自动递增的唯一键列。如果定义一列为 IDENTITY 类型,它会被自动修改。 IDENTITY有如下一些特性: 只允许正整数,不允许有零(0),空(NULL),及任何分数。这列的值从1开始,总是递增1,直到最大值。 当达到最大值时,不能折返,如再想插入值则返回出错信息。这个标识列不能修改,对一行数据修改时,这列上的值不变。当插入一行时,不用插入标识列;标识列值自动产生并插入值。如果需要唯一标识列值,那么要在这列上建立唯一索引。 发生系统故障或使用 shutdown with nowait 时,可能会产生不连续的值。 进行 rollback 或 delete 操作时,也会产生不连续值;标识值不重用。 建立标识列 表的标识列是带有 IDENTITY 属性的 numeric 类型。由于 numeric类型允许有小数,但是标识列不允许,所以必须定义小数位为零,例如: create table sales_daily(sto_id char(4) not null, ord_num numeric(10,0) identity,ord_ant money null) 标识列允许的最大位数为38。 预置(preburn)问题 SQL Server 如何为标识列产生下一个值? SQL Server 有一个用 sp_configure 设置的配置值,叫 identityburning set factor,产生如下作用: · 初始时,一组 n 个值预置或存储在内存中。这些值为随后的 n 个插入操作保留。 · SQL Server 上的每个标识列有自己的预置值组。 · 每个插入操作从预置值组中取值。 · 当这组值用完后,产生另外一组 n 个值用于随后的 n 个插入操作。 identity burning set factor 是基于一个标识列的最大值的百分比。缺省的百分比是 0.05% 或 0.0005;然而 sp_configure 的值必须是整数而不能带小数。因此为 sp_configure把系数乘 10 power 7 转变为整数。计算缺省系数: 0.0005 * 10 power 7 = 5000 sp_configure 把值 5000 存储起来。sp_configure identity burning setfactor 的值在 1 和 9,999,999 之间。要确定基于希望预置的值的sp_configure 值,可使用下面的公式: preburned_set / (maximum + 1) = percentage percentage * 10 power 7 = identity burning set factor 例如,一个表的标识列最大为 4 位数,即最大值为 9999。如果想为这列预置 10 个值,利用下面公式: 10 / (9999 + 1) = 0.001 (0.01%) 0.001 * 10 power 7 = 10000 所以如下配置 identity burning set factor: sp_configure \"identity burning set factor\reconfigure 有两点需要注意: 因为是用 sp_configure 设置的值,所以同一个预置系数在服务器范围内适用于所有的表。 如果发生系统故障,大的预置值会引起大的断带。 预置系数在服务器范围内起作用 在服务器上不同的标识列可能大小不一样。对于一个给定的预置系数,要想知道为一个指定的表分配了多少个值,使用下面的公式: preburned set size = (maximum + 1) * (preburning factor * 10 power -7) 例如缺省的预置系数为 5000 一个表的标识列定义为 numeric(4,0),将指定(9999 + 1) * (5000 * 10power -7) = 5 个值,在 5 个插入操作之后,新的一组,紧接着的 5 个稍大的值为后面的插入操作保留。 一个表的标识列定义为 numeric(6,0),将指定(999999 + 1) * ( 5000 *10 power -7)=500个值。 可以通过使用用户自定义类型,使这个范围标准化。例如: sp_addtype sitekey, numeric(6,0), \"identity\" 把这个类型用于相应的地方,前面的例子中的建表语句将改为如下方式: create table sales_daily (stor_id char(4) not null, ord_num sitekey, ord_amt money null) 大的预置数集合可能导致大的断带 当发生系统故障,如果预置的系数越大,则标识值的断带越大,因为在内存中所有没被使用的预置数都将丢失。例如:如果定义标识列的最大值为 numeric(38,0),即使使用最小的预置系数,系统故障时可能丢失几百万个值。shutdown with nowait 会产生和系统故障同样的断带。 在某些环境中 dump/load 可能引起标识值的丢失。对象分配管理程序(OAM)的页面上为每一个对象存储了已使用的页面的页号,或已分配但未使用的页面的页号。Backup Server 直接从硬盘读取数据;OAM 页面存有最大的保留的标识值,而已用的最大值和保留的最大值在这个表的内存结构中保持跟踪,当清空内存结构或服务器用不带 nowait 的shutdown 关掉时,SQL Server 把最大的已用值写回 OAM 页,如果在dump时,最大的保留值和最大的已用值不一样,那么最大的保留值被写出,并在 load 时恢复,导致标识值的丢失。Sybase 正在着手解决这些问题。 4.7 SYBASE SQL Server内存分配 我们知道,在isql中,可以用sp_configure\"memory\"去看SQLServer目前使用的内存 ,这个数字单位为page,每一page为2k。当memory的值被修改后,重新启动SQL Server时,新的值才能生效当然,SQL Server内存与机器内存有一定的比例关系, Server的内存太小,会影响Server性能,甚至无法启动,内存太大,SQL Server也不能启动所以,了解SQL Server内存是如何分配的,对于正确地调整SQL Server内存的数值,保证Server最有效地运行会有很大的帮助。 一、内存使用: 操作系统及其他运行程序所占内存 SOL Server执行代码所占内存Kernl&Server 结构所占内存。 如:user connections,devices,open databases,open objects,locks,network packet buffers,extent i/o buffers等Procedure cacheData Cache 二、内存分配举例:(以 SQL SERVER 10.01 版本为参考) 由上表可知,机器内存中去掉操作系统及其他程序所需的内存,剩下的内存就可以分配给SQL Server。 假设SQL Server内存值为5120 page,即5120 *2k=10MB SQLServer。执行代码所占内存:对于不同平台,不同版本SQL Server执行代码大小不同,但对某种固定的平台及版本大小是固定的。大约在 2.5MB~3.0MB。用dbcc memusage可以观察到执行代码 的大小。我们假设为2.72MB。则剩下内存(10.0 -2.72)=7.28MB。此外,静态SQLServer额外还需要一些保留内存(此值不因用户修改configure参数值而改变),大概在1.20~2.25MB。此例中我们假设为1.31MB。下一步,SQL Server分配用户定义的configure参数所需的内存,如下表: Bvtes perSpace Resourcesp configure值 resourceRequired(MB) user connectionsDeviceslocks 25 23,552+stacksize17,40831580 1.240.190.150.38 open databases12 5005,000 Total 1.97 note: stack size, default 28k 影响内存的参数还有DefaultNetworkPacketSize.extenti/obuffers等,此处忽略。此时,SQL Server剩下的分配给cache的总内存为(7.28-1.31-.97)=4.00MB。 在Cache中,procedure Cache所占内存依赖于sp_configure中procedure Cache参数值缺省为20。即占总Cache 的20%,那么Cache中的80%为data Cache,此例中,我们设procedure Cache仍为20。 data cache =(4.00MB) * 0.8 procedure Cache =(4.00MB) * 0.2 Data Cache用于从database中读取页信息。如:data. log index pagesprocedure Cache用于存放compiled objects。如: storedprocedures,triggers, rules,同时处理query,cursor等。 Procedure Cache&Data Cache不能太小,否则影响使用。可以通过dbce memusage 查询,使Procedure Cache有足够大小,调整好Data Cache与Procedure Cache的比例。此外,我们还可以从SQL Server Errorlog中查看到Cache总内存空间情况: Server:Number of buffers in buffer cache:968Server:Number of proc bufferrs allocated:242Server:Number of blocks left for proc headers:225 第一条信息表示用于data Cache的页数:968 pages 第二条信息表示用于procedure Cache的页数:242 pages 第三条信息表示procedure Cache中一次最多能有225个已编译过的objects。 我们还应知道,如果default network packet size参数变化了,则分配给network packet的总内存为: user connections *3 *default networkpacket size 缺省值为: 25 *3 *512=38,400 bytes。若增加default networkpacket size值,应考虑SQL Server内存所剩空间,特别是data &procedureCache的需要。 三、使用dbcc memusage命令。 dbcc memusage命令用于显示SQL Serrver内存使用信息,也是查看SQL Server执行代码大小的唯一途径。 1>dbcc traceon (3604)2>go 1>dbcc memusage2>go 1>dbcc traceoff (3604) 2>go 信息中,code size表示SQL Server执行代码大小 四、不同SQL Server版本的内存要求: Bytesper Resource Resource 10.0.1Size Open databasesDevicesOpen objectsLocks 1740851231580 4.9.1Size750051231570 4.8Size697051229670 pre-4.8Size644450567232 User connections23552+Stack18000+Stack16000+Stack40960 4.8 阀值管理(Threshold Management) 在使用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段上,该段是通过使用建立数据库( Createdatabase )命令的log on 选项来定义的。 (二)最后机会阈值(Last_chance Threshold) 缺省情况下,SQLServer监测日志段的自由空间,当自由空间量低于事务日志能成功转储的需要时,SQL Server运行sp_ thresholdaction过程。此自由空间量称为最后机会阈值( Last_chance threshold ),它由SQL Server计算得来,并且用户不能改变。 sp_thresholdaction必须由用户编写,SQL Server不提供。另外,如果最后机会阈值越出,那么在日志空间释放前,SQL Server一直挂起所有事务。但可以使用sp_dboption对某一数据库来改变这一行为。设置aborttran 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或Openserver的任意数据库中。但是,超出阈值时,不能执行远程SQL Server上的存储过程。 例如:sp_addthreshold pubs2, logsegment, 200, dump_transaction 其中,存储过程定义为:create procedure dump_transaction@ dbname varchar (30), @ segmentname varchar (30),@ space_left int,@ status intas 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 isfull",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) · 只有自由空间减少阈值才触发,如果自由空间增加,它永远不触发。 4.9 如何在NT、UNIX下启动关闭ASE 一:启动ASE Server UNIX: 以sybase用户登录 11.x 版本: cd $SYBASE/install 12.x 版本: cd $SYBASE_ASE/install startserver -f RUN_SYBASE (启动SQL SERVER) startserver -f RUN_SYBASE_back (启动BACK SERVER)startserver -f RUN_SYBASE_mon (启动MONITOR SERVER) NT: 通过 Sybase Central通过 Control Panal Control Panal/Service/Sybase SQLServer -> Start (启动SQL SERVER)Control Panal/Service/Sybase BCKServer -> Start (启动BACK SERVER)Control Panal/Service/Sybase MONServer -> Start (启动MONITORSERVER) 二:关闭ASE Server UNIX: 以sybase用户登录isql -Usa -P shutdown SYB_BACKUPgo shutdowngo isql -Usa -P -SSYBASE_monsms_shutdowngo NT: 通过 Sybase Central通过 Control Panal Control Panal/Service/Sybase SQLServer -> Stop (启动SQL SERVER)Control Panal/Service/Sybase BCKServer -> Stop (启动BACK SERVER)Control Panal/Service/Sybase MONServer -> Stop (启动MONITORSERVER) 4.10 数据库选项(dboptions)的使用与管理 一、概述 SQL Server能管理多个数据库,每个数据库有自己的选项。SQLServer允许用户通过设置数据库选项,来更好地管理和使用数据库。当大批数据需要加载到数据库的表时,如果把该库的Select into/bulkcopy选项设置为true,同时暂时删掉表上的索引和触发器,再使用系统提供的实用程序bcp,数据将以惊人的高速度被装载到用户表里。也曾有用户抱怨,调用dbwritetext函数不能成功地把一幅bmp图写入数据库的image字段中。原因是用户数据库的select into/bulkcopy选项没有设置成true。还有正在开发数据库应用的用户希望日常工作不受数据库日志满的不断打扰。这也可以通过设置数据库选项办到。因此,我们这里将数据库选项的设置和用法详细介绍给读者,希望它有助于你有效地使用和管理用户数据库。 二、数据库选项的设置 使用系统存贮过程sp_dboption来设置数据库选项,它的语法规则如下: sp_dboption [dbname,optname,{true┃false}] 其中: · dbname为用户所需设置选项的数据库名称。如果执行带参数的sp_dboption,则当前使用的库必须是master。不带参数便显示数据库选项清单。但是,用户不能设置master库的数据库选项。 · optname为用户所要设置或关闭的选项名称。SQL Server能识别选项名的任何唯一的字符串。当其名称为关键字或含嵌入空格或标点符号时,用引号括起来。 · {true┃false}——设置该选项时为true,关闭该选项时为false。使用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存贮过程。 三、数据库选项的用途 (1)Selectinto/bulkcopy 使用bcp或批拷贝程序接口将数据高速拷贝到一张没有索引和触发器的表,Writetext或者Select into生成永久表,则此选项必须设置为true。因此,当你使用bcp实用程序往用户数据库加载数据时,或者调用dbwretetext函数把一幅图片插入到某张表的image字段,或者通过Selectinto命令形成结果表时,别忘了把该选项置为true。SQL Server为了快速执行上述操作,减少记录修改操作的日志。但是,这种不记日志的操作会使事务日志与数据库中数据不同步。这种事务日志对于系统失败后的恢复就没有用处。系统禁止在这种情况下,dump transation到转储设备。因此,这些不记日志记录的操作完成后,将Select into/bulkcopy选项关闭后,执行dump database。 由Select into或批拷贝对数据库产生未被日志记录的修改后,执行dump transaction命令时,显示错误信息,并指导用户改用dumpdatabase(而Wrrietext命令没有这种保护)。 由于临时库tempdb从不恢复,所以使用Select into产生临时表时不必将Selectinto/bulkcopy选项打开。对于有索引的表进行bcp时,一般进 行慢速批拷贝并且记入日志,所以此时也不必将Select into/bulkcopy设置为true。 (2)trunc log on chkpt 该选项表示每当checkpoint检查进程执行时(通常每分钟12次以上),事务日志被载截,即将已提交的事务日志删除。但是,该选项设置成true以后,人工执行checkpoint操作时都不载截事务日志。在开发数据库应用时,防止日志增长太快.可以将该选项设置成true,所以它很有用。 (3)abert 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。此时,存在一个基本库和一个辅助库。首先,基本库转储到辅助库中。然后,基本库的事务日志间断地转储并装载到辅助库中 若此选项设置为缺省值false,重新启动SQL Server时,恢复数据库后将向数据库增加一条检查点记录。检查点记录确保机制不会不必要地重新运行,改变顺序号,并导致随后从基本库装载事务日志的失败。 将辅助库的此项设置打开,恢复过程将不产生检查点,这样从基本库转储的事务日志可以被装载至辅助库。 (9)read only 该选项使得用户可以从数据库中检索数据,但不能修改数据。 (10)single user 该选项设置为true时,每次只能有一个用户访问该数据库。 4.11 数据库参数的调整 配置sql server 的方法就是通过sp_configure 命令或直接修改文件SYBASE.cfg。 sp_configure “name”,[”values”] 如果只用sp_configure 命令,此命令的作用是查看全部参数的值。 如果用sp_configure “name”,此命令的作用是查看参数“name”,当前的值。 1> sp_configure “number of user connections”Parameter Name Default Memory Used Config Value ------------------------------ ----------- -----------------------number of user connections 25 2591 2525 显示出参数number of user connections 的值。 1> sp_configure “number of user connections”,30此时,number of user connections 的值仍然为25,因为它是静态参数,重新启动sqlserver 后,此参数的值变为30。 1, 确定sql server 可用的最大内存 首先需要确定计算机系统的物理内存总和,然后减去操作系统所需内存,若此 计算机并非专门用于sql server,则需减去其他应用所需的内存。例如需要减 去分配给sql server 运行在同一机器上的客户应用程序所使用的内存。另外需 要减去分配给additional network memory 配置参数的内存,剩余部分即为sql server 可用内存的总数。通常配置为系统物理内存的60-70%。 设置sql server 可使用的最大内存的命令如下:sp_configure “total_memory”,value(以页为单位) 注意:如果total memory 参数的配置值大于sql server 可使用的最大内存, sql server 将无法启动。 修改sybase 内存配置sp_configure “total_memory”,value(以页为单位) 2,配置最大数据库设备数 系统默认的最大数据库设备数是10 个,这个值不能满足实际需 要,要增加此值,改为20。 Sp_configure “number of device”,20 3,设置用户连接数 系统默认的用户连接数是25 个,可根据实际需要来设置此值。每个用户连 接需要70KB 内存。修改命令如下: sp_configure “number of user connections”,value 修改以上内容后需要重新启动sybase 数据库,修改的内容才能生效。 4.12 数据库设备 数据库设备是指用于存取数据库的存储介质。它既可以是磁盘的一个分区,也可以是文件系统中的一个文件。但无论用哪种作数据库设备,它们在能被用来存取数据库对象之前必须初始化。一旦数据库设备被初始化,该设备就能: 1.为某个用户数据库分配一块可用空间 2.在为某用户数据库分配的空间内指定并存储某个特定的数据库对象3.用于存储某数据库的事务日志 选择磁盘分区还是unix文件来作数据库设备应视具体情况而定。一般来说,如果是最终用户的数据库,建议您用磁盘化区而非文件。因为对磁盘文件,SQL Server不能确切地知道数据是否真正被写到文件中去。如果是开发人员的数据库,那么用磁盘文件要稍好些,因为它使得建在其上的数据库恢复起来要容易一些。但对于master device来讲,无论是最终用户还是开发人员的数据库,磁盘文件无疑更为合适。因为相对而言,对master device的修改更少些而且镜像更为方便简单些。 如果在磁盘分区作数据库设备,应避免使用柱面0,C,swap分区以及其它已被OS占用的分区。如果选择磁盘文件作数据库设备,要保证SYBASE用户在相关的目录下有写权限。 命令diskinit命令对数据库设备进行初始化,使得物理上的硬盘分区 或文件可以被SQL Server使用,同时把逻辑设备映射到物理设备上,而每一次disk init执行后,都会在sysdevices系统表中增加一行。 disk init的语法: disk init name = \"device-name\ phyname = \"physical-name\ vdevno = virtual - device - number ,size = number - of - pages 其中: name:逻辑设备名 physname:硬盘分区或磁盘文件名 vdevno:虚拟设备号。它们取值可以是从1到max configured -1未被使用的任何值。可以用sp_helpdevice或从errorlog文件中查看device。用 sp_configure来看max configured的值。最大取值为255。一般来说,themaster device的vdevno 总为0,如果系统缺省设置最大设备数为10,而您希望使用更多的逻辑设备,可以重新设置备数限制。 在OS下打入:isql -Uxx -Pxx 1) sp_configure \" device\2) reconfigure with override3) go 这个新的配置值必须在Server重新启动后才生效。若一个数据库设备被删除掉后,其vdevno只有在重新启动Server后才能被新的设备所用。 4.13 关于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” 说明:在同一个存储过程或批处理中,创建并使用一个表时,查询优化器无法决定这个表的大小。 因篇幅问题不能全部显示,请点此查看更多更全内容