Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

SQL Server: Cómo reparar base de datos Microsoft SQL Server corrupta con error
Bases de Datos


Tutorial donde mostramos cómo reparar una base de datos Microsoft SQL Server errónea o corrupta, que no arranca, con error "3456". Indicamos también algunos consejos para evitar errores en SQL Server.



Videotutorial Reparar base de datos SQL Server corrupta que no arranca error 3456 Could not redo log record

A continuación mostramos el videotutorial "Reparar base de datos SQL Server corrupta que no arranca error 3456 Could not redo log record":

 

Antecedentes y síntomas de la base de datos corrupta o errónea Microsoft SQL Server

A continuación mostraremos cómo reparar una base de datos corrupta Microsoft SQL Server. Microsoft SQL Server es un motor de base de datos avanzado de uso empresarial. Dicho motor es bastante robusto y no suelen producirse errores en él si se siguen las recomendaciones del fabricante y las que indicamos aquí.

Averiguar y consultar errores en SQL Server, ficheros de log y visor de sucesos

En el ejemplo que recuperaremos el error se produjo en la base de datos Microsoft SQL Server que la aplicación Veeam Backup & Replication instalar para su funcionamiento. En concreto al intentar iniciar el servicio de Veeam Backup & Replication producía el siguiente error:

---------------------------
Servicios
---------------------------
No se puede iniciar el servico Veeam Backup Service en Equipo local.
Error 1053: El servicio no ha respondido a la petición o inicio del control en un tiempo adecuado.
---------------------------
Aceptar
---------------------------

El error anterior de Veeam Backup & Replication era debido a que la base de datos VeeamBackup de Microsoft SQL Server tenía un error, para consultarlo accedemos a los ficheros de log de SQL Server que suelen estar en la carpeta:

C:Archivos de programaMicrosoft SQL ServerMSSQL.2MSSQLLOG

(la carpeta puede variar en función de la instalación y la versión de SQL Server)

En esta carpeta se encuentran los ficheros de log de errores y ficheros de traza con información detallada de los posibles errores

Antecedentes y síntomas de la base de datos corrupta o errónea Microsoft SQL Server

Abriendo el ficheor SQLDump0001.log podemos comprobar el error que se produce, en nuestro caso Error: 3456

2014-06-25 17:33:59.21 spid11s Service Broker manager has started.
2014-06-25 17:34:05.06 spid51 Starting up database 'VeeamBackup'.
2014-06-25 17:34:05.39 spid51 Error: 3456, Severity: 21, State: 1.
2014-06-25 17:34:05.39 spid51 Could not redo log record (89749:231:2), for transaction ID (0:44378616), on page (1:2920), database 'VeeamBackup' (database ID 5). Page: LSN = (89748:172:2), type = 1. Log: OpCode = 6, context 2, PrevPageLSN: (89749:211:2). Restore from a backup of the database, or repair the database.
2014-06-25 17:34:06.14 spid51 Using 'dbghelp.dll' version '4.0.5'
2014-06-25 17:34:06.21 spid51 **Dump thread - spid = 51, PSS = 0x03BB12F8, EC = 0x03BB1300
2014-06-25 17:34:06.22 spid51 ***Stack Dump being sent to C:/Archivos de programa/Microsoft SQL Server/MSSQL.2/MSSQL/LOG/SQLDump0002.txt
2014-06-25 17:34:06.22 spid51 * BEGIN STACK DUMP:
2014-06-25 17:34:06.22 spid51 * 06/25/14 17:34:06 spid 51
2014-06-25 17:34:06.22 spid51 * HandleAndNoteToErrorlog: Exception raised, major=34, minor=56, severity=21
2014-06-25 17:34:06.22 spid51 *
2014-06-25 17:34:06.22 spid51 * Input Buffer 274 bytes -
2014-06-25 17:34:06.22 spid51 * use [VeeamBackup] SELECT (select default_schema_name from sys
2014-06-25 17:34:06.22 spid51 * .database_principals where name = user_name()) AS [DefaultSchema]
2014-06-25 17:34:06.22 spid51 * MODULE BASE END SIZE
2014-06-25 17:34:06.22 spid51 * sqlservr 01000000 02C26FFF 01c27000

Antecedentes y síntomas de la base de datos corrupta o errónea Microsoft SQL Server

En el visor de sucesos también puede aparecer algún error y su descripción, desde "Inicio" - "Panel de control" - "Herramientas administrativas" - "Visor de sucesos":

Antecedentes y síntomas de la base de datos corrupta o errónea Microsoft SQL Server

Buscaremos el error asociado con origen MYSQL$VEEAM (en nuestro caso el nombre de la instancia de SQL Server), pulsando con el botón derecho del ratón y seleccionando "Propiedades" podremos consultar los datos:

