Oracle 26ai データ移行、DBサーバ・本番切り替え
データ移行
どんなシステムであれ大規模DBのデータ移行は面倒極まりない大仕事です。しかし幸いなことにこちらのシステムのDBにはデータがちょろっと入ったテーブルが3つだけしかありません。しかも外部キー(参照整合性制約)やトリガーは何もないという非常に素敵な環境です。なので余計なことはやらずにここはサクッとData Pumpでデータを移行してしまおうと思います。
現行DBのデータ・エクスポート
管理サーバのNFSディレクトリを現新DBのデータ共有用ディレクトリにして現行DBでexport -> 新DBにimportの流れでDBのデータを移行します。
まず現行DBサーバ#1でNFSディレクトリをマウントしてPDBUSERのスキーマを丸ごとエクスポートします。
【現行DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# 管理サーバのNFSディレクトリをマウント
su - -c "mount -t nfs -o rw prsdb00:/db /mnt/dbbkup"
# NFS上にData Pump用ディレクトリを作成
mkdir -p /mnt/dbbkup/prdb/data
# Data Pump用ディレクトリが作成されたことを確認
ls -ld /mnt/dbbkup/prdb/data
drwxr-xr-x 2 oracle oinstall 6 11月 6 18:02 /mnt/dbbkup/prdb/data
[oracle@prsdb01 ~]$
# sqlplusでDBにログイン
sqlplus / as sysdba
-- セッションをPDBに移動
alter session set container = prpdb;
-- Data Pump用ディレクトリ・オブジェクトを作成
create directory DBPUMP as '/mnt/dbbkup/prdb/data';
-- PDBUSERにData Pump用ディレクトリ・オブジェクトのRead/Write権限付与
grant read,write on directory DBPUMP to PDBUSER;
-- sqlplus終了
exit
# PDBUSERのスキーマ・エクスポート
expdp pdbuser/pdbuser@prpdb1 dumpfile=pdbuser.dmp directory=DBPUMP logfile=pdbuser_exp.log
# NFSディレクトリにエクスポート・ダンプファイルが出力されていることを確認
ls /mnt/dbbkup/prdb/data
# 管理サーバのNFSディレクトリをアンマウント
su - -c "umount /mnt/dbbkup"
新DBサーバ#1でNFSディレクトリをマウントして現行DBのエクスポート・ダンプファイルを新DBにインポートします。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# 管理サーバのNFSディレクトリをマウント
su - -c "mount -t nfs -o rw prsdb00:/db /mnt/dbbkup"
# NFSディレクトリに現行DBのエクスポート・ダンプが配置されていることを確認
ls /mnt/dbbkup/prdb/data
# sqlplusでDBにログイン
sqlplus / as sysdba
-- セッションをPDBに移動
alter session set container = prpdb;
-- Data Pump用ディレクトリ・オブジェクトを作成
create directory DBPUMP as '/mnt/dbbkup/prdb/data';
-- PDBUSERにData Pump用ディレクトリ・オブジェクトのRead/Write権限付与
grant read,write on directory DBPUMP to PDBUSER;
-- sqlplus終了
exit
# 現行DBでエクスポートしたダンプ・ファイルを新DBにインポート(1行で記述)
impdp pdbuser/pdbuser@prpdb1 dumpfile=DBPUMP:pdbuser.dmp full=yes logfile=DBPUMP:pdbuser_imp.log
# sqlplusでDBにログイン(PDBUSERでログイン)
sqlplus pdbuser/pdbuser@prpdb
-- PDBUSERのセグメント情報(表領域、タイプ、セグメント名)を確認
col SEGMENT_NAME format a30
col TABLESPACE_NAME format a20
col SEGMENT_TYPE format a10
select TABLESPACE_NAME,SEGMENT_TYPE,SEGMENT_NAME from USER_SEGMENTS;
TABLESPACE_NAME SEGMENT_TY SEGMENT_NAME
-------------------- ---------- ------------------------------
USERIDX01 INDEX IDX_TEST_TBL1
USERIDX01 INDEX IDX_TEST_TBL2
USERIDX01 INDEX IDX_TEST_TBL3
USERTBL01 TABLE TEST_TBL1
USERTBL01 TABLE TEST_TBL2
USERTBL01 TABLE TEST_TBL3
6行が選択されました。
SQL>
-- 各テーブルのレコード件数を確認(すべて10000件であればOK)
select count(*) from TEST_TBL1;
select count(*) from TEST_TBL2;
select count(*) from TEST_TBL3;
-- sqlplus終了
exit
# 管理サーバのNFSディレクトリをアンマウント
su - -c "umount /mnt/dbbkup"
以上でデータ移行は完了です。
新DBサーバ・本番切り替え
現新DBサーバでDBネットワーク用ポートグループと管理ネットワークのIPアドレスを入れ替えてDBサーバの本番切り替えを実行します。
現行DBサーバのIPアドレス差し替え
まずは管理ネットワークのIPアドレス入れ替えです。
APサーバのWebLogicが起動している場合は停止します。
【APサーバ・prsap01、prsap02 / oracleユーザで実行】
-----------------------------------------------------------------------------
# Managed Server停止
/opt/app/oracle/bin/stopManagedWebLogic_prs.sh
# Admin Server停止
/opt/app/oracle/bin/stopWebLogic_prs.sh
現行DBサーバ、新DBサーバのCRSを停止します。
【現行DBサーバ、新DBサーバ・prsdb01、prsdb02、prsdb03 / rootユーザで実行】
-----------------------------------------------------------------------------
# CRS停止(prsdb03 -> prsdb02 -> prsdb01の順にCRSを停止)
/opt/app/21.0.0/grid/bin/crsctl stop crs
新DBサーバを停止して現行DBサーバだけが起動している状態にします。
【新DBサーバ・prsdb01、prsdb02、prsdb03 / rootユーザで実行】
-----------------------------------------------------------------------------
# 新DBサーバ停止
shutdown -h 0
現行DBサーバに接続しているteraterm画面はすべてログアウトします。
【現行DBサーバ・prsdb01、prsdb02、prsdb03 / teraterm画面で実行】
-----------------------------------------------------------------------------
# teraterm接続終了(ログアウト)
exit
APサーバ#1を踏み台にDBネットワーク経由で現行DBサーバ#1にssh接続して管理ネットワークのIPアドレスを変更します。
【APサーバ#1・prsap01 / rootユーザで実行】
-----------------------------------------------------------------------------
# 現行DBサーバ#1にSSH接続
ssh prsdb01
# 管理ネットワーク用インターフェース(ens192)の現状設定を確認
ip addr show dev ens192
-> inet 172.16.10.21/24が設定されていることを確認
# 管理ネットワークのIPアドレスを変更
nmcli connection modify ens192 ipv4.addresses 172.16.10.31/24
# インターフェース(ens192)をアクティベート
nmcli connection up ens192
# 管理ネットワーク用インターフェース(ens192)の最新設定を確認
ip addr show dev ens192
-> inet 172.16.10.31/24が設定されていることを確認
# 現行DBサーバからログアウト
exit
同じ手順で現行DBサーバ#2、現行DBサーバ#3の管理ネットワークのIPアドレスを変更します。
| DBサーバ | (管理N/W)ホスト名 | 旧IPアドレス | 新IPアドレス |
| 現行DBサーバ#2 | prsdb02 | 172.16.10.22/24 | 172.16.10.32/24 |
| 現行DBサーバ#3 | prsdb03 | 172.16.10.23/24 | 172.16.10.33/24 |
すべての現行DBサーバのIPアドレスを修正したらteratermでそのアドレスに接続できることを確認します。接続時にPC側のknown_hostsのエントリとサーバ側のホスト鍵が一致しないメッセージが表示されるので「既存の鍵を、新しい鍵で上書きする(R)」にチェックを入れて「続行(C)」をクリックします。
接続に問題がなければ現行DBサーバを停止します。
【現行DBサーバ・prsdb01、prsdb02、prsdb03 / rootユーザで実行】
-----------------------------------------------------------------------------
# 現行DBサーバ停止
shutdown -h 0
現新DBサーバのポートグループ入れ替え
ESXiコンソールで現新DBサーバ(仮想マシン)のネットワーク アダプタ 2に割り当てられているポートグループを以下のように差し替えます。
【DBサーバ・ポートグループ設定(N/Wアダプタ 2)】
| DBサーバ | 仮想マシン | ネットワーク アダプタ | 現在のポートグループ | 設定変更後のポートグループ |
| 現行DBサーバ#1 現行DBサーバ#2 現行DBサーバ#3 | prsdb01 prsdb02 prsdb03 | ネットワーク アダプタ 2 | Production DB Network | Vup Pub Network1 |
| 新DBサーバ#1 新DBサーバ#2 新DBサーバ#3 | prsdb11 prsdb12 prsdb13 | ネットワーク アダプタ 2 | Vup Pub Network1 | Production DB Network |
設定変更が完了したら新DBサーバ(#1、#2、#3)のみ起動します。
新DBサーバのIPアドレス差し替え
APサーバ#1を踏み台にDBネットワーク経由で新DBサーバ#1にssh接続して管理ネットワークのIPアドレスを変更します。
作業の流れは基本的に現行DBサーバのIPアドレス差し替えと同じですが、APサーバ#1のrootユーザのkown_hostsには現行DBサーバ#1のホスト情報が残っているため最初にこの情報を削除してから新DBサーバ#1のIPアドレスを変更します。
【APサーバ#1・prsap01 / rootユーザで実行】
-----------------------------------------------------------------------------
# known_hostsから現行DBサーバのホスト情報を削除
ssh-keygen -R prsdb01
# 新DBサーバ#1にSSH接続
ssh prsdb01
# 管理ネットワーク用インターフェース(ens192)の現状設定を確認
ip addr show dev ens192
-> inet 172.16.10.31/24が設定されていることを確認
# 管理ネットワークのIPアドレスを変更
nmcli connection modify ens192 ipv4.addresses 172.16.10.21/24
# インターフェース(ens192)をアクティベート
nmcli connection up ens192
# 管理ネットワーク用インターフェース(ens192)の最新設定を確認
ip addr show dev ens192
-> inet 172.16.10.21/24が設定されていることを確認
# 現行DBサーバからログアウト
exit
同じ手順で新DBサーバ#2、新DBサーバ#3の管理ネットワークのIPアドレスを変更します。
| DBサーバ | (管理N/W)ホスト名 | 旧IPアドレス | 新IPアドレス |
| 新DBサーバ#2 | prsdb02 | 172.16.10.32/24 | 172.16.10.22/24 |
| 新DBサーバ#3 | prsdb03 | 172.16.10.33/24 | 172.16.10.23/24 |
すべての新DBサーバのIPアドレスを修正したらteratermでそのアドレスに接続できることを確認します。
APサーバ(WebLogic)から新DBへの接続確認
APサーバのWebLogicを起動して新DBにセッションが生成されることを確認します。
最初にすべての新DBサーバでCRSを起動します。
【新DBサーバ・prsdb01、prsdb02、prsdb03 / rootユーザで実行】
-----------------------------------------------------------------------------
# CRS起動(prsdb01 -> prsdb02 -> prsdb03の順にCRSを停止)
/opt/app/26.0.0/grid/bin/crsctl start crs -wait
新DBサーバ#1のoracleユーザでDB、PDB、接続サービスがすべて起動状態となっていることを確認します。
【新DBサーバ・prsdb01で実行】
-----------------------------------------------------------------------------
# oracleユーザにスイッチ
su - oracle
# DBの状態を確認
srvctl status database -db prdb
インスタンスprdb1はノードprsdb01で実行中です。
インスタンスprdb2はノードprsdb02で実行中です。
インスタンスprdb3はノードprsdb03で実行中です。
[oracle@prsdb01 ~]$
# PDBの状態を確認
srvctl status pdb -db prdb
プラガブル・データベースPRPDBは有効です。
データベースprdbのプラガブル・データベースPRPDBは、ノード: prsdb01,prsdb02,prsdb03で実行中です
[oracle@prsdb01 ~]$
# サービスの状態を確認
srvctl status service -db prdb
サービスbatch_srvはインスタンスprdb3で実行中です
サービスonline_srvはインスタンスprdb1,prdb2で実行中です
[oracle@prsdb01 ~]$
APサーバ#1、APサーバ#2でWebLogicを起動します。
【APサーバ・prsap01、prsap02で実行】
-----------------------------------------------------------------------------
# oracleユーザにスイッチ
su - oracle
# Admin Server起動
/opt/app/oracle/bin/startWebLogic_prs.sh
# Managed Server起動
/opt/app/oracle/bin/startManagedWebLogic_prs.sh
新DBサーバ#1のoracleユーザでDBにログインしてAPサーバからの接続が生成されていることを確認します。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# sqlplus起動(DBログイン)
sqlplus / as sysdba
-- セッションをPDBに移動
alter session set container = prpdb;
-- APサーバからのセッションを確認
col USERNAME format a10
col MACHINE format a20
select INST_ID,MACHINE,USERNAME,count(*)
from GV$SESSION
where MACHINE like 'prsap0%'
group by INST_ID,MACHINE,USERNAME
INST_ID MACHINE USERNAME COUNT(*)
---------- -------------------- ---------- ----------
1 prsap01.exsample.lan PDBUSER 200
1 prsap02.exsample.lan PDBUSER 95
2 prsap01.exsample.lan PDBUSER 200
2 prsap02.exsample.lan PDBUSER 105
SQL>
-- sqlplus終了
exit
※新DBのユーザ・セッション数はノード当たり80本が見積上限ですがAPサーバのDS設定が古いままなので上の結果はキャパオーバー状態です。APサーバのDS設定はあとで修正します。
NFSマウント・ディレクトリ変更新
新DBサーバのDBバックアップ用のNFSマウント・シェルはDB構築時用の一時的なNFSディレクトリ(/nfsdisk/exports/db26)をマウントするように設定されています。
新DBサーバ#1のrootユーザで正規のNFSディレクトリをマウントするようにシェルを修正して新DBサーバ#2、新DBサーバ#3に配布します。
【新DBサーバ・prsdb01 / rootユーザで実行】
-----------------------------------------------------------------------------
# 既存のシェルをバックアップ
cp /usr/local/bin/dbbkmount /usr/local/bin/dbbkmount.bk
# マウントするNFSディレクトリをdb26からdbに修正
sed -i 's/db26/db/g' /usr/local/bin/dbbkmount
# 変更箇所を確認
diff /usr/local/bin/dbbkmount /usr/local/bin/dbbkmount.bk
18c18
< $(mount -t nfs -o rw ${NFS_SVR}:/db ${MNT_DIR} &)
---
> $(mount -t nfs -o rw ${NFS_SVR}:/db26 ${MNT_DIR} &)
[root@prsdb01 ~]#
# NFSマウントを実行
dbbkmount
ls /mnt/dbbkup/
prdb
[root@prsdb01 ~]#
# シェルのバックアップを削除
rm /usr/local/bin/dbbkmount.bk
# シェルを新DBサーバ#2、新DBサーバ#3に配布
scp /usr/local/bin/dbbkmount prsdb02:/usr/local/bin/
scp /usr/local/bin/dbbkmount prsdb03:/usr/local/bin/
以上で新DBサーバの本番切り替えは終了です。本番稼働を終えた現行DBサーバはライセンス(開発者サブスクリプション)の上限があるのでタイミングを見て削除します。
で、続けてAPサーバのWebLogicもバージョンアップ、と思ったんですがDBサーバのバージョンアップだけでも結構手間が掛かってしまいなかなか先に進みません。
しかもここまでいろんなサーバを作っては見たものの、やってみたらあまりよろしくなかった点を後からちょこちょこ直したりして環境がゴチャゴチャしてきておりまして、どこかでちゃんと整理した環境をまとめ直そうと思っている次第です。なのでAPサーバ(WebLogic)のバージョンアップはそこでやるとして一旦置いておいて、当初の予定通り、次はOEMを構築しようと思います。
DBサーバ構築(Oracle 26ai)・関連ページ
DBサーバ構築、Oracle 26ai(1)概要
DBサーバ構築、Oracle 26ai(2)OS、N/W、ストレージ
DBサーバ構築、Oracle 26ai(3)Gridインストール1
DBサーバ構築、Oracle 26ai(4)Gridインストール2
DBサーバ構築、Oracle 26ai(5)DBインストール
DBサーバ構築、Oracle 26ai(6)2ノードRAC構築 1 (DB設計)
DBサーバ構築、Oracle 26ai(6)2ノードRAC構築 2 (DB構築)
DBサーバ構築、Oracle 26ai(6)2ノードRAC構築 3 (アーカイブログ、HugePages他)
DBサーバ構築、Oracle 26ai(7)RACノード追加 1(Gridノード追加、Oracleホーム拡張)
DBサーバ構築、Oracle 26ai(7)RACノード追加 2(DBインスタンス追加・DBCA版)
DBサーバ構築、Oracle 26ai(7)RACノード追加 3(DBインスタンス追加・スクリプト版)
DBサーバ構築、Oracle 26ai(8)データ移行、本番切り替え
コメント