不能停止

运动,游玩,学习,我的爱不能停止

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  5 随笔 :: 3 文章 :: 8 评论 :: 0 Trackbacks

2005年10月26日 #

数据库日常维护工作是系统管理员的重要职责。其内容主要包括以下几个部分:

  一、备份系统数据

  sybase 系统的备份与恢复机制保证了在系统失败时重新获取数据的可能性。sql server 提供了两种不同类型的恢复机制:一类是系统自动完成的恢复,这种措施在每次系统启动时都自动进行,保证了在系统瘫痪前完成的事务都写到数据库设备上,而未完成的事务都被回退;另一类是人工完成的恢复,这是通过 dump 和 load 命令来执行人工备份和恢复工作。因此定期备份事务日志和数据库是一项十分重要的日常维护工作。

  1、备份数据库

  每一个数据库都应在创建之后卸出,从而提供一个装入基点。在此之后按排定的时间周期表卸出。比如每周五卸出数据库。对一般数据库系统卸出数据库周期建议为每周一次。

  除了按计划周期卸出数据库之外,还需在每次运行没有日志的操作后卸出数据库。例如:

  ·每次强制地运行了 dump tran with no_log (因为数据库的磁盘空溢出);

  ·每次用 sp_dboption 允许 select into/bulkcopy 做快速拷贝,或用 select into 命令创建一个永久性的表,或使用了 writetext 命令。

  卸出数据库的命令为:

  dump database database_name

  to dump_device

  database_name 是要卸出的数据库名称,dump_device 是卸出设备的名称。用系统过程 sp_helpdevice 可以获得设备的信息。

  下面一条命令用来卸出数据库 my_db :

  dump database my_db

  to db_bk_dev

  2、备份事务日志

  如果事务日志与数据库放在同一个设备上,则事务日志不应与数据库分开备份。master 数据库和小于 4m 的用户数据库就是这种情况。一般数据库系统的数据库和日志分别放在不同的设备上,因此,可以用 dump tran 命令单独备份日志。

  备份事务日志的周期直接影响数据的恢复程度,因此建议每天备份。

  备份事务日志的命令格式为:

  dump transaction database_name

  [to dump_device]

  [with truncate_only|with no_log|with no_truncate]

  其中 database_name 是要备份事务的数据库名称,dump_device 是备份设备名称,仅当包含了 with truncate_only 或 with no_log 子句时,才可以备份到设备。

  注意:如果总是用 dump datebase (备份数据库及其日志),而不用 dump tran ,事务日志将不会刷新,而变得非常庞大。

  对于 master 数据库和小型数据库每次运行 dump datebase 之后应当运行 dump transaction 命令刷新日志 。

  下面一条命令备份数据库 db160 的事务日志到备份设备上:

  dump transaction db160

  to db_log_bk_dev

  with truncate_only

  3、备份数据库及其日志间的相互作用

  在至少卸出一次数据库前,卸出事务日志是毫无意义的。下图显示了备份数据库及其日志间的关系

  如果在星期二下午5:01出现非硬件故障,需要做的所有工作是装入磁带5(参见下一节:数据恢复),由于磁带5是下午5:00刚备份的,因此只有备份和装入之间的一分钟内的数据损失。

  但是,如果在星期二下午4:49失效会怎么样呢?在这种情况下,要装入磁带1(在星期五下午5:00的卸出)。然后,依次装入磁带2,3以及4。这样,系统将恢复到星期二上午10:00点的状态,星期二的大部分工作丢失了。此例显示了经常卸出事务的重要性。

  二、万一系统失败时恢复数据库系统

  如果用户数据库存储的设备失效,从而数据库被破坏或不可存取,通过装入最新的数据库备份以及后来的事务日志备份可以恢复数据库。假设当前的事务日志存在于一个并没有毁坏的设备上,带着 with no_truncate 选项的 dump transaction 命令卸出它。

  要恢复数据库按如下步骤去做:

  1、如果日志存在于一个分离的设备上,用带着 no_truncate 选项的 dump transaction 命令卸出被毁坏的或者不可存取的用户数据库事务日志。

  2、用下面的查询检查设备分配已毁坏数据库的设备使用情况。必须为同一目的赋同样的空间块。

  下面的查询显示了分配给数据库 mydb 设备使用和尺寸情况:

  select segmap,size from sysusages

  where dbid =

  ( select dbid from sysdatabases where name = “mydb”)

  3、检查查询的输出。在 segmap 列的 ‘3’代表数据分配,‘4’代表日志分配。size 列代表 2k 数据块的数目。注意此信息的次序、使用和尺寸部分。例如,输出为:

  segmapsize

  --------------------

  310240//实际尺寸为:20m

  35120//实际尺寸为:10m

  45120//实际尺寸为:10m

  31024//实际尺寸为:2m

  42048//实际尺寸为:4m

  4、用 drop database 命令删除毁坏设备上的数据库。如果系统报错,用dbcc dbrepair 命令的 dropdb 选项。

  5、删除数据库后,用 sp_dropdevice 删除毁坏了的设备。

  6、用 disk init 初始化新的数据库设备。

  7、重建数据库。用 create database 命令从老的 sysusages 表拷贝所有的行,并包含第一逻辑设备。

  对上例,命令为:

  create database mydb

  on datadev1=20,datadev2=10

  log on logdev1=10

  8、用 alter database 命令重建其余入口。在此例中,在datadev1上分配更多的空间,命令为:

  alter database mydb on datadev1=2

  9、用 load database 重新装入数据库,然后用 load tran 装入前面卸出的日志。

  load database 命令语法是:

  load database database_name

  from dump_device

  load transaction 命令的语法是:

  load transaction database_name

  from dump_device

  卸出数据库和事务日志的缺省权限归数据库所有者,且可以传递给其他用户;装载数据库和事务的权限也归数据库所有者,但不能传递。

  二、产生用户信息表,并为信息表授权;

  系统维护人员的另一个日常事务是为用户创建新的信息表,并为之授权。创建表以及为表授权的方法已经在讲过,在此只将有关命令语法写出来。

  ·创建表的命令为:

  create table table_name

  ( column_1 datatype [null | not null | identity],

  column_2 ……

  )

  go

  alter table table_name

  add primary key (column_list)

  go

  ·删除表的命令格式为:

  drop table table_name

  go

  ·为表授权的命令格式为:

  grant {all|permission_list}

  on table_name to user_name

  go

  ·收回权限的命令格式为

  revoke {all|permission_list}

  on table_name from user_name

  go

  三、监视系统运行状况,及时处理系统错误;

  系统管理员的另一项日常工作是监视系统运行情况。主要有以下几个方面:

  1、监视当前用户以及进程的信息

  使用系统过程:sp_who

  说明:该命令显示当前系统所有注册用户及进程信息,如下表是某系统的信息。

  spidstatusloginamehostnameblkdbnamecmd

  ---------------------------------------------------------------

  1runningsascosysv0masterselect

  2sleepingnull0masternetwork handle

  3sleepingnull0masterdeadlock tune

  4sleepingnull0mastermirror handler

  5sleepingnull0masterhousekeeper

  6sleepingnull0mastercheckpoint sleep

  从左向右依次显示:进程号、当前状态、注册用户名、主机名、占用块数、数据库名以及当前命令。

  如果监视时发现进程总数接近最大连接数(用系统过程:sp_configure “user conn” 查看)时,应下掉不活动或无关进程,以保证系统正常运做;另外亦可监视非法用户或用户使用不属于自己使用范围的数据库等情况。

  2、监视目标占用空间情况

  使用系统过程:sp_spaceused

  说明:该过程显示行数、数据页数以及当前数据库中由某个目标或所有目标所占用的空间。如下表是某数据库日志表的信息:

  namerow_totalreserveddataindex_sizeunused

  ------------------------------------------------------------

  syslogsnot avail32kb32kb0kbnot avail

  日常要监视的主要目标有:用户数据库、数据库日志表(syslogs)以及计费原始数据表等。如果发现占用空间过大,对日志表要进行转储;对其他目标则应扩充空间或清楚垃圾数据。

  3、监视 sql server 统计数字

  使用系统过程:sp_monitor

  说明:sp_monitor 显示sql server 的历史统计数字,下表是某系统的统计数字:

  last_runcurrent_runseconds

  ---------------------------------------------------------------

  may 13 2000 1:27pmmay 13 2000 3:01pm5678

  cpu_busyio_busyidle

  ---------------------------------------------------------------

  16(6)-0%0(0)-0%5727(5672)-99%

  packets_receivedpackets_sentpacket_errors

  ---------------------------------------------------------------

  21(17)100(97)0(0)

  total_readtotal_writetotal_errorsconnections

  --------------------------------------------------------

  785(366)311(113)0(0)3(2)

  上表依次给出该系统本次运行统计的上一次时间、本次时间、间隔秒数、cpu占用、io占用、收发包情况、系统读入写出情况等信息

  四、保证系统数据安全,周期更改用户口令;

  为保证系统数据的安全,系统管理员必须依据系统的实际情况,执行一系列的安全保障措施。其中,周期性的更改用户口令是比较常用且十分有效的措施。

  更改用户口令是通过调用系统过程sp_password 来实现的。sp_password 的语法为:

  sp_password caller_password,new_password [,loginame]

  其中caller_password 是登录口令(老口令),new_password是新口令,loginame是登录名称。

