OracleからPostgreSQLへのデータの移行

最近まで、当社のプロジェクトにおけるDBMSの「ランドスケープ」は次のように見えました。それらのほとんどはOracleであり、MS SQLとMySQLはほとんどありませんでした。



しかし、ご存じのとおり、永遠に続くものはありません。最近、私たちのプロジェクトの1つでPostgresの適用可能性についてのリクエストを受け取りました。 ここ数年、私たちはこのDBMSを綿密に精査してきました-会議やミートアップに参加しますが、最近まで「戦闘」状態で試すことはできませんでした。



だから挑戦



想定:Oracleサーバー(シングルインスタンス)11.2.0.3および合計容量が約50GBの無関係なスキームのセット。 必須:OracleからPostgresにデータ、インデックス、プライマリおよび参照キーを転送します。



移行ツールの選択



移行ツールのレビューにより、Enterprise DB Migration ToolkitやOracle Golden Gateなどの商用ツールとフリーソフトウェアの両方の可用性が示されました。 翻訳は一度計画されたため、成熟したツールが必要でしたが、明確でシンプルでした。 さらに、当然、価値の問題も考慮されました。 フリーソフトウェアの中で、今日最も成熟しているのは、Gilles Darold(Darold Gill)によるOra2Pgプロジェクトであり、機能性の商用オプションを大きく上回りました。 彼の方向にスケールを傾ける利点:





Ora2Pgコマンドラインユーティリティの動作原理は非常に簡単です。Oracleデータベースに接続し、構成ファイルで指定された回路をスキャンし、DDL命令の形式で回路オブジェクトをSQLファイルにアンロードします。 データ自体は、INSERTとしてsqlファイルにアップロードするか、作成されたPostgres DBMSテーブルに直接挿入できます。



環境のインストールとセットアップ



会社では、DevOpsアプローチを使用して、仮想マシンの作成、必要なソフトウェアのインストール、ソフトウェアの構成と展開を行っています。 私たちの作業ツールはAnsibleです。 ただし、認識を促進し、記事に関係のない新しいエンティティを導入しないために、コマンドラインから手動によるアクションを示します。 興味のある方のために、 ここにすべてのステップのAnsibleプレイブックを掲載しています。



そのため、OS Centos 6.6を搭載した仮想マシンでは、次の手順を実行します。



  1. Postgresリポジトリをインストールします。
  2. Postgres 9.4サーバーをインストールします。
  3. データベースを作成し、アクセスを構成します。
  4. Postgresをサービスとしてインストールして実行します。
  5. インスタントOracleクライアントをインストールします。
  6. Ora2Pgユーティリティをインストールします。


それ以降のすべてのアクションは、 root



アカウントから実行されます。 リポジトリをインストールします。

#yum install yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm







Postgres 9.4をインストールします。

#yum install postgresql94-server







Postgresクラスターを作成します。

#service postgresql-9.4 initdb









アクセス設定は、テストの利便性のためにPostgres接続のセキュリティを特別に低くするという事実に限定されます。 もちろん、実稼働環境では、これを行うことはお勧めしません。



ファイル/var/lib/pgsql/9.4/data/postgresql.confでlisten_addresses = '*'



行のコメントを解除する必要があります。 ローカルおよびリモート接続用のファイル/var/lib/pgsql/9.4/data/pg_hba.confで、 trust



方法を設定する必要があります。 編集後のセクションは次のようになります。

 # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all all trust
      
      





Postgresをサービスとして登録して実行します。

 #chkconfig postgresql-9.4 on #service postgresql-9.4 restart
      
      





Oracleインスタント・クライアントをインストールするには、OTNから次のパッケージをダウンロードする必要があります。

 oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm
      
      





それらをインストールします。

 #yum install /tmp/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm #yum install /tmp/oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm #yum install /tmp/oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm #yum install /tmp/oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm
      
      





tnsnames.ora



フォルダーを作成します。

 #mkdir -p /usr/lib/oracle/11.2/client64/network/admin #chmod 755 /usr/lib/oracle/11.2/client64/network/admin
      
      





次の環境変数を設定します(ユーザーの.bash_profile内):

 export ORACLE_HOME=/usr/lib/oracle/11.2/client64 export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib export TNS_ADMIN=$ORACLE_HOME/network/admin
      
      





そして、パフォーマンスを確認します。

 sqlplus system/<you_password_here>@host.domain.ru/SERVICE
      
      





すべて問題なければ、次のような結果が得られます。

  Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL>
      
      





セットアップの最後のステップ-Ora2pgのインストールは残りました。 Ora2Pg 最新バージョンをサイトからダウンロードします (執筆時点では、バージョン15.2がありました)。 必要なパッケージをインストールします。

 #yum install gcc cpan postgresql94-plperl postgresql94-devel
      
      





CPanモジュールをインストールします。

 #cpan
      
      





Perl用の追加モジュールをインストールします。

 #cpan Test::Simple DBI Time::HiRes DBD::Oracle DBD::Pg
      
      





