カテゴリー別アーカイブ: データベース連携

データベースリンク(Oracle)

ITコーディネータのシュウです。

IMG_1878

だいぶ前になってしまいますが、お正月に、田舎に帰省したときに、飛行機から富士山が綺麗に見えたため、撮った写真です。飛行機の搭乗員の方も、これほど富士山が綺麗に見えるのは珍しいと言われていましたので、とても得をした気分になりましたね。
今年は縁起がいいかも!
いろいろと仕事が忙しかったため、前回の投稿からかなり時間が空いてしまいましたが、今年も頑張っていければと思います。よろしくお願いいたします。

<本日の題材>
データベースリンク(Oracle

システム開発の仕事をしていると、時折、複数のORACLEのサーバーがあり、それぞれに格納されているテーブルを同時にアクセスしてデータを抽出するなどの処理を行いたいという依頼を受けることがあります。
こういうときにORACLEデータベース側で、他のデータベースにアクセスできるデータベースリンクというものを作成することで、そういった操作が可能になります。
今回は、それを試してみたいと思います。

例)
今回は、Oracle12cのデータベースから、Oracle11gR2 のデータベースへのデータベースリンクを作成して、Oracle12c側からOracl11gR2側のデータを抽出できるようにしたいと思います。

設定の内容としては、大きくは以下になります。
①    ORACLEデータベースサーバー同士で接続できるように、
  ネットサービス名を設定します。
  今回は、Oracle12c側で設定を行います。
②    データベースリンクを作成するための権限を、該当のユーザ
  ーに与えます。
③ 該当のユーザーでデータベースリンクを作成します。

それでは始めて行きます。
①ネットサービス名の設定は、ツールでも可能ですが、今回はOracle12c側の「tnsnames.ora」ファイルを直接編集することで行います。

追加するネットサービス名を「ORCL11G」として、以下の内容を追加します。

ORCL11G =
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = サービス名)
   )
 )

※「HOST=」の後には、Oracl11gR2サーバーのIPアドレス(ホスト名でもよい)を設定し、「PORT=」の後にはデフォルトのポート番号を記載しています。最後の「SERVICE_NAME =」の後には、Oracle11gR2データベースのサービス名を設定します。

②    データベースリンクを作成するための権限を、該当のユーザーに与えます。以前、「Oracle12cでのユーザー作成でエラー「ORA-65096」」という内容でブログで取り上げたときの内容を使って、Oracle12cの「BLOG_TEST」というユーザーに権限を与えます。

Sqlplusでsysdba でログインした後、「PDBORCL」というプラガブルデータベースに接続します。

ALTER SESSION SET CONTAINER = PDBORCL;

alter_session

 BLOG_TEST というユーザーでデータベースリンクを作成したいのですが、データベースリンク作成には権限が必要なので、このユーザーに権限を与えます。

GRANT CREATE DATABASE LINK TO BLOG_TEST;

cre_databaselink

それでは、「BLOG_TEST」ユーザーに接続して、データベースリンクを作成します。

CONNECT BLOG_TEST/passwd@PDBORCL
(passwdのところは、パスワード)
connect_2

Oracle11gR2のデータベースに対するデータベースリンク「ORCL11DB」を作成します。

CREATE DATABASE LINK ORCL11DB CONNECT TO BLOG_TEST IDENTIFIED BY passwd USING ‘ORCL11G’;

cre_databaselink_2
(IDENTIFIED BY の後には、Oracle11gR2側のBLOG_TESTユーザーのパスワードを設定します。)

 データベースリンクが作成されましたので、Oracle11gR2側の「CUSTOMER」テーブルのデータを抽出してみます。

SELECT * FROM CUSTOMER@ORCL11DB;

select_dblink

毎回、「CUSTOMER@ORCL11DB」のように書くのが面倒だという場合などには、シノニムを作成することもできます。

まず、シノニムを作成できる権限を、「BLOG_TEST」に与えます。一度、SYS ユーザーに戻ってから下記コマンドを実行します。

GRANT CREATE SYNONYM TO BLOG_TEST;
grant_cre_synonym

再度BLOG_TEST で接続して、シノニムを作成してみます。

CONNECT BLOG_TEST/passwd@PDBORCL
connect_2

CREATE SYNONYM OR11_CUSTOMER FOR CUSTOMER@ORCL11DB;

cre_synonym

それでは、シノニムを使って、データベースリンクを貼ったOracle11gR2側データベースの「CUSTOMER」データを抽出します。

SELECT * FROM OR11_CUSTOMER;
select_synonym

シノニムを使って、データベースリンクを貼ったテーブルのデータを抽出できることが確認されました。

ただし、注意点として、リモートのデータベースへ接続するため、ネットワークの状態や、データ件数やデータを取得するやり方により、ローカルのデータベース内のみでの操作に比べて、パフォーマンスが低下する場合があります。

今日は以上まで

にほんブログ村 IT技術ブログへ
にほんブログ村