【小ネタ】TypeORMからMySQLに接続する際program_nameを明示して各種調査の助けにする

地味ですが保守性を向上させるために設定しておきましょう
2023.04.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部@大阪の岩田です。

MySQL5.7から利用可能になったsys.sessionは現在実行中のユーザーセッションに関する情報が確認できるviewです。このviewを通して実行中のSQLをはじめロックに関する情報やトランザクションに関する情報など、様々な情報が確認できます。このように有事の調査に大活躍するsys.sessionですが、このviewにはprogram_nameというカラムがあり、このカラムを有効活用することで接続元のクライアントを識別するのが容易になります。program_nameはクライアントがMySQLサーバーに接続する際に自分で指定する項目で、いわばクライアントがMySQLサーバーに対して「自分のプログラム名はxxです」と「名乗っている」と捉えて良いかもしれません。MySQLのクライアントプログラムを扱う場合は適切なprogram_nameを指定することで、有事の調査がスムーズに進むように備えておきたいところです。

現在自分が関わっているシステムではMySQLにアクセスするためにTypeORMとNode MySQL 2を利用しているのですが、MySQL接続時にprogram_nameを指定してみたので、簡単にではありますが設定手順をご紹介します。

ライブラリのバージョン

今回利用したライブラリのバージョンは以下の通りです

  • TypeORM: 0.3.9
  • Node MySQL 2: 2.3.3

やってみる

TypeORMから普通にMySQLに接続してみる

まずTypeORMの使い方についておさらいです。MySQLに接続する際は以下のようなコードを記述します。

const AppDataSource = new DataSource({
      type: 'mysql',
      host: 'MySQLサーバーのホスト名やIPアドレス',
      username: 'DBユーザー名',
      password: 'パスワード',
})
// AppDataSourceを利用する諸々のコードを記述

このようなコードで接続すると、sys.sessionのprogram_nameはNULLになります。

mysql> select thd_id,conn_id,user,db,program_name from  sys.session ;
+--------+---------+---------------------+----------+--------------+
| thd_id | conn_id | user                | db       | program_name |
+--------+---------+---------------------+----------+--------------+
|     52 |      10 | typeorm@172.18.0.1  | typeorm  | NULL         |
|     51 |       9 | root@localhost      | mysql    | mysql        |
+--------+---------+---------------------+----------+--------------+

TypeORMからprogram_nameを指定してMySQLに接続してみる

program_nameを指定して接続するには以下のようにします。

const AppDataSource = new DataSource({
      type: 'mysql',
      host: 'MySQLサーバーのホスト名やIPアドレス',
      username: 'DBユーザー名',
      password: 'パスワード',
      extra: {
        connectAttributes: {
          program_name: 'TypeORM',
        },
      },
})
// AppDataSourceを利用する諸々のコードを記述

元々のコードに extraを追加しています。このextraで指定したオブジェクトはTypeORMの下層で利用しているDBドライバのオプションに直接渡されます。今回のケースだとDBドライバにはNode MySQL 2を利用しているので、Node MySQL2のオプションにconnectAttributesを指定したのと同じ効果になります。このconnectAttributesというオブジェクトでprogram_nameを指定すると、指定した文字列がsys.sessionのprogram_nameにも反映されます。

改めてsys.sessionを確認すると...

mysql> select thd_id,conn_id,user,db,program_name from  sys.session ;
+--------+---------+---------------------+----------+-----------------+
| thd_id | conn_id | user                | db       | program_name    |
+--------+---------+---------------------+----------+-----------------+
|     52 |      10 | typeorm@172.18.0.1  | typeorm  | TypeORM         |
|     51 |       9 | root@localhost      | mysql    | mysql           |
+--------+---------+---------------------+----------+-----------------+

無事にprogram_nameが反映されました!

まとめ

ものすごく地味な改善ではありますが、こういう細かな積み重ねがシステムの保守性に影響してきます。運用開始当初は1つのシステムからしかDBに接続していなかったのに、時を経るにつれて別の外付けプログラムからもDBに接続するようになり...というのは割とシステムあるあるだと思うので、初期開発時からこういった細かな小技を意識しておきたいですね。

参考