しかし、ご存じのとおり、永遠に続くものはありません。最近、私たちのプロジェクトの1つでPostgresの適用可能性についてのリクエストを受け取りました。 ここ数年、私たちはこのDBMSを綿密に精査してきました-会議やミートアップに参加しますが、最近まで「戦闘」状態で試すことはできませんでした。
だから挑戦
想定:Oracleサーバー(シングルインスタンス)11.2.0.3および合計容量が約50GBの無関係なスキームのセット。 必須:OracleからPostgresにデータ、インデックス、プライマリおよび参照キーを転送します。
移行ツールの選択
移行ツールのレビューにより、Enterprise DB Migration ToolkitやOracle Golden Gateなどの商用ツールとフリーソフトウェアの両方の可用性が示されました。 翻訳は一度計画されたため、成熟したツールが必要でしたが、明確でシンプルでした。 さらに、当然、価値の問題も考慮されました。 フリーソフトウェアの中で、今日最も成熟しているのは、Gilles Darold(Darold Gill)によるOra2Pgプロジェクトであり、機能性の商用オプションを大きく上回りました。 彼の方向にスケールを傾ける利点:
- 豊富な機能;
- プロジェクトの積極的な開発(15年間の開発、15のメジャーリリース)。
Ora2Pgコマンドラインユーティリティの動作原理は非常に簡単です。Oracleデータベースに接続し、構成ファイルで指定された回路をスキャンし、DDL命令の形式で回路オブジェクトをSQLファイルにアンロードします。 データ自体は、INSERTとしてsqlファイルにアップロードするか、作成されたPostgres DBMSテーブルに直接挿入できます。
環境のインストールとセットアップ
会社では、DevOpsアプローチを使用して、仮想マシンの作成、必要なソフトウェアのインストール、ソフトウェアの構成と展開を行っています。 私たちの作業ツールはAnsibleです。 ただし、認識を促進し、記事に関係のない新しいエンティティを導入しないために、コマンドラインから手動によるアクションを示します。 興味のある方のために、 ここにすべてのステップのAnsibleプレイブックを掲載しています。
そのため、OS Centos 6.6を搭載した仮想マシンでは、次の手順を実行します。
- Postgresリポジトリをインストールします。
- Postgres 9.4サーバーをインストールします。
- データベースを作成し、アクセスを構成します。
- Postgresをサービスとしてインストールして実行します。
- インスタントOracleクライアントをインストールします。
- 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に最も近いものです。 両方で、データ型はよく相関しており、そこには、スキーマなどがあります。 これを利用して、「ところで」データを転送します。 移行プロセスは、次の手順で構成されます。
- Ora2pgを使用した移行プロジェクトの作成。
- ora2pg.conf構成ファイルの編集。
- OracleからDDLテーブル、インデックス、制約をアンロードします。
- Postgresでデータベースを作成します。
- 手順3で準備したDDLテーブルをインポートします。
- データをコピーします。
- 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プロジェクトを開始すると発表しました。 それは有望に思えます。
成功した移行!