すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:Import data to a Data Warehouse Edition cluster using the import tool

最終更新日:Mar 29, 2026

AnalyticDB for MySQL インポートツールは、Java Database Connectivity (JDBC) を使用して、ローカルの区切り付きファイルを AnalyticDB for MySQL データウェアハウスエディションクラスターに読み込みます。このツールは、LOAD DATA 文よりも優れたパフォーマンスを発揮し、同時実行による複数ファイルのインポートをサポートします。また、ライトスループットを最大化するために、batchSize および concurrency のチューニングが可能です。

仕組み

このツールは、複数のフロントノードにトラフィックを分散する Server Load Balancer (SLB) インスタンスに接続します。フロントノードは MySQL プロトコルと SQL ステートメントを解析し、データを書き込み、クエリをスケジュールします。データはフロントノードからストレージノードに流れ、永続化されます。

Architecture diagram

前提条件

開始する前に、以下を確認してください。

  • Java 1.8 以降がインストールされていること (java -version を実行して確認)

  • AnalyticDB for MySQL クラスターエンドポイントへのネットワークアクセスがあること

  • クラスター内にデータベースとターゲットテーブルがすでに作成されていること

データインポート

ステップ説明
ステップ 1: インポートツールのダウンロードと解凍ツールパッケージをダウンロードして解凍します。
ステップ 2: データファイルの準備ファイル形式、列の順序、および区切り文字を確認します。
ステップ 3: インポートスクリプトの設定接続、ファイル、およびパフォーマンスパラメーターを設定します。
ステップ 4: インポートの実行スクリプトを実行し、進捗を監視します。

ステップ 1: インポートツールのダウンロードと解凍

  1. 作業ディレクトリを作成します。

    mkdir -p /u01/loadata
  2. ディレクトリに移動します。

    # cd /u01/loadata
  3. ツールをダウンロードします。

    wget https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20220811/gpvn/adb-import-tool.tar.gz
  4. パッケージを解凍します。

    tar zxvf adb-import-tool.tar.gz

パッケージは以下のファイルを抽出します。

adb-import.sh.template
adb-import.sh.template.md5
adb-import-tool.jar
adb-import-tool.jar.md5

ステップ 2: データファイルの準備

ファイル形式の確認

  1. インポートするファイルまたはフォルダーの絶対パスをメモします。

  2. 行区切り文字と列区切り文字を特定します。これらはスクリプトパラメーターで設定します。

  3. ファイル内の列の順序が CREATE TABLE 文と一致することを確認してください。データベースで SHOW CREATE TABLE を実行して確認してください。テーブルとそれに対応するデータファイルは、次のようになります:

    CREATE TABLE `product_info` (
      `id` bigint NOT NULL,
      `name` varchar,
      `price` decimal(15, 2) NOT NULL
    )
    DISTRIBUTED BY HASH(`id`)
    INDEX_ALL='Y';
    1|tv|1000.0
    2|computer|2000.0
    3|cup|15.8

    ファイルには、少なくとも 2 つのカラムが含まれている必要があります。最後のカラムの後ろに続くデリミタは許容されており、1|abc|3.01|abc|3.0| はどちらも有効です。

空のフィールドは、デフォルトで null として扱われます。たとえば、4||5.0name 列に空文字列ではなく null を挿入します。オートインクリメント列は自動的に処理されるため、事前処理は不要です。

大容量ファイルの分割

大容量ファイルをセグメントに分割すると、インポートツールがそれらを同時に読み取ることができます。セグメントサイズは 1 ~ 2 GB を推奨します。

ファイルサイズが 128 GB の filename.txt を、2 GB ずつの 64 個のセグメントに分割します:

# split -l$((`wc -l < filename.txt`/64 + 1)) filename.txt filename.txt.split -da 2;

このツールは、インポート中に 64 個すべてのセグメントを同時に読み取ります。

ステップ 3: インポートスクリプトの設定

adb-import.sh.template ファイルは、再利用可能なテンプレートです。テーブルごとにコピーして名前を変更します。たとえば、product_info テーブルの場合は adb-import-product_info.sh のようにします。