posted @ 2005-10-26 17:46 快乐的射手 阅读(966) | 评论 (1)编辑 收藏

可能内容有些没章法。
以前在坛上许过写份学习资料出来。今天补上。望对学习者有帮助。

简介:
对学习sybase和ms-sqlserver的体会,包括安装、初始化、sql学习,过程和触发子创建,db-library和ct-library以及同oracle的不同之处,和细节注意对比。

[不能上传文件,只好列出内容]
Sybase学习体会
原创:戴黎鸣
第一大块:Sybase安装 [redhat 7.2]
Sybase rpm 包安装顺序 12.5.0.1 for linux
sybase-common-12.5.0.1DE-1.i386.rpm
sybase-ase-12.5.0.1ESD-1.i386.rpm
sybase-efts-12.5.0.1ESD-1.i386.rpm
sybase-openclient-12.5.0.1ESD-1.i386.rpm
sybase-esql-12.5.0.1ESD-1.i386.rpm
sybase-sqlremote-7.0.2-1.i386.rpm
sybase-chinese-12.5.0.1ESD-1.i386.rpm
安装
rpm -ivh sybase-common-12.5.0.3-7.i386.rpm
rpm -ivh sybase-ase-12.5.0.3-7.i386.rpm [ -Uhv --nodeps]
rpm -ivh sybase-efts-12.5.0.3-7.i386.rpm [ -Uhv --nodeps]
rpm -ivh sybase-openclient-12.5.0.3-7.i386.rpm
rpm -ivh sybase-esql-12.5.0.3-7.i386.rpm
rpm -ivh sybase-sqlremote-7.0.2-1.i386.rpm
卸载
rpm -e sybase-efts-12.5.0.3-7
rpm -e sybase-sqlremote-7.0.2-1
rpm -e sybase-esql-12.5.0.3-7
rpm -e sybase-openclient-12.5.0.3-7
rpm -e sybase-openclient-12.5.0.3-7
rpm -e sybase-ase-12.5.0.3-7
rpm -e sybase-chinese-12.5.0.3-7
rpm -e sybase-doc-12.5.0.3-7
rpm -e sybase-common-12.5.0.3-7
rpm -ql libstdc++
安装顺序和依赖关系说明:
sybase-common-12.5.0.1DE-1.i386.rpm The common package is a prerequisite to all other packages. It creates and installs the default runtime environment required by other packages, and includes tools to configure, install, and administer Adaptive Server and related components.
NOTE: The sybase-common-12.5-3.i386.rpm is a pre-required package. You must install it before you install any other rpm package as all depend on the common package.

sybase-ase-12.5.0.1ESD-1.i386.rpm This package installs all binary server components required to run Adaptive Server, Backup Server, XP Server, Monitor Server, Historical Server and related utilities and tools for database development and maintenance.

