某行XX系統DB2資料庫遷移實施方案

chenoracle發表於2021-06-12

一 環境說明

原庫:

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#####

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2776631/,如需轉載,請註明出處,否則將追究法律責任。

相關文章