Pesquisar neste blog

terça-feira, 7 de abril de 2009

Criando um script de backup para o SQL Server com data no nome do arquivo da base

Olá pessoal,
aqui vai uma dica de como criar arquivos de backup do sqlserver com a data no nome do arquivo, o que nos facilita muito, pois o sqlserver não nos permite isso usando o gerenciador de backups dele, ele apenas nos permite agendar um dump da base.

Bom o script que falo é um arquivo com instruções sql, onde vamos definir as seguintes variáveis:

  1. Setar nome da database na variável @databaseName
  2. Setar o caminho absoluto da pasta onde vai ser armazenado o backup na variável @backupDirectory
  3. Para testar rode o script pelo Query Analyzer.
Depois de executado o script será criado um arquivo com o seguinte formato: Database-07.04.2009.bak

Para agendar o script para rodar diariamente é só criar um new job e na aba steps, campo comand colar o conteúdo do script e pronto.

Ai vai o script:

-----------------------------------------------------------------
-- Backup database to file
-----------------------------------------------------------------
declare @backupFileName varchar(100), @backupDirectory varchar(100),
@databaseDataFilename varchar(100), @databaseLogFilename varchar(100),
@databaseDataFile varchar(100), @databaseLogFile varchar(100),
@databaseName varchar(100), @execSql varchar(1000)

-- Set the name of the database to backup
set @databaseName = 'MinhaDatabase'
-- Set the path fo the backup directory on the sql server pc
set @backupDirectory = 'caminho_absoluto_para_backup_directory' -- such as 'c:\temp\'

--
-- ATENÇÃO: DAQUI PARA BAIXO NÃO PRECISA MECHER EM NADA
--

-- Create the backup file name based on the backup directory, the database name and today's date
set @backupFileName = @backupDirectory + @databaseName + '-' + replace(convert(varchar, getdate(), 110), '-', '.') + '.bak'

-- Get the data file and its path
select @databaseDataFile = rtrim([Name]),
@databaseDataFilename = rtrim([Filename])
from master.dbo.sysaltfiles as files
inner join
master.dbo.sysfilegroups as groups
on
files.groupID = groups.groupID
where DBID = (
select dbid
from master.dbo.sysdatabases
where [Name] = @databaseName
)

-- Get the log file and its path
select @databaseLogFile = rtrim([Name]),
@databaseLogFilename = rtrim([Filename])
from master.dbo.sysaltfiles as files
where DBID = (
select dbid
from master.dbo.sysdatabases
where [Name] = @databaseName
)
and
groupID = 0

print 'Backing up "' + @databaseName + '" database to "' + @backupFileName + '" with '
print ' data file "' + @databaseDataFile + '" located at "' + @databaseDataFilename + '"'
print ' log file "' + @databaseLogFile + '" located at "' + @databaseLogFilename + '"'

set @execSql = '
backup database [' + @databaseName + ']
to disk = ''' + @backupFileName + '''
with
noformat,
noinit,
name = ''' + @databaseName + ' backup'',
norewind,
nounload,
skip'

exec(@execSql)

2 comentários:

Ramos disse...

Se o diretóro de backup for em uma pasta mapeada na rede, funciona?

julicravo disse...

Amigo,

Estou tentando usar o seu script.

quando eu uso ele dentro do "Sql Server Management Studio" funciona tranquilamente.

O problema quando eu executo da seguinte forma:

osql -U sa -P XXXXX -i c:\scripts\scriptsql.sql_3.SQL

Aparece a seguinte mensagem:


C:\scripts>osql -U sa -P w0lw3r1ne==banco==@TM1 -i c:\scripts\scriptsql.sql_3.SQ
L
1> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18> 19> 20> 21> 22> 2
3> 24> 25> 26> 27> 28> 29> 30> 31> 32> 33> 34> 35> 36> 37> 38> 39> 40> 41> 42> 4
3> 44> 45> 46> 47> 48> 49> 50> 51> 52> 53> 54> 55> 56> 57> 58> 59> 60> 61> 62> 6
3> Mensagem 102, Nível 15, Estado 1, Servidor WINSERVER-BANCO\SQLEXPRESS, Linha
1
Sintaxe incorreta próxima a '´'.

C:\scripts>pause
Pressione qualquer tecla para continuar. . .


Alguma Sugestão ??