VPC+RDS(Oracle)からのDBLinkについて

記事タイトルとURLをコピーする

追記:現在、VPC+RDS(Oracle)からのDBLinkは対応しています。
(参照 → VPC の DB インスタンスで使用するデータベースリンクの調整)

vpc oracle

こんにちは、開発の千葉(@kachina_t)です。

今回はVPC内に起動したRDSのOracleから、別データベース・インスタンスへのDBLinkについて
検証したので投稿したいと思います。

まず、OracleのDBLinkについて簡単に触れておきたいと思います。

細かい説明は下記のリンクを参照して頂きたいのですが、
簡単に言うと別データベース・インスタンスの、テーブル等のリソースを利用可能とする仕組みです。
http://docs.oracle.com/cd/E16338_01/server.112/b56301/ds_admin002.htm

利用シーンとしては、複数台のデータベースにてマスタデータを一元管理したい場合や
集計処理の結果テーブルを、別システムのデータベースから参照させたい場合などに利用します。

さて、大変便利なDBLinkなのですが、VPC内から利用する場合には注意が必要です。
今回は下記の2パターンについて記載したいと思います。


構成図
  • VPC内の別データベース・インスタンスへのDBLink
  • VPC外の別データベース・インスタンスへのDBLink

 

1. VPC内の別データベース・インスタンスへのDBLink

添付の構成図にて、【192.168.10.110】から【192.168.30.130】のfooデータベースのbarテーブルを利用するイメージです。
まず、【192.168.10.110】へSQLPlusで接続した後、以下のクエリを発行します。

create database link foo_db
   connect to foo_db_user identified by password
using '(description=(address=(protocol=tcp)
         (host=192.168.30.130)
         (port=1521))
         (connect_data=(sid=foo)))';

これでDBLinkが作成されました、以後はプレフィクスに『foo_db.』を付けることで
設定したアカウントが許可されたリソースを利用することが可能です。

select * from foo_db.bar;

とても簡単ですね。

2. VPC外の別データベース・インスタンスへのDBLink

さて、VPC外へのDBLinkの場合です。
こちらも、VPC内の場合と同様に【192.168.10.110】へSQLPlusで接続しDBLinkを作成します。

create database link foo_db
   connect to foo_db_user identified by password
using '(description=(address=(protocol=tcp)
         (host=xxx.xxx.xxx.xxx)
         (port=1521))
         (connect_data=(sid=foo)))';

ここまではクエリが正常終了しますが、リソースの利用を試みると以下のエラーが発生します。

select * from foo_db.bar;
ORA-12170: TNS:Connect timeout occurred

さて困りました。

前提として、【192.168.10.0】のセグメントに存在するEC2インスタンスから、
【xxx.xxx.xxx.xxx】に対してSQLPlusでの接続は成功していますので通信環境の問題ではありません。

 
 
試行錯誤をするものの、何をやっても繋がりません。
お手上げなので、我らがプレミアムサポートへ問い合わせしてみました。
先方にご協力頂きながら、再度試行錯誤。。。

そして結論
VPC内に起動したRDSのOracleから、VPC外のOracleへのDBLinkは対応していない。
(2012/10/10現在)
だそうです。
ググっても、あまり情報がなかったのでダレかの助けになれば幸いです。

ちなみに、DBLinkの確認・削除のクエリは以下のとおりです。
参考までに。

【確認】
select db_link from user_db_links;
【削除】
drop database link foo_db;

『MySQLでFEDERATED テーブルを利用してVPC外のMySQLへ』って場合も同じことが発生するんじゃないかな?
http://dev.mysql.com/doc/refman/5.1/ja/federated-create-connection.html

いつの日か、VPC+RDS(Oracle)が対応してくれるとウレシイです。
よろしくお願いします!