Oracle の listener.ora の GLOBAL_DBNAME と SID_NAME はなんのために使われているのか調べてみた。
GLOBAL_DBNAME がクライアントとのインタフェースに、SID_NAME がインスタンスとのインタフェースに使われているっぽい。つまり、GLOBAL_DBNAME は tnsnames.ora の SERVICE_NAME と、SID_NAME は接続するインスタンス名と一致しないといけない。
[実験結果]
- listener.ora
LISTENER= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.45.101)(PORT=1522)) (ADDRESS=(PROTOCOL=ipc)(KEY=extproc)))) SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (GLOBAL_DBNAME=orcl) (ORACLE_HOME=/export/home/oracle/product/10.2.0/db_1) (SID_NAME=matrix)))
- tnsnames.ora
orcl= (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.45.101)(PORT=1522)) (CONNECT_DATA= (SERVICE_NAME=orcl)))
$ sqlplus system/manager@orcl SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- matrix
- orcl というサービス名で待受けて、matrix インスタンスに接続するようになってるっぽい。
$ lsnrctl status (中略) Service "orcl" has 1 instance(s). Instance "matrix", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully