EC2でMySQLログインし、SELECTしたデータをscpコマンドでローカルへ保存してみた


やりたかったこと

タイトル通り。

出力失敗

EC2にSSHログイン後
$ mysql -h hogehoge.ap-northeast-1.rds.amazonaws.com -P 3306 -u username -p
# mysql -h ホスト名 -P ポート番号 -u MySQLユーザ名 -p

# ここでパスワード入力
MySQL [(none)]> use database_name;
MySQL [database_name]> SELECT * FROM table_name INTO OUTFILE './sample.dmp';

ERROR 1045 (28000): Access denied for user 'username'@'%' (using password: YES)

このMySQLユーザには FILE 権限がないと怒られている(意訳)。
諸事情により権限の変更はできないため別の方法を探す。
ちなみにデータは2万行近くあり、コピペするのはいささか面倒臭い。

出力成功

EC2にSSHログイン後
$ mysql -h hogehoge.ap-northeast-1.rds.amazonaws.com -P 3306 -u username -p -t -e 'SELECT * FROM table_name;' database_name > sample.dmp

# -t : 区切り線を付けて出力する
# -e : SQLステートメントをサーバーに渡し、mysqlはステートメント実行後に終了する

カレントディレクトリに存在するsample.dmpに標準出力をリダイレクトすることで、ファイルに保存することができた。

SCPコマンドでサーバ上のファイルをローカルにコピー

ローカルマシンのターミナル
$ scp [email protected]:/hoge/hoge/sample.dmp ./

# scp username@*ホスト名*:コピーしたいファイルのパス 保存したいディレクトリ(ローカル)

まとめ

出力成功例は『ファイルに書き込む』という処理をしていないため、上手く行ったのだと解釈している。
標準出力の向きを変えただけ。
間違っていたらマサカリお願いします。


編集後記

お風呂で身体を洗うタオルの存在意義に疑問を抱き始めた今日この頃です。
手だけで意外と洗える。背中をカバーしきれないのが唯一の弱点。

参考文献