MySQLの情報取得用のマクロを作ってみました。
取りたい情報を全部とれるか、といったら、
このまま使ったら本当に最低限だけです。
ただ、実行させたいSQLは追加できるので、
不足があれば後から足していけばOKです。
2018/3/3追記:
取ると有益そうな情報を取得するSQLを追加しました。
SHOW ENGINE INNODB STATUSが取れないのが痛い・・・
MySQLステータスチェックマクロ_v2
マクロで書くメリットとしては、
Excelのピボットテーブルでのまとめをする際、
データが元々Excelに入っていればすごくやりやすい、
という点があります。
監視用ツールって色々ありますが、
生の数字を持ち、かつグラフのフォーマットも自由に変えられる、
という点では、なんだかんだExcelは相当優秀です。
もちろん、MySQL Enterprise Monitor, Percona Monitoring and Managementなどの環境があり、
これを使いこなせるならそちらを使った方がいいに決まっているのですが、
普段作業しているWindowsの環境で、
手軽にMySQLの稼働統計を取ってみたい、
というくらいであれば、
サーバー側にコンポーネントを入れたり、
監視用のソフトを入れたりする必要がなく、
単にWindowsのPCとExcel(とMySQLのODBCドライバ)があれば良いので、
使う機会はまあなくはないかな、と思いました。
あと、使ってみて思いましたが、SHOW GLOBAL STATUSとか変数絞らずにやると、
系列数が255を超えてピボットテーブルで表示できないですね。
その辺はまあ、もともとのデータをSHOW GLOBAL STATUS LIKE ‘XXX’とかで絞るか、
一旦255を超える系列数でピボットテーブル作って、フィルターかなんかで絞るか、
でしょうか。
日々の運用を少しだけ楽にしよう、
と思ったらExcel VBAって結構必要で、
Excel VBA書く練習、という意味でも結構面白かったです。
次は他の言語で、sysstatがあることを前提にOS情報も付与する、
とかも考えてみてもいいかな、
と思いました(やるとは言ってない)。
では。
P.S.
最後に、Excel VBAのコードを載せておきます。
マクロ入りファイルをダウンロードするのはキモイ、という人もいると思うので・・・。
Option Explicit
Sub 実行制御()
Dim START_TIME As Variant
Dim END_TIME As Variant
If Range("I6").Value = "" Then
START_TIME = Time
Call MySQLステータスチェック
END_TIME = Time
Application.OnTime Now() + (Range("I5").Value - (TimeValue(END_TIME) - TimeValue(START_TIME))), "実行制御"
Else
MsgBox "定期実行を終了します。"
Exit Sub
End If
End Sub
Sub MySQLステータスチェック()
Dim CON As Object
Dim RS As Object
Dim SQL As Variant
Dim RS_FIELDS As Object
Dim DRIVER_CELL As String
Dim HOST_CELL As String
Dim PORT_CELL As String
Dim USER_CELL As String
Dim MYSQL_PASSWORD As String
Dim RESULT_SECTION_START_AT As Range
Dim RESULT_START_AT As Range
Dim SQL_INFO_START_AT As Range
Dim i As Integer
Dim j As Integer
Dim SQL_LIST_ARRAY As Variant
Dim EXEC_DATETIME As String
''''''''''''''
' コンフィグ '
''''''''''''''
DRIVER_CELL = Range("C5").Value
HOST_CELL = Range("C6").Value
PORT_CELL = Range("C7").Value
USER_CELL = Range("C8").Value
Set RESULT_SECTION_START_AT = Range("B13")
Set SQL_INFO_START_AT = Sheets("情報取得SQL").Range("B3")
''''''''
' MAIN '
''''''''
Sheets("表紙").Activate
If Range("C9").Value = "" Then
MYSQL_PASSWORD = InputBox("MySQLの " & USER_CELL & " ユーザのパスワードを入力してください", "MySQLパスワード入力")
If MYSQL_PASSWORD = "" Then
MsgBox "パスワードが入力されませんでした。プログラムを終了します。"
Exit Sub
End If
Else
MYSQL_PASSWORD = Range("C9").Value
End If
EXEC_DATETIME = Now
Set CON = CreateObject("ADODB.Connection")
On Error GoTo ErrorTrap
CON.Open _
"DRIVER={" & DRIVER_CELL & "};" & _
" SERVER=" & HOST_CELL & ";" & _
" PORT=" & PORT_CELL & ";" & _
" USER=" & USER_CELL & ";" & _
" PASSWORD=" & MYSQL_PASSWORD & ";"
SQL_LIST_ARRAY = Sheets("情報取得SQL").Range(SQL_INFO_START_AT, SQL_INFO_START_AT.End(xlDown)).Value
For Each SQL In SQL_LIST_ARRAY
Set RESULT_START_AT = Cells(RESULT_SECTION_START_AT.Row + RESULT_SECTION_START_AT.Offset(2, 1).CurrentRegion.Rows.count + 1, RESULT_SECTION_START_AT.Column + 1)
Set RS = CON.Execute(SQL)
Set RS_FIELDS = RS.FIELDS
If RESULT_START_AT.CurrentRegion.Rows.count = 1 Then
With RESULT_SECTION_START_AT
.Value = SQL
.Font.Bold = True
.Font.Underline = xlUnderlineStyleSingle
End With
RESULT_START_AT.Value = "実行日時"
For i = 0 To RS_FIELDS.count - 1
Cells(RESULT_START_AT.Row, RESULT_START_AT.Column + 1 + i) = RS_FIELDS(i).Name
Next
With Range(RESULT_START_AT, RESULT_START_AT.End(xlToRight)).Interior
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.249977111117893
End With
End If
' CopyFromRecordsetでは一部データが欠損することがあったので以下の方法。
i = 1
Do Until RS.EOF
Cells(RESULT_START_AT.Row + i, RESULT_START_AT.Column) = EXEC_DATETIME
For j = 1 To RS.FIELDS.count
Cells(RESULT_START_AT.Row + i, RESULT_START_AT.Column + j).Value = RS.FIELDS(j - 1).Value
Next j
i = i + 1
RS.MoveNext
Loop
Call 罫線引き(RESULT_START_AT.CurrentRegion)
Set RESULT_SECTION_START_AT = RESULT_SECTION_START_AT.Offset(0, RESULT_START_AT.CurrentRegion.Columns.count + 2) ' 横に結果を並べたければこちら
RS.Close
Set RS = Nothing
Next
CON.Close
Set CON = Nothing
Exit Sub
ErrorTrap:
MsgBox (Err.Description)
End Sub
Sub 罫線引き(TARGET_CELL As Range)
TARGET_CELL.Borders(xlDiagonalDown).LineStyle = xlNone
TARGET_CELL.Borders(xlDiagonalUp).LineStyle = xlNone
With TARGET_CELL.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With TARGET_CELL.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With TARGET_CELL.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With TARGET_CELL.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With TARGET_CELL.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With TARGET_CELL.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
Exit Sub
ErrorTrap:
MsgBox (Err.Description)
End Sub
Sub 結果削除()
Range(Rows("12:12"), Rows("12:12").End(xlDown)).Delete Shift:=xlUp
End Sub