すべてのSQLサーバーのバックアップ が現在G:ドライブに保存されているサーバーがあります。
ドライブGには、過去5日間のバックアップを保持するのに十分なディスク容量がありません。このG:ドライブにさらに100 GBを追加するように依頼しましたが、それは不可能でした。そのため、下の図に示すように、代わりにI:ドライブにディスク容量を追加してもらいました。
次に、新しいI:ドライブを指すように、以下のSQL ServerジョブのG:ドライブへのすべての参照を置き換える必要があります。
同じ状況で3台のサーバーがあるとすると、T-SQLでこれを実現するにはどうすればよいですか?
このカーソルアプローチを試して、 dbo.sysjobsteps から行を読み取り、変更する文字列の検索/置換を行った後、 sp_update_jobstep を実行できます。
これは、実際に文字列を持つジョブステップのみを更新するように改善することもできます。
DECLARE @cmd VARCHAR(max)
DECLARE @job_id UNIQUEIDENTIFIER
DECLARE @step_id INT
DECLARE @command NVARCHAR(max)
DECLARE _CURSOR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT job_id
,step_id
,command
FROM msdb.dbo.sysjobsteps
OPEN _CURSOR
FETCH NEXT
FROM _CURSOR
INTO @job_id
,@step_id
,@command
WHILE @@FETCH_STATUS = 0
BEGIN
SET @command = replace(@command, 'g:', 'I:')
EXEC msdb.dbo.sp_update_jobstep @job_id = @job_id
,@step_id = @step_id
,@Command = @command
FETCH NEXT
FROM _CURSOR
INTO @job_id
,@step_id
,@command
END --End While
CLOSE _CURSOR
DEALLOCATE _CURSOR
完全を期すために(スクリーンショットから、Olaのバックアップソリューションを使用しているため)、Olaのスクリプトの新しいバージョンには ディレクトリ構造を指定する機能 があります。
デフォルトのディレクトリ構造:{ServerName} $ {InstanceName} {DirectorySeparator} {DatabaseName} {DirectorySeparator} {BackupType}{Partial}{CopyOnly}
問題- DatabaseBackup-構成可能なフォルダー名 は閉じられます。
msdb..sysjobsteps
テーブルを更新できます。
UPDATE s
SET command = Replace(command, 'G:\', 'I:\')
FROM msdb..sysjobsteps s
JOIN msdb..sysjobs o ON s.job_id = o.job_id
WHERE o.[name] LIKE 'DatabaseBackup%'
もう1つは、必要なジョブをスクリプト化し、SSMSを介して実行できるドライブの場所を変更するためのものです。 SQLServerエージェントのジョブをクリックします。
次に、[オブジェクトエクスプローラーの詳細を表示]をクリックするか、を押します F7。
そのウィンドウに入ったら、 ctrl + left click 必要な仕事のために
script jobs
を選択し、drop and create
をクリックします。
これにより、ドロップが作成され、すべてのジョブのスクリプトが1つのスクリプトで作成されます。これが生成されたら、それを確認してドライブの場所を手動で新しい場所に変更するか、SSMSでFind and Replace
を実行できます。
スクリプトを実行して、必要なパラメーターを使用して新しいジョブを作成します。