MySQLは、LOAD DATA INFILEコマンドというもので、テキストファイルやCSVファイルのデータをインポートすることができる。
今回、LOAD DATA INFILEコマンドを使用するのは、PostgreSQLからMySQLへデータ移行するため。
PostgreSQLのpg_dumpコマンドで取得したバックアップファイル内のデータは、COPYコマンドを使用してタブ区切りのデータをインポートできるようにエクスポートされるが、MySQLにCOPYコマンドはなく、LOAD DATA INFILEコマンドを使用する必要があるようです。
なお、今回のバージョンは以下です。
- Windows 10 Pro(64bit)
- MySQL 5.5
LOAD DATA INFILEコマンドの基本的な使い方
LOAD DATA INFILEコマンドの構文は以下のよう。
LOAD DATA INFILE "[データファイル]" INTO TABLE [テーブル名];
データファイルが先頭行なし、タブ区切り、フィールド囲み文字なし、改行コードCR+LF(\r\n)の場合、オプションは特に何もいらない。
それらをコマンドオプションで指定することができる。
データファイルをMySQLのdataフォルダに置いて実行することになるので、実行ユーザーにFILE権限を付与する必要がある。
データファイルを任意の場所に置いて実行する場合は、FILE権限は不要で、「LOAD DATA LOCAL INFILE」とすればOK。
実際のコマンドラインから実行するサンプルはこのような感じ。
--MySQL接続 >mysql -u test_user -ptest_password >USE test_db; >LOAD DATA LOCAL INFILE ".\\data\\test_data.txt" INTO TABLE test_table;
インポート時に警告などが出た場合は、SHOW WARNINGSコマンドで確認しよう。
PostgreSQLからMySQLへのデータ移行
PostgreSQLのpg_dumpコマンドで取得したバックアップファイル内のデータを使用し、MySQLのLOAD DATA INFILEコマンドを使用する場合、以下の項目でエラーとなった。
- boolean型の項目
- timestamp型の項目
まず、PostgreSQLでboolean型の項目は、データはt/f(true/false)の文字列で抽出されていたが、MySQLではtinyint型(1桁)となる。
なので、t/fを0/1へと置換してやる必要があった。
次に、PostgreSQLのtimestamp型の項目をMySQLのdatetime型の項目へと変換しようとしていたので、データの小数点以下の秒数を切り捨てた。
以上で、無事にインポートできました。
参考サイト
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.6 LOAD DATA INFILE 構文
LOAD DATA INFILE構文:データのインポート | Smart
コメント
[…] MySQLのLOAD DATA INFILEコマンドでテキスト・CSVファイルデータをインポート […]