一 环境说明
原库:
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 nolog, load启用参数
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#####