Zálohování cele databáze v archivním módu a obnova tablespace

Toto cvičení nenavazuje na konkrétní přednášku. Nějak na ni nevyšlo místo. Nicméně není možné si myslet, že rozumíte administraci Oracle bez toho, aniž byste si vyzkoušeli archivní mód.

O principu zálohování jsem na přednáškách mluvil několikrát. Máte k dispozici také prezentaci o zálohování a obnově databáze.

Pašíkův image

Poslední Oracle image máme od pašíka (kameny házejte na prvního středečního cvičího, omlouvám se :)).

Nahozeni site na eth1:

dhclient eth1

Funkční postup na obnovu a nahození Oracle je:

# nastavení prostředí
su - oracle
source /usr/local/bin/oraenv (jako jmeno databaze uvedte "orcl")

# start listenera
lsnrctl start

# start databáze
dbstart $ORACLE_HOME

# manualní start databáze
sqlplus /nolog
connect / as sysdba
startup

# v případě neúspěšného startu, končícího s chybou:
ORA-00845: MEMORY_TARGET not supported on this system

# je oprava na příkazové řádce roota (zkuste experimentovat se size, měla by stačit menší):
umount /dev/shm
mount -t tmpfs shmfs -o size=13g /dev/shm

# a nasledně opětovné spuštění v sqlplus
startup

Test, jestli databáze funguje správně:

# pomocí připojení přes sqlplus

sqlplus
(login as "system", password "dba")

Nahození webové správy (není potřeba):

emctl start dbconsole

# Pokud selže, prohoďte řádky v /etc/hosts.
# Přístupná bude z prohlížeče na URI https://127.0.0.1:1158/.

Scénář

Nejprve souhrnně celý postup:

  1. Vytvoříme tablespace backuptest,
  2. databázi přepneme do archivního módu,
  3. vytvoříme uživatele uu, který v něm bude vytvářet své objekty,
  4. ve schématu uu vyrobíme tabulku t1 a vložíme do ní pár řádek,
  5. pomocí rman vytvoříme plnou zálohu databáze,
  6. přidáme další řádky do tabulky t1 ,
  7. provedeme několikrát log switch, abychom simulovali transakční provoz,
  8. shodíme databázi a smažeme soubor tablespace backuptest,
  9. nastartujeme databázi, detekujeme potřebu obnovy tablespace,
  10. datafile dáme offline, databázi otevřeme,
  11. dáme offline tablespace backuptest,
  12. pomocí rman provedeme restore a recovery chybějícího tablespace,
  13. tablespace dáme do stavu online,
  14. zkontrolujeme, že ztracená data byla obnovena.

Jednolivé kroky:

  1. vytvoříme tablespace backuptest
    CREATE TABLESPACE backuptest DATAFILE '/opt/oracle/app/oracle/oradata/orcl/backuptest.dbf' SIZE 10M;

    Případně SELECT file_name FROM dba_data_files; pro zjištění cesty k souborům

  2. databázi přepneme do archivního módu
    archive log list
    show parameter log_archive_start
    show parameter log_archive_local_first
    shutdown immediate;
    startup mount;
    alter database archivelog;
    alter database open;
    archive log list
    show parameter log_archive_start
    show parameter log_archive_local_first

    V Archive destination ve vypisu archive log list je řetězec za poslednim lomítkem již součástí jména archivovaného logu, nikoliv adresářem.

    alter system switch logfile;
    alter system switch logfile;
    !ls /opt/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/

    V cílovém adresáři (viz poslední příkaz) by měly přibýt archivované log soubory.

  3. vytvoříme uživatele uu, který v něm bude vytvářet své objekty
    create user uu identified by u
    default tablespace backuptest
    temporary tablespace temp;
    grant connect, resource to uu;
  4. ve schématu uu vyrobíme tabulku t1 a vložíme do ní pár řádek
    create table uu.t1 (a number, b number);
    insert into uu.t1 values (1,1);
    insert into uu.t1 values (1,1);
    commit;
  5. pomocí rman vytvoříme plnou zálohu databáze
    • ukončete sqlplus a vytvořte si adresář, pro zálohu:
      mkdir /opt/oracle/backup

      v novém shellu provedem (cold) backup celé databáze pomocí backup set v nástroji rman

      rman target sys/oracle
      shutdown immediate
      startup mount
      RUN {
             BACKUP AS BACKUPSET
             FORMAT '/opt/oracle/backup/%d_%s_%p'
             (DATABASE);
          }

      zálohu by bylo možné provádět i při spuštěné databázi, tohle je rychlejší

    • Chvíli to poběží, buďte trpěliví (pár minut). Sledujte jak přibývá zálohový soubor v adresáři /opt/oracle/backup. Zálohu pak uvidíte ve výpisu:
       alter database open;
       LIST BACKUP OF DATABASE;

      V jiném shellu otevřete sqlplus a přihlaste se jako sysdba. rman si drží informace o provedených zálohách v řídícím souboru cílové databáze:

      SELECT * FROM  v$backup_set;
  6. přidáme další řádky do tabulky t1
     select count(*) from uu.t1;
     insert into uu.t1 select * from uu.t1;
     insert into uu.t1 select * from uu.t1;
     insert into uu.t1 select * from uu.t1;
     insert into uu.t1 select * from uu.t1;
     insert into uu.t1 select * from uu.t1;
     insert into uu.t1 select * from uu.t1;
     insert into uu.t1 select * from uu.t1;
     commit;
     select count(*) from uu.t1;
  7. provedeme několikrát log switch, abychom simulovali transakční provoz
    alter system switch logfile;
    alter system switch logfile;
    alter system switch logfile;
    !ls /opt/oracle/product/11.1.0/db_1/dbs/
  8. shodíme databázi a smažeme soubor tablespace backuptest
  9. nastartujeme databázi, detekujeme potřebu obnovy tablespace
    startup

    Databáze zustane ve stavu mount. Z chybového hlášení je zřejmé, že chybí datový soubor tablespace backuptest

  10. datafile dáme offline, databázi otevřeme
    alter database datafile '/opt/oracle/app/oracle/oradata/orcl/backuptest.dbf' offline;
    alter database open;</code>
      - dáme offline tablespace backuptest <code>
    select tablespace_name, status from dba_tablespaces;
    alter tablespace backuptest offline immediate;
    select tablespace_name, status from dba_tablespaces;
  11. pomocí rman provedeme restore a recovery chybějícího tablespace (pracujme ve druhém shellu)
    rman target sys/oracle;
    restore tablespace  backuptest;
    recover tablespace backuptest;
    sql 'alter tablespace backuptest online';
  12. zkontrolujeme, že ztracená data byla obnovena (v sqlplus)
    select count(*) from uu.t1;

(logický) flashback na úrovni tabulek

  1. V sqlplus se připojte jako uživatel uu
    drop table t1;
    select count(*) from t1;
    select object_name, original_name from user_recyclebin;
    flashback table t1 to before drop rename to t2;
    select count(*) from t2;
    create table t1 as select * from t2;
    drop table t1;
    drop table t2 purge;
    select object_name, original_name from user_recyclebin;
    purge recyclebin;
    select object_name, original_name from user_recyclebin;

(logický) flashback dotazy na staré hodnoty řádků

Vysvětlující a doplňující dokumentace k flashback operacím je v manálu Oracle

  1. jako uživatel uu vytvoříme tabulku t1
    create table t1 (a number, b number);
    insert into t1 values (1,1);
    commit;
  2. jako uživatel sysdba uděláme update:
    update uu.t1 set b=2 where a=1;
    commit;
  3. jako uživatel uu uděláme update:
    update t1 set b=3 where a=1;
    commit;
  4. jako uživatel sysdba uděláme update:
    update uu.t1 set b=4 where a=1;
    commit;
  5. jako sysdba:
    SELECT versions_startscn, versions_starttime,
    versions_endscn, versions_endtime,
    versions_xid, versions_operation,
    a, b
    FROM uu.t1
    VERSIONS BETWEEN TIMESTAMP minvalue and maxvalue;

Pro další dotaz je třeba z výsledku tohoto získat nějaké xid.

SELECT xid, operation, start_scn,commit_scn,
       logon_user, undo_sql
FROM flashback_transaction_query
WHERE xid = '07002100C3020000';
 
2010-12-backuporacle.txt · Last modified: 2010-12-19 20:32 by ucitel
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki