読者です 読者をやめる 読者になる 読者になる

LAMPエンジニアってこういうもんでしょ

こういうもんでしょって話をつらつらと

リモートにあるMySQLの大量データをCSVで出力してデータ移行

大量データを移行する必要があって調べていたら
AWSさんには良い記事がありました。

docs.aws.amazon.com

 

ただ困ったことに、オロゴンリージョンのRDSからから東京リージョンのRDSへ
1Tぐらいのデータを移さないといけなかったので
SSHでDBに入れない
・データが超でかい
の状況でデータ移行をする方法を模索しました

MySQLからCSVでデータを取得してくる

最終的にはコマンドでテーブル毎にデータを流し込むことになるので
データをCSVで取得してきます。
「--tab」 オプションを使う方法だとDBサーバーのローカルにファイルが作られるので色々具合が悪いです。

qiita.com

 

queryを分割してしまうと「--single-transaction」オプションが使えず
レプリケーションの設定とかはできないので注意が必要です。
今回はテストデータ移行で特に同期は必要ないのでサクッと取得します。

SELECTしたらsedCSVに変換

MySQLには標準でCSV出力の機構がないので
取得データをsedで整形してリダイレクトで吐き出す事になるのですが
日本語データとかブログ記事データとか含まれているのでちょいちょい面倒くさい感じになりました。

参考にしたのは以下

qiita.com

qiita.com

 

もろもろ検討して結果的に以下のshell fileを作って実行しました。

#!/bin/bash
TABLES=(tableName1 tableName2 tableName3)
for item in ${TABLES[@]}; do
echo $item
MYSQL_PWD=password mysql my_db -u db_user -h hostname -N -B -e "select * from ${item};" | sed -e 's/\"/\\\"/g' -e 's/\t/","/g' -e 's/^/\"/' -e 's/$/\"/' > ${item}.txt &
done;

・書き出し部分はテーブルによって重たいので、バックグラウンド実行にして並列取得
・passwordを毎回聞かれると辛いのでコマンド実行時に環境変数に設定する(非推奨)

という感じで取得しました。

圧縮して送信

このあたりは余裕ですね。

tar zcvf dump.tar.gz data

こんな感じで良いと思います。
あとはscpなりsftpなりでざっくり送ります。
個人的にはsftpが好きなので今回はsftpでこんな感じです。

sftp -oIdentityFile=~/.ssh/ssh_key.ppk tanaka@hostname

ファイルが取得できました。

解凍して挿入

挿入もカチカチのままの方がtar.gzを展開してcsvの取り込みを行います。

DBのテーブルデータは既に作られている前提です。

展開はこんな感じでサクッといきます。

tar zxvf dump.tar.gz

展開されたら挿入も並列実行でガリガリやっていきましょう。
AWSスクリプトを参考にしつつ、極度の面倒くさがりなので、こちらのshell作りました。

#!/bin/bash
TABLES=(tableName1 tableName2 tableName3)
for item in ${TABLES[@]}; do
echo $item
MYSQL_PWD=password mysql -u db_user -h hostname me_db -e'LOAD DATA LOCAL INFILE \'${item}.txt\' INTO TABLE ${item} FIELDS TERMINATED BY \',\' ENCLOSED BY \'"\' LINES TERMINATED BY \'0x0d0a\';' >> ~/import.log &
done;

あとはshellが勝手にやってくれるので放置でOKです。
進行状況はプロセス監視になるので
以下のコマンドで様子を見る感じになります。

ps aux | grep mysql

やばそうならkillしてテーブルDROPして再実行かなと・・・。

まとめ

テラバイト級のデータの扱いはミドルウェアに任せる部分が多いので
いざ平文で触ろうとするとなかなか辛いところが多いですね。
どう作業しても時間はかかるので
ゆったりした気持ちで進めたいものです。
(今度本番データの移行があるからビビってる)

 

初めてQiitaに投稿してみたら疲れた

そもそものテーマがめちゃくちゃ重たいっていうのもありますが、とりあえず疲れました。

qiita.com

 

インフラ構成図とか書いていないな~と思いつつ、今はこれが精いっぱい(cv. 山田康雄

マークダウン記法は扱いやすいところとそうでもないところがあるな~って感じですね。

よければご活用くださいませ。。。

 

PHP5系のメジャーサポートが全部なくなったから、これから7系移行が色んなところで勃発するんだろうな~と思っていますが

快適ローカル環境でサクッと検証していきたいものです。

共有されたパッケージ管理のパッケージをinstallする方法

最近色んなパッケージ管理が出てきて、オープンソースのあれやこれやを簡単に扱う事ができるようになってきましたね。
gitやsvnなどのソース管理にパッケージのソースを入れなくて良くなったので
プロジェクトの取得も軽くなったし同じパッケージを使う事で開発と本番でパッケージ依存のなんやかんやみたいのもなくなりましたね。

ただ、意外とパッケージ管理の初期構築、共有、除外設定、共有されたもののインストール
みたいなところをまとめた情報がなかったので、知っている範囲でメモっておこうと思います。

共有ファイルについてはプロジェクトの設定によって変わります。
除外設定については過去プロジェクトで使った.gitignoreの記述を参考にしています。

Vagrant

言わずと知れた仮想環境構築ツール

公式 https://www.vagrantup.com/

初期構築

vagrant init

共有するファイル

Vagrantfile

除外設定

/.vagrant

共有されたもののインストール

vagrant up

composer

PHPのパッケージ管理です。
過去にはPearPeclも使われていましたが、共有のしやすさからcomposerを使われる事が多くなってきました。

公式 https://getcomposer.org/

初期構築

composer init

共有するファイル

composer.json composer.lock

除外設定

/vendor/

共有されたもののインストール

composer install

npm

nodejsのパッケージ管理ですね。 僕が初めて触った今時のパッケージ管理です。

公式 https://www.npmjs.com/

初期構築

npm init

共有するファイル

package.json

除外設定

node_modules

共有されたもののインストール

npm install

【まとめ】 今時のパッケージ管理はプロジェクト構築も対話式で出来る事が多いですし
チーム開発をしていく上で大きな武器になるので、是非とも活用していきたいですね。
まだ導入していないプロジェクトはさっさと入れてソース管理から外部パッケージは除外していきましょう!