概要
本記事は、主流の分析処理(AP、Analytical Processing)データベースである、Huawei Cloud DWS、StarRocks、Alibaba Cloud ADB(AnalyticDB for MySQL)をOceanBaseに移行するユーザー向けに、エンドツーエンドのデータ移行に関するベストプラクティスを提供します。
OceanBaseは外部テーブル(External Table)メカニズムを通じて、効率的かつ拡張性のあるダイレクトロード(Direct Load)を実現し、大規模なデータ移行シナリオに適しています。
全体的な移行計画
「エクスポート・中継・インポート」の3段階アーキテクチャを採用することを推奨します:
- エクスポート段階:ソースAPデータベース内で、書き込み可能な外部テーブルを使用してデータを構造化ファイル(ParquetやORCなど)にエクスポートし、オブジェクトストレージ(S3やOSSなど)またはHDFSに保存します。
- 中継段階:データをオブジェクトストレージまたは分散ファイルシステムに一時保存し、中間媒体として利用します。
- インポート段階:OceanBaseは読み取り専用の外部テーブルを通じて上記ファイルを直接読み取り、ダイレクトロード機能を活用してデータをターゲットテーブルに効率的に書き込みます。
この計画には以下の利点があります:
- ソースシステムとターゲットシステムを分離し、本番環境への影響を軽減します。
- カラムストア形式を利用してI/Oおよび圧縮効率を向上させます。
- パラレル・ダイレクトロードをサポートし、スループットを大幅に向上させます。
ソースデータベースのデータエクスポート
対応データベース
以下の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)**技術を組み合わせることで、上記の問題を回避できます。
OMSを使用した増分同期の実現
リアルタイムで増分変更を同期する必要があるシナリオでは、**OceanBase Migration Service(OMS)**の使用を推奨します:
適用条件:ソース側がCDC(Change Data Capture)機能を備えていること。
APデータベースの制限:DWS、StarRocks、ADBなどは通常、ネイティブのCDC出力をサポートしていない。
推奨事項:これらのAPデータベースの上流業務システム(例:MySQL、Oracle)から増分ログをキャプチャし、OMSを介してOceanBaseに同期します。
サポート状況:OMSはOracle(OGGを含む)、MySQLなどの主要なOLTPデータベースの増分同期をサポートしています。
詳細な操作手順については、以下を参照してください:OMSを使用したデータ移行