必須パラメーター

すべてのインポートジョブでこれらのパラメーターを設定します。

####################################
# Path to the Java command.
# If Java is already on your PATH, leave this as-is.
####################################
java_cmd=java

####################################
# Absolute path to the import tool JAR.
# If the script and JAR are in the same directory, leave this as-is.
####################################
jar_path=adb-import-tool.jar

####################################
# Database connection settings.
# If encryptPassword=true, provide a Base64-encoded password.
####################################
host=host
port=3306
user=adbuser
password=pwd
database=dbname
encryptPassword=false

####################################
# Table name.
####################################
tableName=please_set_table_name

####################################
# Path to the file or folder to import.
# For multiple files, separate paths with commas (,).
####################################
dataPath=please_set_data_file_path_or_dir_path

####################################
# The number of files that are imported in a concurrent manner.
# To fully leverage the performance of AnalyticDB for MySQL, set this
# parameter to a number within the range of 16 to 96.
####################################
concurrency=64

####################################
# The number of values that are written when the import operation is performed.
# Specify this parameter based on the lengths of individual rows.
# To fully leverage the performance of AnalyticDB for MySQL, set this
# parameter to a number within the range of 1024 to 4096.
# Smaller batches make individual failed rows easier to identify.
####################################
batchSize=4096

####################################
# File encoding. Valid values: UTF-8, GBK.
####################################
encoding=UTF-8

####################################
# Row delimiter.
# For non-printable characters, use hexadecimal notation.
# Example: \x0d\x06\x08\x0a -> hex0d06080a
####################################
lineSeparator="\\n"

####################################
# Column delimiter.
# For non-printable characters, use hexadecimal notation.
# Example: \x07\x07 -> hex0707
####################################
delimiter="\\|"

オプションパラメーター

特定のシナリオに合わせてこれらのパラメーターを調整します。

####################################
# JVM heap size. Increase if you see frequent garbage collection (GC).
####################################
jvmopts="-Xmx12G -Xms12G"

####################################
# Max number of files read concurrently from a folder.
####################################
maxConcurrentNumOfFilesToImport=64

####################################
# How to handle empty fields.
# false (default): empty fields become null.
# true: empty fields become '' (empty string).
####################################
nullAsQuotes=false

####################################
# Print the actual row count of the destination table after each file.
####################################
printRowCount=false

####################################
# Max characters to display for failed SQL statements.
####################################
failureSqlPrintLengthLimit=1000

####################################
# Dry-run mode. true=display INSERT statements only, false=execute them.
####################################
disableInsertOnlyPrintSql=false

####################################
# Skip the header row in each file.
####################################
skipHeader=false

####################################
# Buffer pool size for INSERT batches.
# Separates I/O and compute, improving client throughput.
####################################
windowSize=128

####################################
# Escape backslashes (\) and apostrophes (') in column values.
# true (default): safe for all data but slightly slower.
# false: faster, but only use if your data contains neither character.
####################################
escapeSlashAndSingleQuote=true

####################################
# Ignore batches that fail to import instead of stopping.
####################################
ignoreErrors=false

####################################
# Print failed SQL statements.
####################################
printErrorSql=true

####################################
# Print the stack trace when a SQL error occurs.
####################################
printErrorStackTrace=true

ステップ 4: インポートの実行

  1. インポートスクリプトを実行します。

    sh adb-import-product_info.sh;

    以下のログエントリは、スクリプトが開始されたことを確認します。

    [2021-03-13 17:50:24.730] add consumer consumer-01
  2. このツールはプログレスバーを表示しません。ロードされた行数を確認するには、宛先テーブルをクエリします。

    mysql > select count(*) from dbname.product_info;
  3. インポートが完了すると、ツールはサマリーを出力します。各ファイルで読み取られた行数、各ファイルにかかった時間、合計経過時間、およびすべてのファイルが成功したかどうかです。

    • すべてのファイルが正常にインポートされました:all import finished successfully

    • 1つ以上のファイルが失敗しました: all import finished with ERROR!

