sql >> Database >  >> RDS >> Sqlserver

Manieren om SQL Server te repareren Detecteerde een op logische consistentie gebaseerde I/O-fout

Samenvatting: Het probleem met de ontoegankelijkheid van SQL Database is het veelvoorkomende probleem waarmee de databasegebruikers worden geconfronteerd. Dus deze blog over het aanpakken van problemen zal SQL Server Detected A Logical Consistency-Based I/O Error bespreken. We gaan de reden achter deze fout bespreken en de best mogelijke manieren om dit probleem aan te pakken. Om toegang te krijgen tot de ontoegankelijke SQL-database en deze te herstellen, kan de gebruiker de hulp inroepen van Recover SQL Server Database Tool.

Redenen achter de op logische consistentie gebaseerde I/O-fout van de database:

  • Plotselinge systeemuitschakeling/crash of beperkte afsluiting
  • SQL-beheerder probeert SQL-gegevens op te vragen of te wijzigen

Op het moment dat een SQL Server-database een op logische consistentie gebaseerde fout tegenkomt, is de eerste stap het detecteren van de fout.

De bijbehorende strategieën kunnen helpen bij het opsporen van de fout:

  • Gebruik de tool Best Practice Analyzer (BPA) - De BPA-tool helpt bij het identificeren van basisconsistentiefouten. Deze tool is expliciet voor de SQL-variant, wat betekent dat BPA 2008 toegankelijk is met SQL 2008, enz.
  • Controleer Windows-systeem op raamwerkniveau van gebeurtenislogboek, stuurprogramma of schijfgerelateerde fouten
  • Controleer de respectabiliteit van het bestandsframework door chkdsk-volgorde uit te voeren
  • Voer de diagnostiek uit die wordt aanbevolen door hardwareproducenten voor het framework of de schijf
  • Voor SQL Server 2008 voert u het hulpprogramma SQLIOSim uit op de schijf van de database die een I/O-fout heeft aangekondigd.
  • Neem contact op met de hardwareverkoper of de apparaatfabrikant om te controleren of de hardwarevereisten overeenkomen met de I/O-vereisten van de SQL-server.

Handmatige manieren om SQL Server aan te pakken hebben een op logische consistentie gebaseerde I/O-fout gedetecteerd

Techniek 1 – Controleer hardware en applicatienetwerk

Fout in de database-onregelmatigheid kan worden verholpen door een geschikt netwerk op te bouwen tussen de database en de SQL-toepassing.

Techniek 2 – Herstellen vanaf SQL-back-up

De meest haalbare oplossing is om back-up te gebruiken voor het terugwinnen van SQL-databases. Voordat u een back-up terugzet, moet u ervoor zorgen dat:

  • Je hebt een doorlopende volledige back-up
  • Back-up wordt bijgewerkt, alleen vóór corruptie, en niet erg oud om een ​​strategische afstand te bewaren tot basisgegevensverlies.
  • Corruptie vindt plaats op paginaniveau, aangezien corruptieproblemen op paginaniveau kunnen worden opgelost met behulp van herstel op paginaniveau.

Stap 1: Gebruik de bijbehorende volgorde voor het herstellen van de SQL-database vanaf een volledige back-up

Maak een back-up van het transactielogboek

Back-up LOG PageLevelRestores TO

Plaat ='g:PageLevelRestores_LOG1.bak'

MET INIT

GA

Stap 2: Voer de herstelwijziging uit om de voortgang online te spiegelen.

Maak een back-up van de staart van het logboek...

Back-up LOG PageLevelRestores TO

Cirkel ='g:PageLevelRestores_LOG_TAIL.bak'

MET INIT

GA

Opmerking:er is geen dwingende reden om de volledige SQL-serverdatabase te herstellen als corruptie aan een enkele pagina is gebonden. U kunt de database herstellen vanaf de toegankelijke back-up voor die pagina die wordt ondermijnd. Het uitvoeren van begeleidende bestellingen zal helpen bij het herstellen van de back-up voor een eenzame pagina:

Herstel alle toegankelijke logback-ups in het juiste verzoek

Herstel LOG-paginaniveauHerstelt VAN

Cirkel ='g:PageLevelRestores_LOG1.bak'

MET GEEN HERSTEL

GA

Herstel tot slot de back-up van het staartlogboek

Herstel LOG-paginaniveauHerstelt VAN

Cirkel ='g:PageLevelRestores_LOG_TAIL.bak'

MET GEEN HERSTEL

GA

Eindelijk klaar met de herstelreeks

DATABASE PageLevelHerstellen MET HERSTEL

GA

Wanneer de databaseback-up de SQL-database heeft hersteld, voert u de query DBCC CHECKDB opnieuw uit om te controleren of de selectieproclamatie de overhand heeft zonder op logische consistentie gebaseerde I/O-fout van SQL Database. Deze bestelling zorgt er bovendien voor dat er geen gegevensverlies is in deze tabel.

Beperkingen van back-up van SQL-database:

  1. Het is belachelijk om te verwachten dat u herstelt vanuit een SQL-databaseback-up wanneer de toegankelijke back-up verouderd is.
  2. Als de kans groot is dat I/O-fouten op basis van logische consistentie worden verspreid over de SQL-serverdatabase, is deze strategie op dat moment niet legitiem.
  3. Voor die situaties waarin de defecte pagina bestaat in een niet-geclusterde index, kan de SQL-database worden hersteld door de index van de SQL-database te verwijderen en opnieuw te maken.

Techniek 3:Repareer corrupte SQL-database met REPAIR_ALLOW_DATA_LOSS

REPAIR_ALLOW_DATA_LOSS is het vaste basisniveau voor de geanalyseerde fouten.

Opmerkingen:voer het volgende uit voordat u REPAIR_ALLOW_DATA_LOSS gebruikt:

Maak een back-up van de SQL-serverdatabase en sla deze op onder een andere naam

Stel de SQL-database in op de modus voor één gebruiker

Krijg alle tabellen-recordtelling met behulp van de bijbehorende opdrachten

Proclaim @COUNT INT

Proclaim @SQL VARCHAR(2000)

Maak TABLE #T_Info(ID INT IDENTITY(1,1),T_Name VARCHAR(200),D_Count INT)

Proclameer TINFO_CUR CURSOR VOOR

SELECTEER TABLE_NAME UIT INFORMATION_SCHEMA.TABLES

WHERE TABLE_TYPE=’BASISTABEL’

OPEN TINFO_CUR

Haal VOLGENDE VAN TINFO_CUR IN @T_Name

TERWIJL @@FETCH_STATUS =0

Begin

SET @SQL=’INSERT INTO #T_Info(T_Name,D_Count) SELECT ”’[email protected]_Name+”’,COUNT(*) FROM ‘[email protected]_Name+”

UITVOEREN (@SQL)

Haal VOLGENDE VAN TINFO_CUR IN @T_Name

END

SLUIT TINFO_CUR

DEALLOCATE TINFO_CUR

SELECTEER * VAN #T_Info BESTEL OP T_NAME

De bijbehorende verbeteringen helpen bij het repareren van de SQL-database en het oplossen van coherente, op consistentie gebaseerde I/O-fouten:

Voer de opdracht uit:

DBCC CHECKDB (DB_NAME, REPAIR_ALLOW_DATA_LOSS)

Zodra de SQL-database is hersteld, herhaalt u de procedure van 'Table Record Count' en contrasteert u met het aantal oude records.

Er mag geen onderscheid zijn tussen het eerste en het laatste aantal tafelrecords.

Beperkingen :

REPAIR_ALLOW_DATA_LOSS kan een op database-logische consistentie gebaseerde IO-fout oplossen, maar er is een aanzienlijk probleem van gegevensverlies, waarbij een verbinding verlies van basisgegevens kan ondervinden.

Electieve oplossing

Als de bovenstaande technieken niet werken, ga dan naar een SysTools SQL File Repair-tool . Deze tool repareert corrupte MDF- en NDF-bestanden en herstelt alle database-objecten. Bovendien helpt deze tool om alle database-objecten te herstellen, zoals tabellen, triggers, indexen, sleutels, regels, verwijderde bestanden en opgeslagen procedures. Het is een ongelooflijke hulp in het midden van een noodsituatie, omdat het product een onmiskenbare reparatieoplossing biedt en alle SQL-databaseversies ondersteunt.

Conclusie

Lees ook: Controleren of SQL-database beschadigd is 

In dit bericht hebben we de reden beschreven voor SQL Server Detected A Logical Consistency-Based I/O Error en de technieken om dit probleem op te lossen.

Gezien de fout hebben we geprobeerd de juiste techniek te vinden. Als hardware of framework aansprakelijk is voor de fout, is het voorgeschreven om de hardwaregerelateerde problemen te bepalen, en in het geval dat DBCC CHECKDB een consistentiefout rapporteert, probeert u op dat moment de SQL-database te herstellen door een vernieuwde back-up te gebruiken.

Als het probleem niet is opgelost met hardware en back-up, probeer dan op dat moment de database te repareren met behulp van REPAIR_ALLOW_DATA_LOSS. Dit is de basisoplossing om alle fouten van CHECKDB te bepalen, maar dit betekent niet dat het de fout echt zal oplossen. Bovendien kan het gegevensverlies veroorzaken.


  1. Pyodbc - Naam gegevensbron niet gevonden en geen standaardstuurprogramma opgegeven

  2. Een eenvoudige use-case voor indexen op primaire sleutels

  3. Meerdere rijen samenvoegen en groeperen in Oracle

  4. Hoe COT() werkt in MariaDB