Пример резервного копирования базы Oracle средствами операционной системы ( NOARCHIVELOG)

Никому не рекомендуется так делать!

Нужно поднять базу из скопированных файлов на каком-нибудь другом сервере

Глупость это все - копировать файлы по отдельности. Если база не в ASM, просто копируются все файлы на другой сервер и меняются некоторые параметры в конфигах. Если с ASM, то RMAN.

SQL> archive log list;
Database log mode	       No Archive Mode
Automatic archival	       Disabled
Archive destination	       USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     7
Current log sequence	       9

Если нет, можно перевести в режим NOARCHIVELOG следующими командами.

SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;


$ mkdir -p /tmp/backups/ORCL12/{DATAFILE,CONTROLFILE,PARAMETERFILE}


SQL> CREATE PFILE = '/tmp/backups/ORCL12/PARAMETERFILE/pfile.txt' from SPFILE;


SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE as '/tmp/backups/ORCL12/CONTROLFILE/controlfile.txt';


$ rman target /


RMAN> report schema;

using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name ORCL12

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    790      SYSTEM               YES     +DATA/ORCL12/DATAFILE/system.258.888429421
3    650      SYSAUX               NO      +DATA/ORCL12/DATAFILE/sysaux.257.888429347
4    135      UNDOTBS1             YES     +DATA/ORCL12/DATAFILE/undotbs1.260.888429497
6    5        USERS                NO      +DATA/ORCL12/DATAFILE/users.259.888429497

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    197      TEMP                 32767       +DATA/ORCL12/TEMPFILE/temp.265.888429595


Создание консистентного бекапа.

RMAN> shutdown immediate;


$ export ORACLE_HOME=$GRID_HOME
$ export ORACLE_SID=+ASM


$ asmcmd ls +DATA/ORCL12/DATAFILE
SYSAUX.257.888429347
SYSTEM.258.888429421
UNDOTBS1.260.888429497
USERS.259.888429497


$ asmcmd ls +DATA/ORCL12/CONTROLFILE/
Current.261.888429547


$ asmcmd ls +DATA/ORCL12/PARAMETERFILE
spfile.266.888429941


 $ asmcmd cp +DATA/ORCL12/DATAFILE/SYSAUX.257.888429347 /tmp/backups/ORCL12/DATAFILE
 $ asmcmd cp +DATA/ORCL12/DATAFILE/SYSTEM.258.888429421 /tmp/backups/ORCL12/DATAFILE
 $ asmcmd cp +DATA/ORCL12/DATAFILE/UNDOTBS1.260.888429497 /tmp/backups/ORCL12/DATAFILE
 $ asmcmd cp +DATA/ORCL12/DATAFILE/USERS.259.888429497 /tmp/backups/ORCL12/DATAFILE


$ asmcmd cp +DATA/ORCL12/CONTROLFILE/Current.261.888429547 /tmp/backups/ORCL12/CONTROLFILE


 $ asmcmd cp +DATA/ORCL12/PARAMETERFILE/spfile.266.888429941 /tmp/backups/ORCL12/PARAMETERFILE


$ cd /tmp/backups/
$ tar -cvzpf ORCL12.tar.gz ./ORCL12


Восстановление из бекапа

$ ssh oracle12@piter "mkdir -p /tmp/backups/"
$ scp ORCL12.tar.gz [email protected]:/tmp/backups

Восстанавливаю на другом сервере с тем же инстансом:

$ cd /tmp/backups/
$ tar -xvzpf ORCL12.tar.gz ./

Купирую теперь уже на ASM.

$ export ORACLE_HOME=$GRID_HOME
$ export ORACLE_SID=+ASM


$ asmcmd mkdir +DATA/ORCL12
$ asmcmd mkdir +DATA/ORCL12/DATAFILE
$ asmcmd mkdir +DATA/ORCL12/CONTROLFILE
$ asmcmd mkdir +DATA/ORCL12/PARAMETERFILE
$ asmcmd mkdir +DATA/ORCL12/ARCHIVELOG


$ asmcmd mkdir +ARCH/ORCL12/ARCHIVELOG

Команда cp не может скопировать на ASM файлы без цифр. Приходится копировать без них. Из-за этого потом придется еще и пересоздавать контролфайл.

$ asmcmd cp /tmp/backups/ORCL12/DATAFILE/SYSAUX.257.888429347 +DATA/ORCL12/DATAFILE/SYSAUX
$ asmcmd cp /tmp/backups/ORCL12/DATAFILE/SYSTEM.258.888429421 +DATA/ORCL12/DATAFILE/SYSTEM
$ asmcmd cp /tmp/backups/ORCL12/DATAFILE/UNDOTBS1.260.888429497 +DATA/ORCL12/DATAFILE/UNDOTBS1
$ asmcmd cp /tmp/backups/ORCL12/DATAFILE/USERS.259.888429497 +DATA/ORCL12/DATAFILE/USERS


Каталог, который должен быть обязательно создан

$ mkdir -p /u01/oracle/admin/ORCL12/adump


$ cd /tmp/backups/ORCL12/PARAMETERFILE/
$ cp pfile.txt pfile.txt.bkp


$ vi pfile.txt

Удалил строки касающиеся контролфайла:

*.control_files='+DATA/ORCL12/CONTROLFILE/current.261.888429547','+ARCH/ORCL12/CONTROLFILE/current.256.888429547'

Получилось:

ORCL12.__data_transfer_cache_size=0
ORCL12.__db_cache_size=822083584
ORCL12.__java_pool_size=16777216
ORCL12.__large_pool_size=33554432
ORCL12.__oracle_base='/u01/oracle'#ORACLE_BASE set from environment
ORCL12.__pga_aggregate_target=402653184
ORCL12.__sga_target=1207959552
ORCL12.__shared_io_pool_size=50331648
ORCL12.__shared_pool_size=268435456
ORCL12.__streams_pool_size=0
*.audit_file_dest='/u01/oracle/admin/ORCL12/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_domain=''
*.db_name='ORCL12'
*.db_recovery_file_dest='+ARCH'
*.db_recovery_file_dest_size=4560m
*.diagnostic_dest='/u01/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCL12XDB)'
*.open_cursors=300
*.pga_aggregate_target=382m
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1148m
*.undo_tablespace='UNDOTBS1'


$ export ORACLE_HOME=/u01/oracle/database/12.1
$ export ORACLE_SID=ORCL12


$ sqlplus / as sysdba


SQL> startup nomount pfile=/tmp/backups/ORCL12/PARAMETERFILE/pfile.txt


SQL> create spfile from memory;
SQL> shutdown immediate;


$ cd /tmp/backups/ORCL12/CONTROLFILE
$ cp controlfile.txt controlfile.txt.bkp
$ vi controlfile.txt

Взял часть кода “RESETLOGS case”. Пришлось удалить цифры в названии файлов данных. Выполняю по частям в консоли:

SQL> STARTUP NOMOUNT


SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL12" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '+DATA/ORCL12/ONLINELOG/group_1.262.888429551',
    '+ARCH/ORCL12/ONLINELOG/group_1.257.888429559'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '+DATA/ORCL12/ONLINELOG/group_2.263.888429563',
    '+ARCH/ORCL12/ONLINELOG/group_2.258.888429569'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '+DATA/ORCL12/ONLINELOG/group_3.264.888429575',
    '+ARCH/ORCL12/ONLINELOG/group_3.259.888429581'
  ) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '+DATA/ORCL12/DATAFILE/system',
  '+DATA/ORCL12/DATAFILE/sysaux',
  '+DATA/ORCL12/DATAFILE/undotbs1',
  '+DATA/ORCL12/DATAFILE/users'
CHARACTER SET AL32UTF8
;


SQL> select status from v$instance;

STATUS
------------
MOUNTED


SQL> SELECT MEMBER FROM V$LOG G, V$LOGFILE F WHERE G.GROUP# = F.GROUP# AND G.STATUS = 'CURRENT';

MEMBER
--------------------------------------------------------------------------------
+ARCH/ORCL12/ONLINELOG/group_3.259.888429581
+DATA/ORCL12/ONLINELOG/group_3.264.888429575


SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: change 1678308 generated at 08/22/2015 18:18:48 needed for thread 1
ORA-00289: suggestion : +ARCH
ORA-00280: change 1678308 for thread 1 is in sequence #9


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: cannot open archived log '+ARCH'
ORA-17503: ksfdopn:2 Failed to open file +ARCH
ORA-15045: ASM file name '+ARCH' is not in reference form

На каком-то сайте написано, что можно игнорировать такого рода ошибки. Данная база никогда не работала в режиме Archivelog. Впрочем база открылась.


SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.


SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/ORCL12/TEMPFILE/temp' SIZE 206569472  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;


SQL> create spfile from memory;


После всех шагов, нужно сделать бекап