Usuário com melhor resposta
Backup

Pergunta
-
Ola amigos...
Como executo o codigo abaixo dentro de um Windows Forms.
USE master
exec sp_addumpdevice 'disk','Backup_Agenda','C:\Petrarca\Backup\Backup Agenda.bak'BACKUP DATABASE Agenda to Backup_Agenda
Completando:
Na verdade estou querendo que o usuário clique em um botão para fazer o Backupe em outro para fazer o Restore
Respostas
-
Olá Petrarca,
Achei que você ainda estava com o problema mas se continua "funcionando perfeito"...
Para restaurar o backup você irá utilizar o método Connect para conectar-se ao servidor. Feito isso é necessário emitir o comando de restore (através do método). O problema é que se você se conectar ao banco Agencia, você não poderá restaurá-lo porque ele estará em uso (mesmo que por você mesmo). Você também não pode eliminar as conexões, pois, estará tentando eliminar a sua própria conexão.
A idéia dessa propriedade é fazer com que você conecte-se ao banco de dados MASTER e assim possa efetuar a restauração do banco. Como sua conexão é no MASTER não haverá impecilhos pelo próprio processo de restore.
Se funcionou, mesmo sem essa propriedade, é porque possivelmente você já se conectava no MASTER e entendo que o problema já estava resolvido.
[ ]s,
Gustavo Maia Aguiar
Todas as Respostas
-
Petrarca,
No Books On-Line do SQL Server faça uma pesquisa sobre SMO, com certeza você vai encontrar muita informações.
Mas recentemente aqui no fórum este assunto foi muito discutivo, realize uma pesquisa, inclusive o Fabiano Amorim realizou um webcast sobre SQL Server + Windows Forms.
-
-
-
Ola Demétrio
- O sistema é uma Agenda Financeira que será distribuída gratuitamente para muitos clientes.
- O cliente não terá nenhuma assistência pessoal de nossa parte.
- Não se trata de um banco que necessite de uma segurança muito aprimorada.
- Alem do mais quando o cliente encerra a aplicação o sistema verifica se houve alguma alteração no banco epergunta se deseja ou não fazer backup.
Gostaria de saber se é possível fazer o Backup e o Restore dentro de um sistema Windows Forms
simplesmente clicando em dois botões.
Obrigadp por sua atenção.
Abraços Petrarca
-
-
Petrarca,
Você encontra os vídeos no endereço:
http://www.microsoft.com/brasil/msdn/eventos/webcasts.mspx
Abraços
-
Caso ainda não tenha encontrado...
Manipulando o SQL Express com SMO e Management Studio Express
Espero que seja útil, e
Qualquer dúvida é só postar...
Abraço.
-
Ola Fabiano
Assisti o video.
Fiz dois procedimentos um para Backup e outro para Restore
O Backup esta funcionando perfeito.
O restore esta dando erro:
Não consegui descobrir o erro.
Sub BackupPrincipal()
Try
Dim CompServer As New Server
CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"
CompServer.ConnectionContext.LoginSecure = True
CompServer.ConnectionContext.Connect()Dim bkp As New Backup
bkp.Action = BackupActionType.Database
bkp.Database = "Agenda"
bkp.Devices.Clear()
bkp.Incremental = False
bkp.Initialize = True
bkp.LogTruncation = BackupTruncateLogType.Truncate
bkp.Devices.Add(New BackupDeviceItem("C:\Petrarca\Backup\Backup da Agenda.Back", DeviceType.File))
bkp.PercentCompleteNotification = 10
bkp.SqlBackup(CompServer)
Catch ex As Exception
MessageBox.Show(ex.Message, Petra, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub btnRestaurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestaurar.Click
If MessageBox.Show("Deseja restaurar o banco de dados.", Petra, _
MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
Windows.Forms.DialogResult.No Then
Exit Sub
End If
Try
Dim CompServer As New Server
CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"
CompServer.ConnectionContext.LoginSecure = True
CompServer.ConnectionContext.Connect()Dim RestoreBkp As New Restore
RestoreBkp.Devices.Clear()
RestoreBkp.Devices.Add(New BackupDeviceItem("C:\Petrarca\Backup\Backup da Agenda.Back", DeviceType.File))
RestoreBkp.Database = "Agenda"
RestoreBkp.SqlRestore(CompServer)
MsgBox("ok")Catch ex As Exception
MessageBox.Show(ex.Message, Petra, MessageBoxButtons.OK, MessageBoxIcon.Error)
End TryEnd Sub
Retorna este erro:
{"Não foi possível obter o acesso exclusivo porque o banco de dados está sendo usado.
RESTORE DATABASE está sendo encerrado de forma anormal."}Abraços...
-
Boa Tarde,
Não há erro no código. O problema é que você não poderá restaurar um banco se ele estiver sendo utilizado (a menos que você o restaure com o outro nome e coloque os arquivos em outro local).
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
-
Olá Petrarca,
Para fazer o RESTORE fazendo a sobrescrita, você deverá mudar a propriedade ReplaceDatabase para true do objeto RestoreBKP antes da chamada ao método SqlRestore. Se alguém estiver conectado, esse comando também não irá funcionar. Nesse caso, é bom advertir o usuário que é necessário que não haja nenhuma conexão à base.
[ ]s,
Gustavo Maia Aguiar
-
-
Colla,
Você esta querendo dizer em deixar o banco com a permissão de acesso single_user, realizar o restore e depois voltar para multi-user!!!
Outra possibilidade seria verificar quais são as sessões que estão conectadas ao banco e realizar o Kill sobre estas sessões.
-
Bom dia Gustavo
Fiz a mudança da propriedade ReplaceDatabase para true do objeto RestoreBKP
antes da chamada ao método SqlRestore, mas continua dando o erro.Verifiquei o erro Em View Detail
Inner Exception
Inner Execption{"Não foi possível obter o acesso exclusivo porque o banco de dados está sendo usado.
RESTORE DATABASE está sendo encerrado de forma anormal."}
Private Sub btnRestaurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestaurar.Click
If MessageBox.Show("Deseja restaurar o banco de dados.", Petra, _
MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
Windows.Forms.DialogResult.No Then
Exit Sub
End If
Try
Dim CompServer As New Server
CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"
CompServer.ConnectionContext.LoginSecure = True
CompServer.ConnectionContext.Connect()Dim RestoreBkp As New Restore
RestoreBkp.Devices.Clear()
RestoreBkp.Devices.Add(New BackupDeviceItem(ParCaminhoDoBackup & "\" & StrFileBackup, DeviceType.File))
RestoreBkp.Database = "Agenda"
RestoreBkp.ReplaceDatabase = True
RestoreBkp.SqlRestore(CompServer)MsgBox("ok")
Catch ex As Exception
MessageBox.Show(ex.Message, Petra, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Outras Informações:É um SqlServer Express
O sistema funciona somente na máquina local (Único usuário)
O restore é feito na saida do sistema, portanto não tem ninguem conectado. -
Olá Petrarca,
Quando você está chamado o método Connect(), você está abrindo uma conexão.
Verifique se o DEFAULT DATABASE do login utilizado nessa conexão não é o próprio banco, se for, você terá que mudar o DEFAULT DATABASE para o MASTER.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
Petrarca,
Se você vai restaurar um backup é aconselhável que o componente que você esta utilizando para fazer a conexão ao SQL Server não esteja direcionando seu acesso ao banco que você deseja restaurar.
Se você estiver trabalhando com o SQL Server Express recomendo deixar habilitada a opção AutoClose, desta forma,
ao ser definida como ON, o banco de dados será desligado corretamente, e seus recursos serão liberados após a saída do último usuário. O banco de dados reabre automaticamente quando um usuário tenta usar o banco de dados novamente.
Ao ser definida como OFF, o banco de dados permanecerá aberto após a saída do último usuário.
-
-
Olá Petrarca,
Esse é o problema. Se você desejar fazer um restore, o banco de dados não pode ser utilizado. Ao conectar-se nele, você está inviabilizando o RESTORE (mesmo que seja sua própria conexão). Você deve alterar o Initial Catalog para MASTER. Assim a conexão é feita ao servidor, mas o banco de dados ficará sem ninguém conectado.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
-
-
Olá Petrarca,
Então há mais alguém conectado. Sugiro os seguintes passos:
- Mantenha a string de conexão dessa forma
- Utilize sua aplicação até o momento do RESTORE
- Abra o Profiler contra o seu servidor e monitore o evento Session:Existing Connections (já está selecionado por padrão)
Verifique quais são as conexões contra o servidor. Se for alguma de aplicação, certifique-se de adaptar o código para que ela não se repita. Se for alguma outra (SQL Management Studio, Query Analyser, etc) feche-a.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
-
-
crie um objeto connection so para rodar o restore do backup e coloque o initial catalog para o master como o gustavo falou, para matar as conex ativas usando a coexao que vc. tem so para o restore antes de executar o restore manda um exec com alter database nome set single_user with rollback immediate que vai rodar.
abs;
-
Olá Petrarca,
Você terá que informar o banco MASTER apenas na string de conexão que irá realizar o backup. A string de conexão utilizada nos demais acessos da aplicação não devem ser alteradas. Se você centralizou a string de conexão (o que é correto), terá que abrir essa pequena exceção para o processo de RESTORE.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
-
Olá Petrarca,
Não acho que esse seja o problema, mas para habilitar o AUTOCLOSE, você pode ir nas propriedades do banco através do SQL Server Management Studio, ou se preferir fazer via TSQL.
Code SnippetALTER DATABASE Agencia SET AUTO_CLOSE ON[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
-
Ola Gustavo
Não acho que esse seja o problema, mas para habilitar o AUTOCLOSE, você pode ir nas propriedades do banco através do SQL Server Management Studio, ou se preferir fazer via TSQL.
Realmente você tinha razão, mudei nas propriedade do banco e ficou na mesma.
Falando que o banco esta sendo usado.
-
Olá Petrarca,
Você prosseguiu com as alterações que lhe falei na string de conexão ? É possível utilizar duas strings (uma para as rotinas normais e uma para o restore ?)
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
Gustavo...
Eu não consegui visualizar como a segunada string de conexao vai entrar no código abaixo.
Try
Dim CompServer As New Server
CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"
CompServer.ConnectionContext.LoginSecure = True
CompServer.ConnectionContext.Connect()
Dim RestoreBkp As New Restore
RestoreBkp.Devices.Clear()
RestoreBkp.Devices.Add(New BackupDeviceItem(ParCaminhoDoBackup & "\" & StrFileBackup, DeviceType.File))
RestoreBkp.Database = "Agenda"
RestoreBkp.ReplaceDatabase = True
RestoreBkp.SqlRestore(CompServer)
MsgBox("ok")
Catch ex As Exception
MessageBox.Show(ex.Message, Petra, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
-
Ola pessoal...
O negocio é genial.
Fiz outro projeto exe separado com um único formulário.
Não fiz nenhuma string de conexão somente coloquei dois botões no formulario e copiei o codigo.
Adivinha o que aconteceu...
Funcionou tanto fazendo o Backup com Restore.
Mas ainda na desisti de fazer funcionar dentro do sistema principal, ate porque tem uns
moderadores cobras me ajudando.
Se servir para alguem o código vai abaixo:
Eu uso o VisualStudio 2005
Referênciar:
Microsoft.SqlServer.ConectionInfo
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoEnum
Microsoft.SqlServer.Enum
No Formulário:
Imports
Microsoft.SqlServer.Management.SmoPublic
Class Form1Private
Sub btnBackup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBackup.ClickCompServer.ConnectionContext.DatabaseName = "Master"
CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"
CompServer.ConnectionContext.LoginSecure =
TrueCompServer.ConnectionContext.Connect()
Dim bkp As New Backupbkp.Action = BackupActionType.Database
bkp.Database =
"Agenda"bkp.Devices.Clear()
bkp.Incremental =
Falsebkp.Initialize =
Truebkp.LogTruncation = BackupTruncateLogType.Truncate
bkp.Devices.Add(
New BackupDeviceItem("C:\Petrarca\Backup\BackupAgenda.bak", DeviceType.File))bkp.PercentCompleteNotification = 10
bkp.SqlBackup(CompServer)
MsgBox(
"ok") Catch ex As ExceptionMessageBox.Show(ex.Message,
End
SubPrivate Sub btnRestaurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestaurar.Click
If MessageBox.Show("Deseja restaurar o banco de dados.", "Petra", _
MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
Windows.Forms.DialogResult.No Then
CompServer.ConnectionContext.DatabaseName = "Master"
CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"
CompServer.ConnectionContext.LoginSecure =
TrueCompServer.ConnectionContext.Connect()
Dim RestoreBkp As New Microsoft.SqlServer.Management.Smo.RestoreRestoreBkp.Devices.Clear()
RestoreBkp.Devices.Add(
New BackupDeviceItem("C:\Petrarca\Backup\BackupAgenda.bak", DeviceType.File))RestoreBkp.Database =
"Agenda"RestoreBkp.ReplaceDatabase =
TrueRestoreBkp.SqlRestore(CompServer)
MsgBox(
"ok")Catch ex As Exception
MessageBox.Show(ex.Message, "Petra", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
-
Olá Petrarca,
Mude a propriedade DatabaseName de CompServer.ConnectionContext para o MASTER.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
-
Olá Petrarca,
Estou sem o Visual Studio no momento, mas ficaria algo similar ao abaixo:
Code SnippetPrivate Sub btnRestaurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestaurar.Click
If MessageBox.Show("Deseja restaurar o banco de dados.", "Petra", _
MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
Windows.Forms.DialogResult.No Then
CompServer.ConnectionContext.DatabaseName = "Master"
CompServer.ConnectionContext.ServerInstance =
"PETRARCA\SQLEXPRESS"CompServer.ConnectionContext.LoginSecure =
TrueCompServer.ConnectionContext.Connect()
Dim RestoreBkp As New Microsoft.SqlServer.Management.Smo.RestoreRestoreBkp.Devices.Clear()
RestoreBkp.Devices.Add(
New BackupDeviceItem("C:\Petrarca\Backup\BackupAgenda.bak", DeviceType.File))RestoreBkp.Database =
"Agenda"RestoreBkp.ReplaceDatabase =
TrueRestoreBkp.SqlRestore(CompServer)
MsgBox(
"ok")Catch ex As Exception
MessageBox.Show(ex.Message, "Petra", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
[ ]s,
Gustavo Maia Aguiar
-
-
Olá Petrarca,
Achei que você ainda estava com o problema mas se continua "funcionando perfeito"...
Para restaurar o backup você irá utilizar o método Connect para conectar-se ao servidor. Feito isso é necessário emitir o comando de restore (através do método). O problema é que se você se conectar ao banco Agencia, você não poderá restaurá-lo porque ele estará em uso (mesmo que por você mesmo). Você também não pode eliminar as conexões, pois, estará tentando eliminar a sua própria conexão.
A idéia dessa propriedade é fazer com que você conecte-se ao banco de dados MASTER e assim possa efetuar a restauração do banco. Como sua conexão é no MASTER não haverá impecilhos pelo próprio processo de restore.
Se funcionou, mesmo sem essa propriedade, é porque possivelmente você já se conectava no MASTER e entendo que o problema já estava resolvido.
[ ]s,
Gustavo Maia Aguiar