Oracle のデータベースリンク経由で MySQL サーバーのホスト名を取得する

MySQL

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_address0.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 側のホスト名を取得できます。

コメント

スポンサーリンク
タイトルとURLをコピーしました