米鼠商城

多快好省,买软件就上米鼠网

最新项目

人才服务

靠谱的IT人才垂直招聘平台

某行XX系统DB2数据库迁移实施方案

  • xx
  • 8
  • 2021-06-12 23:45

一 环境说明

原库:

DB2:DB2 9.7.11

OS:Redhat 7.4

目标库:

DB2:DB2 9.7.11

OS:Redhat76

数据量大小: 16.7TB

迁移方案的选择

1 磁盘快照迁移

服务器没有 HBA 卡,不支持。

2 冷备份加恢复

停机时间较长。

3 热备份加恢复

停机窗口较短,本次迁移采用这种方式。

4 HADR

配置较复杂,并且迁移期间归档生成量很少,不需要自动追归档。

迁移前准备

1 申请新数据库存储资源 (40TB)

2 申请 NAS 存储资源 (40TB)

用于存储备份数据。

3 沟通停机窗口

迁移

1 安装目标 DB2 数据库实例

(1) 创建需要的目录

mkdir /ibmdb2
mkdir -p /db2inst
mkdir -p /db2data
mkdir -p /db2temp
mkdir -p /db2log
mkdir -p /db2logmir
mkdir -p /db2arch

(2)创建对应的 LV

lvcreate -L 10G -n lvibmdb2 vg_srv
lvcreate -L 20G -n lvdb2inst1 vg_srv 
lvcreate -L 200G -n lvdb2inst1data vg_srv 
lvcreate -L 10G -n lvdb2inst1temp vg_srv
lvcreate -L 5G -n lvdb2inst1log vg_srv
lvcreate -L 5G -n lvdb2inst1mir vg_srv
lvcreate -L 20G -n lvdb2inst1arch vg_srv

(3)格式化

mkfs.ext4 /dev/mapper/vg_srv-lvibmdb2
mkfs.ext4 /dev/mapper/vg_srv-lvdb2inst1
mkfs.ext4 /dev/mapper/vg_srv-lvdb2inst1data
mkfs.ext4 /dev/mapper/vg_srv-lvdb2inst1temp
mkfs.ext4 /dev/mapper/vg_srv-lvdb2inst1log
mkfs.ext4 /dev/mapper/vg_srv-lvdb2inst1mir
mkfs.ext4 /dev/mapper/vg_srv-lvdb2inst1arch

(4)添加自动挂载

vi /etc/fstab
/dev/mapper/vg_srv-lvibmdb2 /ibmdb2               ext4    defaults        0 0
/dev/mapper/vg_srv-lvdb2inst1 /db2inst               ext4    defaults        0 0
/dev/mapper/vg_srv-lvdb2inst1data /db2data               ext4    defaults        0 0
/dev/mapper/vg_srv-lvdb2inst1temp /db2temp               ext4    defaults        0 0
/dev/mapper/vg_srv-lvdb2inst1log /db2log              ext4    defaults        0 0
/dev/mapper/vg_srv-lvdb2inst1mir /db2logmir               ext4    defaults        0 0
/dev/mapper/vg_srv-lvdb2inst1arch /db2arch               ext4    defaults        0 0

(5)手动挂载

mount -a

(6) 配置 YUM ,并安装所需安装包

yum -y install libstdc* libaio* gcc* kernel-devel sg3_utils* pam-devel*
yum -y install gcc automake autoconf libtool make openssh-clients iscsi-initiator-utils libnes libmthca libipathverbs libcxgb3 libibcm libaio ibsim ibutils rdma pam dapl* compat-libstdc++* perl-Config-General scsi-target-utils librdmacm-devel*
yum -y install libstdc++* glibc* gcc* ntp* sg3* binutils* openssh* cpp* ksh*

(7)创建用户和组

