技术开发 频道

Siebel 7从DB2 UDB V8到DB2 9胜利大迁移


【IT168 技术文档】

DB2 9 中的新特性

  • pureXM?L:DB2 9 天生就支持 XML 数据存储。这使得可以将格式良好的 XML 文档以其自身固有的分层格式存储在 Siebel 表列中。XML 数据存储为 XML 类型而不是将其存储为文本。因此,您可以使用 XQuery、SQL 或者结合使用二者来有效地搜索和检索 XML 数据。

  • 自动化管理特性:自动化管理特性将简化 Siebel/DB2 DBA 的管理任务。它包括自调优内存管理(Self Tuning Memory Management,STMM)。STMM 通过持续更新配置参数(数据库参数和数据库管理器参数)、调整缓冲池大小以及动态确定数据库使用的内存总量,从而减少或消除配置 DB2 服务器的工作。

  • 增强了数据库安全性:基于标签的访问控制(Label Based Access Control,LBAC)是一种新的安全特性,它使您可以在行和列的级别上控制数据访问。为此,添加了一种新的安全管理员(SECADM)授权级别,它将收集一些与安全相关的权限。根据列表或组的结构、位置或从属关系,LBAC 可用于增强对用户可见记录的 Siebel 访问控制。

  • 弹性增强:Siebel/DB2 DBA 可以立即使用 DB2 9 中的一些增强来添加弹性。其中一些特性包括:

    • 能够重新开始中断的恢复操作,这些操作能够在进行数据库恢复时节省宝贵的时间和工作。

    • 支持使用从已有备份映像中自动生成的脚本执行重定向恢复操作。

    • 能够从表空间备份映像中重新构建数据库。

     

  • 更多附加的有用特性:很多特性对 Siebel 应用程序都非常有用。其中一些特性与性能和可伸缩性有关,例如数据行压缩,而另外一些则与可管理性有关,例如复制数据库模式的功能,以及 ALTER TABLE 语句增强。

    本文将展示如何启用 DB2 9 的一些特性,例如自调优内存管理和压缩,这些都是完成迁移后的工作。

预迁移步骤

预迁移步骤非常重要,是实现成功迁移的关键。在本节中,实际上将执行三项任务:

  1. 在开始迁移之前,搜集有关当前数据库和环境的最重要信息(给出了一些有用的脚本和示例)。这样一来,如果在迁移过程中出现了问题,您可以很轻易地恢复到迁移前的状态。同样,如果您需要使用这些信息并且这些参数值在迁移后还有用的话,您还可以应用它们。

  2. 查看您的机器是否兼容以及是否能够安全地安装和使用 DB2 9。

  3. 停止 DB2 服务器,准备进行迁移。

