SQLServerに大量のテストデータを入れる

SQL Serverのパーティション分割の検証で、大量に日付をを含むテストデータが欲しかったので、
http://d.hatena.ne.jp/dotnetmemo/20111015/1318663995
http://d.hatena.ne.jp/qaz76/20110512/1305251400
を参考にしてみた。

先輩方に感謝!

testdata

[code]
# テーブル作成
CREATE TABLE [dbo].[TestTable](
[id] [int] NULL,
[data] [varchar](50) NULL,
[add_date] [datetime2](7) NULL
)

GO
[/code]

[code]
— ランダムな日付返す
CREATE VIEW
V_RAND
AS
SELECT RAND() RND
GO
–UDF
CREATE FUNCTION
RANDNUM
(
@START AS INT,
@END AS INT
)
RETURNS INT
AS
BEGIN
RETURN (SELECT FLOOR(@START + (RND * (@END – @START + 1))) FROM V_RAND)
END
GO

–UDF
CREATE FUNCTION
RANDDATE
(
@START AS DATETIME,
@END AS DATETIME
)
RETURNS DATETIME
AS
BEGIN
RETURN DATEADD(DAY, DBO.RANDNUM(0, DATEDIFF(DAY, @START, @END)), @START)
END
GO

[/code]

[code]
— 100万件レコード作る
— add_dateには、2015/01/01から2016/07/31までの日付をランダムでくっつける(重複あり)
Declare @p_NumberOfRows Bigint
Select @p_NumberOfRows=1000000;
With Base As
(
Select 1 as n
Union All
Select n+1 From Base Where n < Ceiling(SQRT(@p_NumberOfRows))
),
Expand As
(
Select 1 as C From Base as B1, Base as B2
),
Nums As
(
Select Row_Number() OVER(ORDER BY C) As n From Expand
)
INSERT INTO TestTable
Select n, ‘DATA’ + right(‘0000000000’ + convert(varchar, n), 10),dbo.RANDDATE(‘2015/01/01’, ‘2016/07/31’)
from Nums Where n<=@p_NumberOfRows
OPTION (MaxRecursion 0);
[/code]

Let’s EncryptでブログをHTTPS通信にしてみた

参考:Let’s Encrypt 総合ポータル

基本的には上のリンク通りだがメモしておく。
Apache(RPM) + wordpressの構成

[code]
# 実行ファイルを置く場所 ※今回は/usr/bin

cd /usr/bin

# リポジトリ取得
git clone https://github.com/certbot/certbot

# インストール&設定 ※ 事前に80/tcpを落としておく
cd certbot
/usr/bin/certbot-auto certonly -a standalone -m メールアドレス -d www.jhhk-family.net –agree-tos –no-bootstrap

# ssl.conf修正
# 事前にssl.confを設定してたとして、Let’s Encryptに上書きされるので、もう一度修正。
vim /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>
DocumentRoot "/var/www/wordpress"
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

<Directory "/var/www/wordpress/">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</vertualhost>

# 最後にDocumentRoot直下の.htaccessに、rewriteの設定を追加し、HTTP接続をHTTPSにリダイレクトする

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off # 追加
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] # 追加
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

[/code]

Let’s Encryptの有効期限が3ヶ月なので、crontagで毎月更新している人が多い。

00 16 * * 2 root /usr/bin/certbot-auto renew –post-hook “service httod restart”

Elastic CacheにAWS外からアクセスする

基本的にはAWS 外部からの ElastiCache リソースへのアクセスの通り。

Elastic CacheにはAWS以外からのアクセスが出来ないので、
インターネット-[Elastic IP]–[EC2]–[Elastic Cache]
みたいに、中間にEC2インスタンスを噛ます必要がある。

EC2は、PREROUTINGしかt1.microインスタンスでも十分じゃないかな

[code]
#中間のEC2上で

iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 6379 -j DNAT –to ElasticCacheのIP:6379
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save

#/etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -a
[/code]

grafanaを試してみた

CloudwatchをGrafana+Graphiteで見るようにしたら幸せになった件を見たらカッコよかったので試してみた

AWS上にt1.nanoインスタンス(Amazon Linux)を作成し、ここにgrafanaを入れてみる。

Redhat系とはいえ、初めてAmazon Linuxも触ったのでOSの設定も少し入っています。

まずはawscliをインストールする。

pythonのバージョンを確認したら、2.7.10だったので、pipは最初から入っていたが、

/usr/local/bin/pip にPATHが通って居なかったので、まずはPATHを通します。


修正が終わったらsource /root/.bash_profileを忘れずに。

次は、awscliのインストール。


で、やっとgrafanaのインストール。

grafanaはRPMで配っていたので、さくっと。


grafanaを起動する前に、awsのAPIに繋ぐ為の認証情報を設定する。

awscliの認証ファイルは、~/.aws/に保存されるがgrafanaの場合は/usr/share/grafana/.awsに同じファイルを複製してあげればいい。


ここまでやって、grafanaを起動。
初期ポートは3000
アカウント:admin
パスワード:admin
grafana_login.jpg
ログイン後、左上のアイコンをクリックし、DataSourceを選択。
CloudWatchを選択し、接続情報を設定する。

grafana_datasource.jpg

グラフの表示、並べ替えなどはもう少し勉強してから書きます。
grafana_grafh.jpg

トレースフラグを付けてデッドロックを記録する

SQL Serverにはトレースフラグを言うものを付けて、特定のエラーを記録する方法がある。
デットロックを後追いするにはいいかもしれない。

[code]
— 現在のトレースフラグ確認
DBCC TRACESTATUS (1204, 1222)
GO

— 結果
TraceFlag Status Global Session
1204 0 0 0 1222 0 0 0

— トレースフラグ設定
DBCC TRACEON (1204, 1222,-1)
GO

— 結果
TraceFlag Status Global Session
1204 1 1 0 1222 1 1 0

— トレースフラグ設定を消す場合
DBCC TRACEOFF (1204, 1222,-1)
GO
[/code]
カッコ内の番号は、MSサイトを参照

上記はオンラインで変更できるパラメータだが、起動時から有効にするには
SQL Server Configuration Managerで、

[code]
-T1204 -T1222
[/code]

を追加する。

SQLConfigurationManager.png

#error “Unrecognized SSL Toolkit!”

apacheのmod_sslを後から追加しようとしたら、こんなエラーに遭遇

