在Windows和UNIX/Linux平台下,DB2实例有很大差别。UNIX/Linux系统下实例名需要与用户绑定,不同实例需要对应不同的用户名,实例创建在用户目录下。这样,当需要切换不同实例时,只需切换到相应用户即可。在Windows系统下,实例不需要与用户绑定,当需要在不同实例间切换时,通过db2instance环境变量进行设置。以下分别讲述两种平台的实例创建过程。
在Windows平台下,DB2软件安装过程会自动创建一个名为DB2的实例,用户可以使用这个实例,也可以选择自己创建。实例创建的命令是db2icrt,语法如下:
其中,-s 选项用于指定实例的类型;-p选项用于指定实例目录的位置,如果不指定,默认的实例会创建在DB2INSTPROF注册变量指定的位置(通过db2set可查看)。
以下在E盘创建一个名为TESTINST的实例,创建后,观察E盘实例目录情况。
在UNIX/Linux平台下,DB2实例需要与一个系统用户关联在一起,实例名与用户名相同。UNIX/Linux下db2icrt的语法如下:
其中,-p选项用于指定实例端口号;-s 选项用于指定实例类型;-u用来指定fenced user,该用户用来执行存储过程等。
与Windows不同,InstName必须是一个事先建好的操作系统用户,该用户也叫实例用户。当实例创建后,会在该用户目录创建一些文件和子目录。
接下来,为大家演示Linux下用户/组、实例的创建过程。不同的UNIX平台创建组和用户的命令略有不同。在本例中,我们将用户目录创建在本地/home/db2inst1和/home/db2fenc1中,在实际生产中,如果要配置双机环境,建议创建在共享存储中。
然后切换到DB2软件安装目录,使用root用户创建实例。
可能有的读者会问:为什么需要fence user呢?我们知道,在有些应用中,开发人员会使用非SQL语言设计一些存储过程(Stored Procedure)实现某些业务逻辑。这些存储过程包含用户自己的代码,但是如果这些代码没有被完美地调试过,或者被别有用心的人包含了恶意代码,在DB2引擎进程中执行这些代码可能会破坏一些数据结构,造成DB2的崩溃。为了保护引擎,让这些存储过程在单独的进程下执行,就避免了这个问题,起到了隔离和保护作用,这就是fence user的目的(譬如说DB2引擎是以setuid权限执行的,但是如果在用户的C代码写成的存储过程中恶意地调用了类似Shell,或者后台启动一些root才能执行的操作,会对操作系统造成很大的安全隐患)。
以下是DB2进程执行情况,两个Java存储过程进程(db2fmp)是在db2fenc1用户下执行的。
实例一旦创建成功,会在实例用户目录下生成sqllib目录,进入后出现图4.2所示的目录结构。
图4.2 目录结构
在图4.2所示的目录下包含了很多文件,这些文件基本都是二进制格式,不允许用户手工修改,但大部分可以通过DB2提供的命令来进行浏览和修改。
以下是一些常见的配置文件。
●db2systm:实例配置文件,使用get dbm cfg/update dbm cfg控制。
●profile.env:实例DB2环境变量,使用db2set控制。
●sqldbdir/sqldbdir:实例数据库编目,使用list db directory / catalog database控制。
●sqlnodir/sqlnodir:实例节点编目,使用list node directory / catalog tcpip node控制。
●/var/db2/global.env:全局安装、实例、环境变量列表,使用db2ilist浏览,使用db2greg控制。