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を登録しておくと視覚的に確認できます。