Laga skadad/trasig/havererad/förstörd databas i ett antal enkla steg

Felsökning & diagnos 14 augusti 2019
Om det kommer in ett ärende där det visar sig att kundens databas har blivit skadad av någon anledning är det lämpligt att först ta en kopia på den innan arbete påbörjas. Följ hanteringen för lagring av kunds databas. Samtidigt som backup görs av skadade databasen så kan arbete för eftersökning av tidigare databas göras. Skulle det dock visa sig att kunden inte har någon backup så får försök till återställning påbörjas.Detta går också att använda för Rebnis Kassa men då måste SYSDBA och masterkey. Ge ärendet vidare till 2ndline som har dessa uppgifter.Börja med att försöka göra en vanlig backup och restore på databasen skulle detta inte fungera, gå då vidare till "5 enkla steg varianten".Byt ut mot relevant data för platsen som du jobbar på.gfix -validate -full -user SYSDBA -pas masterkey dator:<FDB-sökväg>gfix -mend -full -ignore -user SYSDBA -pas masterkey dator:<FDB-sökväg>gfix -validate -full -user SYSDBA -pas masterkey dator<FDB-sökväg>gbak -b -ignore -garbage -limbo -user SYSDBA -pas masterkey dator:<FDB-sökväg> <FBK-sökväg>gbak -r -p 4096 -rep user SYSDBA -pas masterkey <FBK-sökväg> dator:<FDB-sökväg>Skulle inte ovanstående lösning hjälpa så gå då vidare till nästa.Kontrollera vilket index som havererar och vilka tabeller och kolumner det berör. Det syns vid en vanlig restore av databasen. Den skriver då ut exempelvis:gbak: ERROR:attempt to store duplicate value (visible to active transactions) in unique index "RDB$PRIMARY99" action cancelled by trigger (3) to preserve data integrity -Cannot deactivate index used by a PRIMARY/UNIQUE constraintI detta exempel är det index RDB$PRIMARY99. För att hitta vilken tabell den hör till, kör denna SQL:SELECT rdb$relation_name as tabellnamn FROM RDB$INDICES where rdb$index_name = '<INDEXNAMN>' Om inte denna fungerar, testa att köra detta och leta manuellt reda på indexet: SELECT rdb$index_name as indexnamn, rdb$relation_name as tabellnamn FROM RDB$INDICES order by 1 asc(Indexnamnet står i vänstra kolumnen och tabellnamnet i den högra.)Gör sedan backup på databasen.Kör restore med följande växlar -i -r -p 4096Ladda databasen i SqlExplorer och sök efter dubbletter i berörd tabell, enligt denna mall:select count(*), <kolumnnamn> from <tabellnamn> group by 2 having count(*) > 1Om träffar visas finns det dubbletter i tabellen. Undersök då varför och ta bort dubbletten, det är här VIKTIGT ATT VETA VAD MAN GÖR OCH VILKA KONSEKVENSER BORTTAGNINGEN KAN FÅ.Om du väljer att lägga ena dubbletten "sist" i tabellen så måste du komma ihåg att ställa upp generatorn, annars kommer nästa inmatning i berörd tabell att smälla.Kör sedan denna SQL:EXECUTE BLOCK AS DECLARE VARIABLE stmt VARCHAR(1000); BEGIN for select 'ALTER INDEX '||rdb$index_name ||' ACTIVE;' from rdb$indices where (rdb$system_flag is null or rdb$system_flag = 0) order by rdb$foreign_key nulls first into :stmt do EXECUTE STATEMENT :stmt; END Den aktiverar samtliga indexeringar och om inga felmeddelanden rapporteras har operationen lyckats. Om den returnerar fel så betyder det antagligen att det finns ytterligare dubbletter. Den bör returnera vilket index det är som spökar, så repetera då steg 2, 5 & 6 i guiden.Avsluta med att köra en backup/restore som vanligt, och förhoppningsvis går det som tåget.
© 2026 Rebnis — Intern dokumentation