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モードのローカルテーブルのデータを(関連するINSERT、UPDATE、DELETE、およびMERGE INTOのSQL文)OceanBaseデータベースのOracleモードのリモートテーブルに書き込む際、以下のような状況が発生します:- この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のものであり、かつ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のものであり、かつ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に関するその他の操作については、以下の情報を参照してください: