用镜头记录,用心灵体验 | 订阅本站 | 所有笔记 | 亲和力设计 | 流量

DB2 学习笔记

博客话题:DB2,Linux,Web,业余无线电,户外,摄影,截拳道,Thankpad,其他

DB2 数据库

IBM DB2 数据库的一般性话题

DB2 connect 错误 SQLEUCCM: SQL0969N

DB2 v8.2 客户端连接任何DB2 Server出错: SQL0969N There is no message text corresponding to SQL error "-2079391743"...

DB2 v8.2 客户端连接任何DB2 Server出错:

SQL0969N  There is no message text corresponding to SQL error "-2079391743" in 
the message file on this workstation.  The error was returned from module 
"SQLEUCCM" with original tokens "".

事实上是,使用客户端instance owner 运行db2 connect 一切正常,当使用其它用户source instance owner 的db2profile 之后,运行db2 connect 出现以上错误,即使将此用户加入到instance owner 的group 也是同样错误。Google 到问题产生的原因: SQLEUCCM error message for DB2 - Coffee|Code : Dan Scott, Caffeinated Librarian Geek

我这里的原因与上文有点差别,我更改了客户端instance 的参数DFTDBPATH ,其默认在instance owner 的HOME,我将其更改为其它路径/db2,这个目录的owner为root,通过group db2授权给客户端instance owner,所有的数据库数据文件将被创建在这个目录下的子目录,子目录与instance owner 同名,虽然子目录完全属于instance owner,并且instance owner 也是其父目录/db2的group 成员(对group成员授与了完全权限),DB2 客户端还会要求似乎不需要的权限,并报出以上错误。

上面描述的情况有点混乱,简单概括一下:

  • DB2 v8.2 客户端instance owner and group: db2amor:db2amor (用户db2amor 也是group db2的成员)
  • DFTDBPATH 与权限: /db2 root:db2 770
  • instance 数据路径与权限: /db2/db2amor db2amor:db2amor 775

使用其它用户source db2amor 的db2profile 之后连接数据库出错,即使将其加入db2amor group 成员也不行。

我的解决方法与上文也有差别,我将需要使用DB2 客户端的用户加入DFTDBPATH 所属group: db2(不需要加入instance owner group: db2amor)

# usermod -aG db2 USER_NAME

产生前面的问题,是因为我使用了DB2 Server instance 中的客户端。其实有个更好的方法避免上述的问题,就是创建独立的DB2 客户端instance,无论是v8 还是v9,这就根本上避免了我们不希望的权限请求。

# /opt/IBM/db2/V8.1/instance/db2icrt -s client INSTANCE_NAME 

Posted by Alex at 6:00 PM | Comments (0) | Edit | Taged: DB2 (15), SQL0969N (1), SQLEUCCM (1)

IBM DB2 信息中心 v8.2 在Gentoo Linux 上安装的一些问题

Gentoo 支持 IBM DB2 信息中心 并不提供对Gentoo Linux 的额外支持,如果使用Gentoo,在以下几个地方,需要额外的工作。 rpm DB2 信息中心安装文件内部使用rpm 包,Gentoo 默认没有rpm 引擎,需要先emerge rpm,否则安装无法继续。 #...

Gentoo 支持

IBM DB2 信息中心 并不提供对Gentoo Linux 的额外支持,如果使用Gentoo,在以下几个地方,需要额外的工作。

rpm

DB2 信息中心安装文件内部使用rpm 包,Gentoo 默认没有rpm 引擎,需要先emerge rpm,否则安装无法继续。

# emerge -av rpm 

信息中心自v9.1 版本,使用tar包,不再需求rpm。

服务daemon 不会自动启动

安装脚本使用Redhat Linux 发布的chkconfig 命令来为Linux 环境设置自动启动daemon,Gentoo 不支持,需要手工配置。

# rc-update add db2icd default 
安装中文帮助文档包

命令行安装仅仅安装基本的英文版本,如果需要中文,手工运行:

# rpm -ivh --nodeps db2/linux/IBM_db2decn81-8.1.0-64.i386.rpm 

繁体中文:IBM_db2detw81-8.1.0-64.i386.rpm 

Truableshooting

GUI安装:Installing DB2 file sets:.......Failure

图形安装方式运行:

# ./db2setup

启动了图形安装界面,services name 和端口使用默认值:db2icserver, 51000,最后一步安装失败,/tmp/db2setup.log 如下:

DB2 Setup log file started at: Sat 01 Mar 2008 01:43:06 AM CST CST
============================================================
Operating system information: Linux 2.6.23-gentoo.#7 PREEMPT Tue Nov 6 17:01:35 CST 2007 i686
Product to install:                        IBM DB2 Information Center
Installation type:                         Custom
Previously Installed Components:        
Selected Components:                    
Languages:                              
Target directory:                          /opt/IBM/db2/V8.1
Space required:                            0 MB
DB2 Information Center Server settings: 
Service Name:                          db2icserver
Port number:                           51000
Checking license agreement acceptance:.......Success
Installing DB2 file sets:.......Failure
ERROR:A major error occurred while installing "IBM DB2 Information Center" on 
this computer. The installation can not continue. If the problem persists 
please contact your technical service representative.
DB2 Setup log file finished at: Sat 01 Mar 2008 01:47:33 AM CST CST
============================================================ 

尚不知如何解决。

命令行安装:error: Failed dependencies:       /opt/IBM/db2/V8.1 is needed by IBM_db2deen81-8.1.0-64.i386

执行命令行安装:

# cd ./261_DOCE_LNX_3264_NLV
# ./db2_install -p DB2.DOCE

提示错误:

   IBM_db2deen81...
error: Failed dependencies:
        /opt/IBM/db2/V8.1 is needed by IBM_db2deen81-8.1.0-64.i386
The installation logfile can be found in /tmp/db2_install_log.16033.
db2_install program terminated prematurely.

这是rpm 包的依赖问题,具体原因不清楚。

临时解决方法:

修改安装目录的文件 261_DOCE_LNX_3264_NLV/db2/linux/db2_install ,573行,为rpm 命令增加参数--nodeps。
573              ( rpm -ivh --nodeps ${INSTDEV?}/${pkg?}${RPMEXTN?} 2>&1; echo $? > ${TMPRC?} ) | tee -a ${DB2INSTLOG?}
服务端口冲突

如果在系统中安装了多个版本的信息中心,比如同时安装了v8 与v9,那么可能需要考虑以下问题。

信息中心v8 版本的命令行安装脚本不能自动配置服务端口,总是使用默认值51000,可能会与其它版本的信息中心引起冲突(比如在安装v8版本之前安装了v9),需要手工修改 /var/db2/v81/db2icd.conf,挑选一个未被占用的端口,这里使用51002。

## TCP/IP port for DB2 Information Center
DB2_ECLIPSEIC_PORT=51002
## Temporary workspace file location for DB2 Information Center
## Default location is DB2 install location (<DB2DIR>/doc/eclipse)
DB2_ECLIPSEIC_DATA=
## Suggested alternate location 
#DB2_ECLIPSEIC_DATA=/tmp/db2icd/workspace
DB2HELP_DIR=/opt/IBM/db2/V8.1/bin/../doc/eclipse

注意,/opt/IBM/db2/V8.1/cfg/db2ic.conf  是个类似的配置文件,但/etc/init.d/db2icd 并没有使用它,使用的是/var/db2/v81/db2icd.conf。

启动服务失败:su: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory

启动服务,输出大量的错误信息,100秒超时后,启动失败。

# /etc/init.d/db2icd start
Initializing startup.
su: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory
ps: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
grep: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
awk: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
grep: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
ps: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
awk: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
sleep: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
expr: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
./db2icd: line 204: [: : integer expression expected
... 

此问题由daemon脚本使用的Java 虚拟机版本和内核环境参数引起。

/etc/init.d/db2icd 使用安装程序自带的Java虚拟机,版本为1.3.1。

# /opt/IBM/db2/V8.1/doc/eclipse/jre/bin/java -version
java version "1.3.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1)
Classic VM (build 1.3.1, J2RE 1.3.1 IBM build cxia32131-20031021 (JIT enabled: jitc))

/etc/init.d/db2icd 为Linux 环境设置了内核环境参数。

LD_ASSUME_KERNEL=2.4.19
export LD_ASSUME_KERNEL 

完成下面2个步骤可以解决问题:

  1. 修改daemon脚本,更换为系统的Java虚拟机
  2. 修改daemon脚本,取消内核环境参数 LD_ASSUME_KERNEL

我的系统中安装两个版本的Java 环境,经测试,任何一个都可以,关于如何切换Java 环境版本,可参考 Gentoo Linux on T43 (12) Java 环境

# java-config -L
The following VMs are available for generation-2:
*)      IBM JDK 1.4.2.9 [ibm-jdk-bin-1.4]
2)      IBM JDK 1.5.0.5a [ibm-jdk-bin-1.5] 

我的内核版本是2.6.23-gentoo:

# uname -svr
Linux 2.6.23-gentoo #7 PREEMPT Tue Nov 6 17:01:35 CST 2007

两处代码更改如下: 

# diff /etc/init.d/db2icd /etc/init.d/db2icd.bak
76,77c76
< #     DB2HELP_JRE="$DB2HELP_DIR/jre/bin/java"
<       DB2HELP_JRE="java"
---
>       DB2HELP_JRE="$DB2HELP_DIR/jre/bin/java"
195,196c194,195
<              #LD_ASSUME_KERNEL=2.4.19
<              #export LD_ASSUME_KERNEL
---
>              LD_ASSUME_KERNEL=2.4.19
>              export LD_ASSUME_KERNEL 

