リモートサーバー上のMySQLからデータを抽出し、ローカル環境へ安全に転送する手順の備忘録です。 INTO OUTFILE命令による権限エラーを回避し、データ内の改行を保持したまま出力する方法を紹介します。

出力対象のテーブル例

以下のusersテーブルから条件に合うデータを抽出します。 特にintroductionカラムに含まれる改行や引用符の扱いがポイントです。

カラム名データ型論理名備考
idINTユーザーID主キー
nameVARCHAR氏名
workplaceTINYINT勤務地フラグ1:北海道, 2:関東, 3:その他
introductionTEXT自己紹介改行や引用符が含まれる可能性あり
created_atDATETIME作成日時yyyy-mm-dd hh:mm:ss 形式

サーバー側でのCSV出力コマンド

SSHログイン後、シェルから以下のコマンドを実行します。標準出力をリダイレクトすることで、MySQL側のディレクトリ書き込み制限を回避します。

mysql -h ホスト名 -u ユーザー名 -p -D DB名 -e "
SELECT
    id 'ID',
    name '氏名',
    CASE workplace
        WHEN 1 THEN '北海道'
        WHEN 2 THEN '関東'
        WHEN 3 THEN 'その他'
        ELSE '不明'
    END '勤務地',
    CONCAT('\"', REPLACE(IFNULL(introduction, ''), '\"', '\"\"'), '\"') '自己紹介',
    DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') '作成日'
FROM users
WHERE created_at < '2026-01-07'
ORDER BY created_at DESC;
" | sed 's/\t/,/g' > ~/users_list.csv

コマンドの解説

mysql -e “SQL”

対話モードに入らずに SQL を実行します。結果は標準出力として返されます。

DATE_FORMAT()

日時型をyyyy-mm-dd HH:mm:ss形式に整形します。

| sed ’s/\t/,/g'

mysql -e の出力結果(タブ区切り)をカンマ区切りに置換します。

> ~/users_list.csv

ログインユーザーのホームディレクトリに書き出します。

データ内の改行・引用符への対応

introduction(自己紹介)のように、改行やカンマが含まれるデータは、そのまま出力するとCSVの行や列が崩れてしまいます。 これを防ぐために、以下のエスケープ処理を施しています。

CONCAT('"', REPLACE(IFNULL(column, ''), '"', '""'), '"')
  • IFNULL: NULL値を空文字に置換し、予期せぬ文字列出力を防ぐ
  • REPLACE: 項目内の " を "" に置換(RFC 4180準拠)
  • CONCAT: 項目全体を " で囲むことで、データ内の改行を「セル内改行」として保持

ローカルPCへのファイル転送

ファイルの生成完了後、ローカルPCのターミナルからscpコマンドで取得します。

scp ユーザー名@サーバー名:~/users_list.csv ~/Documents/

SSH経由でファイルをコピーするコマンドで、ユーザー名@ホスト名:~/pathでリモート側のファイルパスを指定します。~/Documents/でローカル PC 側の保存先ディレクトリを指定します。

この記事のまとめ

この方法を使えば、データベース側の細かい権限設定を変更することなく、安全かつ正確(改行崩れなし)にデータをエクスポートできます。定期的なレポート作成やデータ分析の際に非常に有効です。