なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

MySQLで幸せになれるヤツの続き-列名の行は都度いらなくない?

atsuizo.hatenadiary.jp
で挙げたワンライナーを見て、タイトルのような疑問を持った人もいるかと思いますので、そのへんの補足です。

お好みでどうぞ

「-N」オプションを付与すると、SQL実行毎に表示される列名の行を除外して出力させることができます。

なんで、「-N」なしの例示だったのか

これもCloudWatchLogsでの検索に絡んで、2つの理由があって列名の行を出力させています。

視認性の向上

CloudWatchLogsの情報をManagementConsoleからみるときに、ぱっと見て1回1回の出力結果の切れ目がわかりやすいのです。


もちろん行頭にタイムスタンプを付けて打ち上げているので、そこを見ればいいのですが、あきらかに出力内容が異なるものが行セパレータとして入っていると、視認性が上がります。

フィルタリング操作時の効率化

CloudWatchLogsのフィルタリング(検索)を行う上での都合です。

CloudWatchLogsでは、検索窓に検索キーワードを入力すると、絞り込み(フィルタ)が出来ます。

CloudWatchLogsには、スペース区切り、ダブルクオート併用で、内容をフォーマット認識させることができるのは、前回言及したとおりですが、当然、フィルタリングの際にも、「この列についてこの条件で」というフィルタリングが可能になります。
詳しくはこちらで。
docs.aws.amazon.com




このCloudWatchLogsのフィルタの記述方法には幾つか指定方法があるのですが、基本的には
[列1,列2,列3]
と任意の列名を付与したベースフォーマットを定義しつつ、
[列1,列2=検索キーワード,列3]
と指定することで、特定列に対する条件を付加する事になります。


なお、列名は任意で一意になればよいの、意味が通る列名でもいいし、雑に[a,b,c,d]とかでも通じます。


参考として、SHOW FULL PROCESSLIST(SELECT * FROM information_schema.processlist)の出力の場合、

"ID" "USER" "HOST" "DB" "COMMAND" "TIME" "STATE" "INFO"

に、日付、時刻、を付けたものになるので、

[YMD,HMS,ID,USER,HOST,DB,COMMAND,TIME,STATE,INFO]

みたいに定義しつつ、ヘッダ行排除、このクエリ自身の排除(rootというユーザーで実施)のフィルタを作る場合は、

[YMD,HMS,ID,USER!=USER && USER!=root,HOST,DB,COMMAND,TIME,STATE,INFO]

って具合に書きます。


毎分取得して、60秒を超えるようなクエリが動いていた場合、「TIME<60」、みたいな指定もできますね。


柔軟に検索できるものの、正規表現には対応していないので、そこはAWSさんに頑張ってサポートして欲しいところです。




そんな便利なCloudWatchLogsですが、「このフィルタのベースフォーマットを都度フィルタ窓に書くのが面倒くさい」のです。*1


ログフォーマットの定義を完全に暗記してるかよって話。


そこで、CloudWatchに上がっている内容からコピペである程度持ってこれるよう、打ち上げておく、と。


アドホックな検索が必要なときって、たいてい時間に追われているので、検索の前準備にかける手間は極力減らしたい。
というわけで、良く言えば効率化、悪く言えば、単なる手抜き用に余計なデータを吐いている、という感じです。


まとめ
  • mysqlクライアント起動時に「-N」オプションをつけると、列名を出力しなくなる。
  • CloudWatchLogsに打ち上げるログに列名出力行を含めることは、ゴミではあるが、便利なこともある。
  • 「-N」オプションでカラム名の行を省略するか否かは、お好みでどうぞ。


CloudWatchLogsについてしっかり語った本あったかな?

Amazon Web Services完全ソリューションガイド

Amazon Web Services完全ソリューションガイド

*1:余談だけど、AthenaもS3上のファイルにクエリ投げるために定義を書かなきゃイケナイの、同じように面倒だよね。