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プロジェクトを開始すると発表しました。 それは有望に思えます。

成功した移行!

Source: https://habr.com/ru/post/J262605/


All Articles