groupadd -g 401 db2grp
groupadd -g 402 db2fgrp
groupadd -g 403 db2mgrp
useradd -u 401 -g db2grp -d /db2inst/db2inst1 -s /bin/bash db2inst1
echo "db2inst1:dbxxx" | /usr/sbin/chpasswd
useradd -u 402 -g db2fgrp -m -d /home/db2fenc1 -s /bin/bash db2fenc1
echo "db2fenc1:dbxxx" | /usr/sbin/chpasswd
useradd -u 404 -g db2mgrp -s /bin/bash db2mon
echo "db2mon:dbxxx" | /usr/sbin/chpasswd

(8)创建目录并授权

mkdir -p /ibmdb2/V9.7
mkdir -p /db2inst/db2inst1
mkdir -p /db2data/db2inst1
mkdir -p /db2his/db2inst1
mkdir -p /db2temp/db2inst1
mkdir -p /db2log/db2inst1
mkdir -p /db2logmir/db2inst1
mkdir -p /db2arch/db2inst1
chown -R db2inst1:db2grp /db2inst
chown -R db2inst1:db2grp /db2data
chown -R db2inst1:db2grp /db2temp
chown -R db2inst1:db2grp /db2log
chown -R db2inst1:db2grp /db2logmir
chown -R db2inst1:db2grp /db2arch
chown db2inst1:db2grp /db2inst/db2inst1 /db2data/db2inst1 /db2data/db2inst1 /db2temp/db2inst1 /db2temp/db2inst1 /db2log/db2inst1 /db2log/db2inst1 /db2logmir/db2inst1 /db2logmir/db2inst1 /db2arch/db2inst1 /db2arch/db2inst1

(9)配置环境变量

su - root
vi ~/.bash_profile
# DB2 10.5 Environment
set -o vi
export DB2DIR=/ibmdb2/V9.7
su - db2inst1
vi .bash_profile
export PATH=$PATH:/sbin:/usr/sbin

(10)配置内核参数和资源限制

vi /etc/security/limits.conf
db2inst1  soft    core    unlimited
db2inst1  hard    core    unlimited
db2inst1  soft    memlock unlimited
db2inst1  hard    memlock unlimited
db2inst1  soft    rss     unlimited
db2inst1  hard    rss     unlimited
db2inst1  soft    nofile  unlimited
db2inst1  hard    nofile  1048576
db2inst1  soft    stack   unlimited
db2inst1  hard    stack   unlimited
 
vi /etc/sysctl.conf
# DB2 9.7 Cconfiguration Parameter
kernel.shmmni = 32768
kernel.shmmax = 103079215104
kernel.shmall = 50331648
kernel.sem = 250 2048000 32 24576
kernel.msgmni = 98304
kernel.msgmax = 65536
kernel.msgmnb = 65536
vm.swappiness = 0
vm.overcommit_memory = 0
sysctl -p

(11)开始安装

解压
cd /opt
tar -xvzf v9.7fp11_linuxx64_server.tar.gz
检查
./db2prereqcheck
开始安装
 ./db2_install -b $DB2DIR -l /tmp/db2install.log