sybase-efts-12.5.0.1ESD-1.i386.rpm The efts package installs the Enhanced Full-Text Search Specialty Data Store, which provides the capability to do complex searches on character and text data stored in the ASE. The performance of the searches can be orders of magnitude faster than using standard SQL searches.

sybase-openclient-12.5.0.1ESD-1.i386.rpm The Open Client package installs the Sybase Open Client Software Development Kit (SDK). Open Client consists of programming interfaces and networking services for writing client applications for point-to-point communication to Sybase server products.

sybase-esql-12.5.0.1ESD-1.i386.rpm The Embedded SQL package installs the Sybase ESQL binaries, libraries, include files and sample programs. It consists of the programming interfaces and networking services for writing client application in Embedded-SQL for point-to-point communication to ASE.
NOTE: The sybase-esql-12.5.0.1ESD-1.i386.rpm package requires the sybase-openclient-12.5.0.1ESD-1.i386.rpm package.

sybase-sqlremote-7.0.2-1.i386.rpm The SQL Remote package installs the Sybase SQL Remote for Adaptive Server Enterprise. SQL Remote is a data-replication technology designed for two-way replication between a consolidated data server and large numbers of remote databases, typically including many mobile databases.

sybase-chinese-12.5.0.1ESD-1.i386.rpm
sybase-french-12.5.0.1ESD-1.i386.rpm
sybase-german-12.5.0.1ESD-1.i386.rpm
sybase-japanese-12.5.0.1ESD-1.i386.rpm
sybase-korean-12.5.0.1ESD-1.i386.rpm
sybase-polish-12.5.0.1ESD-1.i386.rpm
sybase-portuguese-12.5.0.1ESD-1.i386.rpm
sybase-thai-12.5.0.1ESD-1.i386.rpm
sybase-spanish-12.5.0.1ESD-1.i386.rpm
NOTE: These packages cannot be installed on a platform that is running an incorrect version of Linux, kernel and run-time. These packages do allow for upgrade of previous released versions under Linux. These packages do not allow for degrading later installs.

Consistency Check: Once the files have been transferred to the target machine, perform a consistency check before installing the packages. Enter:

#rpm -- checksig *.rpm

You should receive the following output:
sybase-common-12.5.0.1DE-1.i386.rpm: md5 OK
sybase-ase-12.5.0.1ESD-1.i386.rpm: md5 OK
sybase-efts-12.5.0.1ESD-1.i386.rpm: md5 OK
sybase-esql-12.5.0.1ESD-1.i386.rpm: md5 OK
sybase-openclient-12.5.0.1ESD-1.i386.rpm: md5 OK
sybase-sqlremote-12.5.0.1ESD-1.i386.rpm: md5 OK
sybase-french-12.5.0.1ESD-1.i386.rpm: md5 OK
sybase-german-12.5.0.1ESD-1.i386.rpm: md5 OK

Refer to the Installation Guide for detailed installation instructions