Ora2pgを/ installに解凍します。

 #cd /install #tar -xvf ora2pg-15.2.tar.gz
      
      





Ora2pgのビルド:

 #perl Makefile.PL #make #make install
      
      





移行



Postgres DBMSは、その「精神」によってOracleに最も近いものです。 両方で、データ型はよく相関しており、そこには、スキーマなどがあります。 これを利用して、「ところで」データを転送します。 移行プロセスは、次の手順で構成されます。



  1. Ora2pgを使用した移行プロジェクトの作成。
  2. ora2pg.conf構成ファイルの編集。
  3. OracleからDDLテーブル、インデックス、制約をアンロードします。
  4. Postgresでデータベースを作成します。
  5. 手順3で準備したDDLテーブルをインポートします。
  6. データをコピーします。
  7. DDLインデックスと制約をインポートします。


以降のすべてのアクションは、postgresユーザーによって実行されます。

 #su -l postgres
      
      





移行プロジェクトを作成します。 このプロジェクトは、対応するオブジェクトのDDLを含むsqlファイル、ora2pg.conf構成ファイル、および起動スクリプトexport_schema.shが含まれるテーブル/関数/ビュー/パッケージフォルダーのセットで構成されます。

 $ora2pg --init_project my_project_name $cd my_project_home $vi config/ora2pg.conf
      
      





構成



Ora2pg構成ファイルは非常に多く、ルートであるか、データの移行中に必要であったパラメーターのみに焦点を当てます。 残りについては、 この記事から学ぶことをお勧めします



Oracleデータベースに接続するためのパラメーターを説明するセクション:

 ORACLE_HOME /usr/lib/oracle/11.2/client64 ORACLE_DSN dbi:Oracle:host=oracle_host.domain.ru;sid=<SID> ORACLE_USER SYSTEM ORACLE_PWD MANAGER
      
      





アップロードするスキームを説明するセクション:

 EXPORT_SCHEMA 1 SCHEMA TST_OWNER
      
      





そして、どの回路をロードするかの指示:

 PG_SCHEMA tst_owner
      
      





エクスポートのタイプを指定します。 COPY



パラメーターは、テキストファイルをバイパスして、データをOracleからPostgresに直接コピーすることを示します。

 TYPE TABLE,COPY
      
      





Postgresデータベースに接続するためのパラメーターを説明するセクション:

 PG_DSN dbi:Pg:dbname=qqq;host=localhost;port=5432 PG_USER tst_owner PG_PWD tst_onwer
      
      





データ型を変換するためのセクション。 number()



タイプが精度を指定せずにbigint



に変換されないようにするには、次を指定します。

 DEFAULT_NUMERIC numeric
      
      





これで構成手順が完了し、移行を続行する準備が整いました。 DDLオブジェクトを含むSQLファイルのセットとしてスキーマ記述をアンロードします。

 $./export_schema.sh
      
      





qqqデータベース、ユーザーtest_ownerを作成し、必要な権限を発行しましょう。

 $psql postgres=#create database qqq; CREATE DATABASE postgres=#create user test_owner password 'test_owner'; CREATE ROLE postgres=#grant all on database qqq to test_owner; GRANT postgres=#\q
      
      





DDLテーブルからsqlファイルをインポートしましょう:

 $psql -d qqq -U test_owner < schema/tables/table.sql
      
      





これで、データをコピーする準備ができました。 以下を開始します。

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





コマンドラインで-



パラメータをアップロードの保存先ファイルの名前で指定するという事実にもかかわらず、データはOracleからPostgresに直接挿入されます。 この場合、挿入速度は1秒あたり約6,000行でしたが、これはもちろん、コピーされるデータの種類と周囲のインフラストラクチャに依存します。



残った最後のステップは、インデックスと制約を作成することです。

 $psql -d qqq -U test_owner < schema/tables/INDEXES_table.sql $psql -d qqq -U test_owner < schema/tables/CONSTRAINTS_table.sql
      
      





前のコマンドの実行中にエラーが発生しなかった場合-おめでとうございます、移行は成功しました! しかし、マーフィーの法則から知られているように:「うまくいかないものは何でもおかしくなります。」



私たちの落とし穴



最初の落とし穴はすでに上で言及されています: number()



タイプは精度を指定せずにbigint



変換されますが、これは正しい構成で簡単に修正できます。



次の課題は、PostgresにOracle anydataに類似したタイプがないことです。 この点で、アプリケーションロジックを分析して修正することを余儀なくされたため、柔軟性が損なわれ、「適切な」タイプ、たとえばvarchar2(100)



に変換されました。 さらに、カスタムタイプがある場合、それらはブロードキャストされないため、すべてをやり直す必要がありますが、これは少なくとも別の記事のトピックです。



まとめると



Ora2Pgユーティリティは、セットアップが複雑であるにもかかわらず、使用が簡単で信頼性があります。 小規模および中規模のデータベースの移行に安全に推奨できます。 ところで、PGConf Russiaの著者は、MS2Pgプロジェクトを開始すると発表しました。 それは有望に思えます。



成功した移行!



All Articles