ベストプラクティスとして、すべてのSQLエージェントジョブがテキストファイルに出力を記録する必要があるアクティビティをスケジュールしようとしています。
手動でこれを単一のジョブに対して実行できます。しかし、私はスクリプトまたはより良い方法のいずれかでより良い方法を探しています。サーバーごとに約80〜90のジョブについて、この変更を行うことができます。
さらに、QA、UAT、および製品でこれを行う必要があり、100台を超えるサーバーをカバーしています。
出力が生成されるログファイルのパスがサーバー/ジョブ全体で共通である必要があるため、これをどのようにして最良の方法で達成できるかについて、経験または役立つリンクを共有してください。
Msdbデータベースには、出力プロパティのみを変更する機能など、さまざまな方法でジョブステップを変更できるストアドプロシージャが含まれています。
次のコードは、「出力ファイル」が指定されていないすべてのジョブステップを変更するために必要なコマンドを出力し、ジョブステップの出力がC:\temp\job_name_here.txt
に書き込まれるようにします。出力は、ジョブステップが実行されるたびに上書きされます。
USE msdb;
DECLARE @OutputPath nvarchar(260);
DECLARE @cmd nvarchar(max);
SET @OutputPath = N'C:\temp';
DECLARE @msg nvarchar(1000);
SET @msg = N'
/*
flags:
0 - overwrite output file
2 - append to output file
4 - Write T-SQL output to step history in MSDB
8 - Write log to table (overwrite existing)
16 - Write log to table (append)
*/
';
PRINT @msg;
DECLARE cur CURSOR LOCAL FORWARD_ONLY LOCAL
FOR
SELECT N'EXEC msdb.dbo.sp_update_jobstep @job_id = N''{' + CONVERT(varchar(50), (sj.job_id)) + N'}''
, @step_id = ' + CONVERT(nvarchar(30), sjs.step_id) + '
, @output_file_name = N''' + @OutputPath + N'\' + sj.name + N'_Step_' + CONVERT(nvarchar(10), sjs.step_id) + N'.txt''
, @flags = 0;
'
FROM dbo.sysjobs sj
INNER JOIN dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
WHERE sjs.output_file_name IS NULL OR sjs.output_file_name = ''
ORDER BY sj.name
, sjs.step_id;
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
IF LEN(@cmd)>4000
BEGIN
SET @msg = 'Output of the next command is truncated.';
RAISERROR (@msg, 14, 1);
END
PRINT @cmd;
--EXEC sys.sp_executesql @cmd; --uncomment this line to actually run the command
FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
「登録済みサーバー」機能を使用してSSMSでローカルサーバーグループを作成し、目的のサーバーをそのグループに追加して、グループに対してクエリを実行することにより、これを複数のサーバーに対して実行できます。
与えられた:
サーバーあたり約80〜90個のジョブ。
そして:
QA、UAT、および製品でこれを行う必要があり、100台を超えるサーバーをカバーしています。
実際にマルチサーバー管理を調べる必要があります。これにより、ジョブ(およびスケジュール)を追加/削除/変更するサーバーに「マスター」サーバーを設定し、それらの定義を取得する任意の数の「ターゲット」を設定できます。