概要
本記事は、Huawei Cloud DWS、StarRocks、Alibaba Cloud ADB (AnalyticDB for MySQL) などの主流の分析処理 (AP, Analytical Processing) データベースから OceanBase への移行を検討しているユーザー向けに、エンドツーエンドのデータ移行に関するベストプラクティスを提供します。
OceanBase は外部テーブル (External Table) メカニズムをサポートしており、大規模なデータ移行シナリオに適した、効率的で拡張性のあるダイレクトロード (Direct Load) を実現します。
全体的な移行計画
「エクスポート・中継・インポート」の3段階アーキテクチャ の採用を推奨します:
- エクスポート段階:ソースの AP データベース内で、書き込み可能な外部テーブルを使用してデータを構造化ファイル(Parquet や ORC など)にエクスポートし、オブジェクトストレージ(S3、OSS など)または HDFS に保存します。
- 中継段階:データを一時的にオブジェクトストレージや分散ファイルシステムに保存し、中間媒体として利用します。
- インポート段階:OceanBase は読み取り専用の外部テーブルを通じて上記のファイルを直接読み取り、ダイレクトロード機能を活用してターゲットテーブルにデータを効率的に書き込みます。
この方式には以下の利点があります:
- ソースシステムとターゲットシステムを分離し、本番環境への影響を軽減します。
- カラムナストレージ形式を活用して、I/O と圧縮効率を向上させます。
- パラレル・ダイレクトロードをサポートし、スループットを大幅に向上させます。
注意
現在の OceanBase 4.4.x バージョンは主にフルダイレクトロードをサポートしています。増分データの移行については、OMS (OceanBase Migration Service) と組み合わせて実施することを推奨します。
ソースデータベースのデータエクスポート
対応データベース
以下のAPデータベースは、外部テーブルを介したデータエクスポートをネイティブでサポートしています:
- Huawei Cloud GaussDB(DWS)
- StarRocks
- Alibaba Cloud AnalyticDB for MySQL (ADB)
推奨エクスポート形式
カラムストア形式を優先:ParquetまたはORC。
形式の利点
- 高い圧縮率:中間データのサイズを大幅に削減し、ストレージとネットワーク帯域幅を節約します。
- 強力な型とネスト構造のサポート:CSVなどのテキスト形式で発生する区切り文字の競合やエスケープ処理などの問題を回避します。
- 高性能な読み書き:CSVと比較して、インポート/エクスポートのパフォーマンスが約20%〜30%向上し、特にワイドテーブルや複雑なデータ型に適しています。
公式ドキュメント参照
データベース |
ドキュメントリンク |
|---|---|
| DWS | DWSデータエクスポートガイド |
| StarRocks | INSERT INTO FILESを使用したデータのエクスポート |
| ADB | 外部テーブルの作成 OSSへのデータエクスポート |
エクスポート例
StarRocksエクスポート例
INSERT INTO FILES(
"path" = "s3://mybucket/unload/data1",
"format" = "parquet",
"compression" = "uncompressed",
"target_max_file_size" = "1024", -- 単位:バイト(例では1KB)
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
ADBエクスポート例
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest3 (
A STRUCT<var1:STRING, var2:INT>
)
STORED AS PARQUET
LOCATION 'oss://testBucketName/osstest/Parquet';
INSERT INTO adb_external_demo.osstest3 SELECT * FROM t1;
説明
ターゲットのバケット(Bucket)のアクセス権限が正しく設定されていることを確認し、ネットワーク接続性を検証してください。
OceanBaseへのデータフルインポート
OceanBaseは、オブジェクトストレージからデータをインポートするための2つの主要な方法を提供しています:
INSERT INTO URL外部テーブルを使用したインポート
ファイルパスを直接指定するシナリオに適しており、構文が柔軟で、ファイル名の正規表現によるマッチングをサポートします。
INSERT /*+ direct(true, 0) enable_parallel_dml parallel(32) */ INTO t1
SELECT * FROM FILES(
location = 's3://data/?host=xxx&access_id=xxx&access_key=xxx',
format = (TYPE = 'PARQUET'),
pattern = 'datafiles$'
);
LOAD DATA ステートメントを使用したインポート
標準的な一括インポートタスクに適しています。
LOAD DATA /*+ direct(true,0) parallel(2) */
FROM 's3://data/?host=xxx&access_id=xxx&access_key=xxx'
INTO TABLE t1
FORMAT (type = 'PARQUET');
説明
どちらの方法も direct(true) ダイレクト書き込みモードと並列度制御をサポートしており、インポート性能を大幅に向上させることができます。
詳細な構文とパラメータの説明については、フルダイレクトロードの概要を参照してください。
外部データソースの直接読み取り(高度なシナリオ)
OceanBaseは、オブジェクトストレージ以外にも、外部テーブルを通じてHDFSやODPSなどの異種データソースに直接アクセスすることをサポートしており、既存のデータレイクアーキテクチャを利用しているユーザーに適しています。
HDFSデータソース
構文例は以下のとおりです:
INSERT INTO t1
SELECT * FROM files(
LOCATION = 'hdfs://${namenode_host}:${namenode_port}/user?principal=hdfs/hadoop@EXAMPLE.COM&keytab=/path/to/hdfs.keytab&krb5conf=/path/to/krb5.conf&configs=dfs.data.transfer.protection=authentication,privacy',
FORMAT = (
TYPE = 'CSV',
FIELD_DELIMITER = ',',
FIELD_OPTIONALLY_ENCLOSED_BY = '\''
),
PATTERN = 'test_tbl1.csv'
);
ODPS(MaxCompute)データソース
構文例は以下のとおりです:
INSERT INTO t1
SELECT * FROM SOURCE (
TYPE = 'ODPS',
ACCESSID = 'your_id',
ACCESSKEY = 'your_key',
ENDPOINT = 'http://service.cn-hangzhou.maxcompute.aliyun.com/api',
PROJECT_NAME = 'my_project',
TABLE_NAME = 'my_table'
);
参考ドキュメント:CREATE EXTERNAL TABLE(MySQLモード)
増分データ同期戦略
現在のOceanBase 4.4.x系のダイレクトロード機能はフルインポートのみをサポートしています。継続的な書き込みシナリオについては、「フル + 増分」ハイブリッド方式の採用を推奨します。
パーティション単位のフルインポート(限定的な増分サポート)
ソースデータが時間パーティション(例:月単位)に分割されている場合、新しいパーティションに対してフルダイレクトロードを実行できます:
-- 指定したパーティションへのインポート(追加)
INSERT /*+ direct(true, 0) enable_parallel_dml parallel(32) */ INTO t1 PARTITION(p0, p1)
SELECT * FROM external_table;
-- 指定したパーティションの上書き
INSERT /*+ direct(true, 0) enable_parallel_dml parallel(32) */ OVERWRITE t1 PARTITION(p0, p1)
SELECT * FROM external_table;
制約
- テーブルレベルロックの制限:指定したパーティションであっても、インポートプロセスではテーブル全体がロックされ、複数のパーティションへの並列インポートタスクは実行できません。
- 隠れたテーブルのオーバーヘッド:インポートごとにテーブル全体に一時的な隠れたテーブルが作成されるため、パーティション数が多い場合、メタデータ操作にかかる時間が著しく増加します。
最適化の提案:パーティション数の多いテーブルについては、**パーティション交換(Partition Exchange)**技術を組み合わせることで上記の問題を回避できます。詳細は関連ドキュメントを参照してください。別のドキュメントのPRがマージされ次第追記します。
OMSを使用した増分同期の実現
リアルタイムで増分変更を同期する必要があるシナリオでは、**OceanBase Migration Service(OMS)**の使用を推奨します:
適用条件:ソース側にCDC(Change Data Capture)機能が備わっていること。
APデータベースの制限:DWS、StarRocks、ADBなどは通常ネイティブのCDC出力を提供していない。
推奨される方法:これらのAPデータベースの上流業務システム(例:MySQL、Oracle)から増分ログをキャプチャし、OMSを通じてOceanBaseに同期します。
サポート状況:OMSはOracle(OGG含む)、MySQLなどの主要なOLTPデータベースの増分同期をサポートしています。