Antecedentes y síntomas de la base de datos corrupta o errónea Microsoft SQL Server

En las propiedades del error podremos consultar los detalles:

Tipo de suceso: Error
Origen del suceso: MSSQL$VEEAM
Categoría del suceso: (2)
Id. suceso: 3456
Fecha: 26/06/2014
Hora: 1:03:24
Usuario: SRVMAIL/Administrador
Equipo: SRVMAIL
Descripción:
Could not redo log record (89749:231:2), for transaction ID (0:44378616), on page (1:2920), database 'VeeamBackup' (database ID 5). Page: LSN = (89748:172:2), type = 1. Log: OpCode = 6, context 2, PrevPageLSN: (89749:211:2). Restore from a backup of the database, or repair the database.

Datos:
0000: 80 0d 00 00 15 00 00 00 €.......
0008: 0e 00 00 00 53 00 52 00 ....S.R.
0010: 56 00 4d 00 41 00 49 00 V.M.A.I.
0018: 4c 00 5c 00 56 00 45 00 L..V.E.
0020: 45 00 41 00 4d 00 00 00 E.A.M...
0028: 07 00 00 00 6d 00 61 00 ....m.a.
0030: 73 00 74 00 65 00 72 00 s.t.e.r.
0038: 00 00 ..

Antecedentes y síntomas de la base de datos corrupta o errónea Microsoft SQL Server

Una vez detectado el error y comprobada la instancia y base de datos en que se produce podremos actuar en consecuencia, como indicamos a continuación.

 

Comprobar servicio de SQL Server y nombre de instancia

También es conveniente comprobar el servicio de SQL Server para ver su estado y el nombre de la instancia, para ello accederemos a "Inicio" - "Ejecutar":

Comprobar servicio de SQL Server y nombre de instancia

Escribiremos sevices.msc, pulsaremos "Aceptar":

Comprobar servicio de SQL Server y nombre de instancia

Normalmente el servicio suele tener el nombre "SQL Server (XXX)" donde "XXX" será el nombre de la instancia, si el error no es "grave" el servicio de SQL Server estará iniciado, para ver las propiedades pulsaremos con el botón derecho del ratón sobre él y seleccionaremos "Propiedades":

Comprobar servicio de SQL Server y nombre de instancia

En las propiedades del servicio podremos comprobar el nombre de la instancia y el nombre del servicio MSSQL$VEEAM:

Comprobar servicio de SQL Server y nombre de instancia

En un mismo equipo puede haber varias instancias de bases de datos SQL Server.

 

Copia de seguridad (backup) de la base de datos Microsoft SQL Server

Antes de realizar cualquier acción sobre la base de datos es muy recomendable hacer copia de seguridad, para ello detendremos los servicios de SQL Server y copiaremos todos los ficheros de datos a una ubicación segura. También podemos hacer la copia de seguridad desde SQL Server Management Studio como indicamos en el siguiente tutorial:

También podremos hacer la copia de seguridad con el comando osql como indicamos a continuación:

En este otro enlace mostramos con más detalle los métodos para hacer copia de seguridad de una base de datos SQL Server:


Cómo reparar una base de datos Microsoft SQL Server con error 3456, corrupta, que no arranca

En primer lugar revisaremos los ficheros de log de SQL Server para tratar de obtener más información sobre el error que se pueda haber producido, como indicamos aquí. Una vez revisados los log realizaremos una copia de seguridad de la base de datos, de esta forma podremos proceder con mayor seguridad, como indicamos aquí.

Abriremos una ventana de MS-DOS, desde "Inicio" - "Ejecutar":

Cómo reparar una base de datos Microsoft SQL Server con error 3456, corrupta, que no arranca

Escribiremos cmd, pulsaremos "Aceptar":

Cómo reparar una base de datos Microsoft SQL Server con error 3456, corrupta, que no arranca

Ejecutaremos el siguiente comando para accede a la herramienta de administración de SQL Sever desde la línea de comandos SQLCMD:

sqlcmd -S .veeam

(donde "veeam" será el nombre de la instancia de SQL Server a la que nos conectaremos, obtenido del servicio)

Una vez conectados escribiremos la siguiente sentencia SQL para obtener el estado de la base de datos corrupta, en nuestro caso, como hemos visto en los log, veeambackup:

select name, state_desc from sys.databases where name = 'veeambackup'
go

(donde "veeambackup" será el nombre de la base de datos obtenida del fichero de log)

A continuación introduciremos "go" y pulsaremos INTRO para ejecutar la consulta anterior:

Cómo reparar una base de datos Microsoft SQL Server con error 3456, corrupta, que no arranca

