none
Backup RRS feed

  • 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 Backup

    e em outro para fazer o Restore

    segunda-feira, 12 de janeiro de 2009 15:47

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

    http://gustavomaiaaguiar.spaces.live.com

    quarta-feira, 14 de janeiro de 2009 11:11

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.

    segunda-feira, 12 de janeiro de 2009 16:07
  • Só uma dica:

     

    Deixar a responsabilidade de backups para o cliente não é uma boa prática. Até mesmo porque ele pode esquecer ou várioas outros problemas podem acontecer.

     

    O ideal é que se faça os backups automaticamente.

     

    Abraços

     

    segunda-feira, 12 de janeiro de 2009 16:21
  • Demétrio,

     

    Concordo plenamente!!!

    segunda-feira, 12 de janeiro de 2009 16:39
  • 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 e

      pergunta 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

     

     

     

     

     

    segunda-feira, 12 de janeiro de 2009 16:53
  • Ola Junior Galvão

     

    Se não for pedir de mais onde encontro o Wbcast Fabiano Amorim realizou.

     

    Grato pela sua ajuda

     

    Abraços Petrarca

    segunda-feira, 12 de janeiro de 2009 16:58
  • Petrarca,

     

    Você encontra os vídeos no endereço:

     

    http://www.microsoft.com/brasil/msdn/eventos/webcasts.mspx

     

    Abraços

     

    segunda-feira, 12 de janeiro de 2009 17:02
  • Caso ainda não tenha encontrado...

    Manipulando o SQL Express com SMO e Management Studio Express

    https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032387063&EventCategory=4&culture=pt-BR&CountryCode=BR


    Espero que seja útil, e

    Qualquer dúvida é só postar...


    Abraço.


    segunda-feira, 12 de janeiro de 2009 17:23
  • 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 Try

    End 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...

    segunda-feira, 12 de janeiro de 2009 17:51
  • 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

     

    segunda-feira, 12 de janeiro de 2009 19:00
  • Ola Gustavo

     

    Iniciante é dureza...

    Eu entendi sua explicação, mas continuo sem saber o que fazer para que este procedimento Restaure o banco de dados.

     

    Grato pela sua ajuda

     

     

     

     

     

    segunda-feira, 12 de janeiro de 2009 19:38
  • 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

    http://gustavomaiaaguiar.spaces.live.com

    segunda-feira, 12 de janeiro de 2009 20:58
  • uma alternativa e avisar e dar a opcao de derumar as conexoes veja um exemplo em TSQL

     

    alter database nome_banco set single_user with rollback immediate

     

     

    Abs;

    • Sugerido como Resposta SouT Cry quinta-feira, 20 de fevereiro de 2014 17:55
    terça-feira, 13 de janeiro de 2009 09:22
  • 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.

     

    terça-feira, 13 de janeiro de 2009 10:05
  • 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.

     

     

    terça-feira, 13 de janeiro de 2009 10:38
  • 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

     

    terça-feira, 13 de janeiro de 2009 10:42
  • 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.

    terça-feira, 13 de janeiro de 2009 10:47
  • Gustavo

     

    Public Conexao = "Password=@petra#210352;Persist Security Info=True;User ID=Petrarca;Initial Catalog=Agenda;Data Source=PETRARCA\SQLEXPRESS"

     

    Pelo que entendi deve ser o catalog=Agenda

     

     

     

    terça-feira, 13 de janeiro de 2009 11:00
  • 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

     

    terça-feira, 13 de janeiro de 2009 11:04
  • Gustavo

     

    Devo ter entido errado, troquei para master e não funciona.

    Public Conexao = "Password=@petra#210352;Persist Security Info=True;User ID=Petrarca;Initial Catalog=Master;Data Source=PETRARCA\SQLEXPRESS"

     

    terça-feira, 13 de janeiro de 2009 11:04
  • Petrarca,

     

    O Initial Catalog representa o nome da base de dado que você deseja acessar.

     

    Ainda esta dando erro?

    terça-feira, 13 de janeiro de 2009 11:13
  • 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

     

    terça-feira, 13 de janeiro de 2009 11:14
  • Gustavo

     

    Se eu mudo na string de conexão para Master as consultas Sql não funcionam.

    Eu não sei mas deveria ter uma forma de fechar o banco e depois fazer o restore.

     

     

    terça-feira, 13 de janeiro de 2009 11:14
  • Bom dia Junior

     

     

    Sim representa, e trocando as consultas não funcionam.

     

    terça-feira, 13 de janeiro de 2009 11:17
  • 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;

     

    terça-feira, 13 de janeiro de 2009 11:19
  • 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

     

    terça-feira, 13 de janeiro de 2009 11:19
  • Junior

     

    Se você estiver trabalhando com o SQL Server Express recomendo deixar habilitada a opção AutoClose, desta forma...

     

    Onde eu configuro o auto close?

     

    terça-feira, 13 de janeiro de 2009 11:46
  • 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 Snippet
    ALTER
    DATABASE Agencia SET AUTO_CLOSE ON

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    terça-feira, 13 de janeiro de 2009 11:49
  • Maia,

     

    Eu também não acho que utilizando o AutoClose seja a solução, somente vejo como mais uma opção para ter certeza que o banco esta fechado e livre para ser restaurado.

    terça-feira, 13 de janeiro de 2009 11:53
  • 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.

     

    terça-feira, 13 de janeiro de 2009 12:03
  • 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

     

    terça-feira, 13 de janeiro de 2009 12:04
  • 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

     

     

    terça-feira, 13 de janeiro de 2009 12:14
  •  

    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.Smo

     

    Public Class Form1

    Private Sub btnBackup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBackup.Click

    Try

    Dim CompServer As New Server

    CompServer.ConnectionContext.DatabaseName = "Master"

    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\BackupAgenda.bak", DeviceType.File))

    bkp.PercentCompleteNotification = 10

    bkp.SqlBackup(CompServer)

    MsgBox("ok")

    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.DatabaseName = "Master"

    CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"

    CompServer.ConnectionContext.LoginSecure = True

    CompServer.ConnectionContext.Connect()

    Dim RestoreBkp As New Microsoft.SqlServer.Management.Smo.Restore

    RestoreBkp.Devices.Clear()

    RestoreBkp.Devices.Add(New BackupDeviceItem("C:\Petrarca\Backup\BackupAgenda.bak", 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

    terça-feira, 13 de janeiro de 2009 13:19
  • Olá Petrarca,

     

    Mude a propriedade DatabaseName de CompServer.ConnectionContext para o MASTER.

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    terça-feira, 13 de janeiro de 2009 21:06
  • Ola Gustavo

     

    Me mostre com o código a mudança que você sugeriu.

     

    Abraços.

     

    quarta-feira, 14 de janeiro de 2009 10:48
  • Olá Petrarca,

     

    Estou sem o Visual Studio no momento, mas ficaria algo similar ao abaixo:

     

    Code Snippet

    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.DatabaseName = "Master"

    CompServer.ConnectionContext.ServerInstance = "PETRARCA\SQLEXPRESS"

    CompServer.ConnectionContext.LoginSecure = True

    CompServer.ConnectionContext.Connect()

    Dim RestoreBkp As New Microsoft.SqlServer.Management.Smo.Restore

    RestoreBkp.Devices.Clear()

    RestoreBkp.Devices.Add(New BackupDeviceItem("C:\Petrarca\Backup\BackupAgenda.bak", 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

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    quarta-feira, 14 de janeiro de 2009 10:53
  • Ola gustavo...

     

    Adicionei a linha e continua funcionando perfeito.

     

    É ruim fazer alguma coisa sem saber o porque então la vai:

    Qual a função desta linha adicionada ?

     

    Abraços

     

     

    quarta-feira, 14 de janeiro de 2009 11:05
  • 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

    http://gustavomaiaaguiar.spaces.live.com

    quarta-feira, 14 de janeiro de 2009 11:11