下面给出了这些任务的细节:

 

  1. 运行数据库的脱机备份。

    Check if there is any application or user connected to the database by issuing
                    db2 list application
                    Disconnect any user or application before issuing the offline backup by running
                    db2 force application all
                    Issue a backup either to TSM, to a directory or a device
                    db2 backup database dbname use TSM    To TSM
                    db2 backup database dbname to directory/device    To a directory or to a device
                    


  2. 将数据库配置信息保存为 db cfg、dbm cfg 和数据行计数。

    1. 对数据库中的所有表格进行行计数并保存结果。下面的脚本将帮助实现此操作。

    2. 对数据库运行 db2 get db cfg for dbname 并保存结果。

    3. 运行 db2 get dbm cfg 并保存结果。

    4. 运行 db2set -all 并保存结果。

    5. 对数据库运行 db2 list tablespaces show detaildb2 list packages for all show detail 并保存结果。

    6. 运行 db2look -d $dbname -e -a -m -o $outputfilename

    7. 运行 db2dart dbname /DB /V Y /RPT . /RPTF E 并保存结果。运行这个命令将占用一些时间。



    清单 1. 在 UNIX 平台上实现表行计数的示例。脚本名:get_table_count.sh
        
    if [ $# -lt 1 ]; then echo "This script need a database name as a parameter " echo echo "Example $0 dbname " exit 1 fi db2 "connect to $1 " if [ $? -ne 0 ]; then echo "ERROR connecting to the database $1" echo;echo exit 1 fi db2 "select tabname from syscat.tables where tabschema = 'SIEBEL' order by 1" > x export rownums=`cat x | wc -l` export headrows=$(($rownums-3)) export tailrows=$(($headrows-3)) cat x | head -$headrows | tail -$tailrows > y echo; echo while read tabname do db2 "select count(*) from siebel.$tabname " > x1 rownums=`cat x1 | wc -l` if [ $rownums -gt 3 ]; then headrows=$(($rownums-3)) tailrows=$(($headrows-3)) cat x1 | head -$headrows | tail -$tailrows > y1 nb=$(cat y1) else nb=0 fi echo "--------------- Number of rows in table ... $tabname $nb" echo done < y rm x y x1 y1 db2 terminate
     

     如果 Siebel 模式名不是 SIEBEL,则应该对脚本和循环中的第一个查询做出相应地修改。

清单 2. 在迁移前获得所有 db 信息的脚本。脚本名:get_db_info.sh

if [ $# -lt 1 ]; then echo "This script need a database name as a parameter " echo echo "Example $0 dbname " echo;echo exit 1 fi export db_name=$1 date echo;echo "-------------- Table counts" nohup get_table_count.sh $db_name | tee table_count.log db2 connect to $db_name echo;echo "-------------- Tablespace lists with detail" db2 list tablespaces show detail | tee tbspace_detail.log echo;echo "-------------- Package lists with detail" db2 list packages show detail | tee package_detail.log echo;echo "-------------- DBM CFG" db2 get dbm cfg | tee dbmcfg.log echo;echo "-------------- DB CFG" db2 get db cfg for $db_name | tee dbcfg.log echo;echo "-------------- DB2 SET" db2set -all | tee db2set.log echo;echo "-------------- db2look for all db objects" db2look -d $db_name -e -a -m -o db2look.log db2 terminate echo;echo "-------------- db2dart on all database. This will take time" db2 force application all db2dart $db_name /DB /V Y /RPT . /RPTF E date


 

  1. 查看磁盘空间需求。数据库迁移需要额外的磁盘空间,如下所示:

    • SQLSPCS.1 和 SQLSPCS.2 文件包含表空间信息,并且在迁移过程中会增长为初始大小的四倍。如果这两个文件的总大小是 512KB,那您至少需要 2MB 的自由空间。

    • 确保系统目录和系统临时表空间中具有足够的自由空间。然而,磁盘空间会发生变化,建议您应用下面的原则。将 SYSCATSPACE 和 TEMPSPACE1(这里是默认名称,可以改变)的总大小增加为目前的两倍。对于 SMS 表空间,增加容器文件的大小,而对于 DMS,则要增加额外的容器文件(这将使数据重新进行平衡)。只有进行迁移操作时才需要额外的空间,因此成功完成迁移后可以减少表空间的大小。以下的示例基于 AIX 和 Siebel 77 DB2 数据库,展示了如何确定 SYSCATSPACE 所占的空间大小。

              
      $ db2 list tablespaces show detail Tablespaces for Current Database Tablespace ID = 0 Name = SYSCATSPACE Type = System managed space Contents = All permanent data. Regular table space. State = 0x0000 Detailed explanation: Normal Total pages = 229882 Useable pages = 229882 Used pages = 229882 Free pages = Not applicable High water mark (pages) = Not applicable Page size (bytes) = 4096 Extent size (pages) = 32 Prefetch size (pages) = 32 Number of containers = 1 229882 pages x 4096 bytes per page which is about 898 MB. Next, you need to find out where the containers for this tablespace are located. $ db2 list tablespace containers for 0 Tablespace Containers for Tablespace 0 Container ID = 0 Name = /V9_FS/sia77u_v9/catalog Type = Path You now need to find out if the free space is at least twice of the used space. $ df -k /V9_FS Filesystem 1024-blocks Free %Used Iused %Iused Mounted on /dev/V9_LV 70909952 67149124 6% 704 1% /V9_FS You can see that you have 67GB free space in this file system, which is enough

       

    • 将 logfilsiz、logprimary 和 logsecond 的值增加为当前大小的两倍。迁移在单个事务中改变系统目录对象,并且这些更改需要足够的日志空间来包含该事务。如果空间不够的话,该事务将回滚并且也不能成功实现迁移。

     

  2. 只针对 Linux:将裸设备(raw device)改为块设备(block device)。

  3. 发出以下命令停止 DB2 服务器:

                    db2licd -end
                    db2 force application all
                    check if there is any application still connecting by issuing db2 list applications
                    db2stop (to be issued for each instance)
                    db2admin stop (to be issued as the DAS user)
                    db2_kill
                    ps -eaf | grep db2 (make sure there are no DB2 processes up)
                    

  4. 在安装 DB2 9 之前,要确保您的机器是兼容的,并且已经安装好了所有的修正程序和补丁

迁移步骤

本节将介绍更多关于迁移任务本身的详细信息。迁移过程包括两大主要步骤,实例迁移和数据库迁移。这一节将介绍迁移的这两个部分,首先介绍在 Windows 平台上的迁移,然后介绍在 UNIX 平台上的迁移。


  • 在 Windows 上进行迁移:对于 Windows 平台上的 DB2 9,有两种方法可以实现数据库的迁移。

    • 第一种方法:如果使用该方法,在安装 DB2 9 的过程中将自动完成实例迁移。(我们推荐使用该方法)

      在安装 DB2 9 时,将检测到之前的版本,并且安装向导将显示一个迁移实例的按钮(参见图 1 下面的部分)。

      图 1. 安装向导
      安装向导

      选择 安装向导 - Migrate 按钮 按钮将安装 DB2 9 并且自动进行实例迁移。稍后您只需要调用 CLP 并发出以下命令就可完成数据库迁移:

                          db2start
                          db2 migrate db dbname
                          


    • 第二种方法:选择这种方法,要将 DB2 安装在与前一版本不同的安装目录。要完成实例迁移和数据库迁移,请执行以下步骤:
      1. 在安装向导中选择 安装向导 - Install New 按钮 按钮,将 DB2 安装在一个不同的文件夹。

      2. 安装完成后,导航到新的 DB2_9Directory/bin。

      3. 打开 DB2 CLP 窗口(db2cmd.exe)并发出以下命令进行实例迁移:db2imigr v8InstanceName /u:userid,password

      4. 关闭 CLP 并重新打开它,以使操作生效。

      5. 发出 db2ilist 命令。将显示所有实例。

      6. 发出 db2 list directory 命令。将引入在下一步骤中迁移的数据库。

      7. 发出 db2start 命令。

      8. 发出 db2 migrate db dbname 命令,进行数据库迁移。

     

  • 在 UNIX 上进行迁移:在 UNIX 平台上,需要执行以下步骤安装 DB2 9、完成实例迁移和数据库迁移:

    • 安装 DB2 9,但不需要卸载 DB2 UDB Version 8,也不需要删除或重命名 SQLLIB 目录。

    • 要添加许可,运行 DB2_9_Directory/adm/db2licm -a filename.lic 命令作为根。
      例如,如果从 /db2_9_installimage 目录中开始安装 DB2 9 ESE,并选择了默认的安装位置,那么应该运行
      /opt/IBM/db2/V9.1/adm/db2licm -a /db2_9_installimage/ese/disk1/db2/license/db2ese.lic

    • 检查根环境并确保 LIBPATH 或 PATH 环境变量中不存在 DB2 路径或实例的 SQLLIB。同时检查 .profile 和 .kshrc 文件。这些文件在使用 db2imigr 命令时将生成错误,阻止进行实例迁移。

    • 迁移实例。在 DB2_Installation_Path/instance 下运行 db2imigr 命令作为根。
      例如,db2imigr -u db2fenc1 db2inst1
      在成功的迁移过程中,旧的 SQLLIB 被重命名为 SQLLIB_V81。

    • 作为被迁移的实例的所有者登录,并发出 db2start 命令。

    • 以实例所有者的身份,通过运行 db2 migrate db dbname 命令进行数据库迁移。

     

此时,您已经完成了迁移任务。下一节将向您展示如何调整一些参数并启用 DB2 的一些特性来开始使用 Siebel 7 和 DB2 9。完成迁移后需要进行的步骤

    这一节将介绍使用 DB2 9 和 Siebel 7 的准备步骤。还将启用 DB2 9 的一些新特性。

    调整日志空间大小(logfilsiz、logprimary 和 logsecond 数据库配置参数)。如果您改变了这些参数(如预迁移步骤中建议的那样),您可以使用预迁移步骤 3 中保存的值将这些参数值恢复为原来的值。

     安装 Siebel 存储过程。将正确的 Siebel 存储过程代码(在 UNIX 上为 siebproc 而在 Windows 上为 siebproc.dll)复制到 SQLLIB 下的 FUNCTION 目录。更改文件的权限。UNIX 的 siebproc 权限应该修改为所有者具有读写权限,组用户只具有读权限,而所有其他人既不具有读权限,也不具有写权限。

     将 Siebel 存储过程和用户定义函数的执行权限授权给 PUBLIC。

db2 grant execute on procedure siebstat to public
db2 grant execute on procedure siebtrun to public
db2 grant execute on procedure siebdbx to public
db2 grant execute on procedure nextseq to public
db2 grant execute on procedure siebtrim to public

    完成迁移后,运行下面的命令激活数据库:

db2 activate db dbname

    查看注册表变量、数据库配置和数据库管理器配置的值。使用 db2set -g 命令设置全局注册表变量。这些类型的变量没有被迁移。

    重新绑定所有的包,因为在迁移过程中,这些包被设置为无效。推荐运行下面的命令重新绑定所有的包:

db2rbind dbname -l output_filename all


You can also bind CLI packages. Go under sqllib/bnd and issue the following
db2 bind @db2cli.lst blocking all grant public clipkg 6

    如果需要的话,迁移 db2 explain 表,运行下面的命令:

db2exmig -d dbname -e explain_schema [ -u userid password ]

    通过运行 预迁移 一节的步骤 2 中的相同命令收集所有数据库信息。

    如果希望对所有或部分表进行压缩,需要对表进行更改并对表启用压缩功能,然后使用 RESETDICTIONARY 选项发出 reorg 命令,如下所示: 
 
db2 "alter table tablename compress yes"
db2 "reorg table tablename resetdictionary"

    您可以通过更改表并禁用压缩功能(compress no)来停用压缩,然后发出相同的 reorg 命令。

    更新所有 Siebel 数据库表上的统计信息,要在所有 Siebel 表上运行 runstats,您可以修改 清单 1 中的 get_table_count.sh 脚本。为此,通过执行下面的代码替换掉 do 和 done 循环之间的所有的指令和命令:

do
echo "-------- Runstats on table $tabname ..."
db2 "runstats on table $tabname with distribution and detailed indexes all shrlevel change"
echo
done < y

    迁移完成后,对数据库进行备份,如 预迁移 一节中的步骤一所示。将连接的客户机迁移到服务器中。执行一些步骤设置 STMM,使其具有更好的性能:

    在数据库配置级别中,将 SELF_TUNING_MEM 设置为 ON 并对 AUTOMATIC 设置下面的内容:

DATABASE_MEMORY, LOCKLIST, MAXLOCKS, PCKCACHESZ, SHEAPTHRES_SHR, SORTHEAP, SHEAPTHRES_SHR, NUM_IOCLEANERS, NUM_IOSERVERS, DFT_PREFETCH_SZ, MAXAPPLS

    在数据库管理器配置级别中,设置如下参数: 将 SHEAPTHRES 设置为 0 (zero) 。将 INSTANCE_MEMORY、FCM_NUM_BUFFERS 和 FCM_NUM_CHANNELS 设置为 AUTOMATIC 。将所有数据库缓冲池的大小设置为 AUTOMATIC。

    可以在 UNIX 平台上运行下面的脚本来启用 DB2 9 的这个新功能。

清单 3. 启用 STMM。脚本名:enable_stmm.sh
if [ $# -lt 1 ]; then echo "This script need database name as a parameter : " echo echo " Example : $0 database_name" echo;echo exit 1 fi export db_name=$1 db2start db2 -v connect to $db_name echo "db cfg level" db2 -v update db cfg for $db_name using self_tuning_mem on db2 -v update db cfg for $db_name using database_memory automatic db2 -v update db cfg for $db_name using locklist automatic maxlocks automatic db2 -v update db cfg for $db_name using pckcachesz automatic db2 -v update db cfg for $db_name using sortheap automatic sheapthres_shr automatic db2 -v update db cfg for $db_name using num_iocleaners automatic db2 -v update db cfg for $db_name using num_ioservers automatic db2 -v update db cfg for $db_name using dft_prefetch_sz automatic db2 -v update db cfg for $db_name using maxappls automatic echo "dbm cfg level" db2 -v update dbm cfg using sheapthres 0 db2 -v update dbm cfg using instance_memory automatic echo "bufferpool level" db2 "select bpname from syscat.bufferpools" > x export rownums=$(cat x | wc -l) headrows=$(($rownums-3)) tailrows=$(($headrows-3)) cat x | head -$headrows | tail -$tailrows > y while read bp_name; do db2 -v alter bufferpool $bp_name size automatic done < y rm x y db2 connect reset db2 terminate db2 force application all db2stop force db2start
0
相关文章