通过http://localhost:51002 访问DB2 Information Center v8.2 成功。

安装路径与卸载问题 

DB2 数据库v8 版本安装不允许修改安装路径/opt/IBM/db2/V8.1/(Solaris 平台除外),同样,信息中心v8 也是如此,虽然其安装脚本db2_install 具有-d 参数,但指定安装目录无效,无论如何都安装在默认目录/opt/IBM/db2/V8.1,会与DB2 数据库v8 混在一起,如果执行Information Center 的卸载程序db2_deinstall,也会将DB2 数据库v8 一并卸载掉,这点需要特别注意。

如果意外卸载了DB2 数据库 v8,用原有的选项重新安装即可,无须重新创建或者修改实例。

Posted by Alex at 1:37 AM | Comments (0) | Edit | Taged: DB2 (15), gentoo (21), linux (38)

DB2 学习笔记(四)

在AIX 系统上使用"db2 ? xxx" 命令查看帮助,需要加转移符"\" $ db2 \? list db2 get authorizations 用来获取当前用户的权限  Direct SYSADM authority                   ...
在AIX 系统上使用"db2 ? xxx" 命令查看帮助,需要加转移符"\"
$ db2 \? list
db2 get authorizations 用来获取当前用户的权限

 Direct SYSADM authority                    = NO
Direct SYSCTRL authority                   = NO
Direct SYSMAINT authority                  = NO
Direct DBADM authority                     = YES
Direct CREATETAB authority                 = YES
Direct BINDADD authority                   = YES
Direct CONNECT authority                   = YES
Direct CREATE_NOT_FENC authority           = YES
Direct IMPLICIT_SCHEMA authority           = YES
Direct LOAD authority                      = YES
Direct QUIESCE_CONNECT authority           = YES
Direct CREATE_EXTERNAL_ROUTINE authority   = YES
Direct SYSMON authority                    = NO
 Indirect SYSADM authority                  = NO
Indirect SYSCTRL authority                 = NO
Indirect SYSMAINT authority                = NO
Indirect DBADM authority                   = NO
Indirect CREATETAB authority               = NO
Indirect BINDADD authority                 = NO
Indirect CONNECT authority                 = YES
Indirect CREATE_NOT_FENC authority         = NO
Indirect IMPLICIT_SCHEMA authority         = NO
Indirect LOAD authority                    = NO
Indirect QUIESCE_CONNECT authority         = NO
Indirect CREATE_EXTERNAL_ROUTINE authority = NO
Indirect SYSMON authority                  = NO

DB2在编目节点(catalog node)时,可以在使用admin 关键字,指定admin 代表此节点对应了一个DB2系统的安装,称为系统(system),如果不指定admin,代表此节点对应了一个DB2的实例(instance),并需要至少指定服务名与端口号其中之一来映射此实例。

$ db2 catalog [admin] node 

Use "WITH HOLD" cause for cursor declaration would have more control on sources used by this cursor.

Use "LEAVE myloop" to stop execution in loop and go to the end of the loop.

Use "ITERATE myloop" to stop execution in loop and return to the begin of the loop to continue next loop.

Below db2 commands above need to attach to target node first before issuing them. 

$ db2 list active databases
$ db2 list applications
UNIQUNE cause in savepoint

the cause intend to that the same savepoint name can't be reused in the same savepoint level.

Units of work

A transaction is commonly referred to in DB2(R) Universal Database (DB2 UDB) as a unit of work. A unit of work is a recoverable sequence of operations within an application process. It is used by the database manager to ensure that a database is in a consistent state. Any reading from or writing to the database is done within a unit of work.

For example, a bank transaction might involve the transfer of funds from a savings account to a checking account. After the application subtracts an amount from the savings account, the two accounts are inconsistent, and remain so until the amount is added to the checking account. When both steps are completed, a point of consistency is reached. The changes can be committed and made available to other applications.

A unit of work starts when the first SQL statement is issued against the database. The application must end the unit of work by issuing either a COMMIT or a ROLLBACK statement. The COMMIT statement makes permanent all changes made within a unit of work. The ROLLBACK statement removes these changes from the database. If the application ends normally without either of these statements being explicitly issued, the unit of work is automatically committed. If it ends abnormally in the middle of a unit of work, the unit of work is automatically rolled back. Once issued, a COMMIT or a ROLLBACK cannot be stopped. With some multi-threaded applications, or some operating systems (such as Windows(R)), if the application ends normally without either of these statements being explicitly issued, the unit of work is automatically rolled back. It is recommended that your applications always explicitly commit or roll back complete units of work. If part of a unit of work does not complete successfully, the updates are rolled back, leaving the participating tables as they were before the transaction began. This ensures that requests are neither lost nor duplicated.


sql0010N state 42603

编译过程时出现此错误信息,可能是由于多余的单引号引起,行号指定处为错误点。

sql0104N state 42601

过程如果超过65535字节长度限制,编译时会抛出此错误信息,行号指定处为限制点。

对于两个整形变量作除法运算,结果可能并不是你希望得到的小数(如果分子小于分母)

select 2/4 from sysibm.sysdummy1
1
----
0


若希望得到小数,可在运算之前转换分子分母任意一个到DECIMAL 或者DOUBLE

select DECIMAL(2)/4 from sysibm.sysdummy1
1
----
0.5

"GET DIAGNOSTICS" must be the first next line after DML, otherwise the ROW_COUNT will not be the value you want.

DELETE FROM PRMS1.opprtnty_line_item;
GET DIAGNOSTICS v_affected_rows = ROW_COUNT;

It's impossible to change a column from not null to nullable by alter table statement.
But there's a way that meets this requirement by execute sys procedure.

It's not allowed to drop columns from a table without re-creation of the table.

db2 doesn't support following sql

select NULL as c1 from sysibm.sysdummy1

在DB2 中重命名表或者索引

RENAME TABLE EMP TO EMPLOYEE
RENAME TABLE ABC.EMP TO EMPLOYEE 
RENAME INDEX NEW-IND TO IND
RENAME INDEX ABC.NEW-IND TO IND

拥有检查约束和非主键自增列的表不允许重命名,在视图、触发器、函数或者物化查询表中被引用的表也不允许重命名,只能Drop 掉,重新创建。

使用DMS 表空间,DB2绕过操作系统,直接管理用于表空间的存储,可以保证数据页物理连续的存放。不过有个例外,如果是files类型的DMS表空间容器,则不能总是保证数据页是物理连续存放的,而对于裸设备(raw)容器,则可以完全保证。

在cygwin中运行db2命令行处理器(db2clp)

参考:http://cygwin.com/ml/cygwin/2003-02/msg00635.html

在cygwin中运行db2clp仅需一步,即创建一个系统的环境变量DB2CLP,变量的值使用如下方法获得:在开始菜单中运行DB2命令行工具的命令窗口(db2cw),会打开一个dos窗口,使用命令echo %DB2CLP%获得此环境变量的值,用于新创建的环境变量。设置之后,就可以在cygwin中运行db2开头的命令了,当然,此时在任何dos窗口,也有相同的效果。

Posted by Alex at 5:26 PM | Comments (7) | Edit | Taged: Database (12), DB2 (15), Study notes (10), 学习笔记 (14), 数据库 (15)

应该了解的几个数据库概念

数据库事务的两阶段提交 用于在单个事务内进行多个数据库同时更新,第一阶段,询问各数据库是否已经完成操作,第二阶段,向各数据库同时发送提交命令或者回滚命令。 数据库事务的四个隔离级别 序列化 可重复读 读提交 读未提交 悲观锁与乐观锁 事务开始即获得锁定,并保持到事务结束 事务开始时并不获得锁,仅当数据被更新的时候才锁定数据,在提交之前需要检查冲突。 非聚簇索引与聚簇索引的区别 使用非聚簇索引的表,新数据添加在表的尾部 使用聚簇索引的表,表中数据按照索引的顺序进行排列,增删改时的开销较大。...

数据库事务的两阶段提交

用于在单个事务内进行多个数据库同时更新,第一阶段,询问各数据库是否已经完成操作,第二阶段,向各数据库同时发送提交命令或者回滚命令。

数据库事务的四个隔离级别

序列化
可重复读
读提交
读未提交

悲观锁与乐观锁

事务开始即获得锁定,并保持到事务结束
事务开始时并不获得锁,仅当数据被更新的时候才锁定数据,在提交之前需要检查冲突。

非聚簇索引与聚簇索引的区别

使用非聚簇索引的表,新数据添加在表的尾部
使用聚簇索引的表,表中数据按照索引的顺序进行排列,增删改时的开销较大。

Posted by Alex at 1:22 AM | Comments (0) | Edit | Taged: 索引 (1), (1), 隔离级别 (2)

db2fm run cpu 100% on linux

refer to DB2 Help, try below command. $ db2fm -k $ db2fm -f on|off $ db2fm...

refer to DB2 Help, try below command.

$ db2fm -k
$ db2fm -f on|off 
$ db2fm -a on|off 
$ db2fm -d 
$ db2fm -D

Posted by Alex at 3:44 PM | Comments (0) | Edit | Taged: CPU (1), Database (12), DB2 (15), 数据库 (15)

升级DB2 UDB V8.1到新版本Stinger

