jueves, 8 de noviembre de 2007

Problemas con Base de datos en Suspect

Imaginese que se encuentre en esta situación, usted es administrador de Base de datos, y al llegar un día a su lugar de trabajo se percata que hay una base de datos que se encuentra en una tonalidad gris y al lado tiene "(suspect)". Por ejemplo: "Databasename (Suspect)". La pregunta es que voy a hacer ahora, los usuarios no pueden accesar a sus sistemas, todos en la empresa lo están llamando porque el sistema está frizado y usted se pregunta ¿Cuál será el backup más actualizado que tengo y que habrá ocacionado esto?
La respuesta puede ser un problema de hardware (especialmente discos con sectores dañados) o algún device de la base de datos corrompido. Aquí les presento algunas acciones que debe tomar para evitar este tipo de error:
  1. Si la base de datos es de consultas, puede colocar la base de datos como solo lectura y los usuarios pueden tener acceso a la misma.
  2. SQL Server puede recuperar la base de datos automáticamente si tiene una falla mínima, puede ver este mensaje al lado de la misma (Recovery).
  3. Otra forma es darle un Detach a la DB y un Attach nuevamente para recuperar la base de datos.
  4. Si ninguna de estas acciones funciona y no tiene un backup actualizado puede probar con este procedure "sp_resetstatus [ @DBName = ] 'database'" que resetea el estatus de la base de datos en el sysdatabase y reparar los daños que tenga la base de datos en caso que se pueda reparar.

Si no tienen acceso a este procedures, aquí les dejo los fuentes con el que pueden crearlo y ejecutarlo:

IF EXISTS ( SELECT * from sysobjects where name = 'sp_resetstatus' )
DROP PROCEDURE sp_resetstatus
GO
CREATE PROC sp_resetstatus @dbname varchar(30) AS
DECLARE @msg varchar(80)
IF @@trancount > 0
BEGIN
PRINT 'Can''t run sp_resetstatus from within a transaction.'
RETURN (1)
END
IF suser_id() != 1
BEGIN
SELECT @msg = 'You must be the System Administrator (SA)'
SELECT @msg = @msg + ' to execute this procedure.'
RETURN (1)
END
IF (SELECT COUNT(*) FROM master..sysdatabases
WHERE name = @dbname) != 1
BEGIN
SELECT @msg = 'Database ' + @dbname + ' does not exist!'
PRINT @msg
RETURN (1)
END
IF (SELECT COUNT(*) FROM master..sysdatabases
WHERE name = @dbname AND status & 256 = 256) != 1
BEGIN
PRINT 'sp_resetstatus can only be run on suspect databases.'
RETURN (1)
END
BEGIN TRAN
UPDATE master..sysdatabases SET status = status ^ 256
WHERE name = @dbname
IF @@error != 0 OR @@rowcount != 1
ROLLBACK TRAN
ELSE
BEGIN
COMMIT TRAN
SELECT @msg = 'Database ' + @dbname + ' status reset!'
PRINT @msg
PRINT ''
PRINT 'WARNING: You must reboot SQL Server prior to '
PRINT ' accessing this database!'
PRINT ''
END
GO

Espero que estos les sirva.