¡Hola, chicos!
¿Todo muy bien?
En esta publicación, demostraré cómo hacer una copia de seguridad de todos los trabajos del Agente SQL Server a través de la línea de comandos (CLR C# o Powershell) y exportar los resultados a scripts SQL. Puede optar por generar 1 script para cada trabajo o 1 script único con todos los trabajos en su instancia.
Durante la migración de SQL Server 2008 R2 a 2014, este script fue especialmente útil, ya que había poco más de 700 trabajos en la instancia del servidor de informes y la tarea de guardar el script de cada uno manualmente no era viable. Hacer una copia de seguridad/restaurar la base de datos msdb podría ser una solución (aunque no creo que sea muy recomendable), pero como se trataba de versiones diferentes de SQL Server, descartamos esta hipótesis.
Recuerde que antes de restaurar trabajos en el nuevo entorno, deberá haber creado inicios de sesión en la nueva instancia. Si no sabe cómo hacer una copia de seguridad de sus inicios de sesión y permisos, visite la publicación SQL Server: cómo transferir inicios de sesión entre instancias generando copias de seguridad de usuarios, inicios de sesión y permisos.
Requisitos previos
Como requisitos previos para utilizar el procedimiento almacenado stpJob_Backup, también necesitarás crear los siguientes objetos:
Utils.ExecutScriptPowerShell (Haz clic aquí para acceder a la publicación)
Ver código fuente
Código fuente del archivo Server.cs
Ver código fuente
Código fuente de la clase de retorno (Haz clic aquí para acceder a la publicación)
Ver código fuente
Código fuente del procedimiento CLR (C#) stpJob_Backup
using System;
using System.Data.SqlTypes;
using Bibliotecas.Model;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void stpJob_Backup(SqlString Ds_Servidor, SqlString Ds_Diretorio_Destino, SqlBoolean Fl_Arquivo_Unico)
{
try
{
var comando = @"
$ServerNameList = """ + Ds_Servidor.Value + @"""
[System.Reflection.Assembly]::LoadWithPartialName(""Microsoft.SqlServer.Smo"") | Out-Null
$objSQLConnection = New-Object System.Data.SqlClient.SqlConnection
foreach ($ServerName in $ServerNameList)
{
Try
{
$objSQLConnection.ConnectionString = ""Server=$ServerName;Integrated Security=SSPI;""
Write-Host ""Tentando se conectar na instância do servidor $ServerName..."" -NoNewline
$objSQLConnection.Open() | Out-Null
Write-Host ""Conectado.""
$objSQLConnection.Close()
}
Catch
{
Write-Host -BackgroundColor Red -ForegroundColor White ""Falha""
$errText = $Error[0].ToString()
if ($errText.Contains(""network-related""))
{Write-Host ""Erro de conexão à instância. Por favor, verifique o nome do servidor digitado, porta ou firewall.""}
Write-Host $errText
continue
}
$OutputFolder = """ + Ds_Diretorio_Destino.Value + @"""
$DoesFolderExist = Test-Path $OutputFolder
$null = if (!$DoesFolderExist){MKDIR ""$OutputFolder""}
$srv = New-Object ""Microsoft.SqlServer.Management.Smo.Server"" $ServerName";
if (Fl_Arquivo_Unico.Value)
{
comando += @"
$srv.JobServer.Jobs | foreach {$_.Script() + ""GO`r`n""} | out-file ""$OutputFolder\jobs.sql""";
}
else
{
comando += @"
$srv.JobServer.Jobs | foreach-object -process {out-file -filepath $(""$OutputFolder\"" + $($_.Name -replace '\\', '') + "".sql"") -inputobject $_.Script() }";
}
comando += @"
}";
var saida = Utils.ExecutaScriptPowerShell(comando);
Retorno.Mensagem(saida);
}
catch (Exception e)
{
Retorno.Erro("Erro : " + e.Message);
}
}
};
Ejemplos de uso
Ahora demostraré cómo utilizar el procedimiento almacenado creado para exportar el script SQL de todos los trabajos del Agente SQL Server. Estos son los trabajos actuales para la instancia.
Ejemplo 1:
En este ejemplo, demostraré cómo exportar el script de creación para todos los trabajos de la instancia, con 1 archivo SQL para cada trabajo.
EXEC CLR.dbo.stpJob_Backup
@Ds_Servidor = N'VM-DBA', -- nvarchar(max)
@Ds_Diretorio_Destino = N'C:\Temp\Jobs', -- nvarchar(max)
@Fl_Arquivo_Unico = 0 -- bit
Ejemplo 2:
En este ejemplo, demostraré cómo exportar el script de creación para todos los trabajos en la instancia, con 1 archivo SQL que contiene el script para todos los trabajos.
EXEC CLR.dbo.stpJob_Backup
@Ds_Servidor = N'VM-DBA', -- nvarchar(max)
@Ds_Diretorio_Destino = N'C:\Temp\Jobs', -- nvarchar(max)
@Fl_Arquivo_Unico = 1 -- bit
Usando solo PowerShell y OLE Automation
Si no desea utilizar CLR para esta solución y solo desea utilizar PowerShell para la base de datos, también puede hacerlo.
Requisitos previos
Como requisitos previos para utilizar el procedimiento siguiente, necesitaremos algunas funciones para manipular archivos. Para hacer esto, usaremos OLE Automation para manipular estos archivos. Para obtener más información sobre esto, consulte la publicación. Operaciones de archivos usando OLE Automation en SQL Server.
stpWrite_File_FSO
Ver código fuente
fncFile_Exists_FSO
Ver código fuente
stpDelete_FSO_File
Ver código fuente
Procedimiento almacenado stpExecut_Script_Powershell
CREATE PROCEDURE [dbo].[stpExecuta_Script_Powershell]
@Ds_Script [varchar](MAX),
@Fl_Apaga_Script [bit] = 1
AS
BEGIN
SET NOCOUNT ON
DECLARE
@QuebraLinha VARCHAR(10) = CHAR(13) + CHAR(10),
@arquivo VARCHAR(MAX),
@diretorio VARCHAR(MAX) = 'C:\Temp\',
@scriptPS VARCHAR(MAX) = CAST(NEWID() AS VARCHAR(50)) + '.ps1',
@caminho VARCHAR(MAX)
SET @caminho = @diretorio + @scriptPS
EXEC dbo.stpEscreve_Arquivo_FSO
@String = @Ds_Script, -- varchar(max)
@Ds_Arquivo = @caminho -- varchar(1501)
SET @scriptPS = @diretorio + @scriptPS
DECLARE @cmd VARCHAR(4000)
SET @cmd = 'powershell -ExecutionPolicy Unrestricted -File "' + @scriptPS + '"'
DECLARE @Retorno TABLE (Ds_Texto VARCHAR(MAX))
INSERT INTO @Retorno
EXEC master.dbo.xp_cmdshell @cmd
-- Apaga o script gerado
IF (@Fl_Apaga_Script = 1)
BEGIN
EXEC dbo.stpApaga_Arquivo_FSO
@strArquivo = @scriptPS -- varchar(1000)
END
SELECT * FROM @Retorno
END
Ejemplo de uso:
DECLARE @Script VARCHAR(MAX) = '
$ServerNameList = "VM-DBA"
$OutputFolder = "C:\Teste\Jobs\"
$DoesFolderExist = Test-Path $OutputFolder
$null = if (!$DoesFolderExist){MKDIR "$OutputFolder"}
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
$objSQLConnection = New-Object System.Data.SqlClient.SqlConnection
foreach ($ServerName in $ServerNameList)
{
Try
{
$objSQLConnection.ConnectionString = "Server=$ServerName;Integrated Security=SSPI;"
Write-Host "Tentando se conectar na instância do servidor $ServerName..." -NoNewline
$objSQLConnection.Open() | Out-Null
Write-Host "Conectado."
$objSQLConnection.Close()
}
Catch
{
Write-Host -BackgroundColor Red -ForegroundColor White "Falha"
$errText = $Error[0].ToString()
if ($errText.Contains("network-related"))
{Write-Host "Erro de conexão à instância. Por favor, verifique o nome do servidor digitado, porta ou firewall."}
Write-Host $errText
continue
}
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerName
# Arquivo único com todos os jobs
# $srv.JobServer.Jobs | foreach {$_.Script() + "GO`r`n"} | out-file "$OutputFolder\jobs.sql"
# Um arquivo por job
$srv.JobServer.Jobs | foreach-object -process {out-file -filepath $("$OutputFolder\" + $($_.Name -replace "\\", "") + ".sql") -inputobject $_.Script() }
}'
EXEC dbo.stpExecuta_Script_Powershell
@Ds_Script = @Script, -- varchar(max)
@Fl_Apaga_Script = 0 -- bit
Usando solo PowerShell
Si solo desea utilizar el script de PowerShell manualmente, a continuación se muestra el script completo.
# Nome da sua máquina
$ServerNameList = "VM-DBA"
# Diretório para salvar os scripts
$OutputFolder = "C:\Jobs\"
$DoesFolderExist = Test-Path $OutputFolder
$null = if (!$DoesFolderExist){MKDIR "$OutputFolder"}
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
$objSQLConnection = New-Object System.Data.SqlClient.SqlConnection
foreach ($ServerName in $ServerNameList)
{
Try
{
$objSQLConnection.ConnectionString = "Server=$ServerName;Integrated Security=SSPI;"
Write-Host "Tentando se conectar na instância do servidor $ServerName..." -NoNewline
$objSQLConnection.Open() | Out-Null
Write-Host "Conectado."
$objSQLConnection.Close()
}
Catch
{
Write-Host -BackgroundColor Red -ForegroundColor White "Falha"
$errText = $Error[0].ToString()
if ($errText.Contains("network-related"))
{Write-Host "Erro de conexão à instância. Por favor, verifique o nome do servidor digitado, porta ou firewall."}
Write-Host $errText
continue
}
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerName
# Arquivo único com todos os jobs
# $srv.JobServer.Jobs | foreach {$_.Script() + "GO`r`n"} | out-file "$OutputFolder\jobs.sql"
# Um arquivo por job
$srv.JobServer.Jobs | foreach-object -process {out-file -filepath $("$OutputFolder\" + $($_.Name -replace "\\", "") + ".sql") -inputobject $_.Script() }
}
Eso es todo, amigos.
Un fuerte abrazo y hasta la próxima.
SQL Server: cómo hacer una copia de seguridad de todos los trabajos del Agente SQL a través de la línea de comandos (CLR C# o Powershell) copia de seguridad restaurar trabajos del agente del servidor SQL línea de comandos
SQL Server: cómo hacer una copia de seguridad de todos los trabajos del Agente SQL a través de la línea de comandos (CLR C# o Powershell) copia de seguridad restaurar trabajos del agente del servidor SQL línea de comandos





Comentários (0)
Carregando comentários…