正文 IBM DB2的新版本Stinger已经发布有一段时间了,从名字就可以嗅出火药味,Stinger,不知道是否真的能够刺痛对手的神经。虽然作为一个数据库的使用者——一个全部工作几乎都与数据库相关的人——的确应该关心自己所使用的软件产品是否会有一个更加光明的未来,但这似乎不用更多怀疑,把视线从冒着硝烟的战场挪开,放回到我们应该真正关心的事情上来,无论是DB2、Oracle,或是其它。 从v8.1升级到Stinger,即v8.2版本,只需要安装FixPack 级别7,简称FP7。升级到FP6的路并不十分好走,可参见另一篇文章: 升级DB2 UDB V8.1的补丁包到级别 6 照例,升级之前首先仔细阅读升级包附带的说明文档。 升级包与说明文档的下载地址如下:ftp://ftp.software.ibm.com/ps/products/db2/fixes/ 进入后选择合适的语言、版本以及升级包级别,我的升级环境是32位PC服务器,RH Linux系统,对于我的系统所合适的文件地址如下: ftp://ftp.software.ibm.com/ps/products/db2/fixes/english-us/db2linuxIA32v8/fixpak/FP7a_MI00086/FP7a_MI00086.tarftp://ftp.software.ibm.com/ps/products/db2/fixes/english-us/db2linuxIA32v8/fixpak/FP7a_MI00086/FixPackReadme.txt 升级包超过700M,最好使用断点续传工具下载。 下载完成后,把升级包转移到/tmp目录$...

正文

IBM DB2的新版本Stinger已经发布有一段时间了,从名字就可以嗅出火药味,Stinger,不知道是否真的能够刺痛对手的神经。虽然作为一个数据库的使用者——一个全部工作几乎都与数据库相关的人——的确应该关心自己所使用的软件产品是否会有一个更加光明的未来,但这似乎不用更多怀疑,把视线从冒着硝烟的战场挪开,放回到我们应该真正关心的事情上来,无论是DB2、Oracle,或是其它。

从v8.1升级到Stinger,即v8.2版本,只需要安装FixPack 级别7,简称FP7。升级到FP6的路并不十分好走,可参见另一篇文章:

升级DB2 UDB V8.1的补丁包到级别 6

照例,升级之前首先仔细阅读升级包附带的说明文档。

升级包与说明文档的下载地址如下:

进入后选择合适的语言、版本以及升级包级别,我的升级环境是32位PC服务器,RH Linux系统,对于我的系统所合适的文件地址如下:

升级包超过700M,最好使用断点续传工具下载。

下载完成后,把升级包转移到/tmp目录

$ mv FP7a_MI00086.tar /tmp
$ cd /tmp

查询一下包

$ tar -tvf FP7a_MI00086.tar

发现文件不是在同一个目录当中,所以新建一个目录:db2fp7

$ mkdir db2fp7

然后把文件解开放到新建的目录中

$ tar -xvf FP7a_MI00086.tar -C db2fp7

已经看过了升级说明文件,做安装前的准备工作。

升级DB2需要脱机进行,首先转到数据库管理员用户

$ su - iname

iname 是你的实例名,也是管理这个实例的用户,使用带force参数的命令停止实例

$ db2stop force

接下来停止许可证服务

$ db2licd end

停止DAS服务

$ exit
$ su - aname

aname 是DAS所有者的用户名

$ db2admin stop
$ exit

如果错误监视服务正在运行,也需要停止,使用如下命令查询服务状态(需要root权限)

$ su -
# /bin/db2fmcu

是你db2系统文件的安装路径,比如:/opt/IBM/db2/V8.1

如果此服务正在运行,会返回类似如下输出:

FMC: up: PID = 763

否则输出:

FMC: down

使用如下命令停止服务

# /bin/db2fmcu -d

最后查看是否还有正在运行的db2相关进程,如果有其他db2进程运行,可能会导致升级失败。

# ps -aux |grep db2

如果有,杀掉

# kill -s 9 <进程号>

准备工作已经完成,准备开始升级,需要在root用户下执行升级工作。

# cd /tmp/db2fp7
# ./installFixPak -y

接下来需要等待一会,待提示升级成功之后,需要升级实例和DAS,同样需要root权限

# /instance/db2iupdt iname
# /instance/dasiupdt dasname

接下来重新启动实例

# exit
$ su - db2
$ db2stop
$ db2start

升级工作至此完成,查看是否可以正常连接到样本数据库以及版本信息

$ db2 connect to sample
Database Connection Information

Database server = DB2/LINUX 8.2.0
SQL authorization ID = DB2
Local database alias = SAMPLE

参考资源

Posted by Alex at 9:47 AM | Comments (0) | Edit | Taged: Database (12), DB2 (15), 升级 (2), 数据库 (15), 补丁包 (2)

Uncommitted Read isolation level

10:50 2004-11-23In most cases, transactions using the Uncommitted Read isolation level can read changes made to...
10:50 2004-11-23
In most cases, transactions using the Uncommitted Read isolation level can read changes made to rows by other transactions before those changes have been committed. However, such transactions can neither see nor access tables, views, or indexes created by other concurrent transactions until those transactions themselves have been terminated. The same applies to existing tables, views, or indexes that have been dropped—transactions using the Uncommitted Read isolation level will only learn that these objects no longer exist when the transaction that dropped them is terminated. There is one exception to this behavior: When a transaction running under the Uncommitted Read isolation level uses an updatable cursor, the transaction will behave as if it is running under the Cursor Stability isolation level, and the constraints of the Cursor Stability isolation level will apply.
--------------------------------------------------------------------------------



试着翻译一下:

大多数情况下,在使用“未提交读”隔离级别的事务中,可以看到其他事务中被更改但还未提交记录,但对于创建表、视图或者索引例外,在创建动作提交之前,无法看到它们当然也无法存取。同样,这适用于删除一个表、视图或者索引——所以,使用“未提交读”的事务只有在那些执行了删除动作的事务结束之后,才能发现这些表、视图或者索引已经不存在。但有一个例外的情况,当在运行于“未提交读”隔离级别的事务中使用可更新游标时,事务将被强制运行在“游标稳定”隔离级别。

中心含义就是“一个运行在未提交读隔离级别的事务,可以看到其他并发事务对数据所做的未提交修改,但无法看到它们对表、视图或者索引所做的未提交删除,直到这些并发事务被结束”。

Posted by Alex at 2:35 PM | Comments (0) | Edit | Taged: Database (12), DB2 (15), 数据库 (15), 隔离级别 (2)

DB2 UDB V8.1 管理 学习笔记(一)

正文工作学习之余对DB2使用知识的一点零散记录,包括DB2的基础知识、数据库管理、性能调优以及开发等方面,内容非常零散,而且有时不免理解有误,可能并未回头改掉,望见谅,仅供参考。DB2 基本概念在DB2中由上至下的几个概念:实例(Instance), 数据库(Database),表空间(TableSpace),容器(Container)在一个操作系统中,DB2数据服务可以同时运行多个实例(有别于Oracle在一个系统内只能起一个实例).数据库定义在实例中,一个实例可以包含多个数据库。在同一个实例中的不同数据库是完全独立的,分别拥有自己独立的系统编目表。表空间有2种管理方式:DMS(Database management Space)方式SMS(System manegement Space)方式DMS与SMS方式在表空间建立时指定,建好后不能转换。对于DMS方式,一个表空间对应了一个或多个容器(Container),容器指定了数据的物理存储位置。对于SMS方式,只能够指定一个目录,不能够增加。表空间具有以下类型:系统编目表空间(SysCatSpace)系统临时表空间(SysTempSpace)用户表空间(UserSpace)用户临时表空间(UserTempSpace)一个数据库中必须存在两个系统基本的表空间,分别是系统编目表空间与系统临时表空间。在数据库中创建的任何对象都以在系统编目表空间中增加记录的方式体现,对于临时表空间,其占用磁盘大小是根据使用情况动态伸缩的,即仅在需要时才分配磁盘空间,并在使用后进行回收。此外,若用户需要创建表,则需要创建用户表空间,若需要使用临时表,则需要创建用户临时表空间。容器分为三种类型:Files 文件Devices 设备Directory 目录文件与设备,用于DMS方式的表空间;目录,用于SMS方式的表空间,此种方式不需要人工管理数据存储文件,DB2可根据情况在目录中自动增加存储文件,只要磁盘空间允许。实质上,表空间是数据存储的逻辑位置定义,容器则是数据存储的物理位置定义。数据库的性能影响一个数据库的性能主要有以下因素:磁盘(Disk)内存(Memory)处理器(CPU)网络(Network)其中以磁盘最为显著,90%的性能瓶颈可能来自于磁盘的IO竞争;其次是内存,一方面是指物理内存的总量要满足需求,另一方面是指与内存相关的配置参数应正确配置;当然处理器的性能也很重要,多路CPU会对哪些依赖计算能力的复杂SQL查询起到显著的效果;网络不属于主要因素,属于客观的环境因素,是指过慢的网速会对数据的传输造成影响。以下列出一些对于提高数据库性能有效的方法:对于运行数据库服务的服务器可以尽可能的配置多块物理磁盘,每块的容量不必太大,这样可以有效的分担数据存储与读取操作过程的磁盘IO竞争。即采用多块小容量的磁盘在性能上要优于仅采用一块大容量的磁盘。如果条件允许,尽量使数据存储服务与操作系统分别运行在物理分开的磁盘上。采用DMS(Database Management Space)管理方式的表空间。在物理不同的磁盘上创建多个表空间。然后可以将数据和索引分别存放在不同的表空间,这样可以显著的提高性能。还可以把一个使用频繁的大表纵向拆成多个小表,分别存放在不同的表空间中,然后用一个视图进行联合。DB2服务器可以管理裸设备,即除系统以及DB2服务运行磁盘以外,为DB2数据存放单独准备磁盘,可以是多块,分区后不需要格式化,创建裸设备后直接交给DB2进行管理,用于存储数据。系统的临时表空间对数据库性能影响很大,当由管理的物理内存不能满足数据库操作的需要时,DB2便会把临时数据写到磁盘上,这时便用到了系统临时表空间,并且这种情况会经常发生。尽量在磁盘靠近最内层磁道的位置安放数据,因为此处磁盘的访问速度较快。与性能相关的主要参数DB2的参数配置分为两个级别,一个是实例级别,另一个是数据库级别。对数据服务性能影响较大的参数主要在数据库级别配置。以下是三个比较重要的内存配置参数:bufferpagelocklistsortheapbufferpage: 由同一个数据库中的所有对象共享。sortheap: 用于排序的内存交换区,非共享,不宜设置太大,否则,很容易引起内存耗尽,因为每一个事务都会申请独立的内存用于排序。locklist: 共享内存,用于记录数据服务运行中建立的锁。建议设置20Mb左右,需要时根据实际情况进行调整。DB2默认使用行级锁,如果设置太小,当锁的记录太多时,则会导致内存不足,此时DB2会把多个行锁升级为一个表锁,这样就会大大降低应用程序的并发性能。如果设置太大,则多分配的内存很少会被用到,导致浪费。其他的一些配置参数:numdb: 同时可以启动的实例数目DB2的常用命令db2ilist...