データインポートプロセス中にエラーが発生した場合、インポートツールは直ちにインポート操作を終了し、失敗した SQL ステートメントの詳細を提供します。送信先テーブルには部分的なデータが含まれています。TRUNCATE TABLE table_name を実行して送信先テーブルをクリアし、その後再度インポート操作を実行してください。また、DROP TABLE table_name を実行して送信先テーブルを削除し、その後別のテーブルを作成してインポートすることもできます。

よくある質問

ボトルネックがクライアント側かサーバー側かを確認する方法

リソース飽和を特定するには、クライアントマシンで以下のコマンドを実行します。

コマンド表示内容
topCPU 使用率
freeメモリ使用量
vmstat 1 1000システム全体の負荷
dstat -all --disk-util または iostat 1 1000ディスク読み取り帯域幅と使用率
jstat -gc <pid> 1000Java ガベージコレクションの詳細

jstat が頻繁な GC を示している場合は、jvmopts-Xmx16G -Xms16G に設定して、JVM ヒープを増加させます。

1 つのスクリプトで複数のテーブルをインポートする方法

すべてのテーブルが同じデリミタを共有する場合、tableName および dataPath をパラメーター化します。

tableName=$1
dataPath=$2

次に、テーブルごとに個別の呼び出しを実行します。

# sh adb-import.sh table_name001 /path/table_001
# sh adb-import.sh table_name002 /path/table_002
# sh adb-import.sh table_name003 /path/table_003

インポートをバックグラウンドで実行する方法

# nohup sh adb-import.sh &

ログを確認します。

# tail -f nohup.out

プロセスが実行中であることを確認します。

# ps -ef|grep import

インポートエラーを無視する方法

SQL 実行エラーが発生した場合、ignoreErrors=true を設定します。ツールはインポートを継続し、影響を受けたファイル、開始行番号、および失敗した文をログに記録します。batchSize パラメーターが指定されている場合、不正な行番号は、開始行番号と batchSize 値の合計以下になります。

列数の不一致は無視できません。行内の列数がテーブル定義と一致しない場合、ツールはそのファイルを直ちに停止します。再試行する前に、ファイルを手動で確認してください。エラーメッセージは次のようになります。
[ERROR] 2021-03-22 00:46:40,444 [producer- /test2/data/lineitem.csv.split00.100-41] analyticdb.tool.ImportTool
(ImportTool.java:591) -bad line found and stop import! 16, file = /test2/data/tpch100g/lineitem.csv.split00.100, rowCount = 7, current row = 3|123|179698|145|73200.15|0.06|0.00|R|F|1994-02-02|1994-01-04|1994-02-
23|NONE|AIR|ongside of the furiously brave acco|

インポートエラーの原因を絞り込む方法

3 つのアプローチがあります。

  1. 失敗したステートメントをより多く表示するために、SQL 表示長を増やします

    printErrorSql=true
    failureSqlPrintLengthLimit=1500
  2. 不良行を特定するために、`batchSize` を減らします

    batchSize=10
  3. エラーを含む分割ファイルがすでに特定されている場合は、特定のファイルセグメントを分離します

    dataPath=/u01/this/is/the/directory/where/product_info/stores/file007

Windows でツールを実行する方法

Windows ではシェルスクリプトは提供されません。コマンドラインインターフェイスを使用して JAR を直接呼び出します。

usage: java -jar adb-import-tool.jar [-a <arg>] [-b <arg>] [-B <arg>] [-c <arg>]
      [-D <arg>] [-d <arg>] [-E <arg>] [-f <arg>] [-h <arg>] [-I <arg>]
      [-k <arg>] [-l <arg>] [-m <arg>] [-n <arg>] [-N <arg>] [-O <arg>]
      [-o <arg>] [-p <arg>] [-P <arg>] [-Q <arg>] [-s <arg>]  [-S <arg>]
      [-t <arg>] [-T <arg>] [-u <arg>] [-w <arg>][-x <arg>] [-y <arg>] [-z <arg>]