Nos mostrará la base de datos introducida y su estado, en nuestro caso en estado SUSPECT lo que indica que tiene algún problema, pues el estado normal es ONLINE. Si no sabemos el nombre de la base de datos podemos ejecutar la consulta SQL anterior sin el where para que nos devuelva el estado de todas las bases de datos:

select name, state_desc from sys.databases
go

Cómo reparar una base de datos Microsoft SQL Server con error 3456, corrupta, que no arranca

A continuación trataremos de reparar la base de datos en estado SUSPECT, para ello en primer lugar la cambiaremos a estado EMERGENCY con el comando:

alter database veeambackup set EMERGENCY
go

(como siempre "veeambackup" será el nombre de la base de datos y escribiendo "go" e INTRO para ejecutarlo)

A continuación ejecutaremos el siguiente comando para cambiar la base de datos a SINGLE_USER, así evitaremos que los usuarios no puedan conectarse mientras intentamos repararla:

alter database veeambackup set SINGLE_USER
go

Cómo reparar una base de datos Microsoft SQL Server con error 3456, corrupta, que no arranca

Una vez que tenemos la base de datos en EMERGENCY y SINGLE_USER ejecutaremos el siguiente comando para tratar de repararla:

dbcc CHECKDB (veeambackup, REPAIR_ALLOW_DATA_LOSS) with NO_INFOMSGS
go

El comando anterior puede tardar en ejecutarse unos minutos, en función del tamaño de la base de datos a reparar y tras finalizar puede mostrar el warnig (aviso): The log for database 'VeeamBackup' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files. Este aviso es relativamente normal, nos indica que se ha perdido la coherencia transaccional al realizar la recuperación, en principio es el proceso lógico pues al encontrar ficheros de redo log corruptos ha partido del último válido.

Si el proceso se ha ejecutado correctamente volveremos a cambiar el estado de la base de datos a MULTI_USER con el comando:

alter database veeambackup set MULTI_USER
go

Comprobaremos el estado de la base de datos para consultar si ha sido reparada con el comando:

select name, state_desc from sys.databases where name = 'veeambackup'
go

Si la recuperación ha sido correcta nos debería aparecer con estado ONLINE:

Cómo reparar una base de datos Microsoft SQL Server con error 3456, corrupta, que no arranca

A partir de este momento volveremos a hacer copias de seguridad y a revisar periódicamente los log y tratar de seguir los siguientes consejos para evitar futuros errores o corrupciones en la base de datos.

 

Recomendaciones para evitar errores en SQL Server

Existen muchas recomendaciones para evitar posibles errores en un motor de base de datos Microsoft SQL Server, muchas de ellas aplicables a cualquier otro motor de base de datos avanzado como Oracle, PostgreSQL, Firebird, MySQL, DB2, Informix, etc. A continuación enumeraremos algunas de ellas:

  • El servidor de base de datos, siempre a ser posible, es recomendable que sea un servidor dedicado, es decir, que solo se use para el servicio de SQL Server y para ningún otro propósito. De esta forma evitaremos posibles conflictos entre software no compatible.
  • El servidor de base de datos SQL Server debe tener sistemas de alimentación eléctrica ininterrumpida (SAI) y fuentes de alimentación redundantes para evitar posibles cortes de suministro eléctrico y con ello apagados no controlados.
  • Los datos de la base de datos es muy recomendable que se guarden en sistemas avanzados de almacenamiento (SAN) que incorporan sus propios métodos para evitar errores de disco y apagados no controlados (RAID, baterías, controladoras dobles, fuentes de alimentación redundantes).
  • El sistema operativo del servidor de SQL Server debe estar siempre actualizado a la última versión de Windows y con todos los parches disponibles.
  • SQL Server debe estar siempre a la última versión estable y con todos los parches disponibles.
  • Evitar los apagados descontrolados y siempre que se apague el equipo servidor procurar detener controladamente los servicios de la base de datos y evitar que haya transacciones sin finalizar y usuarios conectados.
  • Revisar los ficheros de log de SQL Server periódicamente y revisar el monitor de eventos del equipo Windows, de esta forma nos aseguraremos de que no se esté produciendo un warning menor que pueda provocar un error mayor.
  • Configurar y programar copias de seguridad diarias del sistema SQL Server, de los datos de las bases de datos y del estado del sistema operativo.
  • Siempre que sea posible, intentar disponer de un entorno de pruebas con una réplica del servidor de SQL Server (a ser posible en entornos virtualizados) para realizar pruebas de desarrollo y actualizaciones de parches en este entorno de pruebas antes de aplicarlos en el entorno de producción.
  • Realizar análisis períodicos del estado de la base de datos SQL Server (como explicamos en este tutorial).

Artículos relacionados

Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft.

Artículo en inglés.


Anuncios


Enviado el Miércoles, 09 julio a las 01:54:46 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A