正文

工作学习之余对DB2使用知识的一点零散记录,包括DB2的基础知识、数据库管理、性能调优以及开发等方面,内容非常零散,而且有时不免理解有误,可能并未回头改掉,望见谅,仅供参考。

DB2 基本概念

在DB2中由上至下的几个概念:

  • 实例(Instance),
  • 数据库(Database),
  • 表空间(TableSpace),
  • 容器(Container)

在一个操作系统中,DB2数据服务可以同时运行多个实例(有别于Oracle在一个系统内只能起一个实例).

数据库定义在实例中,一个实例可以包含多个数据库。在同一个实例中的不同数据库是完全独立的,分别拥有自己独立的系统编目表。

表空间有2种管理方式:

  • DMS(Database management Space)方式
  • SMS(System manegement Space)方式

DMS与SMS方式在表空间建立时指定,建好后不能转换。对于DMS方式,一个表空间对应了一个或多个容器(Container),容器指定了数据的物理存储位置。对于SMS方式,只能够指定一个目录,不能够增加。

表空间具有以下类型:

  • 系统编目表空间(SysCatSpace)
  • 系统临时表空间(SysTempSpace)
  • 用户表空间(UserSpace)
  • 用户临时表空间(UserTempSpace)

一个数据库中必须存在两个系统基本的表空间,分别是系统编目表空间与系统临时表空间。在数据库中创建的任何对象都以在系统编目表空间中增加记录的方式体现,对于临时表空间,其占用磁盘大小是根据使用情况动态伸缩的,即仅在需要时才分配磁盘空间,并在使用后进行回收。此外,若用户需要创建表,则需要创建用户表空间,若需要使用临时表,则需要创建用户临时表空间。


容器分为三种类型:

  • Files 文件
  • Devices 设备
  • Directory 目录

文件与设备,用于DMS方式的表空间;

目录,用于SMS方式的表空间,此种方式不需要人工管理数据存储文件,DB2可根据情况在目录中自动增加存储文件,只要磁盘空间允许。

实质上,表空间是数据存储的逻辑位置定义,容器则是数据存储的物理位置定义。

数据库的性能

影响一个数据库的性能主要有以下因素:

  • 磁盘(Disk)
  • 内存(Memory)
  • 处理器(CPU)
  • 网络(Network)

其中以磁盘最为显著,90%的性能瓶颈可能来自于磁盘的IO竞争;

其次是内存,一方面是指物理内存的总量要满足需求,另一方面是指与内存相关的配置参数应正确配置;

当然处理器的性能也很重要,多路CPU会对哪些依赖计算能力的复杂SQL查询起到显著的效果;

网络不属于主要因素,属于客观的环境因素,是指过慢的网速会对数据的传输造成影响。以下列出一些对于提高数据库性能有效的方法:

  • 对于运行数据库服务的服务器可以尽可能的配置多块物理磁盘,每块的容量不必太大,这样可以有效的分担数据存储与读取操作过程的磁盘IO竞争。即采用多块小容量的磁盘在性能上要优于仅采用一块大容量的磁盘。
  • 如果条件允许,尽量使数据存储服务与操作系统分别运行在物理分开的磁盘上。
  • 采用DMS(Database Management Space)管理方式的表空间。
  • 在物理不同的磁盘上创建多个表空间。然后可以将数据和索引分别存放在不同的表空间,这样可以显著的提高性能。还可以把一个使用频繁的大表纵向拆成多个小表,分别存放在不同的表空间中,然后用一个视图进行联合。
  • DB2服务器可以管理裸设备,即除系统以及DB2服务运行磁盘以外,为DB2数据存放单独准备磁盘,可以是多块,分区后不需要格式化,创建裸设备后直接交给DB2进行管理,用于存储数据。
  • 系统的临时表空间对数据库性能影响很大,当由管理的物理内存不能满足数据库操作的需要时,DB2便会把临时数据写到磁盘上,这时便用到了系统临时表空间,并且这种情况会经常发生。
  • 尽量在磁盘靠近最内层磁道的位置安放数据,因为此处磁盘的访问速度较快。

与性能相关的主要参数

DB2的参数配置分为两个级别,一个是实例级别,另一个是数据库级别。对数据服务性能影响较大的参数主要在数据库级别配置。以下是三个比较重要的内存配置参数:

bufferpage
locklist
sortheap
  • bufferpage: 由同一个数据库中的所有对象共享。
  • sortheap: 用于排序的内存交换区,非共享,不宜设置太大,否则,很容易引起内存耗尽,因为每一个事务都会申请独立的内存用于排序。
  • locklist: 共享内存,用于记录数据服务运行中建立的锁。建议设置20Mb左右,需要时根据实际情况进行调整。DB2默认使用行级锁,如果设置太小,当锁的记录太多时,则会导致内存不足,此时DB2会把多个行锁升级为一个表锁,这样就会大大降低应用程序的并发性能。如果设置太大,则多分配的内存很少会被用到,导致浪费。

其他的一些配置参数:

numdb: 同时可以启动的实例数目

DB2的常用命令

db2ilist 列出当前系统中定义的DB2实例
daslist 列出系统中的DAS
db2 list database directory 列出当前实例中定义的数据库
db2 list tablespaces 列出当前数据库中定义的表空间
db2 list tabses [for all] 列出当前数据库中的表
db2 list active db 列出活动的数据库
db2 get dbm config
get db cfg for databasename
db2 update db cfg for databasename using bufferpage 600M
db2 alter bufferpool IABMDEFAULTBP size =1
db2 list applications show detail

以上命令可以在后面加 " show detail" 参数,显示详细信息。

DB2数据存储的页大小只能在表空间级别统一指定(区别于Oracle,可以定义在表级别), 并且建好后不能修改。

可以手工建立一个页大小为4K的DMS用户临时表空间,然后把系统默认的SMS系统临时表空间删除。为满足应用需求,一般还应再建立一个页大小在8K以上的用户临时表空间。

DB2 UDB V8.1 对RedHat Linux 9 的支持不好,默认情况下无法启动GUI安装程序(可以通过设置环境LD_ASSUME_KERNEL=2.2.5解决),并且不会安装Sample数据库,控制中心也无法正常启动。

DB2 SQL 相关

当使用COUNT()函数时,如果表中的记录数 > 2 147 483 647行,则函数可能返回错误的结果,这时可以使用返回类型为DECIMAL(31, 0)的COUNT_BIG()函数。

DISTINCT 关键字可以用在COUNT()函数中,如:

SELECT COUNT(DISTINCT id) FROM TABLE

这代表将不对id列的重复值进行计数。

ORDER BY子句后面如果写了多个列名,需要分别指定升序或是降序。

可以在load大量数据时,暂时关闭表的日志选项。使用:

ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY

DB2的几个特殊寄存器:

CURRENT DATE
CURRENT TIME
CURRENT TIMESTAMP
USER(用户ID)

有关日期的操作:

CURRENT TIMESTAMP + 2 DAYS(or HOURS, SECONDS, MONTHS, YEARS, etc.)

case 语句的使用:

case when 条件一 then 动作一 else 动作二 end; 

以上可以欠套使用。

在视图的创建语句中无法使用order by 子句与 fetch n rows 子句。但对于order by可以用如下方法替代实现,不过会影响效率。

create view v_name1(c1, c2, c3) as
select * from (
select column1, column2, column3
from t1
order by column1 ) as t1;

参考资源

 

Posted by Alex at 11:11 AM | Comments (0) | Edit | Taged: Database (12), DB2 (15), Study notes (10), 学习笔记 (14), 数据库 (15)

DB2 UDB V8.1 管理 学习笔记(二)

