六、数据库服务器的应用
通常用户按缺省方式建立数据库和表,OnLine的这些概念和技术对他的影响是有限的。在确省情况下,用户的数据库和表都建立在rootdbs中,每个表的extent为8页,以后为4页,并且数据库不带日志,数据表的琐方式为页级琐。
其实用户可以根据其系统的特点了建立其数据库和表,使得系统有较高的运行效率和易于管理的特点,下面将描述在建立用户系统时如何使用OnLine的概念和技术。
1、建立用户数据库
用户可根据自己的要求将他的数据库建立在指定的数据库空间中,当然该数据库空间必须首先存在。
CREATEDATABASEemployeeINcompany;
以上SQL命令将数据库employee建立在名为company的数据库空间中。
CREATEDATABASEemployeeWITHLOG;
CREATEDATABASEemployeeWITHBUFFEREDLOG;
以上两条SQL命令在建立数据库employee市分别要求带UNBUFFERED和BUFFERED日志。
OnLine的日志除了满足事务的提交和滚回,同时还是一种数据库安全机制。当系统由于断电或其他的原因使数据库服务器系统停止运行,但是当它下一次启动时,数据库服务器系统将会根据前一次停止工作时留下的日志来滚回没有完成的事务。UNBUFFERED日志要求数据库每当有事务提交时,立即将数据从共享内存写回磁盘;而BUFFERED日志则并不因为事务提交即将数据从共享内存写回磁盘,它只是当共享内存中的Logicallogbuffer空间满或者当OnLine的定时共享内存数据写回磁盘操作Checkpoint来到时,才将数据从Logicallogbuffer写回到日志文件。如果一个事务已经提交,但共享内存并没有满,同时Checkpoint也没有进行时,系统发生非正常停机,当数据库服务器系统再次启动时,由于该提交的事务并没有被写回磁盘,OnLine将根据在其数据空间中的日志来滚回该操作。因此,带UNBUFFERED日志的数据库对已经提交的事务来说安全性较好,而带BU-FFERED数据库则运行效率较高。不带日志的数据库虽然运行效率最高但它不具有在系统非正常停机后自动滚回失败事务的能力,只能用数据备份来恢复。综合上面的SQL命令就得到下面的建立数据库的命令:
CREATEDATABASEemployeeINcompanyWITHLOG;
CREATEDATABASEemployeeINcompanyWITHBUFFEREDLOG.
对于一个建立的不带日志数据库,希望使它带日志;或者一个带日志的数据库,希望改变它的日志类型,用户可通过onmonitor实用工具来实现。运行onmonitor后,选择Logical-logs菜单,然后再选择Databases菜单,屏幕上显示出日志的四种类型,将选中项移到需要的日志类型上,按Contr-ol-B键,OnLine便将该数据库的日志修改成用户所需要的类型。改变了数据库的日志类型后,用户必须作数据库的0级备份。
PressESCtoreturntotheLogicalLogsMenu.
Usearrowkeystoselectaloggingoption.
PressF3orCTRL-Btochoosethetypeoflogging.
DatabaseCurrentLogStatus
accountingUnbufferedLogging
OPTIONSFORDATABASELOGGING
NoLogging
UnbufferedLogging
BufferedLogging
UnbufferedLogging,ModeANSI
2、建立用户数据表
用户也可以根据自己的需要,将一个或几个表将来在指定的数据库空间中,例如:
CREATETABLEemployee
(empno SMALLINTNOTNULL,
fname CHAR(15),
lname CHAR(15),
....
resume TEXTINmulti,
picture BYTEINmutli,
PRIMARYKEY(empno)
)INcompany;
在该命令中表employee被建立在company的数据库空间中,并且用户已经建立了二进制大对象数据空间,resume和picture被建立在名为multi的二进制大对象数据空间中。根据这些命令和前面已经叙述的OnLine概念,我们不难做到将一个或数个数据库或者表建立在指定的磁盘中,可以按照下面的指示将这些数据库和表联系起来。
用户除了可以直接指定其数据库表存放的数据库空间,还可以定义数据存放时数据连续页的大小和以后数据连续页以什么尺寸来增加,
CREATETABLEemployee
(empno SMALLINTNOTNULL,
fname CHAR(15),
lname CHAR(15),
....
resume TEXTINmulti,
picture BYTEINmutli,
PRIMARYKEY(empno)
)INcompany
EXTENTSIZE1024
NEXTSIZE16;
上面的命令用户定义了employee的初始化数据连续页的大小为1024KB,比较大数据连续页就意味着该表有初始化时有较多的数据页连续的存放在一起,有利于数据存取效率的提高,该用户希望初始化时有1024KB的连续空间来存放其单位现有的员工信息,而以后的员工信息的变化则较小,因此他定义下一个的数据连续页为16KB。
关于数据连续页需要量的准确计算可查阅INFORMIX数据库有关手册。
3、建立分布式数据库访问
假设在我们网络上有三个服务器,分别为account、warehouse和staff数据库服务器,它们对应的service分别是sqlacc,sqlware和sqlsta,网络选用tcp/ip协议。
1)Server端的设置:
在Server设置三个文件/etc/hosts、/etc/hosts.equiv、/etc/services和$INFORMIXDIR/etc/sqlho-sts。/etc/hosts文件中描述了网络中所有的机器的名字和其地址,/etc/services文件中描述了数据库的service名字及其端口号,$INFORMIXDIR/etc/sqlhosts文件中描述了数据库名字、service名字和网络服务器之间的关系,以及网络协议和数据库服务器的类型。因此对于我们的上述假设系统,在三个网络服务器上的设置如下:
在/etc/hosts设置网络节点
132.147.160.1 beijing
132.147.160.2 changsha
132.147.160.3 guangzhou
在/etc/hosts.equiv设置网络节点名
beijing
changsha
guangzhou
在/etc/services最后加上数据库服务的service名字
sqlacc 2000/tcp
sqlware 2001/tcp
sqlsta 2002/tcp
在该文件的设置时尤其要注意的是第二项service的网络端口号不能与文件中已经存在的重复,tcp表示网络采用tcp/ip。
在$INFORMIXDIR/etc/sqlhosts设置数据库服务器与网络服务器、service名字间的关系以及所使用的网络协议。
account ontlitcp beijing sqlacc
warehouse ontlitcp changsha sqlware
staff ontlitcp guangzhou sqlsta
上面的设置中第二项由三部分组成:第一部分on表示数据库服务器采用OnLine,第二部分tli表示通讯协议为tli,第三部分tcp表示网络采用tcp/ip协议。
2)分布式数据库的操作
当位于网络服务器changsha的数据库服务器warehouse接收到一个SQL命令,
INSERTacc@account:tab1
SELECT*
FROMware@warehouse:tab1
WHEREware@warehouse:tab1.col1ISNOTIN
(SELECTacc@account:tab1.col1 FROMacc@account:tab1)
该命令将那些ware@warehouse:tab1中不存在于acc@account:tab1的记录插入到acc@account:tab1中。但是数据库ware@warehouse存放在网络服务器changsha上,而数据库acc@account存放在网络服务器beijing,于是便要使用上面设置的文件来实现分布式的数据操作。首先位于changsha的数据库服务器warehouse接收到该SQL命令后,需要操作在数据库服务器account中的数据库acc,便查询$INFORMIXDIR/etc/sqlhosts中有关数据库服务器account的描述,知道该数据库服务器位于网络服务器beijing上,并且其service名字为sqlacc,于是又从/etc/hosts和/etc/services中得到网络服务器beijing网络地址为132.147.160.1和数据库服务器account对应的sevicesqlacc对应的网络端口号为2000,便通过2000端口号向网络地址为132.147.160.0机器提出数据操作的请求。在通常情况下,当前的数据库服务器名字和数据库名字是可以省略的,因此上述命令也可以是:
INSERTacc@account:tab1
SELECT*
FROMtab1
WHEREcol1ISNOTIN
(SELECTacc@account:tab1.col1 FROMacc@account:tab1)
不过后一种形式只能在SQL命令直接发到位于changsha网络服务器上数据库服务器ware-house时才是正确的,而前一种形式则在任何一个网络服务器上的都是正确的。
