OceanBaseデータベースのDBLink機能は、データソース間でのアクセスを可能にする機能であり、ローカルデータベース上からリモートデータベースにアクセスできます。
現在、OceanBaseデータベースのOracleモードでは、OceanBaseデータベースのOracleテナントから他のOceanBaseデータベースのOracleテナントへ、およびOceanBaseデータベースのOracleテナントからOracleデータベースへのDBLinkの作成がサポートされています。
前提条件
DBLinkを作成するユーザーはCREATE DATABASE LINKまたはCREATE PUBLIC DATABASE LINK権限が付与されていなければなりません。ユーザーへの関連する権限付与操作については、直接権限付与を参照してください。
注意事項
MY_NAMEの後のlocal_ip:local_portをローカルクラスタのプロキシ(ODP)ノードに設定することを強く推奨します。ODPノードは、ローカルデータを取得するために、逆リンクを正しいノードに自動的にルーティングします。DBLinkを作成する際に、
MY_NAMEの後のlocal_ip:local_portがローカルクラスタのODPノードではなく、ローカルクラスタ内のOBServerノード(例えばノードA)である場合、そのDBLinkを使用してOceanBaseデータベースのOracleモードのローカルテーブルのデータをOceanBaseデータベースのOracleモードのリモートテーブルに書き込む(関連するINSERT、UPDATE、DELETE、およびMERGE INTOのSQL文)際に、以下のような状況が発生します:- このSQLがノードA上で実行される場合、DBLinkによって書き込まれた結果は期待通りです。
- このSQLがローカルクラスタ内の他のノード(例えばノードB)上で実行される場合、DBLinkが指定したノードは期待通りではなく、実行結果が誤ってなります。これは、逆リンクが予想されたトランザクション分岐で実行されなかったため、取得したデータにトランザクション内の変更が含まれていないためです。つまり、
MY_NAMEの後のlocal_ip:local_portがノードAの場合、逆リンクは必ずOBServerノードAにアクセスして、ノードAの分散XAトランザクション分岐データを読み取ります。しかし、ノードAは対応するDBLinkによって書き込まれたSQL文を実行していないため、ノードAには対応する分散XAトランザクション分岐が存在せず、対応する分散XAトランザクション分岐はノードBにしか存在しません。
CONNECT TOの後のip:portについても、リモートクラスタのODPノードを使用することを推奨します。リモートクラスタ内のOBServerノードを使用する場合、そのOBServerノードに障害が発生すると、そのDBLinkはリモートクラスタに接続できなくなり、高可用性は保証されません。
OceanBaseデータベース間のDBLinkの作成
リモートのOceanBaseデータベースにアクセスするには、OceanBaseデータベースのOracleテナントから別のOceanBaseデータベースのOracleテナントへのDBLinkを作成できます。
DBLinkを作成するには、DBLink名を指定し、リモートデータベースのユーザー名、テナント名、パスワード、IPアドレス、ポート番号、アクセスタイプなどの情報を提供する必要があります。DBLinkのデータ書き込み機能には、逆リンク特性があります。逆リンク特性は主に、リモートデータベースがローカルデータベースのオブジェクト(テーブル、ビュー、シノニムなど)にアクセスするために使用されます。逆リンク特性を使用する必要がある場合は、DBLinkを作成する際に、ローカルデータベースのユーザー名、テナント名、パスワード、IPアドレス、ポート番号などの情報を提供する必要があります。
Oracleモードで、OceanBaseデータベースのOracleテナントから別のOceanBaseデータベースのOracleテナントへのDBLinkを作成するSQL構文は以下のとおりです:
CREATE DATABASE LINK dblink_name CONNECT TO user@tenant IDENTIFIED BY remote_password [OB] HOST 'ip:port'
[CLUSTER "cluster_name"]
[MY_NAME local_user@local_tenant IDENTIFIED BY local_password HOST 'local_ip:local_port' [CLUSTER "local_cluster_name"]];
関連パラメータの説明は以下のとおりです:
dblink_name:DBLinkの名前。長さは128文字以下です。user:リモートOceanBaseデータベースのユーザー名。tenant:リモートOceanBaseデータベースのテナント名。remote_password:リモートOceanBaseデータベースのユーザー名のログインパスワード。パスワードに数字やアルファベット以外の特殊文字(例:@#!)が含まれる場合は、二重引用符でパスワードを囲む必要があります。これにより、構文エラーを回避できます。OB:オプションです。アクセス対象のリモートデータベースのタイプをOceanBaseと指定します。このパラメータを指定しない場合でも、デフォルトでアクセスするリモートデータベースのタイプはOceanBaseになります。
ip:リモートOceanBaseデータベースのIPアドレスを指定します。IPアドレスは、クラスタのOBProxyのIPアドレス、またはクラスタ内の特定のOBServerノードのIPアドレスを指定できます。IPアドレスとしてOBServerノードのIPアドレスを指定する場合、ローカルデータベースと指定されたOBServerノード間のネットワークが相互接続可能である必要があります。
説明
IPアドレス以外に、OceanBaseデータベースはドメイン名アドレスもサポートしています。例えば、
example.com:portのように。実際の環境に応じて、適切なドメイン名アドレスを使用してリモートデータベースに接続できます。port:リモートOceanBaseデータベースのポート番号を指定します。ポート番号は、クラスタのProxyのポート番号(デフォルトは2883)、またはクラスタ内の特定のOBServerノードのSQLポート番号(デフォルトは2881)を指定できます。ポート番号が指定されたOBServerノードのSQLポート番号である場合、ローカルデータベースと指定されたOBServerサーバー間のネットワークが相互接続可能である必要があります。
cluster_name:リモートOceanBaseデータベースに対応するクラスタ名。IPアドレスとポート番号がクラスタのProxyのIPアドレスとポート番号であり、かつProxyがConfigUrl方式でデプロイされている場合にのみ、クラスタ名を指定する必要があります。クラスタ名は大文字小文字を区別するため、クラスタ名は二重引用符で囲む必要があります。説明
クラスタのProxy(例えばODP)をデプロイする際、以下の2つの方法があります:
- ConfigUrlデプロイ方式:OBProxy起動時に、コマンドで
obproxy_config_server_urlパラメータを指定してOceanBaseクラスタのRootServer情報を取得する方式です。 - RsListデプロイ方式:OBProxy起動時に、コマンドで
-rパラメータを指定してOceanBaseクラスタのRootServer情報を指定する方式です。
- ConfigUrlデプロイ方式:OBProxy起動時に、コマンドで
[MY_NAME local_user@local_tenant IDENTIFIED BY local_password HOST 'local_ip:local_port' [CLUSTER "local_cluster_name"]]:オプションです。ローカルデータベースのユーザー名、テナント名、パスワード、IPアドレス、ポート番号、およびクラスタ情報です。DBLinkのデータ書き込み機能でリバースリンク特性を使用する必要がある場合は、この情報を入力する必要があります。local_user:ローカルデータベースのユーザー名。local_tenant:ローカルデータベースが属するテナント名。local_password:ローカルデータベースユーザーのログインパスワードです。パスワードに数字や文字以外の特殊文字(例:@#!)が含まれる場合は、構文エラーを回避するために二重引用符で囲む必要があります。local_ip:ローカルデータベースクラスタ内の特定のOBServerサーバーのIPアドレス。local_port:ローカルデータベースクラスタ内の特定のOBServerサーバーのSQLポート番号です。OBServerサーバーのSQLポート番号はデフォルトで2881です。local_cluster_name:ローカルOceanBaseデータベースに対応するクラスタ名。IPアドレスとポート番号がクラスタのProxyのIPアドレスとポート番号であり、かつProxyがConfigUrl方式でデプロイされている場合にのみ、クラスタ名を指定する必要があります。クラスタ名は二重引用符で囲む必要があります。
例:
リモートOceanBaseデータベースに接続するDBLinkを作成し、IPアドレスとポート番号が指定されたOBServerサーバーのIPアドレスとポート番号である場合。
obclient> CREATE DATABASE LINK ob_dblink CONNECT TO ob_user@oracle IDENTIFIED BY ****** OB HOST 'xx.xx.xx.xx:2881'; Query OK, 1 row affectedリモートOceanBaseに接続するDBLinkを作成し、IPアドレスとポート番号がクラスタのProxyのIPアドレスとポート番号であり、かつProxyがConfigUrl方式でデプロイされている場合。
obclient> CREATE DATABASE LINK ob_dblink_proxy CONNECT TO ob_user@oracle IDENTIFIED BY ****** OB HOST 'xx.xx.xx.xx:2883' CLUSTER "ob410"; Query OK, 1 row affected注意
クラスタ名を入力する際は、二重引用符を付ける必要があります。これは、クラスタ名のアルファベットが大文字に変換されるのを防ぐためです。
リバースリンク特性を備えたリモートOceanBaseデータベースに接続するDBLINKを作成します。名前は
ob_dblink_reverse_linkです。obclient> CREATE DATABASE LINK ob_dblink_reverse_link CONNECT TO ob_user2@oracle IDENTIFIED BY ****** OB HOST 'xx.xx.xx.xx:2881' MY_NAME local_ob_user@oracle IDENTIFIED BY ****** HOST 'xx.xx.xx.xx:2881'; Query OK, 1 row affected
OceanBaseデータベースからOracleデータベースへのDBLinkの作成
リモートのOracleデータベースにアクセスする場合、OceanBaseデータベースのOracleテナントからOracleデータベースへのDBLinkを作成できます。
DBLinkを作成するには、DBLink名を指定し、リモートデータベースのユーザー名、テナント名、パスワード、IPアドレス、ポート番号、アクセスタイプなどの情報を提供する必要があります。DBLinkのデータ書き込み機能には、リバースリンク特性があります。この特性は主に、リモートデータベースからローカルデータベースのオブジェクト(テーブル、ビュー、シノニムなど)にアクセスするために使用されます。OceanBaseデータベースからOracleデータベースへのDBLinkは、現在リバースリンク特性をサポートしていません。
OceanBaseデータベースからOracleデータベースへのDBLinkを作成するSQL構文は以下のとおりです:
obclient> CREATE DATABASE LINK dblink_name CONNECT TO user@oracle IDENTIFIED BY remote_password OCI HOST 'ip:port/oracle_service_name';
ステートメントの使用方法:
dblink_name:DBLinkの名前。長さは128文字以内です。user:リモートOracleデータベースのユーザー名。oracle:Oracleデータベースに接続する際、この値は常にoracleです。remote_password:リモートOracleデータベースユーザーのログインパスワード。パスワードに数字や文字以外の特殊文字(例:@#!)が含まれる場合は、二重引用符で囲むことで構文エラーを回避します。OCI:アクセス対象のリモートデータベースのタイプをOracleと指定します。このパラメータを指定しない場合、デフォルトでアクセスするリモートデータベースのタイプはOceanBaseになります。ip:リモートOracleデータベースインスタンスのIPアドレスを指定します。説明
IPアドレス以外に、OceanBaseデータベースはドメイン名もサポートしています。例えば、
example.com:portのように。実際の環境に応じて、適切なドメイン名を使用してリモートデータベースに接続できます。port:リモートOracleデータベースインスタンスのポート番号を指定します。oracle_service_name:リモートOracleデータベースサービスの名前。
リモートOracleデータベースに接続するDBLinkを作成する例は以下のとおりです:
obclient> CREATE DATABASE LINK orcl_dblink CONNECT TO orcl_user@oracle IDENTIFIED BY ****** OCI HOST 'xx.xx.xx.xx:1521/ORCL';
Query OK, 1 row affected
関連ドキュメント
DBLinkに関するその他の操作については、以下を参照してください: