← maurobernal.com.ar

Etiqueta: mdf

  • 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.

  • Listar todas las bases de datos con su respectiva ubicación y tamaños

    Listar todas las bases de datos

    Una problemática habitual con la que me enfrentaba en las PCs de desarrollo era que me quedaba sin espacio en los discos por logs inmanejables, y más de una vez olvidar la ubicación de los archivos de las bases en proyectos versionados.

    El siguiente script muy simple pero muy útil permite listar las bases, sus respectivos tamaños, archivos que la componen(MDF y LDF). Además es posible agregarle más campos a gusto del lector.( complementa a este script que muestra los tamaños )

    select d.database_id,d.name, a.name as filename,a.physical_name as ubication,
     a.type_desc,(a.size/128)as sizeMB, recovery_model_desc,d.state_desc,compatibility_level
    from sys.master_files a inner join sys.databases d on (a.database_id = d.database_id)
    order by a.type,a.size
    
    

    Espero que les sea útil, y como siempre cualquier sugerencia será tenida en cuenta..

    Hasta la próxima…

     

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)