DBサーバを運用していく中で、DBやテーブルの件数やサイズを確認したいタイミングがあるでしょう。
また、現在の状態だけではなく、過去の状態はどうだったかも必要になる場合も出てきます。
Elasticsearchを利用して、定期的にテーブルの件数やサイズを保存しておくことで、
あとから確認できるように準備したいと思います。
データ保存用のバッチを作成します。
準備するもの
Elasticsearch 5.6.3
kibana 5.6.3
logstash 5.6.3
JAVA 8
Microsoft SQL Server 用 JDBC Driver
https://docs.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15
Microsoft JDBC Driver 7.4
Elasticsearch、kibanaなどは設定済みとして進めます。
Elasticsearch 192.168.0.37:9200
SQLServer    192.168.0.36:1433 ←このDBサーバの情報を取得します。
バッチは、ElasticsearchとSQLServerに接続できる環境上にあればよいのですが、今回はElasticseachのサーバに格納しました。
DBTableSize.bat
@setlocal enabledelayedexpansion cd /d "%~dp0" SET d=%date% SET yyyy=%d:~-10,4% SET mm=%d:~-5,2% SET dd=%d:~-2,2% SET EXENAME=%0 REM ES取り込み先インデックス名 SET TABLESIZE_INDEX_NAME=dbtable-db2-%yyyy%.%mm% SET ES_SERVER=192.168.0.37 SET LOGSTASH_PATH=C:\App\logstash-5.6.3 REM logstashのpath.settings指定用にスラッシュ区切り版を作成 SET LOGSTASH_PATH_sura=%LOGSTASH_PATH:\=/% call %LOGSTASH_PATH%\bin\logstash.bat -f DBTableSize.conf --path.settings=/%LOGSTASH_PATH_sura%/config | FINDSTR "ERROR" SET RETCODE=!ERRORLEVEL! echo _logstash:!RETCODE! REM 「ERROR」があったら、0 IF "!RETCODE!" EQU "0" ( eventcreate /T ERROR /id 100 /d "%EXENAME% 失敗 Logを確認してください。%LOGSTASH_PATH%\logs" )
TABLESIZE_INDEX_NAME Elasticsearchに作成するインデックス名です。「dbtable-」はテンプレート用のプレフィックス。サーバ名と年月を入れます。
ES_SERVER ElasticsearchのIPアドレス
LOGSTASH_PATH logstashの格納フォルダ
DBTableSize.conf
input {
  jdbc {
    jdbc_driver_library => "C:\App\Microsoft JDBC Driver 7.4 for SQL Server\sqljdbc_7.4\jpn\mssql-jdbc-7.4.1.jre8.jar"
    jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    jdbc_connection_string => "jdbc:sqlserver://192.168.0.36:1433;integratedSecurity=true;"
    jdbc_user => ""
    jdbc_password => ""
    statement => "
sp_executesql N'
SET NOCOUNT ON
create table #tbname (
   [sampledate] datetime
  ,[server_name] varchar(50)
  ,[db_name] varchar(50)
  ,[table_name] varchar(128)
  ,[rows] decimal(13,0)
  ,[pages] decimal(13,0)
  ,[size] decimal(13,0)
 )
 
 
  EXEC sp_MSForEachDB
''use ?;
IF ''''?'''' <> ''''master'''' AND ''''?'''' <> ''''model'''' AND ''''?'''' <> ''''msdb'''' AND ''''?'''' <> ''''tempdb''''
BEGIN
insert into #tbname 
( [sampledate],[server_name],[db_name],[table_name],[rows],[pages],[size])
SELECT
CONVERT(varchar,getdate(),120)
,@@SERVERNAME
,DB_NAME()
,object_name(id)as ''''Table Name'''' 
,rowcnt as ''''Number of Rows''''
,dpages as ''''Number of Pages'''',(dpages * 8  )/1024 ''''サイズ(MB)''''
FROM sysindexes
WHERE indid IN (1,0)
AND OBJECTPROPERTY(id, ''''IsUserTable'''') = 1
END
''
SELECT * FROM #tbname
ORDER BY 1,2,3,4
'
"
  }
}
filter {
}
output {
  elasticsearch {
    hosts => ["${ES_SERVER}:9200"]
    index => "${TABLESIZE_INDEX_NAME}"
    document_type => "dbtable"
    template => "DBTableSize.json"
  }
  stdout {  }
}
jdbc_driver_library java8用jdbcドライバのパスです。
jdbc_connection_string DBサーバの接続文字列で、Windows認証です。SQL認証にする場合は、適宜変更してください。
statement DB、テーブルサイズ取得用のSQL文です。
DBTableSize.json
{
  "template": "dbtable-*",
  "order": 0,
  "index_patterns": [
    "dbtable-*"
  ],
  "settings": {
    "index" : {
        "number_of_shards" : 1, 
        "number_of_replicas" : 0 
    }
  },
  "mappings": {},
  "aliases": {}
}
Elasticsearchのテンプレート
作成したDBTableSize.batを定期的に実行します。
タスクスケジューラに日次タスクとして登録してください。
kibanaの設定
Managementから、Index Patternsを登録します。
Discoverから値を確認できます。
Visualizeにvisualizationを登録しておくと視覚的に確認できます。