正文工作学习之余对DB2使用知识的一点零散记录,包括DB2的基础知识、数据库管理、性能调优以及开发等方面,内容非常零散,而且有时不免理解有误,可能并未回头改掉,望见谅,仅供参考。表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便,简单,无需手工创建和维护数据存储文件。DMS需要手动指定container和存储数据的文件名,并保证有足够磁盘空间可用。对于一个数据库,至少存在一个page size为4K的系统临时表空间,可以额外建立具有更大page size的用户临时表空间,系统会自动进行使用。无法用alter语句更改一个字段的数据类型,对某些字段可以更改数据长度,这一点上相对于Oracle,DB2的限制要多一些。可以使用: select 表达式 from sysibm.sysdummy; 替代的,以下语句是等价的:values 表达式;表和视图的创建、更新、删除操作,都写日志,因此可以commit或rollback。在update语句中,如果没有对定义了默认值的某个字段显式赋值,则更新时,此字段不会重新执行默认值中定义的表达式。为了让其重新执行默认值定义的表达式,可以采用以下方式:create table...

正文

工作学习之余对DB2使用知识的一点零散记录,包括DB2的基础知识、数据库管理、性能调优以及开发等方面,内容非常零散,而且有时不免理解有误,可能并未回头改掉,望见谅,仅供参考。

表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便,简单,无需手工创建和维护数据存储文件。DMS需要手动指定container和存储数据的文件名,并保证有足够磁盘空间可用。
对于一个数据库,至少存在一个page size为4K的系统临时表空间,可以额外建立具有更大page size的用户临时表空间,系统会自动进行使用。

无法用alter语句更改一个字段的数据类型,对某些字段可以更改数据长度,这一点上相对于Oracle,DB2的限制要多一些。
可以使用: select 表达式 from sysibm.sysdummy; 替代的,以下语句是等价的:values 表达式;


表和视图的创建、更新、删除操作,都写日志,因此可以commit或rollback。

在update语句中,如果没有对定义了默认值的某个字段显式赋值,则更新时,此字段不会重新执行默认值中定义的表达式。为了让其重新执行默认值定义的表达式,可以采用以下方式:

create table t1 (c1 varchar(32), lastupdatetime with default current timpstamp);
update t1 set c1 = 'new string', lastupdatetime = default;

对于DB2数据库可以在创建时指定codepage参数,创建后不可修改。当应用程序访问数据库时,DB2会比较两者的codepage是否一致,不一致则进行代码页的自动转换。为了减少转换所带来的开销,应尽量保证应用程序所采用的代码页与数据库一致。

可以对DB2 CLP工具的codepage进行设置,使用:

$ db2set DB2CODEPAGE= 1386

本例中设置的是中文GBK字符集在Windows平台对应的值。注意,这个数字值是由DB2自己定义的。有关各种字符集在相应平台所对应的代码页值可在IBM网站查找。

在DB2 CLP中,对远程数据库编目的操作,首先把远程主机映射为本地节点,节点名自己指定,本例采用TCPIP连接。service_name一般定义在远程主机的/etc/services文件中。

$ db2 CATALOG TCPIP NODE local_node_name REMOTE hostname|ip SERVER service_name 

然后把已知的远程主机的数据库映射到本地别名,注意本地别名在主机级别不能重复。节点名指定上面刚编目的节点。

$ db2 CATALOG DATABASE db_name AS local_alias AT local_node_name USER username USING password 

现在就可以用刚才编目中定义的别名连接远程主机数据库

$ db2 CONNECT TO local_alias USER username USING password

获取数据库详细配置信息

$ db2 GET CONFIGURATION SHOW DETAIL 

对于DB2返回的错误号,可以用以下方法查阅说明(以sql 10008为例):

$ db2 ? sql10008

数据库的备份与恢复:

使用备份与恢复工具可以完成在不同的服务器见完整的转移数据库的工作,命令行方式如下:

备份

$ db2 BACKUP DATABASE db_name USER user_name USING password to backup_dir_name
$ db2 BACKUP DATABASE dlhdb USER dlh USING admindlh TO d:\backups

恢复

$ db2 RESTORE DATABASE source_db_name USER user_name USING password FROM backup_dir_name TAKEN AT backup_file_create_time TO driver_letter INTO new_db_name
$ db2 RESTORE DATABASE dlhdb USER dlh USING admindlh FROM d:\backups TAKEN AT 20031209141056 TO d: INTO newdb

有关实例的操作:

设置默认实例环境变量

$ db2 SET DB2INSTANCE=inst_name

启动当前实例

$ db2start

停止当前实例

$ db2stop [force]

连接到某个实例

$ db2 ATTACH TO ANSTANCE inst_name

获取实例的配置参数

$ db2 GET DBM CFG SHOW DETAIL

导出数据库完整的定义到脚本文件,包括表,视图,函数,数据库参数等

$ db2look -d sample(数据库) -a -e -l -x -m -f -o(参数)samplesql.out(输出文件)

load 一个表的数据时,有可能导致表空间处于backup pending(0x0020)状态。比如把整形数据load到double型的字段中。
处于backup pending状态的表空间不能被访问。
可以通过对此表空间运行一次backup操作,恢复到正常状态(0x0)。

对于自增字段,可以通过两种方式指定:

generated by default as identity
generated always as identity

区别是,第一种方式在插入数据时允许手工指定自增字段的值,只要不重复即可,并且数据库会自动设置下一个值;
第二种方式则不允许指定,只能由数据库自动分配并插入。


DB2 sql语句中转义符的使用:

select * from t1 where a like '%abc\%def' escape '\';

创建数据库时,出现SQL1043C错误,可能的问题:
指定容器所在的磁盘空间不足,
当容器为file类型时,后面的long-num参数不对,比如25600代表256Mb,但如果指定256则会导致以上错误。


平台 RH Linux 8
DB2 UDB v8.1
在WAS 5中建立到db2的数据源,但连接失败,返回以下错误:

[Servlet Error]-[SQLConnect]: java.lang.UnsatisfiedLinkError: SQLConnect

原因是没有为运行was服务的用户设置以下环境变量:

D_LIBRARY_PATH
LIBPATH
DB2INSTANCE
...

以上环境变量定义在 $INSTHOME/sqllib/db2profile文件中,可以采用的解决方案:

$ sh stopServer.sh servername

$ . $INSTHOME/sqllib/db2profile
$ sh startServer.sh servername

也可以把db2profile放到was启动脚本中首先执行。

如果只设置了LD_LIBRARY_PATH,LIBPATH两个环境变量,DB2会返回以下错误:

CLI0600E Invalid connection handle or connection is closed.
SQLSTATE S1000

对应于Oracle的Job包功能,DB2通过一个GUI工具-任务中心(task center)实现。使用任务中心前需要进行必要的工具设置,需要创建一些数据库对象,可以创建在已有的一个数据库中,也可以单独创建一个数据库。通过以下命令实现:

create catalog tools schema_name create new database db_name

此命令为编目工具创建一个名为db_name 的数据库,并指定了一个模式名。
注意:无法用using 子句指定一个codeset,系统会默认使用ISO8859-1字符集。


Quest Center for DB2带有数据库性能诊断功能,动态监视db内存,磁盘io, 表空间,负载等等。

DB2客户端的类型:

  • DB2运行时客户端 DB2 Runtime Client
  • DB2管理客户端 DB2 Administrator Client(包含运行时客户端的所有内容)
  • DB2应用程序开发客户端 DB2 Application Development Client(包含管理客户端的所有内容)
  • DB2瘦客户端 DB2 Thin Client
  • DB2 Relational Connect 联邦数据库,用于连接异种数据库。

参考资源

Posted by Alex at 11:09 AM | Comments (0) | Edit | Taged: Database (12), DB2 (15), Study notes (10), 学习笔记 (14), 数据库 (15)

DB2 UDB V8.1 管理 学习笔记(三)

正文工作学习之余对DB2使用知识的一点零散记录,包括DB2的基础知识、数据库管理、性能调优以及开发等方面,内容非常零散,而且有时不免理解有误,可能并未回头改掉,望见谅,仅供参考。强制断开已有连接,停止实例并删除。$ db2idrop -f instance_name 用于在UNIX下迁移实例。$ db2imigr instance_name 更新实例,用于实例获得一些新的产品选项或修订包的访问权。$ db2iupdt instance_name 获取当前所处的实例。$ db2 get instance 当更新实例级别或数据库级别的参数后,有些可以立即生效,有些需要重新启动实例才可生效。immediate 显式指明更改立即生效,deferred...

正文

工作学习之余对DB2使用知识的一点零散记录,包括DB2的基础知识、数据库管理、性能调优以及开发等方面,内容非常零散,而且有时不免理解有误,可能并未回头改掉,望见谅,仅供参考。

强制断开已有连接,停止实例并删除。

$ db2idrop -f instance_name 

用于在UNIX下迁移实例。

$ db2imigr instance_name 

更新实例,用于实例获得一些新的产品选项或修订包的访问权。

$ db2iupdt instance_name 

获取当前所处的实例。

$ db2 get instance 

当更新实例级别或数据库级别的参数后,有些可以立即生效,有些需要重新启动实例才可生效。immediate 显式指明更改立即生效,deferred 显式指明更改在重起实例后生效。

当需要配置许多台客户机与DB2服务器的连接时,可以用配置助手将服务器的概要文件导出,然后在每个客户机使用配置助手导入概要文件。若客户端只安装了运行时客户端,则可以使用以下命令导入概要文件。

