Scripts de linha de comando para restaurar os 4 bancos de dados do sistema do MS SQL Server 2008

3

alguém pode me dar alguns conselhos sobre como restaurar os 4 bancos de dados do sistema (master, msdb, model, tempdb) de um sql server 2008, por favor?

Eu já fiz alguns testes (restaurando o banco de dados mestre) com o seguinte script de linha commando:

::set variables
set dbname=master
set dbdirectory=C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA
title Restoring %dbname% database
net stop mssqlserver
cd C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn
sqlservr -m
sqlcmd -Slocalhost -E -Q "restore database master from disk='c:\master.bak' WITH REPLACE" 
net start mssqlserver
pause

Após a execução do comando sqlservr -m (usado para iniciar a instância do servidor no modo de usuário único, que é necessário apenas ao restaurar o banco de dados MASTER), o script é interrompido. Então, para executar os dois últimos comandos, preciso separar o script em dois scripts menores e executá-los um após o outro.

Alguém tem uma ideia de como eu posso mesclá-los em um único script que é executado completamente sem qualquer interrupção?

Eu também quero restaurar os outros 3 bancos de dados do sistema usando scripts de linha de comando como este. Alguém pode me aconselhar como eu preciso continuar? Eu já notei que restaurar o temdb não é tão fácil, mas tem que haver uma maneira ...

Aguardamos seus conselhos!

    
por ciscokid 12.05.2010 / 21:37

2 respostas

1

Como mencionado nos comentários, você não faz backup / restauração de TEMPDB.

Para fazer com que o script continue após o comando sqlservr -m , você precisa "colocar em segundo plano" o comando. Para fazer isso, use o comando start na frente dele. Algo como:

start sqlservr -m

deve funcionar. Depois disso, você precisará aguardar que o SQL Server realmente inicie antes de emitir qualquer comando. No Windows 2003, você pode obter sleep.exe do Windows 2003 Resource Kit para fazer isso. No Windows 2008, você pode usar o comando timeout.exe . Você precisará programar algumas startups para ter uma ideia de exatamente quanto tempo esperar antes de tentar as restaurações (e adicionar um pouco de tempo para isso, apenas no caso ...)

No que diz respeito à restauração do msdb e do modelo, deve haver mais 2 restaurações simples do sqlcmd, exatamente como a que você tem para o mestre. Você também precisa certificar-se de parar a instância do SQL Server antes de reiniciar o serviço.

O script final seria parecido com:

::set variables
set dbdirectory=C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA
title Restoring system databases
net stop mssqlserver
cd C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn
start sqlservr -m
timeout /t 60
sqlcmd -Slocalhost -E -Q "restore database master from disk='c:\master.bak' WITH REPLACE" 
sqlcmd -Slocalhost -E -Q "restore database msdb from disk='c:\msdb.bak' WITH REPLACE" 
sqlcmd -Slocalhost -E -Q "restore database model from disk='c:\model.bak' WITH REPLACE" 
taskkill /im sqlservr.exe
net start mssqlserver
pause

Não deixe de conferir este artigo de technet também.

nota: Eu não testei isso, suponho que suas declarações sqlcmd estejam corretas aqui ...

    
por 13.05.2010 / 16:43
1

Em vez de "taskkill / im sqlservr.exe" para parar o mecanismo do SQL Server, uma maneira mais clara é a seguinte:

sqlcmd -Slocalhost -E -Q "shutdown"

O "shutdown" é um comando T-SQL que pode ser emitido para o mecanismo SQL através de qualquer tipo de conexão, então funciona mesmo quando "net stop mssqlserver" não, como no modo de usuário único. Também pode ser feito a partir de uma conexão administrativa. (Eu não tentei, mas pode até funcionar em um procedimento armazenado. Muito divertido em 1 de abril!)

    
por 12.02.2011 / 04:41