Reflejo de bases de datos en SQL Server (ADO.NET)

Actualización: November 2007

El reflejo de base de datos de SQL Server permite mantener una copia, o reflejo, de una base de datos de SQL Server 2005 en un servidor en modo de espera. El reflejo garantiza que en todo momento existen dos copias distintas de los datos, lo que proporciona una alta disponibilidad y una completa redundancia de datos. El proveedor de datos de .NET para SQL Server ofrece compatibilidad implícita con el reflejo de base de datos; así el programador no tiene que realizar ninguna acción ni escribir ningún código una vez que se ha configurado para una base de datos de SQL Server 2005 ó 2008. Además, el objeto SqlConnection admite un modo de conexión explícita que permita proporcionar el nombre de un servidor asociado de conmutación por error en la propiedad ConnectionString.

La siguiente secuencia simplificada de eventos tiene lugar para un objeto SqlConnection que identifica una base de datos configurada para el reflejo:

  1. La aplicación cliente se conecta correctamente a la base de datos principal y el servidor devuelve el nombre del servidor asociado, el cual se almacena en caché en el cliente.

  2. Si el servidor que contiene la base de datos principal da error o se interrumpe la conectividad, se pierde el estado de la conexión y de la transacción. La aplicación cliente intenta restablecer la conexión a la base de datos principal pero no lo consigue.

  3. La aplicación cliente intenta entonces de forma transparente establecer una conexión a la base de datos de reflejo del servidor asociado. Si lo consigue, la conexión se redirecciona a la base de datos de reflejo, que se convierte entonces en la nueva base de datos principal.

Especificación del asociado de conmutación por error en la cadena de conexión

Si proporciona el nombre de un servidor asociado de conmutación por error en la cadena de conexión, el cliente intenta una conexión al asociado de conmutación por error de forma transparente si la base de datos principal no está disponible cuando la aplicación cliente se conecta por primera vez.

";Failover Partner=PartnerServerName"

Si omite el nombre del servidor asociado de conmutación por error y la base de datos principal no está disponible cuando la aplicación cliente se conecta por primera vez, se produce una excepción SqlException.

Cuando una SqlConnection se abre correctamente, el servidor devuelve el nombre del asociado de conmutación por error, que invalida cualquier valor especificado en la cadena de conexión.

Nota:

Se debe especificar de forma explícita el catálogo o el nombre de la base de datos original en la cadena de conexión para los escenarios de creación de reflejos. Si el cliente recibe información de conmutación por error sobre una conexión para la que no se ha especificado de forma explícita un catálogo o base de datos original, dicha información no se almacena en caché y la aplicación no intenta una conmutación por error si el servidor principal da error. Si una cadena de conexión tiene un valor para el asociado de conmutación por error, pero no para el catálogo o la base de datos original, se produce una excepción InvalidArgumentException.

Recuperación del nombre del servidor actual

En caso de una conmutación por error, puede recuperar el nombre del servidor al que hay actualmente una conexión mediante la propiedad DataSource de un objeto SqlConnection. El siguiente fragmento de código recupera el nombre del servidor activo, suponiendo que la variable de conexión hace referencia a una SqlConnection abierta.

Cuando se produce un evento de conmutación por error y la conexión cambia al servidor de reflejo, la propiedad DataSource se actualiza para reflejar el nombre del servidor.

Dim activeServer As String = connection.DataSource
string activeServer = connection.DataSource;

Comportamiento del reflejo de SqlClient

El cliente siempre intenta conectarse al servidor principal actual. Si da error, prueba con el asociado de conmutación por error. Si la base de datos de reflejo ya se ha cambiado a la función principal del servidor asociado, la conexión se realiza correctamente y la nueva asignación principal-reflejo se envía al cliente y se almacena en caché durante la vigencia de la llamada a AppDomain. No se almacena de forma permanente y no está disponible para las posteriores conexiones en un AppDomain o proceso diferente. No obstante, está disponible para las posteriores conexiones en el mismo AppDomain. Tenga en cuenta que otro AppDomain o proceso que se ejecute en el mismo equipo o en uno diferente tiene su grupo de conexiones, y esas conexiones no se restablecen. En ese caso, si la base de datos principal se vuelve inactiva, cada proceso o AppDomain da error una vez y el grupo se borra automáticamente.

Nota:

En el servidor, la compatibilidad con el reflejo se configura por cada base de datos. Si se ejecutan operaciones de manipulación de datos en otras bases de datos no incluidas en el conjunto principal/espejo, o bien con nombres de varias partes o mediante el cambio de la base de datos actual, los cambios en estas otras bases de datos no se propagarán si se produce un error. Cuando los datos se modifican en una base de datos sin reflejo, no se generan errores. El programador deberá valorar los posibles efectos de tales operaciones.

Recursos de reflejos de base de datos

Para obtener documentación conceptual e información sobre la configuración, implementación y administración de reflejos, vea los siguientes recursos en los Libros en pantalla de SQL Server.

Recurso

Descripción

Creación de reflejo de la base de datos en los Libros en pantalla de SQL Server 2008

Describe cómo establecer y configurar el reflejo en SQL Server 2008.

Creación de reflejo de la base de datos en los Libros en pantalla de SQL Server 2005.

Describe cómo establecer y configurar el reflejo en SQL Server 2005.