BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Ora2Pg,Oracle,Postgres】【全2回】Ora2pgを用いたデータベース移行に挑戦!_後半

はじめに

こんにちは! 株式会社BFT名古屋支店・新卒の「なる」と「もな」です!

今回はOra2pgを用いたデータベースの移行に挑戦しました!

行った手順を以下の3ステップで、全2回の記事に分けてご紹介したいと思います。
① Ora2pgサーバ構築
Oracleデータベースからのデータエクスポート
PostgreSQLデータベースへのデータインポート

こちらの記事(後半)では②、③について書いていきます。

今回の検証の背景やOra2pgの詳しい話は、前半のブログに書いてあるので知りたい方はそちらを読んでみてください~!
bftnagoya.hateblo.jp


では、移行作業の内容について大まかに説明していこうと思います。

作業の流れと構成図
今回は"既存のオンプレ環境のOracleDB"から"クラウド(Azure)環境のPostgresDB(PaaS)"への移行を想定して以下のような構成で検証を行いました。詳しい説明は前半のブログをご覧ください!

今回の移行のゴールは「OracleにあるサンプルスキーマHRのテーブルとデータをPostgreSQLに移行すること」です。

※サンプルスキーマHRは、Oracleインストール時にインストールするか、Oracleインストール後に自分でインストールしてください。

1.OracleからデータやDDL等をエクスポートし、データ移行SQLを作成する

2.データ移行SQLをPostgresで読み込んで移行したいデータをPostgresにインサートする

今回のブログでは、以上の手順を詳しく説明していきたいと思います!

使用環境
Ora2pgサーバ
  • Azure VM
  • イメージ:Red Hat Enterprise Linux 7.4 -Gen1
  • VMサイズ:Standard DS1 v2
  • Ora2pgバージョン:23.1
  • sqlplusバージョン:oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64
  • psqlバージョン:postgresql14.x86_64
Oracleサーバ
  • Azure VM
  • イメージ:Windows sever 2016 Datacenter Gen2
  • VMサイズ:Standard D2s v3
  • Oracleバージョン:12.2.0.1.0
PostgreSQLサーバ
  • Azure Database for PostgreSQLフレキシブルサーバー
  • PostgreSQLバージョン:14
  • コンピューティングサイズ:Standard_B1ms(1vCore、2GiB、640最大iops)
  • ストレージ:32
  • 接続方法:パブリックアクセス(許可されているIPアドレス)を選択

前提条件
  • Oracleサーバの構築が完了していること
  • Ora2pgサーバの構築が完了していること(※第1章参照)
  • OracleとOra2pgのサーバが同じVNet内にいること
  • Azure Database for PostgreSQLフレキシブルサーバーの構築が完了していること

事前準備
  • Ora2pgサーバにpsqlをインストールする
  • Ora2pgサーバからAzure Database for PostgreSQLに接続するために、Ora2pgサーバにpsqlをインストールする必要があります。

    psqlのバージョンはPostgresと合わせてインストールしてください ※sqlplusについては、第1章のOra2pgサーバ構築の際にインストール済

OracleからOra2pgにデータエクスポートしてみよう!

移行前確認

はじめに今回移行したいHRスキーマのテーブルとデータがOracleにあることを確認します。

①Ora2pgサーバにrootユーザでログインする

②Ora2pgサーバからOracleサーバのsystemユーザーにログイン
Oracleのリスナーが起動していること
Oracleのサービス名を取得しておくこと

# sqlplus64 system/[パスワード]@[OracleサーバのプライベートアIPアドレス]:1521/[Oracleサービス名]

③ユーザー一覧を取得

SQL> select username from dba_users;

HRスキーマがあることを確認する

④ユーザーのロック状況を確認

SQL> select username,account_status from dba_users;

※ここでHRスキーマが「EXPIRED & LOCKED」となっていたら、ロックを解除し、新しいパスワードを設定する

※SQL> alter user HR account unlock identified by [元のパスワード];

→新しいパスワードを設定する

⑤HRユーザーにログイン

SQL> connect hr/[パスワード]@[OracleサーバのプライベートアIPアドレス]:1521/[Oracleサービス名]

⑥HRスキーマにあるテーブルを表示(これらをPostgresに移行する)

SQL>select table_name from user_tables;

以下のようにHRスキーマにあるテーブルが出力される

⑦HRスキーマにあるテーブルのデータを表示(これらをPostgresに移行する)
※出力例として、テーブル「COUNTRIES」のデータを表示させます。

SQL>select * from COUNTRIES;

以下のように出力されること

SQL>exit

エクスポートするHRスキーマのテーブルとデータがあることを確認できました~!

次にエクスポートする前のOra2pgサーバの状態を確認します!

エクスポート前確認

エクスポートを実行すると移行用SQLファイルが作成されます。
その前にSQLファイルがないことを確認しておきます。

# ls -l /root/migration/test_project

→test_project配下の「export_schema.sh 」を実行すると、「schema」「sources」ディレクトリ配下に、テーブル等の移行用SQLファイルが作成されます。

ここでは、エクスポート前確認として、①「schema」配下のディレクトリに何も入っていないこと、②「data」ディレクトリ配下に何も入っていないことを確認します。


①「schema」配下のディレクトリを確認
※出力例として、「tables」の中身を表示させます。