usage: isql [-b] [-e] [-F] [-p] [-n] [-v] [-X] [-Y] [-Q]
[-a display_charset] [-A packet_size] [-c cmdend] [-D database]
[-E editor [-h header [-H hostname [-i inputfile]
[-I interfaces_file] [-J client_charset] [-K keytab_file]
[-l login_timeout] [-m errorlevel] [-M labelname labelvalue]
[-o outputfile] [-P password] [-R remote_server_principal]
[-s col_separator] [-S server_name] [-t timeout] [-U username]
[-V [security_options]] [-w column_width] [-z localename]
[-Z security_mechanism]

1、 Root用户,先将rpm包解压,解压后的目录为/opt/Sybase-12.5
rpm -ivh *.rpm 顺序为前面所述的顺序。
如果以前安装过,用
rpm -e 'rpm -qa|grep sybase'卸载
2、 执行$SYBASE/install/sybinstall.sh,它将创建sybase用户和口令,用passwd将sybase的用户口令修改为所要设定的口令。
3、 在root用户登录文件中加入以下语句(以bash用户,.bash_profile为例。更改系统内存值为60M):echo "62914560" > /proc/sys/kernel/shmmax
{
1、 改/etc/sysctl.conf文件加入
kernel.shmmax=10000
fs.aio-max-size=10000
2、 编辑$SYBASE/ASE/init/ sample_resource_files/ srvbuild.adaptive_server.rs文件
其他服务建立文件也如此。
注意输入数据文件时,如果没有建立raw device 将要指定存放的目录和数据库数据文件。
3、 修改后用svrbuildres -r $SYBASE/ASE/init/sample_resource_files/
srvbuild.adaptive_server.rs执行将建立数据库。
} /opt/sybase-12.5/ASE-12_5/bin/srvbuildres -r /opt/sybase-12.5/ASE-12_5/init/
sample_resource_files/leon.adapative_server.rs
4、 设置完成后,重新用sybase登陆[他会自动设定完成环境变量],建一个目录存放日后的数据库文件
5、 重新restart computer
6、 sybase登陆x-windows,执行$SYBASE/ASE-12_5/bin/srvbuild,选择完四个服务器,键入数据,执行创建。
[
在X-Windows中使用srvbuild工具配置ASE产品
1、用sybase用户登录X-Windows,执行sybase安装目录(/opt/sybase-11.9.2)下/bin/srvbuild命令。
2、在srvbuild窗口中,选择要安装Server类型。把四种Server都选上。
3、给Server命名。将Adaptive Server命名为TEST,相应地,Backup Server自动命名为TEST_back,Monitor Server命名为TEST_mon,XP Server命名为TEST_XP。点击OK按钮,进入各Server的配置过程。
4、配置Adaptive Server。填写或选择以下内容:
Master device path(主设备路径):/db/sybsystem/master.dat
Master device size(MB)(主设备大小):60
Master database size(MB)(主数据库大小):20
Sybsystemprocs device path(系统存储过程设备路径):/db/sybsystem/systemprocs.dat
Sybsystemprocs device size(MB)(系统存储过程设备大小):60
Sybsystemprocs database size(MB)(系统存储过程数据库大小):60
Error log path(错误日志路径):/opt/sybase-11.9.2/install/TEST.log
Transport type(传输协议类型):tcp
Host name(主机名):192.168.0.1
Port number(监听端口号):4100
点击OK按钮,进入下一配置过程。
5、配置Backup Server。填写或选择以下内容:
Error log path:/opt/sybase-11.9.2/install/TEST_back.log
Tape configuration file:/opt/sybase-11.9.2/backup_tape.cfg
Language:(不填)
Character set:(不填)
Maximum number of network connections:25
Maximum number of server connections:20
Transport type:tcp
Host name:192.168.0.1
Port number:4200
点击OK按钮,进入下一配置过程。
6、配置Monitor Server。填写或选择以下内容:
Maximum number of connections:5
Error log path:/opt/sybase-11.9.2/install/TEST_mon.log
Configuration file path:/opt/sybase-11.9.2/install/TEST_mon.cfg
Share memory directory:/opt/sybase-11.9.2
Transport type:tcp
Host name:192.168.0.1
Port number:4300
点击OK按钮,进入下一配置过程。
7、配置XP Server。填写或选择以下内容:
Transport type:tcp
Host name:192.168.0.1
Port number:4400
点击Build Server按钮,开始创建Server,这时出现一个窗口,你可以看到整个创建过程。如果有显示以下类似信息,表示创建Server成功:
……
Server TEST was successfully created.
Done.
……
8、创建Server成功后,系统就会问你是否将Server本地化(Localize),即是用另外一种语言代替默认的us_english language,以及改变默认的iso_1字符集和Binary索引顺序。选择是NO。为什么呢?曾经把中文(eucgb)设为默认字符集,反而不支持中文大字集,因为eucgb是基于GB2312标准的。查了Sybase的手册中一些关于本地化的说明,得出的印象是,在ASE中有Unicode转换机制,可以转换来自不同字符集的服务器或客户端的数据。应用也证明,使用ASE的默认的语言、字符集、索引顺序来处理中文是可行的。
9、安装成功后要做的几件事。首先在Linux控制台模式下以sybase用户登录。
① 确认Server是否在运行。使用$SYBASE/install/下的showserver命令($SYBASE表示sybase的安装目录),应该可看见系统有几个sybase相关进程。或者用$SYBASE/bin/下的isql -Usa -P -STEST命令来登录Server,应该可以看见isql的提示符"1>",再键入exit就可以退出了。
② 用sp_password null, 新口令
go将sa的用户口令改掉。
]
7、 成功后将自动启动数据库。可用isql -Usa -Ppassword -Sserver_name连进数据库。
isql -Usa -P -Ssybase
8、 执行1>sp_diskdefault master , defaultoff
2>go
将以后用户数据库数据文件不要建立在master所在的数据文件中。
9、 用sp_password oldpassword,newpassword设定sa的用户口令。
a) sp_password null,Sybase
b) go
10、 用shutdown关闭数据库。
11、 重新启动数据库用$SYBASE/ASE/install/RUN_sybase启动,这为前台启动方式。后台启动方式用。
$SYBASE/ASE/install/startserver -f RUN_Sybase
RUN_sybase例子:
#!/bin/sh
#
# ASE page size (KB): 2048
# Master device path: /opt/sybase-12.5/data/nextip.dat
# Error log path: /opt/sybase-12.5/ASE/install/sybase.log
# Configuration file path: /opt/sybase-12.5/ASE/sybase.cfg
# Directory for shared memory files: /opt/sybase-12.5/ASE
# Adaptive Server name: sybase
#
/opt/sybase-12.5/ASE/bin/dataserver \
-d/opt/sybase-12.5/data/nextip.dat \
-e/opt/sybase-12.5/ASE/install/sybase.log \
-c/opt/sybase-12.5/ASE/sybase.cfg \
-M/opt/sybase-12.5/ASE \
-ssybase \

关闭数据库:
用sa用户进入数据库执行shutdown命令即可完成数据库的关闭。

数据库设备的建立
重启在sybase用户下,
1> use master
2> go
3> sp_diskdefault master , defaultoff
4> go
5> sp_helpdevice
6> go
1> disk init
2> name='sybsyntaxdev',
3> physname='/opt/sybase-12.5/data/user_data/testdb.dat',
4> vdevno=4,
5> size='30m'
6>
7> go
建立数据库设备后就可以建立用户数据库
sa
create database userdb on db_dev_name=size M

1> disk init
2> name='testdbdev',
3> physname='/opt/sybase-12.5/data/user_data/testdb.dat',
4> vdevno=6,
5> size
6> go
8> use master
9> go
10> create database testdb on testdbdev=10
11> go
建立用户数据库的用户
1>sa connenction into database
2>use testdb
3>go
4>sp_addlogin ldai, password, null, null, 'dailiming'
5>go
6>sp_adduser ldai,dlm
7>go
isql -Uldai -Ppassword1 -Ssybase就可以连进testdb用户数据库了。
注意口令长度不得小于6位,如果口令以数字开头,还需要以单引号括起来。
Sp_addlogin提供用户能访问数据库的权限,如果没有指定用户具体访问那个数据库,则还需要在相应数据库中用sp_adduser user_name, user_password建一个相同名和口令的用户。
例如
1> sp_adduser ldai, dlm
2> go
3>

如果用sa用户创建了一个用户数据库,想将他的所有者由sa改为其他用户。
确定其他用户只具有addlogin,不具有adduesr。如果有addusers则要sp_dropuser删除掉,否则不能赋给他所有者权限。
Isql -Usa
1> use testdb
2> go
3> sp_changedbowner ldai, testdb
4> go
5> sp_default ldai, testdb
6> go
7> sp_helpdb testdb
8> go
将更改数据库owner了,注master不能更改

建用户有两中方式,上面这一种是建立用户帐号,再在具体数据库中建立该数据库应用帐号。较为繁琐。可通过sp_addlogin加其他参数,一步到位将数据库用户建立起来。
Sp_addlogin user_name,user_password,所用数据库名称,null, '用户全名备注'
例如:
sp_addlogin nextip, nextip, NEXTIPDB, null, 'nextipdb's dba'

Msg 5106, Level 16, State 6:
Server 'sybase', Line 1:
Parameter 'SIZE' requires value of type 'int'.
1> disk init
2> name='sybsyntaxdev',
3> physname='/opt/sybase-12.5/data/user_data/sybsyntaxdev.dat',
4> vdevno=4,
5> size='10m'
6> go
00:00000:00008:2003/10/22 14:33:19.21 kernel Initializing virtual device 4, '/opt/sybase-12.5/data/user_data/sybsyntaxdev.dat' with dsync 'on'.
00:00000:00008:2003/10/22 14:33:19.21 kernel Virtual device 4 started using asynchronous i/o.
00:00000:00008:2003/10/22 14:33:19.22 kernel Initializing device /opt/sybase-12.5/data/user_data/sybsyntaxdev.dat from offset 0 with zeros.
00:00000:00008:2003/10/22 14:33:19.25 kernel Finished initialization.
1>

初次建立数据库对sa的口令要进行修改。
sp_password old_password, new_password, login name
1> sp_password null, nextip, sa
2> go
3>

sp_dboption 是用来打开或关闭数据库的选项 [select into/bulkcopy]。只用这样数据库才能执行如select identity(int) id0,* into #temp1 from tablename这样的sql语句。查看是否打开option用sp_helpdb就可以查看。Sp_dboption只能在master 数据库中引用。是否允许列字段为空还是不为空也是用这个命令。
1> use nextipdb
2> go
3> master..sp_dboption nextipdb,"select into/bulkcopy","true"
4> go
5> checkpoint
6> go

1> dbcc checkdb
2> go
3> dbcc checkcatalog
4> go

1、增加自定义的数据类型为sp_addtype datatypename ,"length",
FE: sp_addtype tid, "char(6)", "not null"
2、查看某一用户是否有什么权限,sp_helprotect user_name
4、 修改用户出始登陆的数据库,命令为sp_modifylogin
5、 检索identity字段可以用syb_identity=指定值来检索,如
t_dns_rezo_gs中有且一个identity字段[rzgs_id ],则可如下检索
select count(*) from t_dns_rezo_gs where syb_indentity=1
6、 sp_dboption可设置数据库通用的一些选项。
7、 当想要对表进行手工插入identity时,如果没有set identity_insert table_name on/off打开,
就要打开,如果一旦打开,每一笔记录都要手工指明identity值,而不是自动插入形式,切记。如果变回off后,则identity记数从表中最大的identity值开始记数。例最大值为10,则记数从11开始,中间就有gap出现了。
8、 identity默认精度为18位,如果达到了,就需要增加其精度。可用alter table table-name
modify identity_col_name, numeric(20,0)进行修改精度。
9、 使数据库自动为新建表建立一个隐藏的identity字段为sp_dboption db_name , "auto identity", "true"
为identity设置精度,由管理员操作sp_configure "size of auto identity", 精度位数
如sp_configure "size of auto identity",15
10、 在当前数据库中创建另外一个数据库的表或其他对象, create other_db_name..object_name
如: create table newdb..t_dns_gs (name varchar(255))
11、 select user_name() /user / db_name() 返回当前用户或数据库
12、 col_length("表名", "字段名") 返回指定字段的长度/ datalength("列名")实际存储长度对varchar/期于是创建时指定的长度
13、 isNull(exp1, exp_value) 为如果exp1为null则用exp_value替代
14、 convert(转换后的类型和长度,要转换的类型值)
如:select "my Test" + ""+convert(varchar(20),1211333)
1> select mmm="my Test" + ""+convert(varchar(20),1211333)
2> go
mmm
----------------------------
my Test 1211333

(1 row affected)
15、 获取当前时间为select getdate()
16、 当前变量申明 declare @变量名 类型
赋值操作select @变量名=变量值
如:
declare @sIpad varchar(20),@iNum numeric(2,0)
select @sIpad='0AC80001',@iNum=32
17、 看过程的源码sp_helptext 过程名
例子:
1> sp_helptext p_convert_num_to_char
2> go
# Lines of Text
---------------
1
(1 row affected)
text
----------------------------------------------------------------------------------------------------------------------
create procedure p_convert_num_to_char
@cint numeric, @outchar varchar(10) output
as
if (@cint=4)
select @outchar='Four'
if (@cint=5)
select @outchar='Five'
if (@cint=6)
select @outchar='Six'
(1 row affected)
(return status = 0)

18、 oracle中查看源码,查看该sources表
19、 在一个过程中调用另外一个过程,
例如:
create procedure test_one @test_proc_name varchar(255)
as exec @test_proc_name
20、 记住在sybase中执行sql是用'go'不是以';'为结束兼执行
21、 创建数据库用户:sa用户 master库中,sp_addlogin user,password,dbname
22、 变更数据属主::sa用户进入要变更的数据库执行 sp_changedbowner user,dbname
23、 设置用户的默认登陆数据库::sa用户进入要设定的数据库执行:
sp_defaultdb user,dbname
24、 以#开头的临时表只是在某一过程或sql操作中存在,一旦过程或sql操作结束,则临时表就不存在了,如果再要访问就回出错。解决是不建立以#为preffix的表。
25、 要想直接手工插入值到表中identity字段,需要打开该表的identity_insert选项。
Set identity_insert 表名 on/off
如:
set identity_insert t_dns_rezo_gs on
这样insert into t_dns_rezo_gs(rzgs_id,rzgs_name) values(999,'12121')才会成功。
26、 指定某个过程什么时候执行后用waitfor delay "hh24:mi:ss",并且用了这种方式后该connection不会有什么响应直到过程被执行完成。
如半个小时后执行过程test_p
begin
waitfor delay "0:30:00"
exec test_p
end
27、 调用带返回参数的过程完整例子
create procedure p_convert_num_to_char
@cint numeric, @outchar varchar(10) output
as
if (@cint=4)
select @outchar='Four'
if (@cint=5)
select @outchar='Five'
if (@cint=6)
select @outchar='Six'
go

declare @getchar varchar(10)
exec p_convert_num_to_char 4,@outchar=@getchar output
28、 过程中有返回参数时,如果预先设定参数值,最终都会改变
如:
declare @First int
select @First=123
exec test_p @second=@First output
//运行结果为999
则@second和@First 都为999
29、 过程名改名sp_rename oldname, newName
30、 ct-library编程,在sybase提供的linux中有,环境搭建要点,要确定$SYBASE设定了,$SYBASE_OCS设定open client所在目录即可不要是全目录,还要设定平台$SYBPLATFORM=linux; 具有这三个环境变量,open client提供的sample才可大部分编译通过;其中有几个程序由于找不到-lsrv,而编译通不过。推测可能涉及了open server的东西,所以没有通过。
例子程序可以单独编译,如make 例子名 [F.E make firstapp
]
设定LD_LIBRARY_PATH=$SYBASE/$SYBASE_OCS/lib

编译形式例如firstapp.c
$SYBASE=/opt/sybase-12.5
$SYBASE_OCS= OCS-12_5
cc -o fist firstapp.c -I. -I/opt/sybase-12.5/OCS-12_5/include -L/opt/sybase-12.5/OCS-12_5/lib -rdynamic -ldl -lnsl -lm -lct -lcs -lsybtcl -lcomn -lintl
31、 db-library编译语句:
cc -I. -I/opt/sybase-12.5/OCS/include example1.c /opt/sybase-12.5/OCS/lib/libsybdb.a -lm -o example1
同样要设好SYBASE SYBASE_OCS SYBPLATFORM
并且要保证interface文件中连接服务器是对的。
同时对于想要连接的服务器名要在环境变量DSQUERY中设好。
如:
export DSQUERY=accunetsvr

注意,用hostname作为连接名时,确保/etc/hosts中的IP和hostname有对应且对应正确。

32、 db-library 经实验数据库连接结构支持线程间的传递,将函数打包用下列样式:
gcc -c -I. -I/opt/sybase-12.5/OCS/include s_fcts.c
ar r libleon.a s_fcts.o
rm -rf *.o
打包完毕
调用函数进行编译样式:
cc -I. -I/opt/sybase-12.5/OCS/include ss_nip_checkUGandUser.c libleon.a
/opt/sybase-12.5/OCS/lib/libsybdb.a -lm -o leon4
或者
cc -I. -I/opt/sybase-12.5/OCS/include -o leon4 ss_nip_checkUGandUser.c libleon.a
/opt/sybase-12.5/OCS/lib/libsybdb.a -lm
33、 DB-library的应用程序运行其他机上访问另一台机(数据库所在的机器).在客户机上需要装sybase-comom 和syabse-openclient组件。需要设定对SYBASE / DSQUERY. 其中sybase要设定为指向interfaces文件的路径,DSQUERY要设定为要远程访问的主机名 (adapative_server_name).将远程主机的interfaces拷贝到客户机上SYBASE指定的目录即可。注意如果没有设定 DSQUERY,则程序默认去找sybase的数据库,这时如果没有该数据库名字在interfaces文件中,程序就会不能运行。
[实际只需设定好DSQUERY环境变量和interface文件即可]
34、 DB-library应用在多线程中每次都要重新连接数据库,否则一定时间后连接会被操作系统重置掉。 Connection reset by peer
35、 DB-library的错误捕捉。系统提供一种系统错误信息函数自动在出现错误时去捕捉显示错误信息。
int msg_handler(dbproc, msgno, msgstate, severity, msgtext,
srvname, procname, line)
DBPROCESS *dbproc;
DBINT msgno;
int msgstate;
int severity;
char *msgtext;
char *srvname;
char *procname;
int line;
{};
int err_handler(dbproc, severity, dberr, oserr, dberrstr, oserrstr)
DBPROCESS *dbproc;
int severity;
int dberr;
int oserr;
char *dberrstr;
char *oserrstr;
{};

  dbmsghandle(msg_handler);
dberrhandle(err_handler);

除此之外,用户如果想要自己控制错误信息可在dbsqlexec() 调用后并且while()处理完后,调用dbcount(dbproc)进行错误信息判断,如果等于-1则出现错误。特例调用没有select的过程:: dbnocount设为on::没有select的sql语句::sql写错::sql执行错误等都可以出现-1所以要小心判断处理。
36、 Jdbc连接sybase。首先需要jconn2.jar和jTDS2.jar文件,在环境变量CLASSPATH设定好。
Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
url结构为: jdbc:sybase:Tds:dbserver_ip/dbserver_hostname:dbserver_port/dbname
dbserver的端口为数据库服务器上的interfaces文件中对应的数据库端口。
例子:
192.168.0.6
interfaces
[root@accunetsvr sybase-12.5]# more interfaces
accunetsvr_text
master tcp ether accunetsvr 4500
query tcp ether accunetsvr 4500


accunetsvr
master tcp ether accunetsvr 4100
query tcp ether accunetsvr 4100


accunetsvr_back
master tcp ether accunetsvr 4200
query tcp ether accunetsvr 4200


accunetsvr_mon
master tcp ether accunetsvr 4300
query tcp ether accunetsvr 4300


ACCUNETSVR_XP
master tcp ether accunetsvr 4400
query tcp ether accunetsvr 4400

可知dbserver_name是accunetsvr
dbserver_ip 是192.168.0.6
dbserver_port 是4100
dbname为nextip
url为 jdbc:sybase:Tds:192.168.0.6:4100/nextip
37、 创建identity列,如果是create table 时一定是numeric型。如果想要创建数据库自动为新建的所有表增加一个隐藏的identity字段,用[sp_dboption database_name, "auto identity", "true"]。在检索数据的时候必须隐式加上SYB_IDENTITY_COL作为隐藏的identity列,例如select SYB_IDENTITY_COL, sn_name from t-subnet
默认的隐藏精度大小为10如果用户想要增大其精度,可用[sp_configure "size of auto identity", 新的精度],例如: sp_configure "size of auto identity",15
38、 从select into 创建一个新的idenetity列,这在sql语句分页检索用。
Select idenetity_name=identity(精度) , * into new_table from old_table;
如:
select id0=identity(1icon_cool.gif,* into #subnets from t_subnet where sn_type=10;
39、 实现用sql语句进行分页查询方法:
A. 创建一个临时表带identity字段 select id=indentity(20), * into #table_anme from table_name where 条件
B. 然后根据id进行检索第n条到m条数据 (也可用between and)
C. 最后Drop掉该临时表
D. 注意要打开数据库的select into /bulk copy属性 sp_dboption database_name, "select into/bulk copy", "true"才能进行select into操作
E. mssql中格式为select identity(int) id, * from #table_name from table_name where 条件
40、 linux下访问sql-server用db-library与sybase相同要素。只是远程访问端口为sql-server指定的1433

41、 JDBC访问MS-SQLSERVER
连接数据库:[需要这三个jar文件msbase.jar msutil.jar mssqlserver.jar]
JDBC DRIVER:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://Ip Or Name:1433;DatabaseName=XXX
42、 Oracle中的外连接符为=(+) 或(+)= 在Sybase中为=* 或 *=
43、 执行sybase过程中会有日志满了或存储空间不够了,出现supsend状态,可用
isql -Usa -Ppassword -Sdbservername
进去执行dump tran db_name with truncate_only进行清空操作
或者dump tran db_name to 'path/file'进行备份在执行清空。
44、 ms-sql中的substring(string, start, length)函数参数,start和length为INT型不能为numeric型。
45、 select * into 在oracle中的用法在ms-sql和sybase中的用法为select @变量=column
from 表名 where 条件
46、 游标在ms-sql和sybase中差别主要为while 判断的全局变量不同。
Sybase中为@@sqlstatus = 0
Ms-sql中为@@FETCH_STATUS = 0
关闭游标时在ms-sql中除了[close 游标名] 还要增加[deallocate 游标名]

47、 MS-SQL对于sql语句大小写不敏感,sybase对大小写敏感。

48、 oracle同sybase和mssql的常用函数对比
ORACLE SYBASE MS-SQLSERVER
SysdateTo_char(, '格式')格式:yyyymmddhh24miss任意组合 getdate()可用year() month() day()分解获得年月日 convert(varchar, getdate(), 108)是hh:mm:ss getdate()可用year() month() day()分解获得年月日convert(varchar, getdate(), 108)108是hh:mm:ss120是yyyy-mm-dd
Length() Datalength() Datalength()
Ltrim() rtrim() Ltrim() rtrim() Ltrim() rtrim()
Substr() Substring() Substring(varchar, INT, INT)
Replace('123', '2', 'A) Replace('123', '2', 'A)
instr
Lpad() rpad() Replicate('0', 32) Replicate('0', 32)
Upper() lower() Upper() lower() Upper() lower()

49、 日期计算在ms-sql中
dateadd(日期代码,日期值, 日期)
select convert(varchar,getdate(),120) as year,convert(varchar,dateadd(ss, 1200,getdate()),120) as nYear
go
日期部分 简写 值
year yy 1753--9999
quarter qq 1--4
month mm 1--12
day of year dy 1--366
day dd 1--31
week wk 1--53
weekday dw 1--7(Sunday--Saturday)
hour hh 0--23
minute mi 0--59
second ss 0--59
milisecond ms 0-999

也可
select convert(varchar, getdate(), 111)+' '+convert(varchar,getdate(),108) as oldtime,convert(varchar,dateadd(ss,1200,getdate()),111)+' '+convert(varchar,dateadd(ss,1200,getdate()),108) as date
也可
select convert(varchar,convert(datetime,'20031223'),111)
go


50、 PostgreSQL中的lib编程时,select 和update /delete的成功失败条件判断是不同的。
Update/delete:: strcmp(PQcmdStatus(temp_res), "")==0
select :: !temp_res||PQresultStatus(temp_res) != PGRES_TUPLES_OK
51、 日期各格式的引用模式ms-sql和sybase中都通用
yyyy/mm/dd hh24:mi:ss
select convert(varchar, getdate(), 111)+' '+convert(varchar,getdate(),108) as oldtime,convert(varchar,dateadd(ss,1200,getdate()),111)+' '+convert(varchar,dateadd(ss,1200,getdate()),108) as date
select name,text from all_source where type='FUNCTION' and name='F_CHECK_IB_SCOPE';
select convert(varchar,convert(datetime,'20031223'),111)
go
Select count(ipgs_host_name)||',host-'||f_ipad_change_dec4('%s','1') From t_ipdev_gs

yyyy/mm/ddhh24miss
Select CO_DESC,to_char(sysdate - 1/48,'yyyymmddhh24miss') co_date from T_LICENSE
dateadd(ss, -1800, getdate())
select co_desc, convert(varchar, dateadd(ss, -1800, getdate()),111)+convert(varchar,dateadd(ss, -1800, getdate()),108) as co_date from t_license
select convert(varchar, getdate(), 111)+' '+convert(varchar,getdate(),108) as oldtime,convert(varchar, dateadd(ss, -1800, getdate()),111)+convert(varchar,dateadd(ss, -1800, getdate()),108) as co_date

yymmddhh:mi:ss
select convert(varchar,getdate(),112)+convert(varchar,getdate(),icon_cool.gif
go
52、 显示sql执行时间用: isql -Unextip -Pnextip -Sleon1 -p
进入即可,加小写-p参数
53、 MS-SQL中创建数据库
create database NEXTIPDB
on primary
(
name = DEVDB,
filename = 'd:\mssql_data\devdb.mdf',
size = 30MB,
maxsize = 100MB,
filegrowth = 10MB
),
(
name = DEVDB1,
filename = 'd:\mssql_data\devdb1.ndf',
size = 10MB,
filegrowth = 10MB
)
Log on
(
name = DEVDBLOG,
filename = 'e:\mssql_log\devdblog.ldf',
size = 10MB,
maxsize = 100MB,
filegrowth = 10MB
)
go
54、 细小区别
Sybase::
IF NOT EXISTS (SELECT * FROM master..syslogins, master..sysdatabases
WHERE master..syslogins.suid = master..sysdatabases.suid
AND master..syslogins.name = 'nextip')
EXEC sp_changedbowner nextip, NEXTIPDB
GO

Ms-sqlserver::
IF NOT EXISTS (SELECT * FROM master..syslogins, master..sysdatabases
WHERE master..syslogins.sid = master..sysdatabases.sid
AND master..syslogins.name = 'nextip')
EXEC sp_changedbowner nextip, NEXTIPDB
GO
posted @ 2005-10-26 17:44 快乐的射手 阅读(1135) | 评论 (0)编辑 收藏

太久没有研究过新技术了.作为一个程序员,我觉得很惭愧.老早就想看看关于xmlhttp的技术了,今天总算有点时间,做个一个最初的体验.马上就爱上了它.
如果你想不刷新页面就可以与后台进行数据交互,或者在异构系统之间交换数据,xmlhttp技术是个不错的选择.
下面是我的一个很小的体验程序,参考了csdn网友s_phoenix()给人的回贴.
首先建一个tomcat的web项目.

1:-------index.htm文件内容如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<script language="javascript">
var XML="<root><test>李春雷</test><test>毛泽东</test></root>"
var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
var xmlDoc=new ActiveXObject("Msxml2.DOMDocument");
function test(){//客户端xml的解析
xmlDoc.loadXML(XML);
if(xmlDoc.parseError.line>0){
throw xmlDoc.parseError.reason;
}
var nodes= xmlDoc.selectNodes("/root/test");
for(var i=0;i<nodes.length;i++){
alert(nodes.item(i).text);
}
}

function action(){//客户端和服务端的通讯
xmlHttp.open("post","http://127.0.0.1:8888/xmlhttpTest/UrlTestServlet",false);
xmlHttp.setRequestHeader("context-type","text/xml;charset=utf-8");
xmlHttp.send(XML);
var showstr=xmlHttp.responseText;
alert(showstr);
}

</script>
<button onclick="test();">查看将要传输的xml</button><br/>
<button onclick="action();">朝服务器传送xml,并接收服务器回应</button>
</BODY>
</HTML>


2:------------写一个servlet: UrlTestServlet.java

/*
 * 创建日期 2005-4-7
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package com.lcl;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.dom4j.io.*;
import org.dom4j.*;


/**
 * @author lcl
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */

public class UrlTestServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/xml;charset=utf-8";
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Get request


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
InputStream is=request.getInputStream();

SAXReader reader=new SAXReader();
Document doc=null;
try{
doc=reader.read(is);
} catch(Exception ex){
System.out.println(ex);
}
String[] s= getElementTexts(doc,"test");
out.println("数据交换成功:返回" + s[0] + s[1]);
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}

private String getElementText(Document doc,String name){
return doc.getRootElement().element(name).getText();
}

private String[] getElementTexts(Document doc,String name){
List l=doc.getRootElement().elements(name);
Iterator it=l.iterator();
List l1=new LinkedList();
while(it.hasNext()){
Element e=(Element)it.next();
l1.add(e.getText());
}
return (String[])l1.toArray(new String[]{});
}

//Clean up resources
public void destroy() {
}
}

3:--------web.xml更改如下(加servlet映射):

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>


<!-- JSPC servlet mappings start -->

    <servlet>
        <servlet-name>UrlTestServlet</servlet-name>
        <servlet-class>com.lcl.UrlTestServlet</servlet-class>
    </servlet>
 

    <servlet-mapping>
        <servlet-name>UrlTestServlet</servlet-name>
        <url-pattern>/UrlTestServlet</url-pattern>
    </servlet-mapping>


<!-- JSPC servlet mappings end -->
 <welcome-file-list>
        <welcome-file>index.htm</welcome-file>
    </welcome-file-list>
</web-app>

好了,启动tomcat,访问:http://127.0.0.1:8888/xmlhttpTest/work/(如果你的tomcat端口是8080,就改一下)
看到结果了吧,真的很不错.不用刷新页面,就让htm前台页面和后台进行了一次数据交换.

你甚至可以在不同的服务器之间进行数据交换,比如一个mis系统,和一个gis系统,想整合成一个系统,原先我们是用了一个frame,左边的是mis,右边的是gis,通过javascript在两个系统间交换数据.如果用xmlhttp技术,完全没必要这样了.



本文引用通告地址: http://blog.csdn.net/lcllcl987/services/trackbacks/425242.aspx
posted @ 2005-10-26 17:26 快乐的射手 阅读(347) | 评论 (0)编辑 收藏

 

根据客户需要,我们增加了一个统计表,用来汇总统计数据,统计数据的产生,需要根据一个基本表,动态执行sql语句.在存储过程中,动态生成sql语句然后执行,需要用到Execute Immediate命令.我想写一个通用的统计用存储过程,似乎不大好办,if语句的应用在所难免了.呵呵.

特此存档.

create or replace procedure P_INSERT_XT_TJ_MX(sDate in varchar2) is
--author:李春雷
--create time:2005.8.4
--purpose:更新xt_tj_mx表
       sXh xt_tj.xh%type;                          --主表序号
       sDwmc xt_tj.dwmc%type;
       sDw xt_tj.dw%type;
       sDwzd xt_tj.dwzd%type;
       sTable xt_tj.hzbmc%type;
       sSjzd xt_tj.sjzd%type; 
       sSqlStr varchar2(300);
       iCount int;      
       cursor curSort is
              select xh,dwmc,hzbmc,sjzd,dwzd,dw from xt_tj ;
begin     
     open curSort;
     loop
         fetch curSort into sXh,sDwmc,sTable,sSjzd,sDwzd,sDw;        
         exit when curSort%notfound;
         sSqlStr := 'select count(*)  from '|| sTable || ' where to_char('||sSjzd||','||'''YYYYMM'')=:sDate and '||sDwzd ||
                    ' in (select dwxh from xt_dw connect by  prior dwxh = dwfxh start with dwxh =:sDw)';
         Execute Immediate sSqlStr into iCount using sDate,sDw;
         delete from xt_tj_mx where fxh=sXh and sjz=sDate;
         insert into xt_tj_mx(xh,fxh,hzsm,sjz)values(SEQ_XT_TJ_MX.NEXTVAL,sXh,iCount,sDate);
         commit;
     end loop;
end P_INSERT_XT_TJ_MX;


作者Blog:http://blog.csdn.net/lcllcl987/
posted @ 2005-10-26 17:22 快乐的射手 阅读(1422) | 评论 (2)编辑 收藏