select name, value from v$parameter where name ='instance_name';SID = testdb29
Legen Sie in Ihrem Home-Verzeichnis folgende Verzeichnisse an:
mkdir ~/spfile mkdir ~/pfileIm folgenden werden Sie ein PFILE aus dem standardmäßigen SPFILE erstellen.
Zusatz: Versuchen Sie ein PFILE aus dem SPFILE mittels SQL-Anweisung zu erstellen. Versuchen Sie ein SPFILE aus dem erstellten PFILE zu erstellen. Testen Sie beide Möglichkeiten (OEM und SQL-Anweisung).
Erstellen Sie ein PFILE manuell und binden das SPFILE darin ein.
Starten Sie eine heruntergefahrene Instanz mittels der verschiedenen Start-Optionen.
Wechseln Sie von der niedrigsten Stufe in die jeweils höhere (NOMOUNT, MOUNT, OPEN).
Bei welchen Optionen kann sich der Benutzer test wieder einloggen?
Das Einloggen klappt erst bei OPEN.
Nun werden Sie die Datenbank im eingeschränkten Modus hochfahren.
alter systemset control_files = ( '/hdd1/control01.ctl', '/hdd2/control02.ctl', '/hdd3/control03.ctl' ) SCOPE=SPFILE ;
Simulieren Sie den Ausfall nur einer Kontrolldatei.
Was passiert beim Start?
Es wird ein Lesefehler der Kontrolldatein angezeigt (alert.log).
Es wird aber versucht die DB zu mounten.
Dies gelingt aber nicht.
alter database
add logfile member
'/redoSP/redo01a.log' to group 1,
'/redoSP/redo02a.log' to group 2,
'/redoSP/redo03a.log' to group 3
;
select group#,member,status from v$logfile;
alter database
add logfile group 4
('/redo4/redo04a.LOG',
'/redoSP/redo04b.LOG')
size 50M
;
select group#,member,status from v$logfile; select group#,status from v$log;Was stellen Sie fest?
select group#,status from v$log;
alter database drop logfile group 1;
alter database
add logfile group 1
('/oracle/oradata/testdb29/redo01a.LOG',
'/redoSP/redo01b.LOG')
size 50M;
Was passiert und warum?
alter database
add logfile group 1
('/oracle/oradata/testdb29/redo01a.LOG',
'/redoSP/redo01b.LOG')
size 50M reuse;
select group#,status from v$log; select group#,member,status from v$logfile;
Melden Sie sich an Ihrer Datenbank als sys an.
Erstellten Sie eine Tabelle index_test im lokal verwalteten Tablespace ts_index_test mit einer Datendatei von 500 MB. Die Tabelle soll eine Spalte name besitzen mit dem Datentyp char(2000).
create tablespace ts_index_test datafile '/var/tablespaces/ts_index_test.dbf' size 500M extent management local; create table index_test (name char(2000)) tablespace ts_index_test;Geben Sie folgendes Kommando ein:
set timing on;Was bewirkt dieses Kommando?
set timing on; select * from index_test; ... Abgelaufen: 00:00:00.02Geben sie folgende Namen ein: Klaus, Silke, Manu, Stefan, Alex.
insert into index_test values ('Klaus');
insert into index_test values ('Silke');
insert into index_test values ('Manu');
insert into index_test values ('Stefan');
insert into index_test values ('Alex');
Fügen Sie weitere Datensätze der Tabelle hinzu, indem Sie folgenden Befehl 12 mal verwenden:
-- 12x insert into index_test select * from index_test; -- select count(*) from index_test;Danach haben Sie 20480 Datensätze in Ihrer Tabelle. Fügen Sie nun einen Datensatz mit Anna als Namen ein.
insert into index_test values ('Anna');
commit;
Sie werden nun eine Abfrage starten, bei der ein Full Table Scan durchgeführt werden muss.
Dabei wird die gesamte Tabelle nach den entsprechenden Datensatz durchsucht.
Wie lange benötigt die Abfrage zur Ausführung?
select * from index_test where name = 'Anna'; ... Abgelaufen: 00:09:35.00Erstellen Sie nun einen normalen Index auf die Spalte name Ihrer Tabelle test.
create index id1 on index_test(name);Wiederholen Sie die in Punkt 7 getätigte Abfrage und notieren Sie sich die zur Ausführung benötigte Zeit. Vergleichen Sie beide Zeiten miteinander und interpretieren Sie das Ergebnis.
select * from index_test where name = 'Anna'; ... Abgelaufen: 00:00:15.08Löschen Sie den Index, die Tabelle und den Tablespace.
drop index id1; drop table index_test; drop tablespace ts_index_test;
Melden Sie sich als sys an.
Erstellten Sie eine Tabelle constr_test im lokal verwalteten Tablespace ts_constr_test mit einer Datendatei von 50 MB. Die Tabelle soll eine Spalte name besitzen mit dem Datentyp varchar(20).
create tablespace ts_constr_test datafile '/var/tablespaces/ts_constr_test.dbf' size 50M extent management local ; create table constr_test (name varchar(20)) tablespace ts_constr_test ;Geben sie folgende Namen ein: Klaus, Silke, Manu, Stefan, Alex, Ines.
insert into constr_test values ('Klaus');
insert into constr_test values ('Silke');
insert into constr_test values ('Manu');
insert into constr_test values ('Stefan');
insert into constr_test values ('Alex');
insert into constr_test values ('Ines');
Erstellen Sie ein Check-Constraint für die Spalte name.
Es soll verhindern werden, dass der Name Anna und Berta eingefügt werden kann.
alter table constr_test
add constraint ck_name_constr_test
check (name not in ('Anna', 'Berta'))
;
Versuchen Sie nun den Namen Anna in die Tabelle einzufügen.
insert into constr_test values ('Anna');
FEHLER in Zeile 1:
ORA-02290: Verstoß gegen CHECK-Regel (SYS.CK_NAME_TEST1)
Schalten Sie nun die Constraint-Prüfung aus.
alter table constr_test disable validate constraint ck_name_constr_test;Versuchen Sie nun wiederum den Namen Anna in Ihre Tabelle einzufügen.
insert into constr_test values ('Anna');
FEHLER in Zeile 1:
ORA-25128: Kein Einfügen/Aktualisieren/Löschen bei Tabelle mit
deaktiviertem und validiertem Constraint (SYS.CK_NAME_TEST1)
Schalten Sie die Constraint-Prüfung nun wieder ein.
Aktivieren Sie sie so, dass bestehende Datensätze nicht durch das Constraint geprüft werden.
Was passiert und warum?
alter table constr_test enable novalidate constraint ck_name_constr_test;
insert into constr_test values ('Anna');
FEHLER in Zeile 1:
ORA-02290: Verstoß gegen CHECK-Regel (SYS.CK_NAME_TEST1)
Können Sie den Namen Berta der Tabelle hinzufügen?
insert into constr_test values ('Berta');
FEHLER in Zeile 1:
ORA-02290: Verstoß gegen CHECK-Regel (SYS.CK_NAME_TEST1)
Ändern Sie den Zustand des Constraints so ab, dass bestehende Datensätze auf Übereinstimmung geprüft werden. Was passiert und warum?
alter table constr_test enable validate constraint ck_name_constr_test; Tabelle wurde geändert.
create user anna identified by anna; grant connect, create session to anna;
sqlplus anna@testdb29 Kennwort eingeben: anna SQL>
SQL> create table annatest(s1 int); FEHLER in Zeile 1: ORA-01031: Unzureichende Berechtigungen
SQL> exit
alter user anna quota unlimited on users;
alter user anna default tablespace users
quota unlimited on users;
sqlplus anna@testdb29 Kennwort eingeben: anna SQL> create table annatest(s1 int);
SQL> insert into annatest values(1);
SQL> insert into annatest values(2);
SQL> select * from annatest;
S1
----------
1
2
SQL> commit;
create user berta identified by berta; grant connect, create session to berta; alter user berta quota unlimited on users; alter user berta default tablespace users quota unlimited on users;Was passiert und warum?
sqlplus berta@testdb29 Kennwort eingeben: SQL> create table bertatest(s1 int); SQL> select * from anna.annatest; select * from anna.annatest FEHLER in Zeile 1: ORA-00942: Tabelle oder View nicht vorhanden
sqlplus anna@testdb29 SQL> grant select on annatest to berta; Benutzerzugriff (Grant) wurde erteilt.
sqlplus berta@testdb29
SQL> select * from anna.annatest;
S1
----------
1
2
sqlplus berta@testdb29 SQL> create table anna.bertatest(s1 int); FEHLER in Zeile 1: ORA-01031: Unzureichende BerechtigungenKann nur durch SYS dem User anna zugewiesen werden (grant ... with admin option). sys darf natürlich Rechte für Objekte vergeben. anna kann nur für ihre Objekte die Berechtigungen weitergeben.
sqlplus anna@testdb29 SQL> grant select, insert, update, delete on anna.annatest to berta; Benutzerzugriff (Grant) wurde erteilt.
... (SID_DESC= (GLOBAL_DBNAME=pinguin) (ORACLE_HOME=/opt/oracle/product/9ir2) (SID_NAME=testdb29) ) ...Starten Sie den Listener neu.
sqlplus /nolog connect sys/sys@pinguinWas passiert?
Montag 18:00 Uhr - Cold Backup
Führen Sie ein Cold-Backup durch.
Die Datenbank testdb29 soll im Modus NOARCHIVE-Log sein.
shutdown immediate; startup mount; alter database noarchivelog; archive log stop;Fahren Sie nun die Instanz herunter un kopieren Sie alle notwendigen Dateien in das Verzeichnis /backup. Fahren Sie anschließend die Instanz wieder hoch.
shutdown immediate; host; cp /oracle/oradata/testdb29/* /backup exit startup;Dienstag 08:00 bis 15:59 - Arbeitslast
create table unterricht (fachnummer number, fachname varchar2(20)); insert into unterricht values(1,'Deutsch'); insert into unterricht values(2,'Deutsch'); insert into unterricht values(3,'Englisch'); insert into unterricht values(4,'Mathe'); insert into unterricht values(5,'Zeichnen'); commit; alter system switch logfile; alter system switch logfile; alter system switch logfile;Dienstag 16:00 - Verlust der Datei users01.dbf
shutdown immediate;
host;
rm /oracle/oradata/testdb29/users01.dbf
exit
startup;
...
Datenbank mit Mount angeschlossen.
ORA-01157: Datendatei 3 kann nicht identifiziert/gesperrt werden
Siehe DBWR-Trace-Datei.
ORA-01110: Datendatei 3: '/oracle/oradata/testdb29/users01.dbf'
Wiederherstellung der Datenbank testdb29 (1. Versuch)
shutdown immediate; host; cp /backup/users01.dbf /oracle/oradata/testdb29 exit startup; ... Datenbank mit Mount angeschlossen. ORA-01113: Für Datei '3' ist eine Datenträger-Recovery notwendig ORA-01110: Datendatei 3: '/oracle/oradata/testdb29/users01.dbf'Versuchen Sie nun, die seit der letzten Sicherung durchgeführten Transaktionen aus den Online-Redo-Log-Dateien wiederherzustellen. Es kann sein, dass bei Ihnen die Datei users01.dbf nicht die Dateindatei 3 ist.
recover datafile 3;Warum schlägt dieses Vorhaben fehl?
Wiederherstellung der Datenbank testdb29 (2. Versuch)
Versuchen Sie alle Datendateien wiederherzustellen.
shutdown immediate; host; cp /backup/* /oracle/oradata/testdb29 exit startup; ORACLE-Instanz hochgefahren. ... ORA-00214: Steuerdatei '/hd2/control02.ctl' Version 684 nicht konsistent mit Datei '/oracle/oradata/testdb29/control01.ctl Version 657Natürlich müssen noch die Multiplex-Control-Dateien an den entsprechenden Stellen und unter den entsprechenden Namen wiederhergestellt werden. Da die Control-Dateien immer identisch sind, kann die gesicherte Control-Datei aus dem Verzeichnis /backup an die anderen Speicherorte ohne weiteres kopiert werden.
shutdown immediate; host; cp /backup/control01.ctl /hd2/control02.ctl cp /backup/control01.ctl /hd3/control03.ctl exit startup; ORACLE-Instanz hochgefahren. ... Datenbank geöffnet.Nun testen Sie, ob die Tabelle unterricht noch vorhanden ist.
select * from unterricht;
*
FEHLER in Zeile 1:
ORA-00942: Tabelle oder View nicht vorhanden.
select log_mode from v$database; LOG_MODE ------------ NOARCHIVELOG 1 Zeile wurde ausgewählt. shutdown immediate; sqlplus /nolog connect sys/sys as sysdba startup mount; alter database archivelog;Manuell:
alter system archive log start; alter system set log_archive_start=true scope=spfile; alter database open;
Montag 18:00 Uhr - Cold Backup
Im folgenden werden Sie ein Cold-Backup durchführen.
Fahren Sie nun die Instanz herunter und kopieren Sie alle notwendigen Dateien in das Verzeichnis /backup.
Fahren Sie anschließend die Instanz wieder hoch.
shutdown immediate; host; cp /oracle/oradata/testdb29/* /backup exit startup;Dienstag 08:00 bis 15:59 - Arbeitslast
create table unterricht (fachnummer number, fachname varchar2(20)); insert into unterricht values(1,'Deutsch'); insert into unterricht values(2,'Deutsch'); insert into unterricht values(3,'Englisch'); insert into unterricht values(4,'Mathe'); insert into unterricht values(5,'Zeichnen'); commit; alter system switch logfile; alter system switch logfile; alter system switch logfile;Dienstag 16:00 - Verlust der Datei users01.dbf
shutdown immediate;
host;
rm /oracle/oradata/testdb29/users01.dbf
exit
startup;
...
Datenbank mit Mount angeschlossen.
ORA-01157: Datendatei 3 kann nicht identifiziert/gesperrt werden
Siehe DBWR-Trace-Datei.
ORA-01110: Datendatei 3: '/oracle/oradata/testdb29/users01.dbf'
Wiederherstellung der Datenbank testdb29
shutdown immediate; host; cp /backup/users01.dbf /oracle/oradata/testdb29 exit startup; ... Datenbank mit Mount angeschlossen. ORA-01113: Für Datei '3' ist eine Datenträger-Recovery notwendig ORA-01110: Datendatei 3: '/oracle/oradata/testdb29/users01.dbf'Als nächstes versuchen Sie nun, die seit der letzten Sicherung durchgeführten Transaktionen aus den Online-Redo-Log-Dateien wiederherzustellen. Es kann sein, dass bei Ihnen die Datei users01.dbf nicht die Dateindatei 3 ist.
recover datafile 3;Warum sfunktioniert dieses Vorhaben nunmehr?
alter database backup controlfile to trace;
alter database open;Was passiert?
RMAN target sys/sys@testdb29 nocatalogGeben Sie folgende Anweisung ein:
run {
allocate channel s1 type disk format '/backup/b_%u_%s_%p';
backup database;
}
Erstellen Sie die Tabelle abteilung und tragen dort zwei Abteilungen ein.
Führen Sie drei Log-Switches durch.
Die Änderungen befinden sich demnach nicht mehr in den Online-Redo-Log-Dateien.
create table abteilung (abtnr int, abtname varchar2(30)); insert into abteilung values (1,'Forschung'); insert into abteilung values (2,'Entwicklung'); commit; alter system switch logfile; alter system switch logfile; alter system switch logfile;Simulieren Sie den Verlust der Datendatei users01.dbf.
shutdown immediate;
host;
rm /oracle/oradata/testdb29/users01.dbf
exit
startup;
...
Datenbank mit Mount angeschlossen.
ORA-01157: Datendatei 3 kann nicht identifiziert/gesperrt werden
Siehe DBWR-Trace-Datei.
ORA-01110: Datendatei 3: '/oracle/oradata/testdb29/users01.dbf'
Im welchen Zustand befindet sich die Instanz?
Stellen Sie die Datei users01.dbf mit RMAN wieder her.
RMAN target sys/sys@testdb29 nocatalogGeben Sie folgende Anweisung ein:
run {
allocate channel s1 type disk format '/backup/b_%u_%s_%p';
restore datafile '/oracle/oradata/testdb29/users01.dbf';
recover datafile '/oracle/oradata/testdb29/users01.dbf';
}
Wechseln Sie zu SQLPLUS und öffnen Sie die Datenbank.
alter database open;
Stefan Hietel dama.go GmbH, Robert Warnke http://rowa.giso.de