# ls -l /root/migration/test_project/schema
# ls -l /root/migration/test_project/schema/tables

→何も入っていないことが確認できます!

②「data」ディレクトリ配下を確認

# ls -l /root/migration/test_project/data

→こちらも何も入っていないことが確認できます!

では実際にエクスポートをしていきましょう!

エクスポート実行

①export_schema.sh を実行して、OracleオブジェクトをPostgresオブジェクトとしてエクスポートする
※移行テンプレートはOra2pgサーバ構築時に作成済

# cd /root/migration/test_project
# pwd

→/root/migration/test_projectにいること

# ./export_schema.sh

最後に「To extract data use the following command:ora2pg -t COPY -o data.sql -b ./data -c ./config/ora2pg.conf」と出力されたら成功です!

→ここでは/root/migration/test_project/schema配下の、「procedures」「sequences」「tables」「triggers」「views」ディレクトリの中にSQLファイルが作成されます。

②データを抽出する

# ora2pg -t COPY -o data.sql -b ./data -c ./config/ora2pg.conf

※完了するまで何回かコマンドをうつ (今回のサーバはスペックが低いので、7回抽出コマンドを打ちました

→ここでは/root/migration/test_project/data配下に、SQLファイルが作成されます。

エクスポート実行後、移行用SQLファイルが作成されたことを確認してみます!

エクスポート後確認

エクスポート実行後、移行用SQLファイルが作成されたことを確認します!

①「schema」配下のディレクトリを確認
※出力例として、「tables」の中身を表示させます。

# ls -l /root/migration/test_project/schema
# ls -l /root/migration/test_project/schema/tables

→test_project配下の「procedures」「sequences」「tables」「triggers」「views」 ディレクトリの大きさが増えていますね!
さらに、「tables」ディレクトリ配下を見てみると、SQLファイルが作成されています!

②「data」ディレクトリ配下を確認

# ls -l /root/migration/test_project/data

「data」ディレクトリ配下を見てみると、SQLファイルが作成されています!

OracleからOra2pgサーバにデータエクスポートすることができました~!

あとはPostgresにインポートするだけです!

Ora2pgからPostgreSQLにデータインポートしてみよう!

インポートする前のPostgresの状態を確認します。

インポート前確認

①Ora2pgサーバからAzure Database for PostgreSQLに接続をする
※Ora2pgサーバーからAzure Database for PostgreSQLへの通信が許可されていること

# psql "host=[サーバ名] port=5432 dbname=[データベース名] user=[ユーザー名] sslmode=require"

→パスワードを入力しログインします

②テーブル一覧を取得

postgres=> \dt

→まだインポートしていないので、HRスキーマのテーブル・データがないことを確認する

postgres=> \q

では実際にインポートをしていきましょう!

インポート実行

①生成されたデータ移行SQLファイルを読み込む

# psql -f /root/migration/test_project/schema/sequences/sequence.sql -h [サーバー名] -p 5432 -U [ユーザー名] -d [データベース名]
# psql -f /root/migration/test_project/schema/tables/table.sql -h [サーバー名] -p 5432 -U [ユーザー名] -d [データベース名]

→ここでPostgreSQLにテーブルが作成されます!

②Ora2pgからPostgreSQLにデータインポートする

# psql -f /root/migration/test_project/data/data.sql -h [サーバー名] -p 5432 -U [ユーザー名] -d [データベース名]

→ここでPostgreSQLにデータが作成されます!


インポート後確認

インポートしたテーブルとデータが作成されたことを確認します!

PostgreSQLにログインする

# psql "host=[サーバ名] port=5432 dbname=[データベース名] user=[ユーザー名] sslmode=require"

②インポート実行で作成されたテーブルがあることを確認する

postgres=> \dt

Oracleで確認した7つのテーブルが作成されています!

③インポート実行で作成されたデータがあることを確認する
※出力例として、テーブル「COUNTRIES」のデータを表示させます。

postgres=> select * from countries;

上記の通り、テーブル「COUNTRIES」のデータを確認すると、こちらもOracleで確認したデータが作成されています!

GUI操作できる「pgAdmin」でもみてみると、HRスキーマにあったテーブル・データが移行されていることが確認できました~!!

これでやっとサンプルスキーマHRのテーブルとデータが移行できました~!お疲れ様でした!

まとめ

今回はPostgreSQLスキーマ指定せずに、テーブルとデータを移行したので、publicスキーマに移行されていました! (PostgreSQLではスキーマを指定せずにテーブルを作成するとpublicスキーマに配置されるそうです)

以下参考資料
PostgreSQLの“仕様”による、運用者にとって悩み深い脆弱性とは
https://atmarkit.itmedia.co.jp/ait/articles/1805/16/news010.html

Ora2pgの公式サイトによるとconfファイルの設定で移行先のスキーマを指定できるそうですが、今回の検証ではうまくいきませんでした…泣。原因が分かったらまた記事にするかもです...



以上でOra2pgサーバをインストールして、このOra2pgサーバをつかってOracleからPostgresへの移行が完了しました!

最後まで読んでいただきありがとうございます!!

まだまだひよっこエンジニアなのでこれからも頑張っていきます!!



参考資料
Oracle を Azure Database for PostgreSQL に移行する docs.microsoft.com ・ora2pgドキュメンテーション ora2pg.darold.net