Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
La aplicación cliente finaliza una actualización en la réplica principal correctamente, pero una consulta a la réplica secundaria muestra que el cambio no se ha reflejado. En este caso, se presupone que el estado de sincronización de su disponibilidad es correcto. En la mayoría de casos, este comportamiento se resuelve pasados unos minutos.
Si los cambios aún no se reflejan en la réplica secundaria pasados unos minutos, puede haber un cuello de botella en el flujo de trabajo de sincronización. La ubicación del cuello de botella depende de si la réplica secundaria está configurada para confirmación sincrónica o asincrónica.
Confirmación sincrónica
Cada actualización realizada correctamente en la réplica principal ya se ha sincronizado con la réplica secundaria, o que los registros del log ya se han volcado para garantizar su persistencia en la réplica secundaria. Por lo tanto, el cuello de botella debe estar en el proceso de la fase de puesta al día que se produce después de que el registro se vacíe en la réplica secundaria.
Sin embargo, cuando se alcanza la fase de puesta al día, todas las cargas de trabajo de lectura de la réplica secundaria pasan por el aislamiento de instantáneas:
Transacciones de ejecución prolongada en la réplica principal
Fase de puesta al día en la réplica secundaria
Confirmación asincrónica
Puesto que la confirmación asincrónica da por confirmada una transacción en cuanto se escribe en el disco local, el cuello de botella puede estar en cualquier punto posterior:
Transacciones de larga duración en la réplica principal
Latencia o rendimiento de red
Confirmación del registro en la réplica secundaria
Fase de puesta al día en la réplica secundaria
En las siguientes secciones se describen las causas comunes de los cambios en la réplica principal que no se reflejan en la réplica secundaria para las consultas de solo lectura.
Transacciones activas de ejecución prolongada
Una transacción de larga duración en la réplica principal impide que las actualizaciones se lean en la réplica secundaria.
Explicación
Todas las cargas de trabajo de lectura de la réplica secundaria son consultas de aislamiento de instantáneas. En el aislamiento de instantánea, los clientes de solo lectura ven la base de datos de disponibilidad en la réplica secundaria tal como estaba en el punto inicial de la transacción activa más antigua del registro rehecho. Si una transacción no se ha confirmado desde hace horas, la transacción abierta impide que las consultas de solo lectura vean cualquier actualización nueva.
Diagnóstico y resolución
En la réplica principal, use DBCC OPENTRAN (Transact-SQL) para ver las transacciones activas más antiguas y vea si se pueden revertir. Cuando las transacciones activas más antiguas se han revertido y sincronizado en la réplica secundaria, las cargas de trabajo de lectura en la réplica secundaria pueden ver las actualizaciones en la base de datos de disponibilidad hasta el principio de la transacción activa que en aquel momento sea la más antigua.
La alta latencia de red o el bajo rendimiento de red producen una acumulación de registros en la réplica principal
La alta latencia de red o el bajo rendimiento pueden impedir que los registros se envíen a la réplica secundaria lo suficientemente rápido.
Explicación
La réplica principal activa el control de flujo en el envío del registro de transacciones cuando ha superado el número máximo permitido de mensajes no confirmados enviados a la réplica secundaria. Hasta que no se acepten algunos de estos mensajes, no se podrán enviar más bloques de registro a la réplica secundaria. Esta situación puede tener un impacto más grave en la posible pérdida de datos, lo que podría poner en peligro su objetivo de punto de recuperación (RPO).
Diagnóstico y resolución
Un valor alto de DMV log_send_queue_size puede indicar que los registros están siendo retenidos en la réplica principal. Dividir este valor por log_send_rate puede dar una estimación aproximada de cuánto tardarán los datos en ponerse al día en la réplica secundaria.
Además, también es útil comprobar los dos contadores de rendimiento SQL Server:Availability Replica > Flow Control Time (ms/sec) y SQL Server:Availability Replica Flow control/sec. Al multiplicar estos dos valores, puede ver cuánto tiempo se pasó en el último segundo esperando a que se liberara el control de flujo. Cuanto mayor sea el tiempo de espera del control de flujo, menor será la tasa de envío.
A continuación encontrará métricas útiles para diagnosticar el rendimiento y la latencia de red. Puede usar otras herramientas de Windows, como ping.exe, para evaluar el uso de la red.
DMV log_send_rate
Contador de rendimiento
SQL Server:Database > Log Bytes Flushed/secContador de rendimiento
SQL Server:Database Mirroring > Send/Receive Ack TimeContador de rendimiento
SQL Server:Availability Replica > Bytes Sent to Replica/secContador de rendimiento
SQL Server:Availability Replica > Bytes Sent to Transport/secContador de rendimiento
SQL Server:Availability Replica > Flow Control Time (ms/sec)Contador de rendimiento
SQL Server:Availability Replica > Flow Control/secContador de rendimiento
SQL Server:Availability Replica > Resent Messages/sec
Para solucionar este problema, intente actualizar el ancho de banda de red o eliminar o reducir el tráfico de red innecesario.
Otra carga de trabajo de generación de informes impide la ejecución del subproceso redo
El subproceso de rehacer de la réplica secundaria está bloqueado e impedido de realizar cambios de lenguaje de definición de datos (DDL) debido a una consulta de solo lectura de larga duración. El subproceso de la fase de puesta al día debe desbloquearse para poder poner más actualizaciones a disposición de la carga de trabajo de lectura.
Explicación
En la réplica secundaria, las consultas de solo lectura adquieren bloqueos de estabilidad del esquema (Sch-S). Estos bloqueos Sch-S pueden impedir que el subproceso de la fase de puesta al día adquiera bloqueos de modificación del esquema (Sch-M) para hacer cambios en el lenguaje de definición de datos. Un hilo de redo bloqueado no puede aplicar los registros del log hasta que se desbloquee.
Diagnóstico y resolución
Cuando el subproceso de rehacer queda bloqueado, se genera un evento extendido denominado sqlserver.lock_redo_blocked. Además, puede consultar la DMV sys.dm_exec_request en la réplica secundaria para averiguar qué sesión está bloqueando el subproceso REDO y luego tomar medidas correctivas. La siguiente consulta devuelve el identificador de sesión de la carga de trabajo de informes que está bloqueando el subproceso de redo.
select session_id, command, blocking_session_id, wait_time, wait_type, wait_resource
from sys.dm_exec_requests where command = 'DB STARTUP'
Puede dejar que la carga de trabajo de generación de informes finalice, en cuyo momento el subproceso de rehacer se desbloqueará, o puede desbloquear inmediatamente el subproceso de rehacer ejecutando el comando KILL (Transact-SQL) sobre el identificador de sesión que está bloqueando.
El subproceso de la fase de puesta al día se retrasa debido a la contención de recursos
Una gran carga de trabajo de informes en la réplica secundaria ha ralentizado el rendimiento de la réplica secundaria y el subproceso de la fase de puesta al día se ha retrasado.
Explicación
Al aplicar las entradas de registro en la réplica secundaria, el subproceso de rehacer lee las entradas de registro del disco de registro y, a continuación, para cada entrada de registro, accede a las páginas de datos para aplicar dicha entrada de registro. El acceso a la página puede estar limitado por la E/S (acceso al disco físico) si la página no está ya en la reserva de búferes. Si hay una carga de trabajo de informes enlazada a E/S, esta carga de trabajo compite por los recursos de E/S con el subproceso de la fase de puesta al día y puede ralentizar dicho subproceso. Esta situación no solo impide que otras cargas de trabajo de generación de informes vean datos actualizados, sino que también afecta al RTO.
Diagnóstico y resolución
Puede usar la siguiente consulta DMV para ver hasta qué punto el subproceso de la fase de puesta al día se ha retrasado, midiendo la diferencia entre last_redone_lsn y last_received_lsn.
select recovery_lsn, truncation_lsn, last_hardened_lsn, last_received_lsn,
last_redone_lsn, last_redone_time
from sys.dm_hadr_database_replica_states
Si realmente el subproceso de la fase de puesta al día se retrasa, debe investigar la causa principal de la degradación del rendimiento en la réplica secundaria. Si hay contención de E/S con la carga de trabajo de informes, puede usar Resource Governor para controlar los ciclos de CPU que utiliza dicha carga de trabajo y, de ese modo, controlar indirectamente, hasta cierto punto, los ciclos de E/S consumidos. Por ejemplo, si la carga de trabajo de los informes está consumiendo un 10 % de la CPU, pero la carga de trabajo está enlazada a E/S, puede utilizar Resource Governor para limitar el uso de recursos de la CPU al 5 % y regular así la carga de trabajo de lectura. De esta forma, se reduce el impacto en la E/S.
Contenido relacionado
- Troubleshooting performance problems in SQL Server 2008 (Solucionar problemas de rendimiento en SQL Server 2008)