Gerando backups do SQL Server por .NET

No artigo da semana passada, tivemos uma breve introdução à biblioteca SMO, que pode ser tanto utilizada pelo .NET quanto pelo PowerShell para criar aplicações ou scripts para gerenciar o SQL Server.

Nesta semana, demonstrarei como utilizar as classes Smo.Backup e Smo.BackupDeviceItem, de um outro assembly do SMO, o SmoExtended, que poderá ser encontrado no caminho:

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SmoExtended.dll

As classes Smo.Backup e Smo.BackupDeviceItem são responsáveis respectivamente por gerar backup e determinar onde este será salvo.

Para demonstrar a utilização destas classes, adequei o exemplo da semana passada, que relacionava os bancos de dados de uma determinada instancia do SQL Server, para também possibilitar identificar a data de ultimo backup de um determinado banco de dados e realizar o backup do mesmo:

Ajuste realizado:

// Gerando a classe Smo.Backup
var backup = new Backup { Database = database.Name };

// Definindo com o Smo.BackupDeviceItem onde será salvo o backup
var path = string.Format(@"C:\Temp\{0}_{1:yyyy-MM-dd HH_mm_ss}.bak", database.Name, DateTime.Now);

backup.Devices.AddDevice(path, DeviceType.File);

// Executando o backup
backup.SqlBackup(server);

Código completo:

using System;
using System.Linq;
using System.Security;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace DemoSmo
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Servidor:");
            var serverInstance = Console.ReadLine();
            Console.WriteLine();

            Console.WriteLine("Usuário:");
            var user = Console.ReadLine();
            Console.WriteLine();

            ServerConnection conn;

            if (!string.IsNullOrEmpty(user))
            {
                Console.WriteLine("Senha:");
                var pass = ReadPassword();
                Console.WriteLine();

                // Criando um objeto de conexão com SQL Authentication
                conn = new ServerConnection(serverInstance, user, pass);
            }
            else
            {
                // Criando um objeto de conexão com Windows Authentication
                conn = new ServerConnection(serverInstance);
            }

            // Criando um objeto que abstrai a instância do SQL Server
            var server = new Server(conn);

            Console.WriteLine("Carregando lista de bancos de dados ...");
            Console.WriteLine();

            try
            {
                // Recuperando a lista de banco de dados
                var lst = server.Databases.Cast<Database>().OrderBy(db => db.ID).ToArray();

                // Escrevendo a relação de banco de dados encontrados
                foreach (var db in lst) Console.WriteLine("{0}. {1}", db.ID, db.Name);

                // Recuperando o banco de dados por meio do número informado pelo usuário
                Console.WriteLine();
                Console.WriteLine("Digite o número do banco de dados:");

                var key = Console.ReadLine();

                int id;

                if (!int.TryParse(key, out id)) return;

                var database = lst.FirstOrDefault(db => db.ID == id);

                if (database == null) return;

                Console.WriteLine();

                // Recuperando informações do último backup do banco de dados
                if (database.LastBackupDate == DateTime.MinValue)
                {
                    Console.WriteLine("Nenhum backup encontrado.");
                }
                else
                {
                    Console.WriteLine("Último backup: {0:yyyy-MM-dd HH:mm:ss}", database.LastBackupDate);
                }
                Console.WriteLine();
                Console.WriteLine("Aperte ENTER para gerar um backup, ou qualquer outra tecla para sair.");

                if (Console.ReadKey().Key != ConsoleKey.Enter) return;

                // Gerando a classe Smo.Backup
                var backup = new Backup { Database = database.Name };

                // Definindo com o Smo.BackupDeviceItem onde será salvo o backup
                var path = string.Format(@"C:\Temp\{0}_{1:yyyy-MM-dd HH_mm_ss}.bak", database.Name, DateTime.Now);

                backup.Devices.AddDevice(path, DeviceType.File);

                // Executando o backup
                backup.SqlBackup(server);

                Console.WriteLine();
                Console.WriteLine("Backup concluído ...");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        // Método para evitar que a senha digitada apareça na tela da aplicação
        private static SecureString ReadPassword()
        {
            var pass = new SecureString();

            while (true)
            {
                var key = Console.ReadKey(true);

                if (key.Key == ConsoleKey.Enter) break;

                pass.AppendChar(key.KeyChar);

                Console.Write("*");
            }

            Console.WriteLine();

            return pass;
        }
    }
}
Anúncios

2 pensamentos sobre “Gerando backups do SQL Server por .NET

  1. Pingback: Gerando backups do SQL Server por PowerShell « SQL From Hell.com

  2. Pingback: Trabalhando com SMO – Resumo « SQL From Hell.com

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s