bashのaliasを利用してMySQLデータベースの保守を極限まで楽ちんにする

サービスのサポートや保守、開発などをしていると、コマンドラインから直接データベースにログインしてデータを探したり、ステータスのチェックをしたりすることがやたら多い。
私もここ最近、サービスごとにそれぞれのデータベースにログインしては、やれ顧客情報を調査したり、リレーションに齟齬があるデータを修正したり、スロークエリを探したり……と、DB保守にどっぷりハマっている状態だ。
──で、ステージングと本番環境ではDBへの接続アカウントが違っていたりして、毎度DBにログインする時に、パスワードを入力するのがつらくなって来た。そもそも、DB接続用のコマンドを打つのも面倒になって来た（笑）

そんなわけで、自分のDB保守環境をbashのaliasを使って極限まで簡素化してみたら、ダダ下がりだったモチベーションをかなり持ち直すことができたので、ナレッジ的にQiitaに残しておこうかと思った次第だ。

## データベースへのログインを楽ちんにする

例えば、MySQLにログインする時、一般的には、

```bash:
$ mysql -u user -p
```

──と、コマンドラインから実行して、パスワードを入力することになるのだが……これが、めんどい。
保守してるサービスや環境ごとにDBが別々だったりすると、それぞれユーザとパスワードが異なるので、そのペアを思い出すのも一苦労だ。さらにパスワードが自動生成されたヤツだったりすると覚えてられないので、どっかに控えたパスワードを探す羽目にもなる。
これは日々保守作業をする者としては、是が非でも簡素化したい部分だ。

ちゅーわけで、ある程度のセキュリティも考慮したうえで、簡素化してみよう。

まず、DBアクセス用のユーザ名・パスワードのペアは設定ファイル化してしまうのが一番だ。
事前準備として、読み込み専用の `.conf/my.cnf` を作成して、自分用のMySQLアクセス情報をそこに書いておこう。

```bash:
$ cd ~
$ mkdir -m 700 .conf
$ vi .conf/my.cnf
$ cat .conf/my.cnf
[client]
user=db_user
password=db_password

$ chmod 400 .conf/my.cnf
```

cat のところは確認用に実行しているので、実際は不要だ。
もし自動生成された記号混じりパスワードだったりしたら、 `password="DB@Password"` のようにクォートで括っておくと無難だろう。
あとは、この自分用設定ファイルを使ってDBにログインするbashのaliasを作る。

```bash:
$ vim .bashrc
$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
alias myc='mysql --defaults-extra-file=~/.conf/my.cnf'

$ source .bashrc
```

実際に .bashrc に追加したのは最後の一行だけだ。alias名は **my**sql **c**onnect から `myc` とした。
では、使ってみよう。

```bash:
$ myc
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 101
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

一発でMySQLにログインできた。**うひょ～、テンション上がるぜ！**（笑）

この alias の `myc` は結構万能で、データベース指定してログインしたい時は、

```bash:
$ myc database_name
```

──でOKだし、下記のように直接SQLクエリだって発行できる。

```bash:
$ myc -e "select count(*) from database_name.users;"
+----------+
| count(*) |
+----------+
|     1234 |
+----------+
```

いやぁ、今まで`mysql -u ~` とか長ったらしいコマンド打っていた日々から解放されたのがすごくうれしい。

<br>

## よく使いそうなクエリをalias化しておく

MySQLにログインしなくても、よく使うSQLクエリをbashでaliasにしておくと、さらにテンションが上がってくる（笑）
例えば、以下のような感じだ。

### 1. データベースの一覧をls感覚で見る

bashに登録するalias:

```bash:
alias dbls='mysql --defaults-extra-file=~/.conf/my.cnf -s -r -N -e "show databases;"'
```

利用例:

```bash:
$ dbls
information_schema
mysql
performance_schema
sys
```

### 2. データベースのプロセスを確認する

bashに登録するalias:

```bash:
alias dbps='mysql --defaults-extra-file=~/.conf/my.cnf -e "show processlist;"'
```

利用例:

```bash:
$ dbps
+--------+--------+-----------+--------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| Id     | User   | Host      | db           | Command | Time | State        | Info                                                                                                 |
+--------+--------+-----------+--------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| 397495 | db_user | localhost | NULL         | Query   |    0 | starting     | show processlist                                                                                     |
+--------+--------+-----------+--------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
```

プロセスのクエリを省略しないで表示したい場合は、

```bash:
alias dbps='mysql --defaults-extra-file=~/.conf/my.cnf -e "show full processlist \G;"'
```

──としておくと良いかも。

### 3. 全カスタムデータベースのテーブルとDBエンジンの一覧を表示する

bashに登録するalias:

```bash:
alias dbla='mysql --defaults-extra-file=~/.conf/my.cnf -e "select table_name,engine,table_schema from information_schema.tables where table_schema not in (\"information_schema\",\"mysql\",\"performance_schema\",\"sys\");"'
```

### 4. データベースのユーザー一覧を表示する

bashに登録するalias:

```bash:
alias dbusr='mysql --defaults-extra-file=~/.conf/my.cnf -e "select host,user from mysql.user;"'
```

### 5. レプリケーションの状態を確認する

bashに登録するalias:

```bash:
alias dbms='mysql --defaults-extra-file=~/.conf/my.cnf -e "show master status\G"'
alias dbsl='mysql --defaults-extra-file=~/.conf/my.cnf -e "show slave status\G"'
```

### 6. データベースのステータスを確認する

bashに登録するalias:

```bash:
alias dbstat='mysql --defaults-extra-file=~/.conf/my.cnf -e "show status;"'
```

<br><br>

──こんな感じに、よく使う自分用のSQLクエリをalias化していく。
高度なクエリが必要なら、一度MySQL側でストアドプロシージャを組んでおき、bashのaliasからそのストプロを実行するようにすると……やれることは多岐に渡る。

もしかしたら、MySQLのコンソール開かなくてもサービスの保守が完結してしまう──なんて、夢のような業務効率化ができるかもしれない。