OceanBaseデータベースのDBLink機能は、データソース間でのアクセスを可能にする機能であり、ローカルデータベース上からリモートデータベースにアクセスすることができます。
前提条件
- DBLinkを作成するアカウントはスーパーユーザーである必要があります。スーパーユーザーの作成方法については、アカウントの作成と管理をご参照ください。
- リモートデータベースのテナントは、ローカルからのアクセスアドレスに対してホワイトリストを開放している必要があります。詳細な操作手順については、ホワイトリストグループの設定をご参照ください。
- リモートデータベースの接続情報を取得済みであること。関連説明については、データベース接続の概要をご参照ください。
DBLinkの作成
DBLinkの作成が成功すると、DBLinkを通じてリモートデータベースのオブジェクト(テーブルやビューなど)にアクセスできるようになります。
使用上の制限
- OceanBaseデータベースのMySQLテナントからMySQLデータベースへのDBLinkの作成は現在サポートされていません。
- MySQLモードでは、現在DBLinkの書き込みおよび逆リンク機能はサポートされていません。
OceanBaseデータベースからOceanBaseデータベースへのDBLinkの作成
指定されたリモートデータベースにアクセスするためのDBLinkを作成する際には、そのDBLinkの名前を指定し、リモートデータベースのデータベース名、アカウント名、テナントID、パスワード、およびアクセスアドレスを提供する必要があります。
MySQL互換モードでOceanBaseデータベースのMySQLテナントからOceanBaseデータベースのMySQLテナントへのDBLinkを作成するSQL構文は以下のとおりです:
CREATE DATABASE LINK [IF NOT EXISTS] dblink_name CONNECT TO user@tenantid DATABASE database_name IDENTIFIED BY 'remote_password' HOST 'ip:port';
関連パラメータの説明は以下のとおりです:
dblink_name:作成予定のDBLinkの名前。IF NOT EXISTS:MySQLデータベースの構文との互換性を持たせるために使用します。IF NOT EXISTSを指定すると、作成予定のDBLinkが既に存在してもエラーは報告されません。指定しない場合に作成予定のDBLinkが既に存在すると、システムはエラーを報告します。user:リモート側OceanBaseデータベースのアカウント名。tenantid:リモート側OceanBaseデータベースのテナントID。remote_password:リモート側OceanBaseデータベースのアカウントのログインパスワード。パスワードに数字や文字以外の特殊文字(例:@#!など)が含まれる場合は、構文エラーを回避するために、シングルクォートまたはダブルクォートで囲む必要があります。database_name:リモート側MySQLテナントのデータベース名。DBLinkを使用してデータを読み取る場合、デフォルトでこのデータベースにアクセスします。他のデータベースにアクセスする必要がある場合は、SQLステートメントでテーブルに特定のデータベースを指定できます。ip:port:リモート側OceanBaseデータベーステナントのアクセスアドレス。アクセスアドレスがプライベートネットワークのアドレスの場合、ローカルデータベースと指定されたテナント間のネットワークが相互接続可能である必要があります。
例:
リモートのOceanBaseデータベースに接続するためのDBLinkを
ob_dblinkという名前で作成し、そのIPアドレスとポート番号は指定されたOBServerノードのIPアドレスとポート番号に設定します。CREATE DATABASE LINK IF NOT EXISTS ob_dblink CONNECT TO username@t******** DATABASE test_database IDENTIFIED BY '********' HOST 'xx.xx.xx.xx:3306';
DBLinkを使用したリモートデータベーステーブルのデータのクエリ
使用上の制限
MySQL互換モードでは、DBLinkを介してアクセスできるデータ型は以下のとおりです:
数値型:
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL。日付時刻型:
DATE、TIME、YEAR、DATETIME、TIMESTAMP。文字列型:
CHAR、VARCHAR、TINYBLOB、TINYTEXT、BLOB、TEXT、MEDIUMBLOB、LONGBLOB、LONGTEXT。その他の型:
ENUM、SET。注意
OBClientの制限により、現在DBLlinkを使用してテーブルデータを読み取る際、リモートテーブル内の
ENUM型およびSET型の列はVARCHAR型の列として処理されます。
各データ型の詳細については、データ型の概要をご参照ください。
操作手順
SQLステートメントは以下のとおりです:
SELECT select_expr_list FROM table_name@dblink_name WHERE where_conditions;
パラメータの説明:
select_expr_list:クエリ対象の式または列名を指定します。複数の列は半角カンマ(,)で区切り、アスタリスク(*)はすべての列を表します。table_name@dblink_name:クエリ対象のリモートデータベース内のテーブルを指定します。複数のデータベースは半角カンマ(,)で区切ります。デフォルトでは、DBLinkの作成時に指定されたデータベース内のテーブルにアクセスします。他のデータベース内のテーブルにアクセスする必要がある場合は、SQLステートメントでdatabase_name.table_name@dblink_nameの形式で指定できます。where_conditions:フィルタ条件を指定します。クエリ結果には条件を満たすデータのみが含まれます。これはオプションです。
例
DBLinkを使用する手順は以下のとおりです:
以下のSQLステートメントを使用して、リモートのOceanBaseデータベースのMySQLモードに接続するDBLinkを作成します。DBLinkの名前は
my_link、リモートアカウントはtest_mysql、テナントIDはt*******、デフォルトのアクセスデータベースはtest_databaseです。CREATE DATABASE LINK my_link CONNECT TO test_mysql@t******** DATABASE test_database IDENTIFIED BY '******' HOST 'xx.xx.xx.xx:3306';以下のSQLステートメントを使用して、ステップ1で作成したDBLinkを使用して、リモートデータベース内のデータをクエリします。
my_linkを使用して、リモートデータベースのtest_databaseデータベース内のテーブルtest_tbl1のデータをクエリします。SELECT * FROM test_tbl1@my_link WHERE id = 1;実行結果は次のとおりです:
+------+------+ | id | name | +------+------+ | 1 | A1 | +------+------+ 1 row in setmy_linkを使用して、リモートデータベースのtest_databaseデータベース内のテーブルtest_tbl1を読み取り、ローカルデータベースのテーブルtbl1と結合操作を実行します。SELECT a.id, b.name FROM tbl1 a, test_tbl1@my_link b WHERE a.id = b.id;実行結果は次のとおりです:
+------+------+ | id | name | +------+------+ | 1 | A1 | | 2 | A2 | +------+------+ 2 rows in setmy_linkを使用して、リモートデータベースのstudent_dbデータベース(DBLink作成時に指定したデータベースがtest_databaseの場合)内のテーブルstudentのデータを読み取ります。SELECT * FROM student_db.student@my_link LIMIT 3;実行結果は次のとおりです:
+------+---------+--------+------+-------+-----------------+ | id | name | gender | age | score | enrollment_date | +------+---------+--------+------+-------+-----------------+ | 1 | Emma | 0 | 20 | 85 | 2021-09-01 | | 2 | William | 1 | 21 | 90.5 | 2021-09-02 | | 3 | Olivia | 0 | 19 | 95.5 | 2021-09-03 | +------+---------+--------+------+-------+-----------------+ 3 rows in set