こわくないよ!SQL 〜本番DBのデータが見たい!の巻〜

投稿者
加藤たみー

こんにちは、開発部の加藤たみーです。

先日、スタテクの若手エンジニアと会話していたところ、

「本番DBはなにかあると怖いのでアクセスしない」

「デバッグが必要なときはダンプしてローカルに取り込んでから調査してる」

といった声が聞こえてきました。

確かに安全な方法ではあるのですが、大規模なシステムになるとダンプするだけでも一苦労ですよね。

安全に、かつ効率的にデバッグするために、「こうすれば怖さが軽減するよ!」という視点で記事を書いてみました。

  • 目的:安全な使い方を知ってSQLと仲良くなろう
  • 対象:SQLがこわい人(初学者の方など)

※もともと社内ポエムドキュメント用に書いたものなので、説明が若干ふんわりしています。ご容赦ください 🙏


今日解消したいこわさ

  • Q1. 本番データ書き換えちゃいそうでこわいよ!

 → A1. 権限を限定したユーザでログインすればこわくないよ

  • Q2. 大量のデータをSELECTしちゃってシステム重くしそうでこわいよ!

 → A2. クライアントツール使えば(多少)こわくないよ

スペック

MySQL 5.7


本番データ書き換えちゃいそうでこわいよ!

  • デバッグ用に別のユーザを作って、普段はそっちでログインしよう

権限を限定したユーザでログインするようにすればこわくないよ

  • デバッグで必要そうな権限をピックアップしてみる

今回は SELECT, SHOW DATABASES の2つにしました

  • デバッグ用のユーザを作る
CREATE USER debug_user;
  • 作ったユーザに権限をつける
GRANT SELECT, SHOW DATABASES on *.* to debug_user;
  • 権限の確認
SHOW GRANTS FOR debug_user;
MySQL [(none)]> show grants for debug_user;
+-----------------------------------------------------------------------------------+
| Grants for debug_user@localhost                                                         |
+-----------------------------------------------------------------------------------+
| GRANT SELECT, SHOW DATABASES ON *.* TO 'debug_user'@'%'   |
+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

✌ (‘ω’ ✌ )三 ✌ (‘ω’) ✌ 三( ✌ ‘ω’) ✌

  • 普段のデバッグにはこっちのユーザを使うようにしよう

ちなみに

  • 権限にはレベルがあるよ

グローバルレベル、データベースレベル、テーブルレベル、etc…

今回はグローバルレベルで設定したので、すべてのデータベース、テーブルで適用されます。

「データベースAではupdate, createできるけどデータベースBではできない」みたいな設定とかもできるので各自調べてみてください。


大量のデータSELECTしちゃってシステム重くしそうでこわいよ!

  • 末尾に limit つけるのを徹底する

…と言っても限界があるので、ツールに頼って人的ミスを減らしていきましょう。

クライアントツール使えば(多少)こわくないよ

レコード数の多いテーブルはよしなに limit つけて表示してくれます。

いろいろなクライアントツール

軽くて使いやすいので大好きです。でもMac版しかないようです。

Oracleが出してる公式クライアント。以前使ってました。Mac / Win / Linux 対応。

Winの場合はこちらも使いやすいらしいです。

  • PostgreSQLだったら

私は Postico を以前使ってました。

とはいえ

  • SQLクエリを自分で実行するときは limit をつけてくれない

limit をつける意識はしっかり持ちましょう ٩( ‘ω’ )و

まとめ

  • 本番DBには権限を限定したユーザを作って、デバッグにはそのユーザを使いましょう
  • SQLクライアントツールを使うと大量SELECTの心配が軽減されます
  • 用法用量をきちんと知って、ご安全に開発していきましょう
一緒にスタートアップを盛り上げませんか?
フラッシュメッセージを含めたアカウントロック実装方法(gem Sorceryを使用)
2020/01/28
Rails + GitHub Actionsではまったこと
2020/02/14