$ db2cfimp access_profile_name

疑问:是否应该由已配置好的一台客户机导出概要文件?

列出所有的数据库连接

$ db2 list applications 

终止指定的连接句柄,事务被中断并回滚。同时操作多个句柄可以用逗号分开,或者指定关键字 all。此命令只终止指定的连接,不会阻止新的应用连接到数据库。

$ db2 force application (2) 

创建数据库时可以指定排序方式:

collate using identity

系统模式集是和每个数据库一起创建的,并且它们被放置到 SYSCATSPACE 表空间中。

  • SYSIBM:基本系统目录,建议不要进行直接访问
  • SYSCAT:PUBLIC 被授予该模式的 SELECT 权限,对只读视图编目,这是获取目录信息的推荐方式
  • SYSSTAT:可更新的目录视图 - 影响优化器
  • SYSFUN:用户定义的函数

如果表中的现有行不满足约束,则不能定义该约束。可以关闭约束检查以加快大量数据的添加,但是该表处于检查暂挂(CHECK PENDING)状态。

在创建表时,可以使用选项来指定一个或多个表空间,表和索引将被放置到其中:

CREATE TABLE TEST (
column 1 definition, column 2 definition, ...
) IN <tablespace name> INDEX IN <index space name>

这条命令为您提供了一个选项:指定创建表和索引的位置。如果没有指定单独的索引表空间,那么将在表所在的同一表空间中创建索引。创建表之后,就没有机会在不同的表空间中创建索引了。创建索引要提前作规划!

CREATE <UNIQUE> INDEX <index name> ON <table name>
(
column 1 <ASC | DESC> ,
column 2 <ASC | DESC> ...
)

UNIQUE 属性告诉 DB2,索引必须强制所有插入值的唯一性。
如果结果集是以升序和降序两种方式排序的,ALLOW REVERSE SCANS 会告诉 DB2 在索引中包括附加的指针,以允许在记录中有效地进行正向和反向链接。

DB2 能够向正在创建的索引中添加另外的列。CREATE INDEX 命令允许用户指定那些不属于实际索引但因为性能原因而保存在索引记录中的列。

CREATE UNIQUE INDEX ON EMPLOYEE (EMPNO) INCLUDE (LASTNAME,FIRSTNAME)

对于索引中包含的列而言,索引必须是 UNIQUE 的。当创建索引时,另外的列被添加到索引值中。索引不使用这些值进行排序或确定唯一性,但可以在满足 SQL 查询时使用它们。例如,下列 SELECT 语句将不需要读取实际数据行:

SELECT LASTNAME, FIRSTNAME FROM EMPLOYEE WHERE EMPNO < '000300'

要在表上创建群集索引,将 CLUSTER 关键字附加到 CREATE INDEX 命令的末尾,例如:

CREATE INDEX DEPTS-IX ON EMPLOYEE(WORKDEPT) CLUSTER

使用下列通用规则来决定为表定义的索引的经典数量。索引数量取决于数据库的主要用途:
对于在线事务处理(OLTP)环境,创建一到两个索引。
对于混合查询和 OLTP 环境,创建两到五个索引。
对于只读查询环境,创建五个以上索引。

在Windows平台上的DB2的命令行模式下,或者在类Unix平台下,使用命令db2cc启动控制中心。

db2move提供了在数据库之间批量移动数据的能力,可以指定某个表,也可以指定整个数据库的表。

$ db2move dbname action

action 可以指定为:export, import或者load
使用 -l 参数指定lob对象存储的文件夹

执行增量备份要求设置数据库配置参数“trackmod”的值为“YES”
执行在线备份要求设置数据库配置参数“logretain”的值为“YES”,在线备份语法:

$ db2 backup db dbname online to path

当删除了das用户的home目录,未先drop掉das服务,则再执行dasdrop则不成功,提示:
db2admin 命令无法找到,原因是db2admin命令保存在das的home目录中。
可以删除干净das用户的home目录后,重起服务器解决此问题。

$ dasupdt dasName 升级das
$ db2iupdt instName 升级实例
$ db2licd end 停止许可证守护进程

在Linux系统安装DB2 V8.1后,db2fmcd进程会自动启动,即使不启动实例和DAS,

在中文Linux环境下安装了DB2数据库服务,并使用GBK代码页(codepage)创建了一个数据库,完成后可以正常连接操作,若更改操作系统代码页为英语,则使用“db2 connect”时会报错,连接时无法转换代码页。

参考资源

 

Posted by Alex at 11:07 AM | Comments (0) | Edit | Taged: Database (12), DB2 (15), Study notes (10), 学习笔记 (14), 数据库 (15)

升级DB2 UDB V8.1的补丁包到级别 6

对于一个第一次使用DB2修订包的用户,修订包的升级不是一件十分轻松的事情,本文记录了升级DB2 V8.1 修订包到级别6的一般过程,以及可能导致升级失败的问题。 下载修订包 DB2不要求逐个的安装不同级别的修订包,级别高的修订包包含低级别修订包中的所有代码,所以您可以挑选当前级别最高的修订包下载。 下载位置:ftp://ftp.software.ibm.com/ps/products/db2/fixes/ 选择相应的语言环境和产品版本 本文中示例在如下环境安装成功: IBM xSeriers 345(Inter 32位) RedHat Enterprise Linux 3.0...

对于一个第一次使用DB2修订包的用户,修订包的升级不是一件十分轻松的事情,本文记录了升级DB2 V8.1 修订包到级别6的一般过程,以及可能导致升级失败的问题。

下载修订包

DB2不要求逐个的安装不同级别的修订包,级别高的修订包包含低级别修订包中的所有代码,所以您可以挑选当前级别最高的修订包下载。

下载位置:ftp://ftp.software.ibm.com/ps/products/db2/fixes/

选择相应的语言环境和产品版本

本文中示例在如下环境安装成功:

准备工作

在准备升级修订包之前,应先将数据库进行完整的备份。

首先查看当前修订包级别,以确认是否需要升级

$ db2level

注释掉自动启动的db2的监视进程,如果此进程随系统自动启动的话

# su -
# vi /etc/inittab

找到相关的行注释掉

重起系统

# reboot

登录到DAS管理用户,停止DAS服务

# su - db2as
$ db2admin stop
$ exit

登录到实例所有者用户,停止实例

# su - db2
$ db2 force applications all
$ db2 terminate
$ db2stop
$ exit

停止许可证服务

$ db2licd end
$ exit

查看是否还有正在运行的db2相关进程,如果有其他db2进程运行,可能会导致升级失败。

# ps -aux |grep db2

如果有,杀掉

# kill -s 9 进程号

准备安装fixPack级别6,进入下载文件解压的目录

# cd FP6_MI00080/

升级

在root身份下开始安装fixPack级别6

# ./installFixPak

安装完成后升级实例和DAS服务

# su - db2
$ cd /opt/IBM/db2/V8.1/instance/
$ ./db2iupdt db2
$ ./dasupdt db2as

绑定需要的包

$ db2 connect to dlhdb
$ db2 bind /opt/IBM/db2/V8.1/bnd/db2schema.bnd blocking all grant public sqlerror continue

升级结束

参考资源

Posted by Alex at 10:52 AM | Comments (0) | Edit | Taged: Database (12), DB2 (15), 升级 (2), 数据库 (15), 补丁包 (2)

自己编写脚本, 让DB2 的命令行安装变得更轻松

正文在Linux平台下DB2 UDB V8.1提供了命令行和图形界面两种安装方式,图形界面虽然通过交互简化了安装的复杂性,但安装过程需要人工干预,耗时相对较长,并且在内核较新的Linux版本下还存在无法启动GUI安装界面的问题,虽然可以通过设置环境变量进行解决,还是显得有些麻烦。当然如果你用命令行方式手动安装就不存在这个问题,不过需要手动完成很多步骤,如果安装或卸载比较频繁的情况下,就不如把整个安装过程写入shell脚本执行方便。下面是我完成的一个用于安装和卸载的shell脚本,在数据库安装时,只需指定安装文件的源路径,即可完成全部安装。包括创建必要的用户和组,创建DAS服务以及实例,在系统注册服务名和服务端口,设置注册表变量,设置自动启动等。另外可以通过三个可选的参数指定忽略拷贝安装文件,或者忽略创建用户或者组,以节约安装时间。卸载功能可以用于卸载使用本安装脚本安装的数据库,包括删除实例和DAS服务,清除前面创建的用户和组,恢复系统的配置文件等,可通过可选的参数指定同时删除安装时拷贝的package文件。在脚本的开始部分,有一些参数可以自行根据实际环境修改,比如要创建的实例名、用于DAS的用户名及组名、数据库的默认建立路径等,在使用本脚本之前可以先进行修改。将本脚本保存为文件,本例存为instdb.sh,添加可执行属性,在root权限下运行,例如:使用源路径'/mnt/DB2UDB8FORLINUX' 进行安装;# ./instdb2 -d /mnt/DB2UDB8FORLINUX删除已经进行的DB2安装,同时删除所有已经拷贝到安装目录的package文件。# ./instdb2 -d /mnt/DB2UDB8FORLINUX -remove -all本文中脚本在如下环境测试通过:RedHat Enterprise Linux 3.0DB2 V8.1...

正文

