こわくないよ!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の心配が軽減されます
- 用法用量をきちんと知って、ご安全に開発していきましょう