この章では、Oracle DatabaseのMySQLクライアント・ライブラリ・ドライバと、MySQLからOracleへのアプリケーションの移行におけるその使用について説明します。
この章の内容は次のとおりです。
Oracle Database 12cリリース1用MySQLクライアント・ライブラリ・ドライバ(liboramysql
)はMySQL Commercial Connector/C 6.0クライアント・ライブラリに代わるものです。liboramysql
ドライバは類似のAPIを実装しているため、MySQL用に開発されたCベースのアプリケーションとツールはOracle Databaseに接続できます。ドライバを使用すると、最小限のコードの変更でアプリケーションをMySQLからOracle Databaseに移行できます。
liboramysql
ドライバは、Oracle Call Interface(OCI)を使用してOracle Databaseに接続します。
図6-1 MySQLアプリケーション・コードがliboramysqlドライバを使用してOracleに接続する場合
例6-1のCコード・スニペットで、MySQLへの接続方法と、表に行を挿入する方法を示します。実行可能ファイルがlibmysqlclient
ライブラリではなくliboramysql
ライブラリを使用してリンクされている場合、接続資格証明の更新後、コードを変更することなくOracle Databaseを対象に実行できます。
c = mysql_init(NULL); mysql_real_connect(c, "myhost", "myun", "mypw", "mydb", 0, NULL, 0); mysql_query(c, "insert into mytable values (1,2)"); mysql_close(c);
データベースのスキーマとデータをOracleに個別に移行する必要があり、liboramysql
ライブラリはSQL文を翻訳しませんが、アプリケーション・コードを変更する必要がないため、Oracle Databaseへの移行時の労力が大幅に軽減されます。
カスタムCアプリケーションは、liboramysql
ライブラリを使用してOracle Databaseに簡単に移行できます。
Oracle用MySQLクライアント・ライブラリ・ドライバは、liboramysql.so
共有ライブラリ(Linuxの場合)またはoramysql.dll
動的リンク・ライブラリ(DLL) (Windowsの場合)内のファイルとして提供されます。ドライバは、Oracle Instant Client Basic
およびBasic Lite
パッケージの一部としてパッケージされ、OTNからダウンロードできます。http://www.oracle.com/technetwork/topics/linuxsoft-082809.html
およびhttp://www.oracle.com/technetwork/topics/winsoft-085727.html
を参照してください。
ドライバは、Oracle Client共有ライブラリ(Linuxの場合はlibclntsh.so
、Windowsの場合はoci.dll
)と同じディレクトリにインストールする必要があります。通常、このインストール・ディレクトリを含めるように、オペレーティング・システムの環境変数(Linuxの場合はLD_LIBRARY_PATH
、Windowsの場合はPATH
)を設定する必要があります。
ORACLE_HOME
インストールの場合、ドライバ・ライブラリは、$ORACLE_HOME/lib
ディレクトリ(Linuxの場合)および%ORACLE_HOME%\bin
ディレクトリ(Windowsの場合)にインストールされます。Instant Client ZIPファイルの場合、ライブラリはinstantclient_12_1
ディレクトリにあります。Instant Client RPMインストールの場合、ライブラリは、32ビットLinuxプラットフォームまたは64ビットLinuxプラットフォームでそれぞれ/usr/lib/oracle/12.1/client/lib
ディレクトリまたは/usr/lib/oracle/12.1/client64/lib
ディレクトリにインストールされます。
Oracle DatabaseにCベースのMySQLアプリケーションを移行するには、次の手順を行う必要があります。
MySQLデータベースに対してアプリケーションが実行されることを確認します。
これにより、移行プロセスが、既知の基本的な機能で開始されます。
libmysqlclient
ライブラリをliboramysql
ライブラリに置き換えます。
libmysqlclient
ライブラリではなくliboramysql
ライブラリを使用するようにアプリケーションを再リンクする必要があります。
アプリケーション・スキーマをOracle Databaseに移行します。
Oracle DDLおよびタイプを使用するようにスキーマを移行する必要があります。このプロセスには、Oracle SQL Developerが役立ちます。
詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。
アプリケーションで使用されるすべてのSQL文を確認します。
必要に応じて、Oracle構文を使用するようにアプリケーションのSQL文を変更するか、アプリケーションの実行時に変換を自動で行うSQLトランスレータを実装します。Oracle DatabaseでサポートされないMySQL機能に依存するロジックを記述しなおします。
第4章「JDBCアプリケーションとODBCアプリケーションのSQL翻訳」を参照してください。
Oracle Databaseに接続するようアプリケーションの接続文字列を更新します。
接続呼出しのhost
パラメータでOracle簡易接続構文またはtnsnames.ora
接続識別子を使用します。
Oracle Databaseでアプリケーションをテストします。
Oracle Databaseに対してアプリケーションを検証します。
liboramysql
APIはMySQL Commercial Connector/C 6.0と互換性があります。Oracle Database用MySQLドライバであるliboramysqlは、MySQL API呼出しをOracle Call Interface(OCI)呼出しへ翻訳、およびOracleデータ型とMySQLデータ型間での翻訳を行います。
既存のMySQLベースのアプリケーションは、liboramysql
ドライバを使用するように再リンクし、Oracle Databaseを新しいデータ・ソースにすることができます。liboramysql
ドライバでは、Oracle Databaseへの接続のみがサポートされることに注意してください。同じアプリケーション内でMySQLデータベースとOracle Databaseの両方に同時に接続することはできません。
データ型マッピングとAPIの互換性の詳細は、第7章「Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス」を参照してください。詳細情報は、『Oracle SQL Developerユーザーズ・ガイド』にも記載されています。
liboramysql
ドライバは、SQL文を翻訳しません。Oracle Databaseに対して無効な文を記述しなおす必要があります。これは、アプリケーションで直接行うか、SQLトランスレータを使用して行います。アプリケーションのスキーマとデータも個別に移行する必要があります。Oracle SQL Developerにより、このプロセスは自動化されます。
古いバージョンのOracle Databaseに対するバージョン間OCI接続が存在する場合、liboramysql
ドライバを使用して、古いバージョンに接続します。
次の各項でこれらについて説明します。
liboramysql
ライブラリを使用する基本的な手順として、新しいライブラリを使用するようにアプリケーションを再リンクします。liboramysql
ライブラリは、MySQL Commercial Connector/C 6.0.2パッケージのlibmysqlclient.so
ライブラリと互換性があるため、Oracle Databaseに移行する前に、バージョンの影響を受けるアプリケーションをMySQL Commercial Connector/C 6.0.2を使用してビルドし、検証する必要があります。
ソース・コードからコンパイルされたパブリック・ソフトウェアのインストール・スクリプトでは、通常、MySQLコンポーネントは事前に定義されたシステム・ディレクトリ構造に従うと想定されます。これは、Instant Client SDKのdemo
ディレクトリ内のsetuporamysql.sh
スクリプトを使用して行います。
アプリケーションに応じて次の方法を1つ以上使用し、アプリケーションをliboramysql
ライブラリに再リンクします。
直接liboramysql
ライブラリを使用してビルドします。
liboramysql
ライブラリを使用するようビルド・スクリプトを更新し、このOracleライブラリを直接使用するカスタム・アプリケーションをビルドできます。
liboramysql
ライブラリを使用してMySQL Commercial Connector/Cディレクトリをエミュレートします。
Instant Client SDKのsetuporamysql.sh
ライブラリで、MySQL Commercial Connector/Cインストールをエミュレートしたディレクトリ構造の作成方法が示されます。エミュレートされたこのディレクトリを使用してアプリケーションをビルドできます。
LD_PRELOAD
環境変数を使用します。
事前構成のプログラムでLD_PRELOAD
環境変数を使用してliboramysql
ライブラリにリンクできます。ただし、プログラムでdlopen()
メソッドを使用している場合、この環境変数の値を変更すると機能しない場合があります。
liboramysql
ライブラリを複製します。
次の手順に従って、liboramysql
ライブラリの名前を、アプリケーションで使用されているMySQLクライアント・ライブラリ名に変更します。
ldd
コマンドを使用して、アプリケーションのリンク先のMySQLライブラリを特定します。
$ ldd yourprogram ... libmysqlclient.so.16 => /usr/lib/libmysqlclient.so.16 (0x00007f9004e7f000) ...
次のシンボリック・リンクをOracleソフトウェア所有者ユーザーとして作成します。
$ ln -s $ORACLE_HOME/lib/liboramysql12.so $ORACLE_HOME/lib/libmysqlclient.so.16
libmysqlclient
ライブラリを使用していたアプリケーション用に$ORACLE_HOME/lib
をLD_LIBRARY_PATH
環境変数に追加します。
$ export LD_LIBRARY_PATH=$ORACLE_HOME/lib
システムMySQLクライアント・ライブラリを置き換えます。
ターゲット・システムのMySQLクライアント・ライブラリの名前を変更し、その場所の新しいライブラリにリンクします。このオプションは、MySQLを使用するシステムのすべてのアプリケーションに影響を与えるため、絶対に必要な場合のみ行ってください。
# mv /usr/lib64/libmysqlclient.so.16 /usr/lib64/libmysqlclient.so.16.backup # ln -s $ORACLE_HOME/lib/liboramysql12.so /usr/lib64/libmysqlclient.so.16
MySQLアプリケーションをソース・コードから再ビルドできない場合、まず、MySQL Connector/C 6.0.2パッケージのlibmysqlclient.so
ライブラリに対してアプリケーションをリンクする必要があります。これによって、liboramysql
ライブラリ内のデータ構造とのバイナリ互換性が保証されます。
liboramysql
ライブラリを使用してOracle Databaseに接続するには、接続呼出しのhost
パラメータでOracle簡易接続構文またはtnsnames.ora
接続識別子を使用します。
mysql_real_connect(c, "localhost/pdborcl", "myun", "mypw", NULL, 0, NULL, 0);
Oracle用MySQLクライアント・ライブラリ・ドライバは、Oracle Instant Clientがサポートされているプラットフォームで使用できます。
サポート対象プラットフォームのリストについては、OracleのSupport Certificationサイト(https://support.oracle.com
)を参照してください。
OCIクライアント・コードまたはOracleサーバーで生成されるすべてのエラーは、エラー後にmysql_errno()
メソッドまたはmysql_error()
メソッドが呼び出されると、アプリケーションに渡されます。
アプリケーションで想定される日付形式は、Oracle DatabaseのNLS_DATE_FORMAT
環境変数を使用して設定されるか、同等のALTER SESSION
コマンドで接続後に変更されます。NLS_LANG
も環境で設定される場合、NLS_DATE_FORMAT
環境変数のみが使用されます。
liboramysql
ライブラリの一部のAPIは、MySQLデータベースとOracle Databaseとの間の根本的な違いから、必然的に異なる結果を返します。これらのAPIを使用する既存のアプリケーションはロジックの変更が必要な可能性があります。これらの違いの詳細は、第7章「Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス」を参照してください。