Desenvolver um simple disaster recovery para Base dados

Em esta artigo vamos desenvolver um simple disaster recovery duma base dados MS SQL SERVER, criando um backup e depois enviando o ficheiro para um servidor FTP.

Ante de enviar o Backup vamos fazer zip do ficheiro e vamos proteger com uma senha, o envio sera feito utilizando o protocolo SFTP.

S.O: window 2008 R2 com .NET 4.0

Linguagem: Visual C#

References

  • Ionic.Zip http://dotnetzip.codeplex.com/
  • WinSCPnet http://winscp.net/

O ficheiro WinSCP.exe deve ser copiado na mesma pasta da nossa aplicaçao.

Backup base dados

Vamos iniciar com o backup da base dados:

using System.Data.SqlClient;

String connectionString =”Data Source=WIN-SQL\SQLEXPRESS; Initial Catalog=master; User Id=sa; Pwd=sa;”
String nameDB = “testDB”;
String pathBackup = “c:\\backup”;

SqlConnection conn = new SqlConnection(connectionString);

//Open connection
conn.Open();

//Backup
sqlBackup = String.Format(“BACKUP DATABASE {0} TO DISK='{1}’ WITH INIT”, nameDB, pathBackup) ;
using (SqlCommand comm = new SqlCommand(sqlBackup, conn)){
comm.CommandTimeout = 0;
comm.ExecuteNonQuery();
}

//close Connection
conn.Close();

 ZIP Backup

Vamos fazer agora o zip do ficheiro de backup com senha.

using Ionic.Zip;
using System.IO;

String nomeBackup = nameDB + “.bak”;
String nomeZip = nameDB + “.zip”;

using (ZipFile zip = new ZipFile())
{
zip.Password = “ref263h26sgf3”;
zip.AddFile(Path.Combine(pathBackup, nomeBackup));
zip.Save(nomeZip);
}

Envio no servidor SFTP

Vamos agora enviar o ficheiro zip para o servidor SFTP

using WinSCP;

SFtp sftp;

SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = “127.0.0.1”,
UserName = “user”,
Password = “12345678”,
GiveUpSecurityAndAcceptAnySshHostKey = true
};

sftp.sessionOptions = sessionOptions;

String pathApp = “C:\minhaAplicacao”;
String nomeFilePath = Path.Combine(pathApp, nomeZip);
String destinationPath = “./”;

using (Session session = new Session())
{
// Connect
session.DisableVersionCheck = true;
session.Open(sessionOptions);

// Upload files
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;

TransferOperationResult transferResult;
transferResult = session.PutFiles(nomeFilePath, destinationPath, false, transferOptions);

// Throw on any error
transferResult.Check();

// Print results
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Log.WriteLog(String.Format(“Upload of {0} succeeded”, transfer.FileName));
}
} //using session

Envio ficheiro Ticket

O envio do ficheiro ticket para servidor SFTP è para ter um controlo no servidor se  o envio do backup foi completo.

// Criaçao do ficheiro ticket
nameFileTck = nameDB+”.tck”;
if (! File.Exists(nameFileTck)) {
using (StreamWriter w = File.AppendText(nameFileTck))
{
w.WriteLine(“{0}”, DateTime.Now.ToShortDateString());
}
}

nomeFilePath = Path.Combine(pathApp, nameFileTck);

using (Session session = new Session())
{
// Connect
session.DisableVersionCheck = true;
session.Open(sessionOptions);

// Upload files
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;

TransferOperationResult transferResult;
transferResult = session.PutFiles(nomeFilePath, destinationPath, false, transferOptions);

// Throw on any error
transferResult.Check();

// Print results
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Log.WriteLog(String.Format(“Upload of {0} succeeded”, transfer.FileName));
}
} //using session