← maurobernal.com.ar

Etiqueta: checkdb

  • Reparar una base dañada de MS SQL Server

    Últimamente me ha tocado quemarme las pestañas por casos de bases de datos dañadas. Una mala infraestructura, y/o un mal plan de backups termina provocando este tipo de post luego de sufrir por un rato…

    Reparar una base dañada

    El siguiente es un error común cuando se daña una base:

    Msg 824, Level 24, State 2, Line 11
    SQL Server detected a logical consistency-based I/O error: incorrect pageid (expected 1:49876; actual 17253:-991032068). It occurred during a read of page (1:49876) in database ID 15 at offset 0x000000185a8000 in file ‘E:\Bases\SBDAXXXX.MDF’.  Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

    A continuación los pasos que se debería seguir:

    1. Intentar hacer un backup de la base
    2. Obtener la cantidad de registros que hay en ese momento en cada tabla (script adjunto al final)
    3. Colocar la base en modo de usuario único
      ALTER DATABASE SBDAXXXX SET SINGLE_USER WITH ROLLBACK IMMEDIATE

       

    4. Intentar reparar la base
      DBCC CHECKDB(SBDAXXXX,REPAIR_ALLOW_DATA_LOSS)

       

    5. Verificar la cantidad de registros actual (script adjunto al final)
    DECLARE @Tabla VARCHAR(250)
    DECLARE @SQL VARCHAR(2000)
    CREATE TABLE #TablaTemp(ID INT IDENTITY(1,1),Tabla_Nombre VARCHAR(200),Cant_Registros INT)
    
    DECLARE TINFO_CUR CURSOR FOR 
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE='BASE TABLE'
    
    OPEN TINFO_CUR
    FETCH NEXT FROM TINFO_CUR INTO @Tabla
    WHILE @@FETCH_STATUS =0
    BEGIN
    SET @SQL='INSERT INTO #TablaTemp(Tabla_Nombre,Cant_Registros) SELECT '''+@Tabla+''',COUNT(*) FROM '+@Tabla+''
    EXECUTE (@SQL)
    FETCH NEXT FROM TINFO_CUR INTO @Tabla
    END
    CLOSE TINFO_CUR
    DEALLOCATE TINFO_CUR
    
    
    SELECT * FROM #TablaTemp ORDER BY Tabla_Nombre
    
    DROP TABLE #TablaTemp

     

    Si la base está muy dañada posiblemente no se repara, o se pierde información. En ese caso se puede recurrir a un software de 3ro para intentar reparar el .MDF.

Tags

tsql (27)mssql (26)sql (20)devops (20)dotnet (18)docker (15)performance (14)contenedores (11)dotnet10 (10)linux (9)csharp (8)microservicios (7)angular (7)angular21 (7)sql server (6)issabel (6)docker-compose (6)typescript (6)mysql (5).NET (5)