Chinaunix首页 | 论坛 | 博客
  • 博客访问: 599131
  • 博文数量: 152
  • 博客积分: 2684
  • 博客等级: 少校
  • 技术积分: 1126
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-29 11:03
文章分类
文章存档

2012年(6)

2011年(96)

2010年(50)

分类: DB2/Informix

2011-11-17 13:24:46

本文由satoni在论坛所发,CU技术文章整理,供大家参考学习,转载请注明出处,谢谢
第六章 数据库服务器的应用
通常用户按缺省方式建立数据库和表,OnLine的这些概念和技术对他的影响是有限的。在确省情况下,用户的数据库和表都建立在rootdbs中,每个表的extent为8页,以后为4页,并且数据库不带日志,数据表的琐方式为页级琐。
其实用户可以根据其系统的特点了建立其数据库和表,使得系统有较高的运行效率和易于管理的特点,下面将描述在建立用户系统时如何使用OnLine的概念和技术。

第一节 建立用户数据库
用户可根据自己的要求将他的数据库建立在指定的数据库空间中,当然该数据库空间必须首先存在。
CREATE DATABASE employee IN company ;
以上SQL命令将数据库employee建立在名为company的数据库空间中。 
CREATE DATABASE employee WITH LOG ;
CREATE DATABASE employee WITH BUFFERED LOG ;
以上两条SQL命令在建立数据库employee市分别要求带UNBUFFERED和BUFFERED日志。 
OnLine的日志除了满足事务的提交和滚回,同时还是一种数据库安全机制。当系统由于断电或其他的原因使数据库服务器系统停 止运行,但是当它下一次启动时,数据库服务器系统将会根据 前一次停止工作时留下的日志 来滚 回 没有完成的事务。 UNBUFFERED 日志要求数据库每当有事 务提交时,立即将数据从共享 内存写回磁盘;而BUFFERED日志则并不因为事务提交即将数据从共 享内存写回磁盘,它只是当共享内存中的 Logical log buffer空间满或者当OnLine的定时共享内存数据 写回磁盘操作 Checkpoint 来到时,才将数据从 Logical log buffer  写回到日志文件。如果一个事务已 经提交,但共享内存并没有满,同时 Checkpoint 也没有进行时,系统发生非正常停机,当数据库服 务器系统再次启动时,由于该提交的事务并没有被写回磁盘,OnLine将根据在其数据空间中的日志 来滚回该操作。因此,带UNBUFFERED日志的数据库对已经提交的事务来说安全性较好,而带BU-FFERED数据库则运行效率较高。不带日志的数据库虽然运行效率最高但它不具有在系统非正常停机后自动滚回失败事务的能力,只能用数据备份来恢复。 综合上面的SQL 命令就得到下面的建立数据库的命令:
CREATE DATABASE employee IN company WITH LOG;
CREATE DATABASE employee IN company WITH BUFFERED LOG.
对于一个建立的不带日志数据库,希望使它带日志;或者一个带日志的数据库,希望改变它的日志类型,用户可通过onmonitor 实用工具来实现。运行 onmonitor后,选择 Logical-logs菜单, 然 后再选择Databases菜单,屏幕上显示出日志的四种类型,将选中项移到需要的日志类型上,按Contr- ol-B键,OnLine便将该数据库的日志修改成用户所需要的类型。  改变了数据库的日志类型 后, 用 户必须作数据库的0级备份。 


-----------------------------------------------------------------------
Press ESC to return to the Logical Logs Menu.
Use arrow keys to select a logging option.
Press F3 or CTRL-B to choose the type oflogging.

         Database            Current Log Status

         accounting          Unbuffered Logging

                  OPTIONS FOR DATABASE LOGGING

                   No Logging

                   Unbuffered Logging

                   Buffered Logging

                   Unbuffered Logging, Mode ANSI
-----------------------------------------------------------------------

第二节 建立用户数据表
用户也可以根据自己的需要,将一个或几个表将来在指定的数据库空间中,例如:
CREATE TABLE employee
( empno SMALLINT NOT NULL,
  fname CHAR(15),
  lname CHAR(15), 
  ....
  resume TEXT IN multi,
  picture BYTE IN mutli,
  PRIMARY KEY (empno)
) IN company;
在该命令中表 employee 被建立在company 的数据库空间中,并且用户已经建立了二进制大 对象数据空间,resume和picture被建立在名为multi的二进制大对象数据空间中。根据这些命令和前 面已经叙述的 OnLine 概念,我们不难做到将一个或数个数据库或者表建立在指定的磁盘中,可以 按照 下面的指示将这些数据库和表联系起来。
用户除了可以直接指定其数据库表存放的数据库空间,还可以定义数据存放时数据连续页 的大小和以后数据连续页以什么尺寸来增加,
 CREATE TABLE employee
( empno SMALLINT NOT NULL,
     fname CHAR(15),
     lname CHAR(15), 
  ....
     resume TEXT IN multi,
     picture BYTE IN mutli,
     PRIMARY KEY (empno)
) IN company
EXTENT SIZE 1024
NEXT SIZE 16;
上面的命令用户定义了employee的初始化数据连续页的大小为1024KB,比较大数据连续页 就意味着该表有初始化时有较多的数据页连续的存放在一起,有利于数据存取效率的提高,  该用 户希望初始化时有1024KB的连续空间来存放其单位现有的员工信息,而以后的员工信息的变化则 较小,因此他定义下一个的数据连续页为16KB。
关于数据连续页需要量的准确计算可查阅INFORMIX数据库有关手册。 

第三节 建立分布式数据库访问
假设在我们网络上有三个服务器,分别为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命令,
INSERT acc@account:tab1
SELECT * 
FROM ware@warehouse:tab1 
WHERE ware@warehouse:tab1.col1 IS NOT IN 
( SELECT acc@account:tab1.col1 
FROM acc@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机器提出数据操作的请求。在通 常情况下, 当前的 数据库服 务器名字和数据库名字是可以省略的,因此上述命令也可以是: 
INSERT acc@account:tab1
SELECT * 
FROM tab1 
WHERE col1 IS NOT IN 
( SELECT acc@account:tab1.col1 
FROM acc@account:tab1)
不过后一种形式只能在 SQL 命令直接发到位于changsha 网络服务器上数据库服务器ware- house 时才是正确的,而前一种形式则在任何一个网络服务器上的都是正确的。为了简化操作命令 可以 通 过在这些数据库服务器中定义同义名表来实现,详细方法可参考CREATE SYNONYM。
阅读(1365) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

☆彼岸★花开2011-11-19 19:46:37

精华帖啊,收藏了~