オフラインバックアップのレストア

別環境のDB2のオフラインバックアップを自環境にレストアするところではまったのでメモ。
ちなみに環境は、AIX(6.1)上のDB2(V9.5)です。

レストアする前に必要なこと

バックアップ情報の中に環境情報などが混じっているため、
レストア前にバックアップを取った環境と同じにするようにしなければなりません。
なお、バックアップを取得した際にDB2

 DATABASE.0.db2inst2.NODE0000.CATN0000.20140905155518

のようなファイルを作りますが、ここからも少し情報を読み取ることができまして、

 データベース名.0.db2インスタンスユーザー名.NODE0000.CATN0000.20140905155518

といった感じで読み取ることができます。

実際の環境によって必要な情報(インスタンスの追加作成の有無など)は違うと思いますが、
私が構築した際に必要とした情報は以下の通りです。

  1. db2インスタンスユーザー:BACKUPコマンドを実行したユーザー(この場合:db2inst2)
  2. データベース名:バックアップファイルから読み取れます(この場合:DATABASE)
  3. db2インスタンスインスタンスが追加で必要な場合はあらかじめ情報を提供してもらう
  4. 展開先のフォルダ:データベースを展開していたフォルダはレストアしながら補完してもいいですができれば情報を提供してもらう

これに基づいて以下のオペレーションを行いました。

インスタンスの作成(要root)

db2icrtコマンドでインスタンスを作成(参考:DB2でインスタンスを追加で作成するには
分離ユーザーはDB2をインストールする際に指定したユーザー(デフォルト:db2fenc1)で大丈夫っぽいです。

# cd /opt/IBM/db2/V9.5/instance
# ./db2icrt -u db2fenc1 db2inst2

/etc/service に ポートの登録(要root)

インスタンスに紐づくポートを登録しておきます(要再起動)
「db2c_db2inst2」は任意の文字列でOKです。

db2c_db2inst2	50001/tcp

RESTOREコマンドの実行(db2インスタンスユーザー)

実行時にフォルダが存在しないエラーなどが出る場合は適宜フォルダを作って補完します。

db2 RESTORE DB DBCD02 FROM /udb/backup_DATABASE

ロールフォワードの実行(db2インスタンスユーザー)

$ db2 rollforward db DATABASE complete 

ちなみにこれを行わない場合、以下のエラーがでることがあります。

SQL1117N  「ロールフォワード・ペンディング」のために、データベース "DATABASE"
の接続または活動化を行うことはできません。  SQLSTATE=57019
{{<
** svcenameの登録(db2再起動必要)
これをしないと外部ツールから接続することができません。
「db2c_db2inst2」は/etc/serviceで登録した際に利用した文字列を利用します。
>|sh|
$ db2 update dbm cfg using svcename db2c_db2inst2

DB2インスタンスプロトコルの設定(db2再起動必要)

$ db2set DB2COMM=TCPIP

これをしないと外部ツールから接続する際に以下のエラーがでることがあります。

[IBM][CLI Driver] SQL30081N 通信エラーが検出されました。使用された通信プロトコル : "TCP/IP" 使用中の通信 API: "SOCKETS" エラーが検出された場所: "" エラーを検出した通信機能: "connect" プロトコル固有のエラー・コード: "10061""*""*" SQLSTATE=08001 

最後に

個人的にはリソースの観点から全く同じものを複製するのは難しいような気もしていて、
データベースをコピーするdb2moveの方が汎用的で使いやすいと思ったりもするのですが、
これはこれで、データベースを作ったり、シーケンス作ったり、権限付与したりと
それはそれでまた面倒な構築作業も増えたりもするので迷うところです。