[code]
# /usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c
/usr/local/apache-2.2.31/build/libtool –silent –mode=compile gcc -prefer-pic -DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/openssl/include/openssl -c -o mod_ssl.lo mod_ssl.c && touch mod_ssl.slo
ssl_private.h:60 から include されたファイル中,
mod_ssl.c:27 から:
ssl_toolkit_compat.h:267:2: error: #error "Unrecognized SSL Toolkit!"
In file included from ssl_private.h:86,
from mod_ssl.c:27:
~中略~
ssl_private.h:644: error: declaration for parameter ‘ssl_init_Child’ but no such parameter
mod_ssl.c:572: error: expected ‘{‘ at end of input
apxs:Error: Command failed with rc=65536
[/code]

調べたら、そもそもopensslのソースインストールが失敗してた。
改めて、opensslのインストールをしたけど、こっちもエラーでインストールできない。

[code]
make[2]: Entering directory `/usr/local/src/openssl-1.0.2g’
[ -z "" ] || gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,–noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -Iinclude \
-DFINGERPRINT_PREMAIN_DSO_LOAD -o fips_premain_dso \
fips_premain.c fipscanister.o \
libcrypto.a -ldl -lz
make[3]: Entering directory `/usr/local/src/openssl-1.0.2g’
make[4]: Entering directory `/usr/local/src/openssl-1.0.2g’
/usr/bin/ld: libcrypto.a(rsaz_exp.o): relocation R_X86_64_32 against `.rodata’ can not be used when making a shared object; recompile with -fPIC
libcrypto.a(rsaz_exp.o): could not read symbols: Bad value
collect2: ld returned 1 exit status
make[4]: *** [link_a.gnu] Error 1
make[4]: Leaving directory `/usr/local/src/openssl-1.0.2g’
make[3]: *** [do_linux-shared] Error 2
make[3]: Leaving directory `/usr/local/src/openssl-1.0.2g’
make[2]: *** [libcrypto.so.1.0.0] Error 2
make[2]: Leaving directory `/usr/local/src/openssl-1.0.2g’
make[1]: *** [shared] エラー 2
make[1]: ディレクトリ `/usr/local/src/openssl-1.0.2g/crypto’ から出ます
make: *** [build_crypto] エラー 1
[/code]

このエラーを解決するには、configオプションに、-fPICを付けてあげる
[code]
./config -fPIC –prefix=/usr/local/openssl-1.0.2g shared zlib
make
make install
[/code]

で、もう一度「/usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c」を実行したけど、まだ同じエラーが出る。
ldconfigは実行済みなのに・・・

再度ググって、こちらのページを見つけた。元RX-7乗りの適当な日々
同じことやったら通った!
[code]
/usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto -lssl
[/code]

mysqld.sockが作成出来ない

mysqld.sockの場所をRPM標準の/var/lib/mysql/mysqld.sockから/tmp/mysqld.sockに変更したらmysqlが起動しなくなった件

/var/log/mysqld.logを見ると、
[code]
2016-04-27 19:04:34 19904 [ERROR] Can’t start server : Bind on unix socket: Permission denied
2016-04-27 19:04:34 19904 [ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?
2016-04-27 19:04:34 19904 [ERROR] Aborting
[/code]が記録されていた。

Permission denied?
/tmpディレクトリのパーミッションも777なのに?

su -c “touch /tmp/mysql” mysql
でファイル作れるよ?

調べた結果、/var/log/audit/audit.logに以下のログを発見。
原因はselinuxだった。

[code]
type=AVC msg=audit(1461749417.909:7600470): avc: denied { module_request } for pid=22742 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
type=SYSCALL msg=audit(1461749417.909:7600470): arch=c000003e syscall=41 success=no exit=-97 a0=a a1=1 a2=0 a3=7fff608ad190 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
type=AVC msg=audit(1461749417.911:7600471): avc: denied { create } for pid=22742 comm="mysqld" name="mysql.sock" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1461749417.911:7600471): arch=c000003e syscall=49 success=no exit=-13 a0=c a1=7fff608ad1e0 a2=6e a3=0 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
type=AVC msg=audit(1461749433.190:7600472): avc: denied { module_request } for pid=24545 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
[/code]

setenforce 0を実行後、mysqldの起動が出来るようになった。

/etc/sysconfig/selinuxをみると、SELINUX=disabled
になっているので、誰かが手動で有効にしていたんだろう。

windows用カスタムインストールメディアを作成する

サーバーに新規にWindowsをインストールする時、Windows標準のドライバではデバイスを認識しない事がある。

RAIDカードのドライバが合わなければインストールすら出来ないし、
インストール出来たとしても、NICドライバが合わなければ、USBメモリ等にドライバを入れておいて後からインストールする等、めんどくさいです。

Windowsのインストールメディアを元に、
・RAIDドライバの追加
・NICドライバの追加
・Windowsサービスの有効化(SNMPサービスなど)
を行ったカスタムインストールメディアを作る事が出来たので、素人がハマった箇所をメモします。

基本的な手順は、
http://www.vwnet.jp/Windows/WS12R2/AddDriver/AddDriver2ISO.htm
https://msdn.microsoft.com/ja-jp/library/hh825099.aspx
などを見て下さい。

作った環境は以下になります。
クライアント: Windows 10
メディア  : Windows Server 2008 R2
サーバー  : DELL PowerEdge R720
RAIDカード : PERC H710P Mini
ネットワーク: Intel(R) 10G 2P X520 Adapter 、Intel(R) GbE 4P I350-t rNDC

ハマった箇所(1)ドライバファイルの在り処
DELLのドライバは、実行ファイル形式(exe)で提供されています。
そのままでは追加が出来ないので、ドライバーファイルだけに抜き出します。

http://www.dell.com/support/home/jp/ja/jpdhs1/Drivers/DriversDetails?driverId=XYPYC&fileId=3481042880&osCode=WS8R2&productCode=poweredge-r720&languageCode=jp&categoryId=SF


http://www.dell.com/support/home/us/en/19/Drivers/DriversDetails?driverId=W205T
からドライバファイルをダウンロードし解凍します。※Windows標準機能で解凍できました。

<< RAIDカード >>
SAS-RAID_Driver_XYPYC_WN64_6.803.21.00_A07.EXEを解凍します。
解凍後、SAS-RAID_Driver_XYPYC_WN64_6.803.21.00_A07\payload\にドライバーファイルがあります。

<< ネットワークカード >>
SAS-RAID_Firmware_F9M2Y_WN64_21.3.2-0005_A07.EXEを解凍します。
解凍されたフォルダを見ると、Winx64.pkgというファイルがあるので、これも解凍します。
解凍後、Network_Driver_W205T_WN64_17.0.0_A00\Winx64\Winx64にドライバー群があります。
今回のネットワークカードに必要なドライバーは、PRO1000とPROXGBの2つになります。

ハマった箇所(2) boot.wim と install.wim
各サイトを流し読みしていて気付くのが遅れてしまい、無駄に時間を使ってしまったので。
細かいとこは分かりませんが、以下の認識で間違っていないと思う。
boot.wim   ・・・ RAIDカードなどのWindowsのインストールに必須のドライバーを追加
install.wim ・・・ ネットワークカードなど、後からでもいいドライバーの追加、Windows機能のデフォルト値変更、レジストリ変更もここ

indexを適切に指定しないと間違った場所にドライバを追加してしまう事になる為、
必ず
Dism /Get-WimInfo /WimFile:”インストールメディアのPATH\sources\boot.wim”
Dism /Get-WimInfo /WimFile:”インストールメディアのPATH\sources\install.wim”
を実行して、indexを確認してください。

レジストリ変更と、アプリケーション追加は試していないので、試したら追記します。

続きを読む windows用カスタムインストールメディアを作成する

ジョブを設定を一括で変更する

とりあえず、沢山あるログシッピングのLSCopyとLSRestoreジョブの失敗時のアラートを飛ばしたい。
DBメールの設定と、オペレーターの設定は先に済ませておく。

[code]
USE msdb
GO
declare @job_copy nvarchar(50)
declare @job_restore nvarchar(50)
DECLARE C1_LSCOPY CURSOR FOR
SELECT name FROM dbo.sysjobs where name LIKE ‘LSCopy%’
DECLARE C1_LSRESTORE CURSOR FOR
SELECT name FROM dbo.sysjobs where name LIKE ‘LSRestore%’
OPEN C1_LSCOPY
FETCH NEXT FROM C1_LSCOPY INTO @job_copy
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC dbo.sp_update_job @job_name = @job_copy,
@notify_level_email=2,
@notify_email_operator_name=N’Admin’;
FETCH NEXT FROM C1_LSCOPY INTO @job_copy
END
OPEN C1_LSRESTORE
FETCH NEXT FROM C1_LSRESTORE INTO @job_restore
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC dbo.sp_update_job @job_name = @job_restore,
@notify_level_email=2,
@notify_email_operator_name=N’Admin’;
FETCH NEXT FROM C1_LSRESTORE INTO @job_restore
END
CLOSE C1_LSCOPY
CLOSE C1_LSRESTORE
DEALLOCATE C1_LSCOPY
DEALLOCATE C1_LSRESTORE
GO
[/code]

SQL Serverのslowqueryを監視する

前回覚えたSQL Serverの条件分岐を使って、nagios/icinga用のSlowQuery監視スクリプトを書いてみた。

前提として、こちらを参考に、SlowQuery取得の設定が必要。

NRPE経由で監視する場合は、MAX_PACKETBUFFER_LENGTH等の値の変更をしたら幸せになれます。

[bash]
#!/bin/bash
CMDNAME=`basename $0`
while getopts h:u:p:c:w: OPT
do
case $OPT in
"h" ) FLG_H="TRUE" ; VALUE_H="$OPTARG" ;;
"u" ) FLG_U="TRUE" ; VALUE_U="$OPTARG" ;;
"p" ) FLG_P="TRUE" ; VALUE_P="$OPTARG" ;;
"w" ) FLG_W="TRUE" ; VALUE_W="$OPTARG" ;;
"c" ) FLG_C="TRUE" ; VALUE_C="$OPTARG" ;;
* ) echo "Usage: $CMDNAME [-h HOST_NAME] [-u User] [-p PASS] [-c warnning] [-c critical]" 1&gt;&amp;2
exit 1 ;;
esac
done
_HOST=$VALUE_H
_USER=$VALUE_U
_PASS=$VALUE_P
_WARN=$VALUE_W
_CRIT=$VALUE_C
# 何分前の以降に出たSLOW LOGを対象とする
_TIMESTAMP=’00:05′
#echo "$_HOST, $_USER, $_PASS, $_WARN, $_CRIT"
export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
export FREETDSCONF=/etc/freetds/freetds.conf
# ここからT-SQL処理
TDSVER=8.0 /usr/local/freetds/bin/tsql -H $_HOST -p 1433 -U $_USER -P $_PASS &lt;&lt; _EOF &gt; /tmp/${_HOST}_slowlog.tmp
DECLARE @VERSION_FULL nvarchar(max);
DECLARE @VERSION int;
SET @VERSION_FULL = (SELECT convert (nvarchar(max),SERVERPROPERTY(‘productversion’)));
SET @VERSION = substring(@VERSION_FULL, 1, 2)
DECLARE @DATE VARCHAR(16);
SET @DATE = (select CONVERT(VARCHAR,GETDATE()-‘$_TIMESTAMP’,120));
IF @VERSION = 10
BEGIN
SELECT REPLACE((
SELECT
DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) AS timestamp,
DB_NAME(CAST(event_data as XML).value(‘(/event/action[@name="database_id"]/value)[1]’, ‘sysname’)) AS database_name,
CAST(event_data as XML).value(‘(/event/action[@name="sql_text"]/value)[1]’, ‘nvarchar(max)’) AS sql_text,
CAST(event_data as XML).value(‘(/event/data[@name="duration"]/value)[1]’, ‘bigint’) AS duration,
CAST(event_data as XML).value(‘(/event/data[@name="cpu"]/value)[1]’, ‘bigint’) AS cpu_time
FOR XML PATH (”)), ‘ ‘, ‘ ‘) AS RESULT
from sys.fn_xe_file_target_read_file(
‘C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\Highload_Query*.xel’,
‘C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\Highload_Query*.xem’ ,
NULL,
NULL)
where DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) &gt;= @DATE
END
ELSE
BEGIN
IF @VERSION = 11
BEGIN
SELECT
DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) AS timestamp,
DB_NAME(CAST(event_data as XML).value(‘(/event/action[@name="database_id"]/value)[1]’, ‘sysname’)) AS database_name,
CAST(event_data as XML).value(‘(/event/data[@name="batch_text"]/value)[1]’, ‘nvarchar(max)’) AS batch_textt,
CAST(event_data as XML).value(‘(/event/data[@name="duration"]/value)[1]’, ‘bigint’) AS duration,
CAST(event_data as XML).value(‘(/event/data[@name="cpu_time"]/value)[1]’, ‘bigint’) AS cpu_time
from sys.fn_xe_file_target_read_file(
‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log\Highload_Query*.xel’,
NULL,
NULL,
NULL)
where DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) &gt;= @DATE;
END;
GO
quit
_EOF
IFS_BACKUP=$IFS
IFS=$’\n’
_TIME=(`cat /tmp/${_HOST}_slowlog.tmp | sed -n -e ‘s/.*\(.*\)&lt;\/timestamp&gt;.*/"\1"/p’`)
_DBNAME=(`cat /tmp/${_HOST}_slowlog.tmp | sed -n -e ‘s/.*\(.*\)&lt;\/database_name&gt;.*/"\1"/p’`)
_CPUTIME=(`cat /tmp/${_HOST}_slowlog.tmp |sed -n -e ‘s/.*\(.*\)&lt;\/cpu_time&gt;.*/"\1"/p’`)
_DURATION=(`cat /tmp/${_HOST}_slowlog.tmp | sed -n -e ‘s/.*\(.*\)&lt;\/duration&gt;.*/"\1"/p’`)
_QUERY=(`cat /tmp/${_HOST}_slowlog.tmp | tr ‘\n’ ‘ ‘| sed -e ‘s/&lt;\/cpu_time&gt;/&lt;\/cpu_time&gt;\n/g’| sed -n -e ‘s/.*\(.*\)&lt;\/sql_text&gt;.*/"\1"\n/p’`)
func_message (){
for (( i=0; $i&lt;`echo ${#_TIME[@]}`; i++ ));
do
echo "———-"
echo "TIME: ${_TIME[$i]}"
echo "DBNAME: ${_DBNAME[$i]}"
echo "CPU_TIME: ${_CPUTIME[$i]} ms"
echo "DURATION: ${_DURATION[$i]} us"
echo "${_QUERY[$i]}"
done
IFS=$IFS_BACKUP
}
# check
if [ $_CRIT -le `echo ${#_TIME[@]}` ]
then
echo "CRIT: SlowQuery is `echo ${#_TIME[@]}` | SlowQuerys=`echo ${#_TIME[@]}`;$_WARN;$_CRIT"
func_message
exit 2
elif [ $_WARN -le `echo ${#_TIME[@]}` ]
then
echo "WARN: SlowQuery is `echo ${#_TIME[@]}` | SlowQuerys=`echo ${#_TIME[@]}`;$_WARN;$_CRIT"
func_message
exit 1
elif [ $_WARN -gt `echo ${#_TIME[@]}` ]
then
echo "OK: SlowQuery is `echo ${#_TIME[@]}` | SlowQuerys=`echo ${#_TIME[@]}`;$_WARN;$_CRIT"
exit 0
else
echo "status unknown"
exit 3
fi
[/bash]

使い方
./check_sqlserver_slowquery -h ホスト名orIPアドレス -u ユーザー名 -p パスワード -w ワーニング閾値 -c クリティカル閾値

閾値以下の場合は
OK: SlowQuery is 0 | SlowQuerys=0;3;4
とか表示される。

閾値以上の場合は
CRIT: SlowQuery is 6 | SlowQuerys=6;3;4
———-
TIME: “2016-01-08T10:42:00.427”
DBNAME: “hoge”
CPU_TIME: “3932” ms
DURATION: “4011259” us
“~~遅いクエリ~~”
———-
TIME: “2016-01-08T10:42:07.283”
DBNAME: “hoge”
CPU_TIME: “4431” ms
DURATION: “4481414” us
“~~遅いクエリ~~”

等が表示されます。