在Linux平台下DB2 UDB V8.1提供了命令行和图形界面两种安装方式,图形界面虽然通过交互简化了安装的复杂性,但安装过程需要人工干预,耗时相对较长,并且在内核较新的Linux版本下还存在无法启动GUI安装界面的问题,虽然可以通过设置环境变量进行解决,还是显得有些麻烦。

当然如果你用命令行方式手动安装就不存在这个问题,不过需要手动完成很多步骤,如果安装或卸载比较频繁的情况下,就不如把整个安装过程写入shell脚本执行方便。

下面是我完成的一个用于安装和卸载的shell脚本,在数据库安装时,只需指定安装文件的源路径,即可完成全部安装。包括创建必要的用户和组,创建DAS服务以及实例,在系统注册服务名和服务端口,设置注册表变量,设置自动启动等。

另外可以通过三个可选的参数指定忽略拷贝安装文件,或者忽略创建用户或者组,以节约安装时间。

卸载功能可以用于卸载使用本安装脚本安装的数据库,包括删除实例和DAS服务,清除前面创建的用户和组,恢复系统的配置文件等,可通过可选的参数指定同时删除安装时拷贝的package文件。

在脚本的开始部分,有一些参数可以自行根据实际环境修改,比如要创建的实例名、用于DAS的用户名及组名、数据库的默认建立路径等,在使用本脚本之前可以先进行修改。

将本脚本保存为文件,本例存为instdb.sh,添加可执行属性,在root权限下运行,例如:

使用源路径'/mnt/DB2UDB8FORLINUX' 进行安装;

# ./instdb2 -d /mnt/DB2UDB8FORLINUX

删除已经进行的DB2安装,同时删除所有已经拷贝到安装目录的package文件。

# ./instdb2 -d /mnt/DB2UDB8FORLINUX -remove -all

本文中脚本在如下环境测试通过:

  • RedHat Enterprise Linux 3.0
  • DB2 V8.1 for Linux

参考资源

  • IBM DB2 开发者园地
    http://www-128.ibm.com/developerworks/cn/db2/

  • IBM DB2 信息中心
    http://publib.boulder.ibm.com/infocenter/db2help/index.jsp

  • 《DB2 UDB v8.1 for Linux, UNIX, Windows 数据库管理》George Baklarz, Bill Wong 合著,机械工业出版社出版

  • 《DB2数据库管理与应用教程》庄济诚 著,清华大学出版社出版

Posted by Alex at 11:37 AM | Comments (0) | Edit | Taged: Database (12), DB2 (15), Shell (8), 安装 (1), 数据库 (15)

在DB2 UDB V8.1中使用裸(raw)设备

一般信息DB2提供了直接将裸(raw)设备作为表空间容器的功能,这样DB2可以绕过文件系统直接管理设备容器来获得更高的性能,这种方式用在一些对效能要求比较高的场合。本文介绍在Linux环境下,让DB2使用设备容器的一般步骤。本文中的命令和代码在以下环境编译执行通过:IBM xSeriers 345(Inter 32位) RedHat Enterprise Linux 3.0 DB2 V8.1 for Linux主机连接一个IBM EMP300 磁盘柜,用于数据库数据存储。磁盘柜共有6块磁盘,单块146GB,其中5块做成RAID5,剩余一块做备用盘。 RAID5中,校验信息不单独占用一个磁盘,而是根据算法平均分布在各个磁盘上,这样避免了读写校验信息产生的瓶颈。假设在主机上已经安装好了一个DB2服务,创建了一个实例,名为db2,还未建立数据库,并且磁盘柜已经在系统下安装好驱动程序,我们获得的设备名为sdb,还未进行分区。下面分步介绍在磁盘阵列上建立raw设备并进行数据规划和数据放置的操作步骤:规划磁盘分区以root登录,对磁盘阵列进行分区,在root提示符下键入:# fdisk...

一般信息

DB2提供了直接将裸(raw)设备作为表空间容器的功能,这样DB2可以绕过文件系统直接管理设备容器来获得更高的性能,这种方式用在一些对效能要求比较高的场合。本文介绍在Linux环境下,让DB2使用设备容器的一般步骤。

本文中的命令和代码在以下环境编译执行通过:

  • IBM xSeriers 345(Inter 32位)
  • RedHat Enterprise Linux 3.0
  • DB2 V8.1 for Linux

主机连接一个IBM EMP300 磁盘柜,用于数据库数据存储。磁盘柜共有6块磁盘,单块146GB,其中5块做成RAID5,剩余一块做备用盘。

RAID5中,校验信息不单独占用一个磁盘,而是根据算法平均分布在各个磁盘上,这样避免了读写校验信息产生的瓶颈。
假设在主机上已经安装好了一个DB2服务,创建了一个实例,名为db2,还未建立数据库,并且磁盘柜已经在系统下安装好驱动程序,我们获得的设备名为sdb,还未进行分区。

下面分步介绍在磁盘阵列上建立raw设备并进行数据规划和数据放置的操作步骤:

规划磁盘分区

以root登录,对磁盘阵列进行分区,在root提示符下键入:

# fdisk /dev/sdb

新增3个主分区sdb1,sdb2,sdb3,每个分区20GB,分别划分给系统目录表空间、默认的系统临时表空间和新增的32kb的临时表空间,
剩下空间约527GB全部划分给第4个扩展分区sdb4,在扩展分区中增加5个逻辑分区sdb5,sdb6,sdb7,sdb8,sdb9,前两个逻辑分区各160GB,用作表存储的用户表空间,第三个逻辑分区为20GB,用作专门放置索引的用户表空间,余下的2个逻辑分区分别为80GB、93GB,这两个逻辑分区使用ext3进行格式化,用于存放日志和数据库备份。
注意:sdb1-sdb7均未进行格式化操作,准备用作raw设备,由DB2自行管理。

以下是分好区的磁盘状态:

Disk /dev/sdb: 587.2 GB, 587257085952 bytes
254 heads, 63 sectors/track, 71677 cylinders
Units = cylinders of 16002 * 512 = 8193024 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2501 20010469+ 83 Linux
/dev/sdb2 2502 5002 20010501 83 Linux
/dev/sdb3 5003 7503 20010501 83 Linux
/dev/sdb4 7504 71677 513456174 5 Extended
/dev/sdb5 7504 27502 160011967+ 83 Linux
/dev/sdb6 27503 47501 160011967+ 83 Linux
/dev/sdb7 47502 50002 20010469+ 83 Linux
/dev/sdb8 50003 60002 80009968+ 83 Linux
/dev/sdb9 60003 71677 93411643+ 83 Linux

创建RAW设备

打算用作raw设备的各个逻辑分区DB2不能够直接使用,需要使用raw命令创建raw设备名:
在root提示符下键入:

# raw -a

查询当前已经建立的raw设备名,目前为空,我们可以从第一个设备名用起,

在root提示符下键入:

# raw /dev/raw/raw1 /dev/sdb1 # 用于system catalog tablespace (4K)
# raw /dev/raw/raw2 /dev/sdb2 # 用于system temp tablespace (4K)
# raw /dev/raw/raw3 /dev/sdb3 # 用于system temp tablespace (32K)
# raw /dev/raw/raw5 /dev/sdb5 # 用于user tablespace1 (32K),存储表
# raw /dev/raw/raw6 /dev/sdb6 # 用于user tablespace1 (32K),存储表
# raw /dev/raw/raw7 /dev/sdb7 # 用于user tablespace2 (32K),存储索引

至此,我们创建了6个raw设备名,用于交给DB2直接管理,查看一下已经创建的raw设备名的情况:

# raw -a
/dev/raw/raw1: bound to major 8, minor 17
/dev/raw/raw2: bound to major 8, minor 18
/dev/raw/raw3: bound to major 8, minor 19
/dev/raw/raw5: bound to major 8, minor 21
/dev/raw/raw6: bound to major 8, minor 22
/dev/raw/raw7: bound to major 8, minor 23

如果想删除一个raw设备名(例如/dev/raw/raw1),在root提示符下键入:

# raw /dev/raw/raw1 0 0

接着修改系统的初始化文件,添加如下行到 /etc/rc.d/sysinit 文件:

raw /dev/raw/raw1 /dev/sdb1
raw /dev/raw/raw2 /dev/sdb2
raw /dev/raw/raw3 /dev/sdb3
raw /dev/raw/raw5 /dev/sdb5
raw /dev/raw/raw6 /dev/sdb6
raw /dev/raw/raw7 /dev/sdb7

这样系统在下次启动时,会重新建立需要的raw设备名。

默认建立的raw设备拥有者是disk,必须让数据库实例的拥有者具有此设备的存取权限,在root提示符下键入:

# chown db2:disk /dev/raw/raw[1,2,3,4,5,6,7]

将db2用户更改为7个裸设备的拥有者,至此,这些裸设备已经可以为DB2所引用。

创建数据库

下面准备使用以上raw设备创建一个名为newdb的数据库,包含页size为4kb系统目录表空间、系统临时表空间以及用户表空间各一个;
然后新建页size为8kb、16kb、32kb的缓冲池各一个;
删除4kb的用户表空间,新建2个32kb页size的用户表空间,用于用户表的存储;
新建一个32kb页size的用户表空间,用于存储索引;
新建一个32kb页size的系统临时表空间;

我们将完成以上功能的脚本保存为newdb.sql,并通过如下方式执行此脚本:

在root提示符下键入如下命令,转到db2用户下:

# su - db2

执行上面的脚本:

$ db2 -td";" -f newdb.sql

至此数据库创建完成。下载脚本代码

规划日志以及备份文件存储

