SQL Server Management Objects (SMO) y WMI – Parte II

Restauración de una base de datos

 

SMO expone una clase Restore que se puede usar para restaurar una base de datos desde un archivo o desde otro dispositivo de copia de seguridad. En el ejemplo de aplicación, restauro la base de datos de la que recién creamos una copia de seguridad y el proceso es parecido. Observe que no la restauro desde donde se realizó, sino en un nombre de archivo nuevo y con un nuevo nombre lógico. En esencia, esto crea una copia de la base de datos usando métodos de copia de seguridad. Por supuesto, tiene la opción de restaurar la base de datos sobre la existente, pero este proceso resultará práctico.

 

Demo 4: Muestró el método RestoreDB que uso en el ejemplo de aplicación para restaurar la base de datos. El primer paso es crear una instancia de la clase Restore y luego establezco el nombre del archivo de copia de seguridad desde el que realizaré la restauración.

 

public void RestoreDB(string databaseName)

{

            Console.WriteLine("*** Restoring***");

            // Don’t drop it! /// If you do, anyone with the default database of that DB will croak!

            //server.Databases[databaseName].Drop();

            Restore restore = new Restore();

            restore.Devices.Clear();

            string fileName = string.Format("{0}\\{1}.bak", testFolder, databaseName);

            restore.Devices.Add(new BackupDeviceItem(fileName, DeviceType.File));

 

            // Just give it a new name

            string destinationDatabaseName = string.Format("{0}_newly_restored", databaseName);

 

            // Go grab the current database’s logical names for the data and log files

            // For this example, we assume there are 1 for each.

            Database currentDatabase = server.Databases[databaseName];

            string currentLogicalData = currentDatabase.FileGroups[0].Files[0].Name;

            string currentLogicalLog = currentDatabase.LogFiles[0].Name;

 

            // Now relocate the data and log files

            RelocateFile reloData = new RelocateFile(currentLogicalData, string.Format(@"{0}\{1}.mdf", testFolder, destinationDatabaseName));

            RelocateFile reloLog = new RelocateFile(currentLogicalLog, string.Format(@"{0}\{1}_Log.ldf", testFolder, destinationDatabaseName));

            restore.RelocateFiles.Add(reloData);

            restore.RelocateFiles.Add(reloLog);

 

            restore.Database = destinationDatabaseName;

            restore.ReplaceDatabase = true;

            restore.PercentCompleteNotification = 10;

            restore.PercentComplete += new PercentCompleteEventHandler(restore_PercentComplete);

            restore.Complete += new ServerMessageEventHandler(restore_Complete);

            restore.SqlRestore(server);

}

 

Creo un nombre nuevo para la base de datos que restauraré  y obtengo los nombres de los datos lógicos y archivos de registro de las colecciones FileGroups y Files. Estos nombres se necesitan para poder reubicar los archivos físicos de la copia de seguridad a un nombre nuevo (ya que restauro la base de datos a una base de datos nueva e independiente). Luego agrego una instancia de la clase RelocateFile (una para cada archivo que estoy reubicando) a la colección RelocateFiles del objeto de restauración.

Establezco el nombre de la base de datos que se restaurará e indico a SMO que reemplace la base de datos existente, si ya existe alguna, con el mismo nombre. Dado que quiero que ProgressBar muestre el progreso de la operación de restauración, establezco adecuadamente los controladores de eventos PercentComplete y Complete.

 

Comprobación de una copia de seguridad de base de datos

 

No servirá de mucho tener una copia de seguridad de la base de datos si ésta se encuentra dañada. Comprobar una copia de seguridad es una buena idea y puede hacerse fácilmente si se crea una instancia de la clase Restore, se establece DeviceType en su medio apropiado, se agrega el dispositivo y se ejecuta el método SqlVerify. Esto devolverá un valor booleano que indica si la copia de seguridad se ha comprobado o no. El código siguiente muestra cómo realizar esta comprobación:

 

bool verified = restore.SqlVerify(server,out msg);

 

WMI (Windows Management Instrumentation)

 

•Conjunto de clases (no en el sentido clásico de .Net) que permiten:

 

·         oAdministrar

·         oConfigurar

·         oRecibir Eventos

 

•Se clasifican en

 

·         oEspacios de nombres

·         oClases

 

•Poseen herencia

 

Obteniendo la lista de clases WMI disponibles

 

Se comienza investigando el Espacio de Nombres “root”

 

•Es importante tener en cuenta que hay espacios de nombres contenidos en otros:

 

Public Function Clases() As String()

‘Se comienza buscando desde "root"

Return RecurseNS("root")

EndFunction

Private Function RecurseNS(ByVal root As String) As String()

‘Se obtiene la clase

Dim man As New ManagementClass(New ManagementScope(root), _

New ManagementPath("__namespace"), _

Nothing)

Dim l As New System.Collections.Generic.List(Of String)

‘Luego, cada Espacio dependiente

For Each ns As ManagementObject In man.GetInstances

     Dim s As String = root + "\"+ ns("Name").ToString()

     l.Add(s)

     ‘Y con el espacio obtenido, se hace la búsqueda recursivamente

     l.AddRange(RecurseNS(s))

     Next

Return l.ToArray()

End Function

 

Suscribirse a un evento

 

·         Obtener la clase

·         Crear la consulta

·         Crear un “LISTENER” para el evento

·         Y asociarle un procedimiento a ser ejecutado ante el evento

·         Iniciar el LISTENER.

 

Public Class WMIEvent

   Implements IDisposable

‘Evento que esta clase va a lanzar

Public Event EventRaised(ByVal sender As Object, ByVal e As WMIEventArgs)

‘Listener del evento

Dim WithEvents watcher As ManagementEventWatcher

Sub New(ByVal ns As String, ByVal evento As String)

‘Clase de WMI

Dim mgmt As New Management.ManagementClass(ns)

‘Consulta (todas las propiedades del evento solicitado)

Dim query As New EventQuery( _

"SELECT * FROM "& evento)

Se crea el Listener y lo iniciamos

watcher = New ManagementEventWatcher(mgmt.Scope, query)

watcher.Start()

End Sub

‘Controlador del evento

Private Sub watcher_EventArrived(ByVal sender As Object, _

     ByVal e As System.Management.EventArrivedEventArgs) _

           Handles watcher.EventArrived

‘Lanza el evento propio de esta clase

RaiseEvent EventRaised(Me, New WMIEventArgs(e.NewEvent))

EndSub

 

En resumen

 

SMO facilita la realización de operaciones de administración de bases de datos en código .NET. Aunque todas estas tareas se pueden realizar con T-SQL directamente en una base de datos o mediante SQL Server Management Studio, poder usar SMO ofrece mayor flexibilidad para incluir estos tipos de operaciones en aplicaciones .NET. De hecho, SQL Server Management Studio depende de SMO para la mayor parte de sus tareas de la administración.

 

Tanto con SMO como con WMI se dispone de herramientas muy versátiles para la administración de nuestros SQL Server (s)

About justindeveloper

I am MCP (Microsoft Certified Professional). MCTS (Microsoft Certified Technology Specialist) and MCPD (Microsoft Certified Professional Developer), also I am SAP Business One Certified!! Desarrollando desde el IDE de Visual Studio NET 2003 hasta ahora con el Visual Studio NET 2010. Desde Microsoft SQL Server 2000 hasta ahora con el Microsoft SQL Server 2008 R2 y tambien con SharePoint, desde WSS 3.0 y MOSS 2007 y ahora familirizandome con el Sharepoint Foundation 2010 & Sharepoint Server 2010. The software development will follow being every time more wonderful!
This entry was posted in Development. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s