(12) 创建数据库实例(db2 instance

useradd db2inst1
passwd db2inst1
useradd db2fenc
passwd db2fenc
cd /ibmdb2/V9.7/instance
./db2icrt -s ese -u db2fenc db2inst1

(13) 启动实例(db2 instance

设置注册变量和实例参数
su - db2inst1
db2set db2codepage=1386
db2set db2comm=tcpip
db2set db2country=cn
db2set db2_parallel_io=*
db2set db2_use_alternate_page_cleaning=on
db2 update dbm cfg using svcename 50000
db2start

2 梳理迁移方案

将迁移方案梳理出具体命令。

3 禁用 nolog 方式加载数据

由于本次迁移是采用热备加追归档的方式,任何不记录日志的操作都可能有丢失数据的风险,比如nolog方式加载数据、load方式加载数据等,所以在迁移正式开始前,需要先禁用nolog操作。
db2 update db cfg using blocknonlogged yes

4 开启归档

数据库热备份需要数据库启动归档模式。
db2 update db cfg using logarchmeth1 disk:/share/bak

5 重启数据库

归档模式需要重启数据库生效。
db2 terminate
db2 deactivate db cjcdb
db2 force application all
db2stop
db2start

6 解除 backup pending

启动归档模式,重启数据库后数据库处于backup pending模式,无法进行连接和读写操作,必须进行一次数据库全备,才能解除backup pending状态。
由于之前一直使用oracle数据库,很少使用DB2,特别不理解为什么启动归档模式必须要进行一次全备,难道就是因为安全级别高吗。
备份但是无所谓,关键只能进行离线备份,因为归档模式还没生效,更致命的是全库比较大,有16.7TB。
为了使得数据库尽快可用,减少停机时间,本次备份的目的只是为了让归档模式尽快生效,减少停机时间。
所以备份采用如下几种方式,提供备份速度。
(1)将备份文件备份到/dev/null下,不实际落地文件,备份速度完全取决于读取速度,没有写的速度。
(2)启动3个并行,同时写入3个文件。
命令如下:
nohup db2 "backup db cjcdb to /dev/null,/dev/null,/dev/null" &
20210605 18:00-20210606 01:30耗时7.5小时,备份总大小16.7TB,速度647M/s

7 在线备份

成功启动归档后,数据库可以正常对外提供服务,此时可以进行在线备份,用于数据迁移。
第一次进行备份时,命令如下:
nohup db2 backup db cjcdb online to /db2data/db2back > xxx.log &
20210606 03:25-20210606 05:30 失败,自动回滚,怀疑Nas上单个文件不能超过4T。
调整命令进行第二次备份,备份出6个文件,确保单个文件不超过4T。
nohup db2 backup db cjcdb online to /db2data/db2back,/db2data/db2back,/db2data/db2back,/db2data/db2back,/db2data/db2back,/db2data/db2back > xxx.log &
NFS单个文件限制不能超过4T,需要指定6个备份目录
第二次备份时间:
20210606 08:23-20210606 15:51 全备大小16.7TB,耗时也是7.5小时。速度647M/s

8 还原

数据库还原理论上不需要停止原库,因为当前还在停机窗口范围内,为了减少原库新数据的产生,又因为原库和目标库归档目录在同一个NAS共享目录下,为了确保数据安全性,在还原前先停止原库。
(1)停库前,先记录原库核心几张表数据量,用于迁移后进行数据比对。
db2
connect to cjcdb user cjc using cjc
Select count(*) from t1
Select count(*) from t2
(2)停原库
db2 terminate
db2 deactivate db cjcdb
db2 force application all
db2stop
原库停库时会将当前日志刷新到归档日志
(3)备份归档目录下归档文件
(4)还原数据库
nohup db2 restore db cjcdb on /db2data/cjcdb dbpath on /db2data/cjcdb > bak060616.log &
还原时间:
20210606 16:30-20210607 03:30 全备大小16.7TB,耗时11小时,速度442M/s

9 前滚

归档很少,所以全滚执行很快,5分钟内完成。
第一次前滚
db2 rollforward db cjcdb to end of logs
最后一次前滚
db2 rollforward db cjcdb to end of logs and stop

五 优化

1 buffer pool 调大

由于新数据库服务器内存,CPU等资源比老库服务器资源高很多,需要调整对应的参数。
db2 alter bufferpool IBMDEFAULTBP immediate size 10485760  --4KB    40GB     原大小8.63GBdb2 
alter bufferpool EASTRUN32K immediate size 524288      --32KB   16GB     原大小5.35GBdb2 
alter bufferpool EASTBUF32K immediate size 524288      --32KB   16GB     原大小5.35GBdb2 
alter bufferpool EAST1BUF32K immediate size 100000     --32KB   3GB      原大小9.17GBdb2 
alter bufferpool EAST2BUF32K immediate size 1638400    --32KB   50GB     原大小24.22GBdb2 
alter bufferpool EAST3BUF32K immediate size 100000     --32KB   3GB      原大小0.0588GBdb2 
alter bufferpool EAST4BUF32K immediate size 100000     --32KB   3GB      原大小3.39GBdb2 
alter bufferpool EAST5BUF32K immediate size 100000     --32KB   3GB      原大小13.89GBdb2 
alter bufferpool EAST6BUF32K immediate size 100000     --32KB   3GB      原大小0.67GB

2 logbuffer 调大

db2 update db cfg using LOGBUFSZ 102400   ---4KB  400MB 原大小 1MB

3 日志文件调整

日志大小 当前总大小20G,单个80M 调整为每个2G
db2 update db cfg using LOGFILSIZ 524288db2 update db cfg using LOGPRIMARY 10db2 update db cfg using LOGSECOND 100
原大小配置如下:
Log file size (4KB)                         (LOGFILSIZ) = 20480               524288 Number of primary log files                (LOGPRIMARY) = 96   预分配         10Number of secondary log files               (LOGSECOND) = 160  不是预分配     100
调整
db2 update db cfg using LOGBUFSZ 102400
db2 update db cfg using LOGFILSIZ 524288
db2 get db cfg | grep -i log
db2 update db cfg using LOGPRIMARY 10
db2 update db cfg using LOGSECOND 100
db2 get db cfg | grep -i block
db2 update db cfg using BLOCKNONLOGGED no
db2 terminate
db2 deactivate db cjcdb
db2 force application all;db2 terminate
db2 deactivate db cjcdb
db2pd -dbptn
db2stop
db2start

4 nologload启用参数

db2 update db cfg using BLOCKNONLOGGED no

5 关闭归档

db2 update db cfg using LOGARCHMETH1 off

重启数据库生效

6 收集统计信息

查看表数据量信息
db2 "select char(tabschema,15),char(tabname,60),card from syscat.tables where type='T' order by card desc fetch first 1600 rows only with ur" > tab_count0607.log
生成收集统计信息的语句
db2 connect to cjcdb
db2 "select 'runstats on table '||trim(tabschema)||'.'||trim(tabname)||' on all columns with distribution on all columns and detailed indexes all;' from syscat.tables where type='T' with ur" >1.sql
类似如下:
connect to cjcdb;                                                                                                                                                                                                                                                   
runstats on table cjc.T_AA_CJCB on all columns with distribution on all columns and detailed indexes all;                                                                                                                                                                                                                                                  
runstats on table cjc.xxx on all columns with distribution on all columns and detailed indexes all;                                                                                                                                                                                                         
执行脚本
nohup db2 -tvf 1.sql > 1.log &

7 不记录日志

之前出现过单个大事务操作将日志文件占满,导致事务失败,自动回退,建议大事务不记录日志。
大事务语句不记录日志
---原SQL
insert into cjc.cjc_t1 ((SELECT  DISTINCT XX信息.AAAas BBB,XX表.XM as XM,XX表.SFZH as SFZH,XX表.YXJGMC as YXJGMC,XX表.SSBM as SSBM,XX表.ZW as ZW,XX表.YGZT as YGZT,XX表.CJRQ as CJRQ FROM T_CJC_001 AS XX表 INNER JOIN T_AA_CJC AS XX信息 ON XX表.SFZH = XX信息.ZJHM   )WITH UR)
---更改后的SQL(不记录日志)
update command options using C off
alter table cjc.cjc_t1 not logged initially
insert into cjc.cjc_t1 ((SELECT  DISTINCT XX信息.AAAas BBB,XX表.XM as XM,XX表.SFZH as SFZH,XX表.YXJGMC as YXJGMC,XX表.SSBM as SSBM,XX表.ZW as ZW,XX表.YGZT as YGZT,XX表.CJRQ as CJRQ FROM T_CJC_001 AS XX表 INNER JOIN T_AA_CJC AS XX信息 ON XX表.SFZH = XX信息.ZJHM   )WITH UR)
commit
update command options using C on

六 常用命令

1 连接数据库

su - db2inst1

db2 => connect to cjcdb  user cjc  using cjc

2 查看数据库

db2 => list db directory

3 查看告警日志

tail -1000f /db2inst/db2inst1/sqllib/db2dump/db2diag.log

4 查看备份和还原状态

查看备份状态

db2pd -uti

db2top -d cjcdb

5 查看磁盘速度

vmstat -w 1 10

6 查看表空间信息

db2 list tablespaces

db2pd -db cjcdb  -tablespace

7 查看线程信息

db2pd -edu

8 查看配置信息

db2 get db cfg

db2 get db cfg db cjcdb  |grep -i pend

db2 get db cfg for cjcdb  | grep -i archive

db2 get db cfg for cjcdb  | grep -i log

9 查看活动事务信息

db2 get snapshot for database on cjcdb |grep -i oldest

10 查看事务对应 SQL 信息

db2 get snapshot for application agentid 10 24

11 中断某个会话

db2 "force application(5 20 )"

12 查看授权信息

db2licm -l

13 查看帮助信息

db2 ? list |more

14 手动切换归档

db2 ARCHIVE LOG FOR DATABASE dbname

15 查看表信息

list tables

查看系统表

list tables for system

查看表结构

describe select * from dept

16 查看表索引信息

db2 => describe indexes for table T_CJC_XXX
select char(INDSCHEMA,20) SCHEMA,char(INDNAME,20) IDXNAME,char(OWNER,10) OWNER,char(TABSCHEMA,10) TABSCHEMA,char(TABNAME,20) TABNAME,INDEXTYPE,char(COLNAMES,20) COLNAMES FROM syscat.indexes where tabname='T_AA_CJC

17 查看执行计划

db2 => set current explain mode explain
DB20000I  The SQL command completed successfully.
---关闭 set current explain mode no
db2 => explain plan for select count(*) from T_CJC_XXX t1 left join T_AA_CJC t2 on t1.AAA= t2.AAAand t2.cjrq = '20210331' where t1.cjrq = '20210331'
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0219N  The required Explain table "cjc.EXPLAIN_INSTANCE" does not exist.  
SQLSTATE=42704
 
[root@SY-ODSHIS-Standby misc]# pwd
/ibmdb2/V9.7/misc/EXPLAIN.DDL
 
[db2inst1@SY-ODSHIS-Standby ~]$ db2 -tvf /ibmdb2/V9.7/misc/EXPLAIN.DDL
...
DB20000I  The SQL command completed successfully.
 
db2 => set current explain mode explain
DB20000I  The SQL command completed successfully.
db2 => explain plan for select count(*) from T_CJC_XXX t1 left join T_AA_CJC t2 on t1.AAA= t2.AAAand t2.cjrq = '20210331' where t1.cjrq = '20210331'
DB20000I  The SQL command completed successfully.
 
db2exfmt -1 -d cjcdb -o exfmt0601.out'

18 load

db2 load from '/ XX / 001 .txt' of del modified by col1 = 222 111  insert into " cjc "." t_001 " > 1.log;

19 启停数据库

db2 terminate
db2 deactivate db cjcdb
db2 force application all
db2stop
db2start

20 收集统计信息

runstats on table cjc.T_AA_CJC B on all columns with distribution on all columns and detailed indexes all;   

#####chenjuchao 2021-06-12 22:35#####



城市合伙人全球招募中:400-150-9800

参与线下宏伟蓝图,用业绩说话!
软件线索、软件需求,米鼠网帮你变现!
更灵活的合作模式(不限地域、不限金额、不限项目)
更高额的提成比例(提成是软件项目利润的80%)
利润的核算方式:
以平台公开招标的最低价中标价格为基准,剩下的为利润部分,如对平台的最低中标价格有异议,可以推荐供应商进行竞标。
义务:
1、作为城市合伙人,在该城市利用自身优势推广“米鼠网平台”,拓展甲 方所拥有的“米鼠网平台”实名认证用户和 VIP 用户
2、作为城市合伙人,在该城市利用自身优势推广“米鼠网商城”,并寻求该地域软件产品销售商,促成软件产品销售商委托甲方在“米鼠网商城”上代理销售软件产品销售商的软件产品的交易,并拓展软件产品采购用户促成与甲方的采购交易。



如有侵权请联系邮箱(service@misuland.com)

猜你喜欢

评论留言