必須パラメーター:

フラグ説明
-h, --ip <arg>クラスターエンドポイント
-u, --username <arg>データベースアカウント
-p, --password <arg>アカウントパスワード
-P, --port <arg>ポート番号
-D, --databaseName <arg>データベース名
-f, --dataFile <arg>ファイルまたはフォルダーへの絶対パス。複数のファイルの場合は、パスをコンマ (,) で区切ります。
-t, --tableName <arg>宛先テーブル名

オプションパラメーター:

フラグデフォルト説明
-a, --createEmptyFinishFilePath <arg>(空)インポート完了時にマーカーファイルを作成します。無効にするには空白のままにします。
-b, --batchSize <arg>1`INSERT` バッチあたりの行数。最高のスループットを得るには 1024 ~ 4096 の範囲で設定します。
-B, --encryptPassword <arg>falseBase64 パスワード暗号化を有効にします。
-c, --printRowCount <arg>false各ファイルの後に宛先テーブルの行数を表示します。
-d, --skipHeader <arg>false各ファイルの最初の行をスキップします。
-E, --escapeSlashAndSingleQuote <arg>true列の値で \ および ' をエスケープします。データにこれらの文字がいずれも含まれていない場合は、false に設定します。
-I, --ignoreErrors <arg>falseSQL エラーが発生してもインポートを続行します。
-k, --skipLineNum <arg>0IGNORE number LINES各ファイルの先頭でスキップする行数 (`IGNORE number LINES` と同様)。
-l, --delimiter <arg>|列デリミタ。非表示文字の場合は、16進表記を使用します(例:\x07\x07hex0707)。
-m, --maxConcurrentNumOfFilesToImport <arg>Integer.MAX_VALUEフォルダーから同時に読み取られるファイルの最大数。
-n, --nullAsQuotes <arg>falsefalse: 空のフィールド → null。true: 空のフィールド → ''
-N, --printErrorSql <arg>true実行に失敗した SQL ステートメントを表示します。
-O, --connectionPoolSize <arg>2データベース接続プールサイズ。
-o, --encoding <arg>UTF-8ファイルエンコーディング。有効な値:GBKUTF-8
-Q, --disableInsertOnlyPrintSql <arg>falsetrue: INSERT 文を実行せずに表示します。false: 実行します。
-s, --lineSeparator <arg>\n\x0d\x06\x08\x0ahex0d06080a行区切り文字。印刷不可能な文字には 16 進表記を使用します (例: `\x0d\x06\x08\x0a` -> `hex0d06080a`)。
-S, --printErrorStackTrace <arg>falseSQL エラー発生時にスタックトレースを表示します。
-w, --windowSize <arg>128`INSERT` バッチのバッファプールサイズ。I/O を計算から分離してクライアントパフォーマンスを向上させます。
-x, --insertWithColumnNames <arg>trueINSERT 文に列名を追加します(例:INSERT INTO tb(column1, column2))。
-y, --failureSqlPrintLengthLimit <arg>1000失敗した SQL ステートメントに表示する最大文字数。
-z, --connectionUrlParam <arg>?characterEncoding=utf-8?characterEncoding=utf-8&autoReconnect=true追加の JDBC 接続パラメーター。例: `?characterEncoding=utf-8&autoReconnect=true`。

例:

デフォルトパラメーターで単一ファイルをインポートします。

java -Xmx8G -Xms8G -jar adb-import-tool.jar \
  -hyourhost.ads.aliyuncs.com -uadbuser -ppassword -P3306 -Dtest \
  --dataFile /data/lineitem.sample --tableName LINEITEM

最大スループットでフォルダー内のすべてのファイルをインポートします。

java -Xmx16G -Xms16G -jar adb-import-tool.jar \
  -hyourhost.ads.aliyuncs.com -uadbuser -ppassword -P3306 -Dtest \
  --dataFile /data/tpch100g --tableName LINEITEM \
  --concurrency 64 --batchSize 2048