tag:crieit.net,2005:https://crieit.net/tags/mysqldump/feed 「mysqldump」の記事 - Crieit Crieitでタグ「mysqldump」に投稿された最近の記事 2021-12-08T23:55:01+09:00 https://crieit.net/tags/mysqldump/feed tag:crieit.net,2005:PublicArticle/17840 2021-12-08T23:55:01+09:00 2021-12-08T23:55:01+09:00 https://crieit.net/posts/mysql-bulk-import-from-sql-statement-textfile-20211208 テキストファイル(SQL文) から MySQL にインポートする (Docker) <p>大量のデータ(数十万レコード程度)を phpMyAdmin 経由で MySQL にインポートしようとしたらメモリ不足でコケたので、 CLI から直接インポートする方法を模索しました。</p> <p>今回試したのは次の2つの方法</p> <ol> <li><code>use DB_NAME;</code> を SQL文 のテキストファイルの先頭に記述した上で、 <code>mysql -u root -p < FILE_PATH</code></li> <li>MySQL にログインして <code>use DB_NAME;</code> した後に <code>source FILE_PATH</code></li> </ol> <h2 id="方法1 (mysql -u root -p &lt; FILE_PATH)"><a href="#%E6%96%B9%E6%B3%951+%28mysql+-u+root+-p+%26lt%3B+FILE_PATH%29">方法1 (mysql -u root -p < FILE_PATH)</a></h2> <p><code>use DB_NAME;</code> を SQL文 のテキストファイルの先頭に記述した上で、 <code>mysql -u root -p < FILE_PATH</code> する方法です。</p> <p>まず、 SQL文 のテキストファイル (phpMyAdmin 等でエクスポートした、テーブル定義 <code>CREATA TABLE</code> やデータの <code>INSERT</code> を含むもの) に少し手を加えます。</p> <pre><code>-- MySQL dump XX.XX -- -- Host: localhost Database: DATABASE_NAME -- ------------------------------------------------------ -- Server version XX.XX.XX USE DATABASE_NAME; /* 追記 */ /* 以下略 */ </code></pre> <p>先頭に <code>USE DATABASE_NAME;</code> を記述して、どのデータベースにインポートするのか明記します。</p> <p>この加工を施した上で、シェルに入り込み</p> <pre><code class="bash">> docker-compose exec db /bin/bash </code></pre> <p>※今回は MySQLサーバ が Docker Compose 使用の Dockerコンテナ なのでこれで入ります</p> <pre><code class="bash"># ls -al /home/MYSQL_DUMP.sql -rw-r--r-- 1 root root XXXXX WWW dd hh:ii /home/MYSQL_DUMP.sql # mysql -u root -p &lt; /home/MYSQL_DUMP.sql Enter password: # exit </code></pre> <p><code>mysql -u root -p < /home/MYSQL_DUMP.sql</code> でインポート。これで無事に入ったことを確認。</p> <h2 id="方法2 (use DB_NAME; &amp;&amp; source FILE_PATH)"><a href="#%E6%96%B9%E6%B3%952+%28use+DB_NAME%3B+%26amp%3B%26amp%3B+source+FILE_PATH%29">方法2 (use DB_NAME; && source FILE_PATH)</a></h2> <p>方法1だとお手軽ではあるのですが、実行する際に内容を確認せずに実行してしまうので若干怖い部分があります。</p> <p>しかも今回は対象のファイルがかなり大きいのでエディタで開くのも一苦労なシロモノ。</p> <p>そういった事情から、なるべくファイルの中身を編集することは避けたいと考えました。そこで2つ目の方法。</p> <pre><code class="bash">> docker-compose exec db /bin/bash </code></pre> <p>同じく入り込みます。</p> <pre><code class="bash"># mysql -u root -p Enter password: mysql> </code></pre> <p>今回は素直にログインします。</p> <pre><code class="bash">mysql> use DATABASE_NAME; Database changed </code></pre> <p>違うのはまずここ。先程はファイル内で <code>USE</code> していましたが、今回はコマンドを直接叩きます。</p> <pre><code class="bash">mysql> source /home/MYSQL_DUMP.sql # 略 Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> exit Bye </code></pre> <p>今回は <code>source /home/MYSQL_DUMP.sql</code> の形でインポートを実行します。クエリごとにログが出力される点も先程と異なりますね。</p> <p>どちらの方法でも大量のデータを正常にインポートできることを確認しました。</p> <h2 id="余談: エクスポート"><a href="#%E4%BD%99%E8%AB%87%3A+%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88">余談: エクスポート</a></h2> <p>インポートするのが大変ならば、エクスポートするのも大変。同様に phpMyAdmin の画面からエクスポートさせようとすると固まってしまうので、エクスポートも CLI から行うことにします。</p> <pre><code class="bash"># mysqldump -u root -p -h localhost DATABASE_NAME &gt; /home/MYSQL_DUMP.sql </code></pre> <p><code>mysqldump</code>コマンド でエクスポート。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="方法1, 方法2"><a href="#%E6%96%B9%E6%B3%951%2C+%E6%96%B9%E6%B3%952">方法1, 方法2</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://dev.mysql.com/doc/refman/5.6/ja/mysql-batch-commands.html">MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.1.5 テキストファイルから SQL ステートメントを実行する</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://style.potepan.com/articles/25532.html">【MySQL】SQLファイルを実行する方法【3種類】 | ポテパンスタイル</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/IysKG213/items/994e9f4ad12ff8aee322">MySQLでファイルからSQLを実行する - Qiita</a></li> </ul> <h3 id="方法2"><a href="#%E6%96%B9%E6%B3%952">方法2</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ydzum1123/items/219d8e60843a678be719">【MySQL】 SQLをファイルから実行する方法 - Qiita</a></li> </ul> <h3 id="mysqldump によるエクスポート"><a href="#mysqldump+%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88">mysqldump によるエクスポート</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c">mysqldumpまとめ - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/14471 2018-06-18T08:33:07+09:00 2018-10-31T17:00:15+09:00 https://crieit.net/posts/Google-Cloud-Storage-DB Google Cloud Storage無料DBバックアップ <p>サービスを運用していると、データベースのバックアップが必要になります。ただ、同じサーバー内にバックアップを保存すると、サーバーが壊れた際にまるごと紛失してしまいます。</p> <p>そんな時、Google Cloud Storageだと無料でデータベースのバックアップを保存できるため非常に便利です。</p> <h2 id="無料枠の詳細"><a href="#%E7%84%A1%E6%96%99%E6%9E%A0%E3%81%AE%E8%A9%B3%E7%B4%B0">無料枠の詳細</a></h2> <h3 id="容量5GBまでは無料"><a href="#%E5%AE%B9%E9%87%8F5GB%E3%81%BE%E3%81%A7%E3%81%AF%E7%84%A1%E6%96%99">容量5GBまでは無料</a></h3> <p>Always Freeにより、下記はずっと無料になっています。</p> <ul> <li>5 GB の Regional Storage(米国リージョンのみ)</li> <li>5000 回のクラス A オペレーション(1 か月あたり)</li> <li>50000 回のクラス B オペレーション(1 か月あたり)</li> <li>1 GB の北米から全リージョン宛て下りネットワーク(1 か月あたり、中国およびオーストラリアを除く)</li> </ul> <p>上記の通り、米国リージョンでGoogle Cloud Storageのバケットを作成しておくと、5GBまでは無料になります。DBのバックアップであれば速度は関係ないため、米国で良いと思います。</p> <p>Google Cloud Storageにバックアップする総容量が5GBを超えると費用がかかってきてしまいます。</p> <h3 id="通信料も無料"><a href="#%E9%80%9A%E4%BF%A1%E6%96%99%E3%82%82%E7%84%A1%E6%96%99">通信料も無料</a></h3> <p>上り(Google Cloud Storageへのアップロード)は基本的に無料です。バックアップする際は特に気にすることはありません。</p> <p>下り(Google Cloud Storageからのダウンロード)は、前述の無料枠の通り、1GBまでは無料となっています。北米のリージョンにバケットを作って運用しましょう。</p> <h2 id="Google Compute Engineからだったら楽"><a href="#Google+Compute+Engine%E3%81%8B%E3%82%89%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%89%E6%A5%BD">Google Compute Engineからだったら楽</a></h2> <p>Google Compute Engineからバックアップを行う場合、非常に楽です。</p> <p>というのも、Google Compute Engineには最初からGoogle Cloud Storageへのアップロードに必要な<code>gcloud</code>や<code>gsutil</code>が元々入っており、しかも最初から認証済みになっています。そのため、ほとんど事前準備もなくコマンドを叩くだけでバックアップを行うことができます。</p> <p>バケットなどは事前に作っておきましょう。(非公開にしましょう)</p> <p>僕は下記のようなバックアップスクリプトを作成しました。<br /> (gsutilのパスは適宜実際のものとあわせてください)</p> <pre><code class="sh">rm backup.sql.gz mysqldump -u dbuser --password=hogehoge dbname > backup.sql gzip backup.sql /snap/bin/gsutil cp gs://backup-bucket/2.sql.gz gs://backup-bucket/3.sql.gz /snap/bin/gsutil cp gs://backup-bucket/1.sql.gz gs://backup-bucket/2.sql.gz /snap/bin/gsutil cp bakup.sql.gz gs://backup-bucket/1.sql.gz </code></pre> <p>3世代まで保存しています。容量に応じてこの辺は増やしたり減らしたりすれば良いと思います。</p> <p>GCP以外からの場合はkey fileを使って認証が必要なようです。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>何にしろAmazon S3等と違い、Google Cloud Storageは年間クレジットだけでなく永久無料枠があるのが大きな魅力です。さらに、GCPとの連携であれば初期設定も省くことができるのですぐに使えて便利です。ぜひ一度Google Cloud Storageの利用を試してみてください。</p> <p>※料金についてはその都度実際に確認を行ってください。</p> だら@Crieit開発者