Control file datoteka koruptirana – kako otvoriti bazu?

Thursday, 12.03.2009 – msutic

Pozdrav svima!

Prvo da se samo ukratko predstavim. Moje ime je Marko Šutić i radim kao Oracle DBA u jednoj telekomunikacijskoj tvrtci u Hrvatskoj. Prihvatio sam Dejanov poziv da se pridružim ekipi na blogu i sudjelujem sa vlastitim tekstovima Oracle tematike. Nadam se da će moji tekstovi biti zanimljivi i čitljivi, te da će nekome biti od koristi.
No dosta uvoda, pređimo mi na Oracle tematiku 🙂

DB administrator je osoba koja u tvrtci nosi vrlo veliku odgovornost na leđima. To je osoba koja se brine o podacima što je zapravo najveće blago neke tvrtke. Njegova primarna zadaća je da nikad ne izgubi niti jedan podatak (ukoliko je to moguće) kakva god da se havarija dogodila. Da bi to postigao mora biti vrlo izvježban i siguran kod kreiranja sigurnosnih kopija podataka i vraćanja tih podataka u slučaju nekakvog problema. Ali i kada nemate kvalitetnu sigurnosnu kopiju, nije uvijek sve izgubljeno (nada uvijek postoji :)).

U ovom ću postu pisati o tome kako podići/otvoriti bazu kada zbog raznih razloga ostanete bez vrlo bitne controlfile datoteke.

U virtualnoj mašini ću kreirati OracleXE bazu i na njoj napraviti mali demo test. XE je inače besplatna verzija Oracle baze koju najčešće koriste programeri za neke manje aplikacije. Vrlo je jednostavna za kreiranje i konfiguriranje, te ju najčešće programeri vole instalirati bez konzultacija sa db administratorom.

Kad već spominjem OracleXE bazu odmah ću spomenuti dvije stvari na koje trebate obratiti pozornost nakon “defaultne” instalacije:
1. Uobičajenom instalacijom će se kreirati samo jedna controlfile datoteka!
SAVJET: Bitno je da se controlfile datoteka multipleksira, tj. da se napravi još barem jedna kopija na nekoj drugoj lokaciji.

2. Redo Logovi nisu multipleksirani!
SAVJET: Oracle preporuča da se redo logovi multipleksiraju. Gubitak redo logova može biti katastrofalan ukoliko vam je potreban recovery baze.

Dejan je na vrlo razumljiv način opisao postupak instalacije: http://www.baze-podataka.net/2009/03/10/oracle-xe-kako-zapoceti-sa-oracle-om/

Kolegi se jednom dogodila situacija da mu se koruptirala controlfile datoteka i on više nije bio u stanju podići bazu, s obzirom da nije imao nikakvu kopiju te datoteke.
Kada je controlfile datoteka koruptirana ili ne postoji, baza podataka se neće mount-at s obzirom da se u toj datoteci (između ostalog) nalaze pokazivači na db datoteke.

No ipak postoji način da otvorite bazu čak i kada nemate controlfile datoteku ili je ona koruptirana.
Mali demo test:

Baza OracleXE (10.2.0.1.0) na WinXP OS-u.

Kako trenutno u bazi nemam nikakvih podataka, kreirati ću testnu tablicu sa jednim zapisom:

SQL> create table osoba (id number, ime varchar2(20));

Table created.

SQL> insert into osoba values (5, ‘Marko’);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from osoba;

ID IME
———- ——————–
5 Marko

SQL>

Koruptirati ću controlfile datoteku kako bi simulirao situaciju koja se dogodila kolegi.
Otvorit ću CONTROL.DBF u WordPadu i pobrisat neke zapise.

Sada ću pokušati startup baze:

SQL> startup
ORACLE instance started.

Total System Global Area  188743680 bytes
Fixed Size                  1286460 bytes
Variable Size              62918340 bytes
Database Buffers          121634816 bytes
Redo Buffers                2904064 bytes
ORA-00205: error in identifying control file, check alert log for more info

Kao što se vidi, podigla se instanca ali se nisu mount-ale datoteke zbog koruptirane controlfile datoteke.

–> Iz Alert Log-a
Wed Mar 11 10:38:38 2009
ALTER DATABASE   MOUNT
Wed Mar 11 10:38:38 2009
ORA-00202: control file: ‘C:ORACLEXEORADATAXECONTROL.DBF’

Wed Mar 11 10:38:38 2009
ORA-205 signalled during: ALTER DATABASE   MOUNT…

Kako nemamo kopiju controlfile datoteke morat ćemo ju kreirati ručno, a to radimo na ovaj način:

–> Kreirati ćemo skriptu c:ctlfile.sql sadržaja:

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE “XE” NORESETLOGS  NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ‘C:ORACLEXEAPPORACLEFLASH_RECOVERY_AREAXEONLINELOGO1_MF_1_4VH083H0_.LOG’  SIZE 50M,
GROUP 2 ‘C:ORACLEXEAPPORACLEFLASH_RECOVERY_AREAXEONLINELOGO1_MF_2_4VH0878O_.LOG’  SIZE 50M
DATAFILE
‘C:ORACLEXEORADATAXESYSTEM.DBF’,
‘C:ORACLEXEORADATAXEUNDO.DBF’,
‘C:ORACLEXEORADATAXESYSAUX.DBF’,
‘C:ORACLEXEORADATAXEUSERS.DBF’
CHARACTER SET AL32UTF8
;

Ovdje je bitno ispravno definirati pokazivače na db datoteke ovisno o njihovim nazivima i lokacijama.

I sad pokrećemo kreiranu skriptu:

SQL> @c:ctlfile.sql
ORACLE instance started.

Total System Global Area  188743680 bytes
Fixed Size                  1286460 bytes
Variable Size              62918340 bytes
Database Buffers          121634816 bytes
Redo Buffers                2904064 bytes

Control file created.

Controlfile datoteka je kreirana!

Ukoliko je baza bila spuštena na “normal” ili “immediate” način (ne abort) i ukoliko db datoteke nisu oštećene otvaranje baze bi trebalo proći:

SQL> alter database open;

Database altered.

SQL> select * from osoba;

ID IME
———- ——————–
5 Marko

I eto mog zapisa 🙂

  1. 3 Responses to “Control file datoteka koruptirana – kako otvoriti bazu?”

  2. Thumbs up! 😉

    By Mario on Mar 12, 2009

  3. Dobrodošao Marko i čestitka na odličnom tekstu!

    Oštećeni control file je noćna mora svih Oracle administratora. 🙂
    Čak i ako se uspije sve dovesti u red, osjećaj nije kao ranije… Kao kad kupiš nove cipele, paziš ih i čuvaš, ali čim se jednom uprljaju, nisu ti više drage. 🙂

    By Dejan on Mar 12, 2009

  4. Možda već u idućem postu objasnim kako se multipleksiraju redo logovi i controlfile datoteka pa eto da stvar bude kompletna 🙂

    U svakom slučaju hvala na čestitki i dobrodošlici!

    By Marko on Mar 12, 2009

Post a Comment