128 lines
4.1 KiB
Transact-SQL
128 lines
4.1 KiB
Transact-SQL
USE [master]
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [dbo].[sp_RestaurarBackup]
|
|
GO
|
|
|
|
CREATE PROCEDURE [dbo].[sp_RestaurarBackup]
|
|
@Arquivo NVARCHAR(500) = NULL,
|
|
@Tipo CHAR(1) = 'F' -- 'F' = FULL | 'D' = DIFERENCIAL
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
-- =============================================
|
|
-- Se não informar arquivo, lista os disponíveis
|
|
-- =============================================
|
|
IF @Arquivo IS NULL
|
|
BEGIN
|
|
PRINT '>>> Backups disponíveis no histórico:';
|
|
|
|
SELECT
|
|
ROW_NUMBER() OVER (ORDER BY bs.backup_finish_date DESC) AS N,
|
|
CASE bs.type
|
|
WHEN 'D' THEN 'FULL'
|
|
WHEN 'I' THEN 'DIFERENCIAL'
|
|
END AS Tipo,
|
|
bmf.physical_device_name AS Arquivo,
|
|
bs.backup_start_date AS Inicio,
|
|
bs.backup_finish_date AS Fim,
|
|
CAST(bs.backup_size / 1024.0 / 1024.0 AS DECIMAL(10,2)) AS TamanhoMB
|
|
FROM msdb.dbo.backupset bs
|
|
JOIN msdb.dbo.backupmediafamily bmf
|
|
ON bs.media_set_id = bmf.media_set_id
|
|
WHERE bs.database_name = 'Levelcode-LevelOS'
|
|
ORDER BY bs.backup_finish_date DESC;
|
|
|
|
PRINT '>>> Copie o caminho do arquivo desejado e execute:';
|
|
PRINT '>>> EXEC sp_RestaurarBackup @Arquivo = ''caminho_aqui'', @Tipo = ''F''';
|
|
RETURN;
|
|
END
|
|
|
|
-- =============================================
|
|
-- Verifica o arquivo com RESTORE HEADERONLY
|
|
-- =============================================
|
|
BEGIN TRY
|
|
RESTORE HEADERONLY FROM DISK = @Arquivo;
|
|
END TRY
|
|
BEGIN CATCH
|
|
RAISERROR('Arquivo não encontrado ou inválido: %s', 16, 1, @Arquivo);
|
|
RETURN;
|
|
END CATCH
|
|
|
|
-- =============================================
|
|
-- Coloca o banco em SINGLE_USER
|
|
-- =============================================
|
|
PRINT '>>> Preparando banco para restauração...';
|
|
|
|
BEGIN TRY
|
|
ALTER DATABASE [Levelcode-LevelOS]
|
|
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT '>>> Aviso: ' + ERROR_MESSAGE();
|
|
END CATCH
|
|
|
|
-- =============================================
|
|
-- Restauração FULL
|
|
-- =============================================
|
|
IF @Tipo = 'F'
|
|
BEGIN
|
|
PRINT '>>> Restaurando FULL: ' + @Arquivo;
|
|
|
|
RESTORE DATABASE [Levelcode-LevelOS]
|
|
FROM DISK = @Arquivo
|
|
WITH REPLACE,
|
|
NORECOVERY,
|
|
STATS = 10;
|
|
|
|
ALTER DATABASE [Levelcode-LevelOS] SET MULTI_USER;
|
|
|
|
PRINT '>>> FULL restaurado com sucesso!';
|
|
PRINT '>>> Se tiver diferencial execute: EXEC sp_RestaurarBackup @Arquivo = ''caminho_diff'', @Tipo = ''D''';
|
|
PRINT '>>> Se não tiver diferencial execute: RESTORE DATABASE [Levelcode-LevelOS] WITH RECOVERY;';
|
|
END
|
|
|
|
-- =============================================
|
|
-- Restauração DIFERENCIAL
|
|
-- =============================================
|
|
IF @Tipo = 'D'
|
|
BEGIN
|
|
PRINT '>>> Aplicando DIFERENCIAL: ' + @Arquivo;
|
|
|
|
RESTORE DATABASE [Levelcode-LevelOS]
|
|
FROM DISK = @Arquivo
|
|
WITH RECOVERY,
|
|
STATS = 10;
|
|
|
|
ALTER DATABASE [Levelcode-LevelOS] SET MULTI_USER;
|
|
|
|
PRINT '>>> Banco restaurado e online!';
|
|
END
|
|
END
|
|
GO
|
|
|
|
--Como usar --
|
|
-- 1. Lista os backups disponíveis
|
|
EXEC [master].[dbo].[sp_RestaurarBackup];
|
|
|
|
-- 2. Restaura apenas o FULL (sem diferencial)
|
|
EXEC [master].[dbo].[sp_RestaurarBackup]
|
|
@Arquivo = '/var/opt/mssql/backups/Levelcode-LevelOS_FULL_20260413_020000.bak',
|
|
@Tipo = 'F';
|
|
|
|
-- Finaliza o banco após o FULL sem diferencial
|
|
RESTORE DATABASE [Levelcode-LevelOS] WITH RECOVERY;
|
|
|
|
-- 3. Restaura FULL + DIFERENCIAL (sequência completa)
|
|
EXEC [master].[dbo].[sp_RestaurarBackup]
|
|
@Arquivo = '/var/opt/mssql/backups/Levelcode-LevelOS_FULL_20260413_020000.bak',
|
|
@Tipo = 'F';
|
|
|
|
EXEC [master].[dbo].[sp_RestaurarBackup]
|
|
@Arquivo = '/var/opt/mssql/backups/Levelcode-LevelOS_DIFF_20260413_080000.bak',
|
|
@Tipo = 'D';
|
|
|
|
EXEC [master].[dbo].[sp_RestaurarBackup]
|
|
@Arquivo = '/var/opt/mssql/backups/Levelcode-LevelOS_FULL_20260413_072013.bak',
|
|
@Tipo = 'F'; |