大多数据库的设计与管理方式是相通的。DB2与Oracle的结构与管理维度比较类似,核心在于Instance与database的管理。 这里迅速回忆一下:
一. DB2中OS,Instance,Database的关系:
1. “环境变量”有3个层级,OS level ,DB2 Global level ,DB2 Istance level. 其中后两者可配置的参数完全一致,但是以-g -i 区分,配置工具为 db2set.
2. DB2 配置参数是分别在实例级与数据库级配置的,两个级别设置的内容不相同。
3. DB2一个实例可打开多个数据库,一个数据库只能被一个实例打开。 这与Oracle不同
4. Linux下,使用instance owner操作实例,不需要特别环境变量DB2INSTANCE会自动被配置; 而在Windows下,需要set db2instance=db2inst1 ,这与oracle类似。
二. Instance的基本管理
1. 创建实例
Windows:
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2icrt.exe inst1
DB20000I The DB2ICRT command completed successfully.
它会在windows service创建一个服务,服务打开则实例开启;这与windows下的oracle类似。但是严格的说,Oracle的服务启动时,实例是不一定被打开的。这是两个概念!
DB2的若干环境变量与配置、实例信息都会记录在注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\IBM\DB2]
Linux:
linux下创建实例之前,必须在操作系统创建一个与实例名相同的操作系统账户。
[root@ibm1 ~]# userdel -r db2inst2
[root@ibm1 ~]# useradd -g db2iadm1 -G db2iadm1,dasadm1 db2inst2
[root@ibm1 ~]# passwd db2inst2
Changing password for user db2inst2.
New UNIX password:
Retype new UNIX password:
Sorry, passwords do not match.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@ibm1 ~]# su - db2inst2
[db2inst2@ibm1 ~]$ ls -l
total 0
[root@ibm1 instance]# ./db2icrt -u db2fenc1 db2inst2
DBI1446I The db2icrt command is running.
DB2 installation is being initialized.
Total number of tasks to be performed: 4
Total estimated time for all tasks to be performed: 309 second(s)
Task #1 start
Description: Setting default global profile registry variables
Estimated time 1 second(s)
Task #1 end
Task #2 start
Description: Initializing instance list
Estimated time 5 second(s)
Task #2 end
Task #3 start
Description: Configuring DB2 instances
Estimated time 300 second(s)
Task #3 end
Task #4 start
Description: Updating global profile registry
Estimated time 3 second(s)
Task #4 end
The execution completed successfully.
For more information see the DB2 installation log at "/tmp/db2icrt.log.18636".
Required: Review the following log file also for warnings or errors:
"/tmp/db2icrt_local.log.*"
DBI1070I Program db2icrt completed successfully.
可以发现,操作系统账户db2inst2的环境变量已经悄然变化:
[root@ibm1 instance]# su - db2inst2
[db2inst2@ibm1 ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
[db2inst2@ibm1 ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
# The following three lines have been added by UDB DB2.
if [ -f /home/db2inst2/sqllib/db2profile ]; then
. /home/db2inst2/sqllib/db2profile
fi
可以看见后台进程已经启动:
[db2inst2@ibm1 ~]$ ps -elf | grep db2inst2
.........
4 S db2inst1 3003 3001 0 80 0 - 254280 futex_ 14:07 ? 00:00:05 db2sysc
........
当前实例占用了50000端口:
[root@ibm1 ~]# netstat -anp | grep db2
tcp 0 0 0.0.0.0:50000 0.0.0.0:* LISTEN 3003/db2sysc
2.启动、停止实例
Windows: db2stop , db2stop force, db2start
3. 查看,管理实例参数
3.1 查看实例参数: (类似Oracle 的show parameter,支持模糊匹配)
例如,Linux下在实例参数中查看数据库默认安装路径:
[db2inst2@ibm1 ~]$ db2 get dbm cfg | grep DBMax number of concurrently active databases (NUMDB) = 32
SYSADM group name (SYSADM_GROUP) = DB2IADM1
Default database path (DFTDBPATH) = /home/db2inst2
SSL server keydb file (SSL_SVR_KEYDB) =
SSL client keydb file (SSL_CLNT_KEYDB) =
Windows下过滤方式稍有区别:
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2 get dbm cfg | find /i "DB"
Max number of concurrently active databases (NUMDB) = 8
Default database path (DFTDBPATH) = C:
TCP/IP Service name (SVCENAME) = db2c_DB2
db2start/db2stop timeout (min) (START_STOP_TIME) = 10
3.2 改变实例参数,并更新实例配置(很重要):
$db2 update dbm cfg using ......
$ db2 TERMINATE
DB20000I The TERMINATE command completed successfully.
# ./db2iupdt db2inst1
3.3 重置实例参数:
$db2 reset dbm cfg
3.4 特别注意:
手动建立的实例并不会像GUI建立的实例那样,会自动设定实例参数。 如果要使实例能够被正确attach,必须设定三个地方:
更改环境变量:
[db2inst1@ibm1 ~]$ db2set DB2COMM=tcpip
更改实例参数:
[db2inst1@ibm1 ~]$ db2 update dbm cfg using SVCENAME DB2_db2inst1
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
[db2inst1@ibm1 ~]$ db2 terminate
DB20000I The TERMINATE command completed successfully.
在 /etc/services 确认有与SVCENAME对应的条目
[root@ibm1 ~]# cat /etc/services | grep db2
ibm-db2 523/tcp # IBM-DB2
ibm-db2 523/udp # IBM-DB2
questdb2-lnchr 5677/tcp # Quest Central DB2 Launchr
questdb2-lnchr 5677/udp # Quest Central DB2 Launchr
DB2_db2inst1 60000/tcp #有可能在实例创建时,会自动添加好。
DB2_db2inst1_1 60001/tcp
DB2_db2inst1_2 60002/tcp
DB2_db2inst1_END 60003/tcp
重启db2inst1实例后,可查看到实例端口已经启动
[db2inst1@ibm1 ~]$ db2stop
10/17/2013 17:09:17 0 0 SQL1064N DB2STOP processing was successful.
SQL1064N DB2STOP processing was successful.
[db2inst1@ibm1 ~]$ db2start
10/17/2013 17:09:23 0 0 SQL1063N DB2START processing was successful.
SQL1063N DB2START processing was successful.
[db2inst1@ibm1 ~]$ su -
Password:
[root@ibm1 ~]# netstat -anp | grep db2
tcp 0 0 0.0.0.0:60000 0.0.0.0:* LISTEN 24195/db2sysc0
4.让实例随操作系统自动启动
[root@ibm1 ~]# /opt/ibm/db2/V9.7/instance/db2iauto -on db2inst1
5.删除实例
Windows:
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2idrop.exe inst1
[root@ibm1 instance]# ./db2idrop db2inst2
三. DAS的基本管理
DAS 是Database Administration Service的缩写,如果某个DB2实例希望被远程管理,那么数据库本地必须配置DAS,才能被远端的Control Center进行注册,类似于Oracle 9i enterprise console中的agent (oracle 9i之后就淘汰了)
Windows: das管理主要是db2admin、dasupdt命令
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin stop
SQL4407W The DB2 Administration Server was stopped successfully.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin start
SQL4406W The DB2 Administration Server was started successfully.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin creat
SQL4403N The syntax of the command is invalid.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin create
SQL4405W The DB2 Administration Server already exists.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin drop (dropDAS之前,必须先停止它)
SQL4408N The DB2 Administration Server was not dropped because it is active.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin stop
SQL4407W The DB2 Administration Server was stopped successfully.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin drop
SQL4402W The DB2ADMIN command was successful.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin create
SQL4402W The DB2ADMIN command was successful.
C:\Program Files (x86)\IBM\SQLLIB\BIN>db2admin start
SQL4406W The DB2 Administration Server was started successfully.
C:\Program Files (x86)\IBM\SQLLIB\BIN>dasupdt.exe
SQL22266N The DB2 Administration Server is already installed under the current DB2 Copy.
Linux:
linux上DAS的管理员是dasusr1, 属于组dasadm1.
DAS的创建与删除、更新均是由root完成的,基本上都是 /opt/ibm/db2/V10.1/instance/ 下das开头的命令
[root@ibm1 instance]# ./dasupdt
DBI1070I Program dasupdt completed successfully.
[root@ibm1 instance]# ./dasdrop
DBI1070I Program dasdrop completed successfully.
[root@ibm1 instance]# ./dascrt -u dasusr1
DBI1070I Program dascrt completed successfully.
linux下启动与关闭DAS需要具有DASADM权限的用户登录操作,因此要使用dasusr1:
[root@ibm1 instance]# su - dasusr1
[dasusr1@ibm1 ~]$ db2admin stop
SQL4407W The DB2 Administration Server was stopped successfully.
[dasusr1@ibm1 ~]$ db2admin start
SQL4406W The DB2 Administration Server was started successfully.
三. Database的基本管理
1.DB2数据库物理结构与逻辑结构
这几张图非常清晰,主要有以下几点内容:
1. 数据库逻辑上有大到小是 instance - database - tablespace - container - extent - datapage
2. container实际上类似于Oracle datafile的概念。一个tablespace可以跨多个container,
3. 其中extent是由连续的datapage组成 (类似Oracle中,extent与block的关系),一个extent不能跨表!是写container的最小单位
4. extentsize 实际上是间接指定其包含多少个datapage
5. datapage是DB2最小IO单位 (类似Oracle 的block),其size类似 Oracle的blocksize,也有4k 8k 16k 32k 几种
实际上DB2的自动存储类似与Oracle的OMF!
2.创建数据库
db2 CREATE DATABASE TEST1 AUTOMATIC STORAGE YES USING CODESET UTF-8 TERRITORY US ;
db2 UPDATE DB CFG FOR TEST1 USING AUTO_MAINT ON;
db2 UPDATE DB CFG FOR TEST1 USING AUTO_TBL_MAINT ON;
db2 UPDATE DB CFG FOR TEST1 USING AUTO_RUNSTATS ON;
db2 UPDATE ALERT CFG FOR DATABASE ON TEST1 USING db.db_backup_req SET THRESHOLDSCHECKED YES;
db2 UPDATE ALERT CFG FOR DATABASE ON TEST1 USING db.tb_reorg_req SET THRESHOLDSCHECKED YES;
db2 UPDATE ALERT CFG FOR DATABASE ON TEST1 USING db.tb_runstats_req SET THRESHOLDSCHECKED YES;
创建数据库后,本地数据库目录结构如下 ,即: <user database path>/<instance path>/NODE0000/SQL00001
db2 => create database mydb1
DB20000I The CREATE DATABASE command completed successfully.
db2 => quit
DB20000I The QUIT command completed successfully.
[db2inst2@ibm1 ~]$ ls -l db2inst2/NODE0000/
MYDB1/ SQL00001/ sqldbdir/
[db2inst2@ibm1 ~]$ ls -l db2inst2/NODE0000/
total 12
drwx--x--x 5 db2inst2 db2iadm1 4096 Jul 23 15:50 MYDB1
drwxr-x--- 5 db2inst2 db2iadm1 4096 Jul 23 15:49 SQL00001
drwxrwxr-x 2 db2inst2 db2iadm1 4096 Jul 23 15:49 sqldbdir
[db2inst2@ibm1 SQL00001]$ pwd
/home/db2inst2/db2inst2/NODE0000/SQL00001
[db2inst2@ibm1 SQL00001]$ ls -l
total 1900
-rw-r----- 1 db2inst2 db2iadm1 1024 Jul 23 15:49 db2rhist.asc
-rw-r----- 1 db2inst2 db2iadm1 1024 Jul 23 15:49 db2rhist.bak
drwxr-x--- 4 db2inst2 db2iadm1 4096 Jul 23 15:49 HADR
drwxr-x--- 2 db2inst2 db2iadm1 4096 Jul 23 15:49 LOGSTREAM0000
drwxr-x--x 4 db2inst2 db2iadm1 4096 Jul 23 15:50 MEMBER0000
-rw-r----- 1 db2inst2 db2iadm1 16384 Jul 23 15:50 SQLDBCONF
-rw------- 1 db2inst2 db2iadm1 24576 Jul 23 15:50 SQLOGCTL.GLFH.1
-rw------- 1 db2inst2 db2iadm1 24576 Jul 23 15:50 SQLOGCTL.GLFH.2
-rw-r----- 1 db2inst2 db2iadm1 0 Jul 23 15:49 SQLOGCTL.GLFH.LCK
-rw------- 1 db2inst2 db2iadm1 135168 Jul 23 15:49 SQLSGF.1
-rw------- 1 db2inst2 db2iadm1 135168 Jul 23 15:49 SQLSGF.2
-rw------- 1 db2inst2 db2iadm1 786432 Jul 23 15:50 SQLSPCS.1
-rw------- 1 db2inst2 db2iadm1 786432 Jul 23 15:50 SQLSPCS.2
[db2inst2@ibm1 SQL00001]$ ls -l MEMBER0000/
total 92
drwxr-x--- 3 db2inst2 db2iadm1 4096 Jul 23 15:49 db2event
drwxr-x--- 4 db2inst2 db2iadm1 4096 Jul 23 15:49 HADR
-rw------- 1 db2inst2 db2iadm1 512 Jul 23 15:50 SQLBP.1
-rw------- 1 db2inst2 db2iadm1 512 Jul 23 15:50 SQLBP.2
-rw------- 1 db2inst2 db2iadm1 16384 Jul 23 15:50 SQLDBCONF
-rw-r----- 1 db2inst2 db2iadm1 9 Jul 23 15:50 SQLINSLK
-rw------- 1 db2inst2 db2iadm1 24576 Jul 23 15:50 SQLOGCTL.LFH.1
-rw------- 1 db2inst2 db2iadm1 24576 Jul 23 15:50 SQLOGCTL.LFH.2
-rw------- 1 db2inst2 db2iadm1 8192 Jul 23 15:50 SQLOGMIR.LFH
-rw-r----- 1 db2inst2 db2iadm1 0 Jul 23 15:49 SQLTMPLK
重要文件讲解:
1. SQLBP.1 和SQLBP.2 包含缓冲池信息。这两个文件互为备份。
2. SQLSPCS.1 和SQLSPCS.2 文件中包含表空间信息。这两个文件互为备份。
3. SQLSGF.1 和 SQLSGF.2 包含与数据库的自动存储有关的存储路径信息,两个文件互为备份。
4. SQLDBCONF 包含数据库配置信息,切勿手动编辑此文件。
5. SQLLOGCTL.LFH 是日志控制文件,崩溃恢复处理过程中使用这些文件的信息确定要在日志中退回多远开始崩溃恢复。
6. DB2RHIST.ASC 历史记录文件及其备份 DB2RHIST.BAK 中包含关于备份,复原,表装入,表重组,表空间改变和其它数据库更改的历史记录。
7. SQLINSLK 确保一个数据库只能由数据库管理器的一个实例使用。
查看、修改数据库配置参数:
[db2inst1@ibm1 ~]$ db2 get database configuration | grep LOG 再没有连接数据库情况下,需要使用db2 get database configuration for sample | grep LOG
Catalog cache size (4KB) (CATALOGCACHE_SZ) = (MAXAPPLS*5)
Log buffer size (4KB) (LOGBUFSZ) = 256
Log file size (4KB) (LOGFILSIZ) = 1000
Number of primary log files (LOGPRIMARY) = 3
Number of secondary log files (LOGSECOND) = 2
Changed path to log files (NEWLOGPATH) =
Path to log files = /home/db2inst1/db2inst1/NODE0000/SQL00002/SQLOGDIR/
Overflow log path (OVERFLOWLOGPATH) =
Mirror log path (MIRRORLOGPATH) =
Block log on disk full (BLK_LOG_DSK_FUL) = NO
Block non logged operations (BLOCKNONLOGGED) = NO
Percent max primary log space by transaction (MAX_LOG) = 0
Num. of active log files for 1 active UOW(NUM_LOG_SPAN) = 0
Log retain for recovery enabled (LOGRETAIN) = OFF
First log archive method (LOGARCHMETH1) = OFF
Options for logarchmeth1 (LOGARCHOPT1) =
Second log archive method (LOGARCHMETH2) = OFF
Options for logarchmeth2 (LOGARCHOPT2) =
Log pages during index build (LOGINDEXBUILD) = OFF
UPDATE DATABASE CONFIGURATION USING LOGFILSIZ 1001 DEFERRED ;
reset database configuration
在某一实例下,启动与关闭单个数据库:
[db2inst1@ibm1 archive1]$ db2 terminate
DB20000I The TERMINATE command completed successfully.
[db2inst1@ibm1 archive1]$ db2 deactivate database sample [use administrator using 123456]
SQL1496W Deactivate database is successful, but the database was not
activated.
[db2inst1@ibm1 archive1]$ db2 activate database sample [use administrator using 123456]
DB20000I The ACTIVATE DATABASE command completed successfully.
总结:手动创建实例的几个步骤
1. DB2 Instance Creation
2. Create new entry in /etc/services
3. Update DBM configuration file for TCP/IP
4. Auto start DB2 Instance
5. ReStart DB2 Instance
表空间与容器相关的管理,请移步 《【DB2】 管理tablespace 与 container 、buffer pool》
3.删除数据库
db2 drop database test1