Oracleのデータベースリンクのメモ。
データベースリンクとは、別のDB(別のSID)のテーブルへアクセスする為の機能。
「connect USERNAME/PASSWORD@DBNAME」で接続できる他のDBへのDBリンクを作成する例。
create database link LINKNAME connect to USERNAME identified by PASSWORD using 'DBNAME';
作成が成功すると、以下のようにしてリンク先のテーブルにアクセスできる。
SQL> select * from TABLE@LINKNAME;
SQL> select * from user_db_links; DB_LINK -------------------------------------------------------------------------------- USERNAME PASSWORD ------------------------------ ------------------------------ HOST -------------------------------------------------------------------------------- CREATED ---------- LINKNAME.HISHIDAMA.JP USERNAME PASSWORD DBNAME 2008/10/04
CREATEの反対がDROPなのはお約束。
drop database link LINKNAME;
Oracleでクライアントからサーバー(DB)へ接続するには、2つの方法がある。[2008-10-30]
専用サーバー接続 | DEDICATED | デフォルト。 |
共有サーバー接続 | SHARED | 以前は「マルチスレッド・サーバー(MTS)」と呼ばれていたらしい。 |
どちらの方法で接続されるかは、クライアントの状況(とサーバーの設定)次第らしい。特に何も設定していなければ専用サーバー接続になる模様。
クライアントがXAトランザクションを使う(JDBCのクラスで言えば、oracle.jdbc.xa.client.OracleXADataSourceを使用する)場合、DBリンク経由でテーブルにアクセスする為には、共有サーバー接続でなければならないらしい。
ただし、共有サーバー接続をする為には、DB側でそれを受け入れるように設定しておく必要がある。
SQL> show parameters shared
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
max_shared_servers integer 20
shared_memory_address integer 0
shared_pool_reserved_size big integer 2516582
shared_pool_size big integer 50331648
shared_server_sessions integer 165
shared_servers integer 1 ←1以上である必要があるらしい
SQL> show parameters disp
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=ora92XDB)
max_dispatchers integer 5
mts_dispatchers string (PROTOCOL=TCP) (SERVICE=ora92XDB)
mts_max_dispatchers integer 5
dispatchersの設定に、使用しているサービス名が入っている必要がある。デフォルトでは、この例で言うora92XDBだけ共有サーバー接続を受け付けるようになっている模様。
SQL> ALTER SYSTEM SET DISPATCHERS='(PROTOCOL=tcp)';
これで、どのサービスでも共有サーバー接続を受け付けるようになる模様。
(SYSTEMに対する変更なので、ユーザーとかは無関係(全ユーザーの接続方法が対象))