フォーム読み込み中
ご覧いただきありがとうございます。ソフトバンクの莫です。
データベースへのデータインポートは、多くのシステムで重要なタスクの一つです。特に、大量のデータを迅速にインポートするためには、効率的な手法が求められます。今回は、LOCAL DATA LOCAL INFILEコマンドを使用して、Alibaba CloudのECS(Elastic Compute Service)にあるCSVファイルをApsara RDS MySQLにインポートする方法を紹介します。
システムの構築に伴い、データ移行、データ分析の準備やバックアップデータの復元といったデータインポート作業が必要になることがよくあります。パブリッククラウドサービスでは、データ移行やバックアップに関する専用サービスを提供していることが多く、Alibaba Cloudでも「Data Management Service (DMS)のImport Data」機能があります。この機能では、データベースへデータファイルをインポートする設定が可能です。コンソール操作なので簡単であったり、スキーマの整合性を事前にチェックできるなど、便利な機能が備わっているため、データインポート時の重要な選択肢となります。しかし、システム要件やコストの観点から、このような専用機能を利用しないケースも考えられます。
上記の専用機能を利用しないケースとして、コンソール操作に関するユーザー権限管理や、データソースの保存先からデータファイルをエクスポートする際の安全性を考慮して、専用機能を利用せずにローカルからのインポートが必要となる場合もあります。こうしたケースでは、システムの要件やセキュリティポリシーに基づき、より柔軟でカスタマイズ可能な方法が求められることがあります。
このため、今回はローカル環境(ECSを利用)からデータベース(Apsara RDS MySQL)にファイルインポートする方法を紹介したいと思います。
この記事では、ECSインスタンスを作成し、ECSからRDS MySQLに対してCSVファイルをインポートする方法について説明します。まずは、今回使用するAlibaba CloudのプロダクトであるECSおよびApsara RDS MySQLのそれぞれの事前準備設定を紹介します。
▼ECS<Ubuntu 22.04 64bit>
新しいECSインスタンスを作成します。OSはUbuntuを選択します。
ECSインスタンスにログイン後、CSV形式のデータファイルを作成します。
ここでは、ファイル名をcountry_sample.csvとします。
作成したデータファイルは、ECSインスタンスの/rootディレクトリに配置します。したがって、CSVファイルのパスは/root/country_sample.csvとなります。
データファイルのフォーマットと内容を確認します。
▼Apsara RDS MySQL<MySQL 8.0>
ECSと同じVPC内でApsara RDS MySQLインスタンスを作成します。MySQLのバージョンは8.0を選択します。RDSインスタンスが作成されたら、必要なデータベースとユーザーを設定します。
RDSインスタンスへの外部接続を許可するために、必要なホワイトリスト及びセキュリティグループを設定します。
※本記事では内部ネットワークを使用して接続します。そのため、インターネット経由での接続設定は不要です。Apsara RDS MySQLインスタンスへの接続方法については公式ドキュメントを参照してください。内部ネットワークを使用する場合、RDSインスタンスの内側のエンドポイントとポート番号を使用します。
※Apsara RDS for MySQLのサポート状況
調査の結果、Apsara RDS for MySQLは、標準のLOAD DATA INFILEコマンドをサポートしていません。これは、このコマンドではインポートするファイルがRDSサーバー上に配置されている必要があるためです。しかし、LOCALキーワードを追加したLOAD DATA LOCAL INFILEはサポートされており、ファイルはクライアントマシンから直接インポートすることが可能です。
前述の環境準備が完了したら、CSVファイルをインポートする手順に進みます。
<1>MySQLへの接続
MySQLクライアントを使用してRDS MySQLに接続します。接続情報(ホスト名、ユーザー名、パスワード、データベース名)を確認します。
#mysql -h 接続アドレス -p ポート番号 -u ユーザー名 -p
<2>テーブルの準備
まず、ソースデータのファイル /root/country_sample.csvの中身を確認します。
mysql>system cat /root/country_sample.csv;
mysql>system head /root/country_sample.csv;
次に、ターゲットテーブルの構造をデータファイルと一致させ、データをインポートするためのターゲットテーブルcountry_sampletableを作成します。
mysql>create table country_sampletable(
Code CHAR(3),
Name VARCHAR(64),
Continent VARCHAR(32),
Region VARCHAR(32),
SurfaceArea FLOAT,
Population INT,
LifeExpectancy FLOAT,
GNP FLOAT,
GovernmentForm VARCHAR(64),
HeadOfState VARCHAR(64)
);
mysql>show tables;
<3>LOAD DATA LOCAL INFILEコマンドの実行
LOAD DATA LOCAL INFILEコマンドを実行してデータをインポートしてみます。
【注意】LOAD DATA LOCAL INFILEは許可されている場合にのみ機能するのですので、許可されていない場合、該当コマンドが使えなく、エラーが発生します。
【エラーメッセージ】:ERROR 2068(HY000):LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
※LOAD DATA LOCAL INFILEを有効にする方法を紹介します。
接続時に--enable-local-infileを加えて機能を有効にします。
#mysql -h 接続アドレス -p ポート番号 -u ユーザー名 -p --enable-local-infile
local_infileを有効にした後、設定が反映されていること<1(有効)になっている>を確認します。
mysql>select @@local_infile;
再度、LOAD DATA LOCAL INFILEコマンドを実行してデータをインポートしてみます。エラーが発生せずインポートが成功したことを確認します。
mysql>LOAD DATA LOCAL INFILE ‘/root/country_sample.csv’
INTO TABLE country_sampletable
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '¥n'
IGNORE 1 ROWS;
<4>データの確認
データはターゲットテーブルにインポートされたかを確認します。
mysql>select * from country_sampletable;
これでECSにおける /root/country_sample.csvのソースデータをRDS MySQLのターゲットテーブルに無事にインポートしました。
今回は、LOCAL DATA LOCAL INFILEコマンドを使用して、ECSインスタンスにあるCSVファイルをApsara RDS for MySQLにインポートする方法について詳しく紹介しました。この手法は、ローカルのデータを効率的にデータベースに取り込む際に有用かと思います。これを活用すれば、実際の作業がスムーズに進められるでしょう。
条件に該当するページがございません