Oracle のデータベースリンク経由で MySQL サーバーのホスト名を取得する
概要
Oracle から ODBC 経由で MySQL に接続している環境で、データベースリンク越しに MySQL 側のサーバー情報を確認したい場合があります。
例えば、Oracle 側では次のようなデータベースリンクが存在しているとします。
SELECT owner, db_link, username, host
FROM dba_db_links
WHERE db_link LIKE '%MYSQL%';
結果例:
OWNER DB_LINK USERNAME HOST
------ ----------- --------- -----------
HB01 TK_WEBMYSQL ext_user HBWEBMYSQL
この場合、Oracle から見る接続先識別子は HBWEBMYSQL ですが、これは MySQL サーバー名そのものとは限りません。
Oracle 側で確認できる情報
Oracle のデータベースリンク情報としては、次のSQLで確認できます。
SELECT owner, db_link, username, host
FROM dba_db_links
WHERE db_link = 'TK_WEBMYSQL';
権限がない場合は次を使用します。
SELECT db_link, username, host
FROM all_db_links
WHERE db_link = 'TK_WEBMYSQL';
ここで表示される HOST は、Oracle Net の接続識別子や Gateway 用のSIDであることが多く、実際の MySQL サーバー名やIPアドレスとは限りません。
@@hostname は通らないことがある
クライアントがMySQLに直接接続している場合、MySQLサーバー自身のホスト名は次のSQLで取得できます。
SELECT @@hostname;
しかし、Oracle のデータベースリンク越しに実行すると、Oracle 側のSQLパーサーで構文エラーになります。例えば、次のようなSQLは通りません。
SELECT @@hostname
FROM dual@TK_WEBMYSQL;
取得できたSQL
今回の環境では、次のSQLで MySQL 側のホスト名を取得できました。
SELECT variable_value
FROM performance_schema.global_variables@TK_WEBMYSQL
WHERE variable_name = 'hostname';
結果例:
VARIABLE_VALUE
----------------
mysql-server-name

追加で確認できるサーバー情報
ホスト名以外にも、MySQL のサーバー情報を確認したい場合は次のようにします。
SELECT variable_name, variable_value
FROM performance_schema.global_variables@TK_WEBMYSQL
WHERE variable_name IN (
'hostname',
'port',
'version',
'version_comment',
'basedir',
'datadir',
'socket'
);
IPアドレスに近い情報を確認したい場合は、次も試せます。
SELECT variable_name, variable_value
FROM performance_schema.global_variables@TK_WEBMYSQL
WHERE variable_name IN (
'hostname',
'report_host',
'report_port',
'bind_address',
'port'
);
ただし、bind_address は 0.0.0.0 や * になる場合があります。
また、report_host は設定されていない場合があります。
注意点
この方法で取得できるのは、MySQL サーバー自身が保持している情報です。
Oracle Gateway や ODBC の設定ファイルで指定されている接続先、例えば次のような値を取得しているわけではありません。
Server = 192.168.1.50
または、
Server = mysql.example.local
Oracle / ODBC 側で実際に指定されている接続先名やIPアドレスを確認するには、Oracleサーバー上の設定ファイルを確認する必要があります。
代表的には次の順で確認します。
tnsnames.ora
↓
init<SID>.ora
↓
odbc.ini
まとめ
Oracle のデータベースリンク経由で MySQL のホスト名を確認する場合、@@hostname は構文エラーになることがあります。
その場合は、MySQL の performance_schema.global_variables を参照します。
SELECT variable_value
FROM performance_schema.global_variables@TK_WEBMYSQL
WHERE variable_name = 'hostname';
データベースリンクが通っており、performance_schema.global_variables への参照権限があれば、このSQLで MySQL 側のホスト名を取得できます。

コメント