接下来,还需要规划日志和数据库备份的存储,首先将用于日志和数据库备份的分区进行格式化(此过程花费时间较长):
在root提示符下键入:

# mkfs.ext3 /dev/sdb8
# mkfs.ext3 /dev/sdb9

创建DB2数据库的目录:

# mkdir /db2
# chown db2:db2 /db2
# su - db2
$ mkdir /db2/db2log
$ mkdir /db2/db2backup
$ exit

mount逻辑分区到目录:

# mount /dev/sdb8 /db2/db2log
# mount /dev/sdb9 /db2/db2backup

更新数据库的log文件路径:

# su - db2
$ db2 connect to newdb
$ db2 update db cfg using newlogpath '/db2/db2log'

停顿数据库使修改生效,使用defer参数继续执行已有的事务,拒绝新的连接,停顿成功后发布激活数据库的命令:

$ db2 quiesce db defer
$ db2 unquiesce db
$ exit

至此我们完成了利用raw设备进行数据规划和数据放置的任务。

额外信息

当已经在raw设备上创建容器之后,若没有通过正常的步骤删除表空间所在数据库,也没有直接删除容器或者容器所在表空间,则再次利用这些raw设备时,DB2会报错:

The container is already in use

此时应使用db2untag命令释放container标志,而采用重新对磁盘进行分区或者格式化的操作是无济于事的。

释放已经在raw设备raw1上建立的container标志:

# su - db2
$ db2untag /dev/raw/raw1

 

参考资源

  • IBM DB2 开发者园地
    http://www-128.ibm.com/developerworks/cn/db2/

  • IBM DB2 信息中心
    http://publib.boulder.ibm.com/infocenter/db2help/index.jsp

  • dbforums 论坛
    http://dbforums.com/

  • 《DB2 UDB v8.1 for Linux, UNIX, Windows 数据库管理》George Baklarz, Bill Wong 合著,机械工业出版社出版

  • 《DB2数据库管理与应用教程》庄济诚 著,清华大学出版社出版

Posted by Alex at 10:45 AM | Comments (0) | Edit | Taged: Database (12), DB2 (15), RawDevice (1), 数据库 (15), 裸设备 (1)

在DB2 中创建一个获取汉字拼音首字母的SQL 函数

需求 有些时候我们会有这样的需求,要求使用字母从a至z对一组数据进行索引,如果数据的格式全部是半角的英文则很容易实现,但若是对一组中文数据进行索引则会引起一点小的麻烦,数据在录入数据库的时候可能并没有指定一个索引字母,这就要求应用程序可以自动生成用于索引的信息。 一般对于中文数据的索引,采用词组的首汉字拼音的首字母,例如: 词组 索引字母 --- ----- 熊猫 x 白暨豚 b 藏野驴 z 在DB2中并没有提供相应的函数可以取得汉字拼音的首字母,我们可以利用数据库针对中文字符集的排序功能创建一个这样的函数。 工作原理 我们知道在使用中文字符集的数据库中,当你对一列中文数据使用order...

需求

有些时候我们会有这样的需求,要求使用字母从a至z对一组数据进行索引,如果数据的格式全部是半角的英文则很容易实现,但若是对一组中文数据进行索引则会引起一点小的麻烦,数据在录入数据库的时候可能并没有指定一个索引字母,这就要求应用程序可以自动生成用于索引的信息。

一般对于中文数据的索引,采用词组的首汉字拼音的首字母,例如:

词组 索引字母
--- -----
熊猫 x
白暨豚 b
藏野驴 z

在DB2中并没有提供相应的函数可以取得汉字拼音的首字母,我们可以利用数据库针对中文字符集的排序功能创建一个这样的函数。

工作原理

我们知道在使用中文字符集的数据库中,当你对一列中文数据使用order by 排序时,排序的结果正是按照每行记录第一个汉字的拼音首字母进行排列的,那么我们需要想办法取得这个字母。
但是数据库内部是如何做到这一点的呢?以中文字符集GBK为例,让我们查看一下GBK字符集的内码表,我们仅摘出一段:

0 1 2 3 4 5 6 7 8 9 A B C D E F
B040 癅 癆 癇 癈 癉 癊 癋 癎 癏 癐 癑 癒 癓 癕 癗 癘
B050 癙 癚 癛 癝 癟 癠 癡 癢 癤 癥 癦 癧 癨 癩 癪 癬
B060 癭 癮 癰 癱 癲 癳 癴 癵 癶 癷 癹 発 發 癿 皀 皁
B070 皃 皅 皉 皊 皌 皍 皏 皐 皒 皔 皕 皗 皘 皚 皛
B080 皜 皝 皞 皟 皠 皡 皢 皣 皥 皦 皧 皨 皩 皪 皫 皬
B090 皭 皯 皰 皳 皵 皶 皷 皸 皹 皺 皻 皼 皽 皾 盀 盁
B0A0 盃 啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘
B0B0 鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翱
B0C0 袄 傲 奥 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋
B0D0 靶 把 耙 坝 霸 罢 爸 白 柏 百 摆 佰 败 拜 稗 斑
B0E0 班 搬 扳 般 颁 板 版 扮 拌 伴 瓣 半 办 绊 邦 帮
B0F0 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤 苞 胞 包 褒 剥

可以看到从B0A0-1 开始,至B0C0-5,是拼音A开头的汉字,恰好是按照拼音字母的先后顺序排列,并且把音调的因素也考虑进去了,由此,可以推断出,数据库在GBk编码的数据库中对汉字进行排序,即是依照字符内码表的编码进行的。
我们把B0C0-5 位置的汉字记录下来,即“澳”字,这是以“a”拼音开头在内码表中排列在最后的汉字,用同样的方法,我们找出所有以拼音从b至z开头,在内码表中排列在最后的汉字,与26个字母的对应关系如下:

'澳' a
'怖' b
'错' c
'堕' d
'贰' e
'咐' f
'过' g
'祸' h
i
'骏' j
'阔' k
'络' l
'穆' m
'诺' n
'沤' o
'瀑' p
'群' q
'弱' r
'所' s
'唾' t
u
v
'误' w
'迅' x
'孕' y
'座 z

注:没有以'i','u','v'开头的汉语拼音。

现在假若我们拿出任何一个汉字,放在我们挑选出的这些汉字中间,利用数据库进行一次使用GBK字符集的排序,我们便能够根据这个汉字排列的相对位置得到其拼音首字母。

利用sql语句生成一组上述汉字的结果集,我们将'i','u','v' 三个空缺汉字的位置补上了上一个拼音的汉字,

select t1.strChn
from ( select '澳' strChn from sysibm.sysdummy1
union all
select '怖' strChn from sysibm.sysdummy1
union all
select '错' strChn from sysibm.sysdummy1
union all
select '堕' strChn from sysibm.sysdummy1
union all
select '贰' strChn from sysibm.sysdummy1
union all
select '咐' strChn from sysibm.sysdummy1
union all
select '过' strChn from sysibm.sysdummy1
union all
select '祸' strChn from sysibm.sysdummy1
union all
select '祸' strChn from sysibm.sysdummy1
union all
select '骏' strChn from sysibm.sysdummy1
union all
select '阔' strChn from sysibm.sysdummy1
union all
select '络' strChn from sysibm.sysdummy1
union all
select '穆' strChn from sysibm.sysdummy1
union all
select '诺' strChn from sysibm.sysdummy1
union all
select '沤' strChn from sysibm.sysdummy1
union all
select '瀑' strChn from sysibm.sysdummy1
union all
select '群' strChn from sysibm.sysdummy1
union all
select '弱' strChn from sysibm.sysdummy1
union all
select '所' strChn from sysibm.sysdummy1
union all
select '唾' strChn from sysibm.sysdummy1
union all
select '唾' strChn from sysibm.sysdummy1
union all
select '唾' strChn from sysibm.sysdummy1
union all
select '误' strChn from sysibm.sysdummy1
union all
select '迅' strChn from sysibm.sysdummy1
union all
select '孕' strChn from sysibm.sysdummy1
union all
select '座' strChn from sysibm.sysdummy1
) as t1

实现

接下来很方便的就可以写出这个函数的具体实现,在实现的代码中,我们又加入了针对英文字母的处理,函数编译后,可通过如下方式调用:

select getIndex( '索' ) index from dual;
index
------
f

下载代码


实际使用中,应注意建立数据库时字符集参数的设置,应使用GBK字符集。
应用以下命令查看已建立数据库的字符集:

db2 connect to db_name user user_name using password
db2 get db cfg | grep -i 'code set'

此参数在数据库建立之后不能修改。

参考资源

Posted by Alex at 11:32 AM | Edit | Taged: Database (12), DB2 (15), SQL (1), 函数 (1), 数据库 (15)

Alex's picture

my email address in picture

搜索|Search

订阅更新|Subscribe to Feed

评论|Recent Comments

按月归档|By Month

2009
07
2008
11
10
07
05
04
03
02
01
2007
12
10
07
06
05
04
03
02
01
2006
12
11
10
09
08
07
06
05
04
03
02
01
2005
11
10
09
08
07
04
03
2004
12
11
10
09
08
07
06
05
04
03
02
01
2003
12
10
09
08
06
2002
09
08
04
03
02
2001
12
09
07
06
05

我读|My Books

db2

我的链接|My Links

我的朋友|My Friends

Movable Type 4 Logo
Creative Commons License
This blog is licensed under a Creative Commons License.