20200515のMySQLに関する記事は3件です。

MySQLのSELECT結果をtsvに出力してcsvに変換するまで

はじめに

そんなに頻繁に発生する作業ではなく、手順やコマンドを忘れがちだったのでやり方を残しておくことにしました。今日はそんな話です。

手順

{******}の部分と、出力先パスはお使いの環境等に合わせて書き換えてください。

1. tsv 出力

サーバー側プロンプト
user@server:~$ echo "SELECT * FROM {table_name}" | mysql -u{user} -p{pass} {db} > /path/to/filename.tsv

2. csv 変換

前項で出力した tsv ファイルに対して下記コマンドを実行してください。

サーバー側プロンプト
user@server:~$ cat filename.tsv | tr "\\t" "," > filename.csv

3. 自分の端末にダウンロード

FTPソフト等でサーバーに接続できる方はそれ使ってもらえればOKです。
今回は scp コマンドで実行したので、ついでにそのサンプルも残しておきます。

ローカル側プロンプト
$ scp {user}@{host}:/serverside/path/to/filename.csv /local/path/to/filename.csv

SQL注意点

SQLで取得したデータの中に改行、タブ、カンマ等が含まれていると、tsv や csv に変換した際に必要以上に分割が行われてしまいます。その結果、列数が増えてしまいヘッダの項目と合わなくなってしまうことが多々ありました。(ヘッダでは5列しかないのに、中身は6列以上ある、みたいな状態になります。)

csv等に変換する前に改行、タブを取り除いておくとこういった事故をある程度防ぐことができます。(これでもまだ足りないかもしれませんが)REPLACE関数を使うのが楽なのでこちらで行いました。

なお、面倒ですがこの REPLACE 処理は問題のデータが入ってきそうなカラム全てに適用が必要です。(id など、特定の文字列しか入ってこないカラム等は必要ないです。主に自由入力系のフォームから送信された値を保存するカラムでこの問題が起こりえます)

SELECT
  --- char(13) => CR, char(10) => LF, char(9) => tab
  REPLACE(
    REPLACE(
      REPLACE(
        REPLACE(columun_name, char(13), ' '),
      char(10), ' '),
    char(9), ' '),
  ',', ' ') AS 'column_name'
FROM table_name

参考リンク

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS RDSのバックアップからデータをサルベージする方法

はじめに

AWSのRDSを使っている方は、RDSの機能でバックアップを取っている方も多いでしょう。
とても簡単にバックアップが取れて便利ですよね!
今回はそのバックアップからデータが必要になった場合にサルベージする方法を書いていきます!

最新で正確な情報は下記に記載されており、今回はそれを元に作業をした為そちらもご確認ください。
AWS 公式ドキュメント

検証環境

RDS Mysql: 5.7.22

サルベージ方法

データをサルベージする方法としては現状2つ方法が存在します。

Mysql 5.7.22はバージョン対象外なので、バックアップデータをS3にエクスポートする方法は今回使用できませんでした。
恐らく後者の方法の方が楽な気はします。
(5.7.24からは対応していた為、よく見ずに試してエラーが出て対象外な事に気付きました:joy:)

バックアップからDBスナップショットを復元する

基本的にはAWS コンソール RDSメニュー内からスナップショットの復元を行い、DBへアクセスすればデータをサルベージできると思います!

やってみた上での注意点としては下記かなと感じました

  • スナップショットの復元はRDSのインスタンス自体が新規作成される為、インスタンスサイズ等に注意
    • 復元する際のデフォルトの設定が、元のインスタンスと同じ設定だったので不要に大きなインスタンスで立てそうになりました、、、
    • 意外と時間がかかる。今回20GiBのインスタンスの復元をして数十分かかりました、、、
  • Sequel Pro等のMysqlクライアントからDBのデータを確認するためには、踏み台サーバーを用意してあげる必要がある

今回はSequel Proからデータを確認したかった為踏み台サーバーを用意してあげて接続しました。
公式でもしっかりドキュメント用意してくれている為、特に困らず接続できました!
(踏み台ってスラング的な言葉だと思っていたのですが、公式でも言うんですね、、、)

踏み台サーバーを経由してあげれば、問題なくSequel Pro等のクライアントからアクセスできると思います!

まとめ

AWS RDSはバックアップするのも簡単であれば、復元、データのサルベージも簡単で嬉しい!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】docker-maven-pluginでdocker:startするとContainer stopped with exit code 141 unexpectedly after ${time}ms while waiting on log out 'mysqld: ready for connections']で落ちる問題への対処【Maven】

TL;DR

ボリュームを使い切っていたことが原因だったため、クリーンアップしたら解決しました。

調査方法に関しての備忘用に書きます。

利用しているプラグイン

今回の件に直接は関係しませんが、利用しているプラグインはfabric8io/docker-maven-pluginです。

調査経緯

そのまま実行してもログには特に具体的なエラーは表示されず、何がどうエラーになっているか分からなかったため、mvn docker:start -Xとしてfull debug loggingを有効にして実行しました。
すると以下のようなログを見つけました。

[ERROR] InnoDB: Write to file ./ib_logfile101failed at offset 6291456, 1048576 bytes should have been written, only 393216 were written. Operating system error number 28. Check that your OS and file system support files of this size. Check also that the disk is not full or a disk quota exceeded.' [Pattern: mysqld: ready for connections] [thread: 17]

要するにディスク周りを調べろということだったので色々検索し、docker volume pruneするとエラーが解消しました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む