追記:現在、VPC+RDS(Oracle)からのDBLinkは対応しています。
(参照 → VPC の DB インスタンスで使用するデータベースリンクの調整)
こんにちは、開発の千葉(@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)が対応してくれるとウレシイです。
よろしくお願いします!