ORACLE/Backup & Recovery2024. 2. 14. 17:03
반응형

주로 사용자의 실수로 datafile 삭제

-- 전제 조건 아카이브 모드 상태.
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /arch
Oldest online log sequence     83
Next log sequence to archive   85
Current log sequence           85
SQL> 

 

-- 상태 확인 
SQL> select file#,name,status,CREATION_TIME from v$datafile;

     FILE# NAME                                               STATUS  CREATION_TIM
---------- -------------------------------------------------- ------- ------------
         1 /oradata/ORA19C/system01.dbf                       SYSTEM  17-APR-19
         3 /oradata/ORA19C/sysaux01.dbf                       ONLINE  17-APR-19
         4 /oradata/ORA19C/undotbs01.dbf                      ONLINE  17-APR-19
         5 /oradata/ORA19C/users02.dbf                        ONLINE  14-FEB-24
         7 /oradata/ORA19C/users01.dbf                        ONLINE  17-APR-19
         8 /oradata/ORA19C/soe01.dbf                          ONLINE  22-JAN-24

-- 장애 상황 발생 
[oracle@ora19c ORA19C]$ rm users02.dbf 
[oracle@ora19c ORA19C]$ exit

-- 로그 스위칭 도중 db down 발생
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 5028
Session ID: 154 Serial number: 38319

Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
-- DB 마운트 모드 기동
[ora19c:/home/oracle]> ss

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Feb 14 14:52:56 2024
Version 19.21.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup mount
ORACLE instance started.

Total System Global Area 3137336112 bytes
Fixed Size                  8930096 bytes
Variable Size             671088640 bytes
Database Buffers         2449473536 bytes
Redo Buffers                7843840 bytes
Database mounted.
SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                   CHANGE# TIME             CON_ID
---------- ------- ------- -------------------- ---------- ------------ ----------
         5 ONLINE  ONLINE  FILE NOT FOUND                0                       0
 
SQL>  select file#,name,status,CREATION_TIME from v$datafile;
     FILE# NAME                                          STATUS  CREATION_TIM
---------- --------------------------------------------- ------- ------------
         1 /oradata/ORA19C/system01.dbf                  SYSTEM  17-APR-19
         3 /oradata/ORA19C/sysaux01.dbf                  ONLINE  17-APR-19
         4 /oradata/ORA19C/undotbs01.dbf                 ONLINE  17-APR-19
         5 /oradata/ORA19C/users02.dbf                   ONLINE  14-FEB-24
         7 /oradata/ORA19C/users01.dbf                   ONLINE  17-APR-19
         8 /oradata/ORA19C/soe01.dbf                     ONLINE  22-JAN-24

6 rows selected.
-- 삭제 파일  껍데기 만들어 줌
SQL> alter database create datafile '/oradata/ORA19C/users02.dbf';

Database altered.
-- 복구 
SQL> recover datafile 5;
Media recovery complete.
SQL> alter database datafile 5 online;

Database altered.
-- db open 완료
SQL> alter database open;

Database altered. 

-- 복구 완료 확인

SQL> select * from v$recover_file;

no rows selected

SQL> col file_name for a45
SQL> set lines 200
SQL>  select tablespace_name,file_name,bytes/1024/1024 from dba_data_files;

TABLESPACE_NAME                FILE_NAME                                     BYTES/1024/1024
------------------------------ --------------------------------------------- ---------------
USERS                          /oradata/ORA19C/users01.dbf                             93.75
UNDOTBS1                       /oradata/ORA19C/undotbs01.dbf                             605
SYSTEM                         /oradata/ORA19C/system01.dbf                             1150
SYSAUX                         /oradata/ORA19C/sysaux01.dbf                              910
USERS                          /oradata/ORA19C/users02.dbf                           36.5625
SOE                            /oradata/ORA19C/soe01.dbf                                2419

6 rows selected.

SQL>  select file#,name,status,CREATION_TIME from v$datafile;

     FILE# NAME                                          STATUS  CREATION_TIM
---------- --------------------------------------------- ------- ------------
         1 /oradata/ORA19C/system01.dbf                  SYSTEM  17-APR-19
         3 /oradata/ORA19C/sysaux01.dbf                  ONLINE  17-APR-19
         4 /oradata/ORA19C/undotbs01.dbf                 ONLINE  17-APR-19
         5 /oradata/ORA19C/users02.dbf                   ONLINE  14-FEB-24
         7 /oradata/ORA19C/users01.dbf                   ONLINE  17-APR-19
         8 /oradata/ORA19C/soe01.dbf                     ONLINE  22-JAN-24

6 rows selected.

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
ora19c           OPEN

 

※ DB가  다운 되지 않았다면 삭제한 datafile offline 후 alter database create datafile  생성 부터 

진행 하면 된다.

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2023. 5. 23. 17:44
반응형

RAC TO SINGLE 복제 목적지 에서 실행
[oracle@aracdb aracdb]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.219.201 ora12c

### Public
192.168.219.111  arac1
192.168.219.113  arac2
### Private
192.168.0.111  arac1-priv
192.168.0.112  arac2-priv
### Virtual
192.168.219.112  arac1-vip
192.168.219.114  arac2-vip
### DNS
192.168.219.115  arac-scan


source 서버에서 pwd파일 목적지 서버로 카피
scp $ORACLE_HOME/dbs/orapwaracdb1 ora12c:$ORACLE_HOME/dbs/orapwaracdb
-- 패스워드 파일이 없을 시에 실행 후 목적지 서버로 옮긴다
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle force=y format=12

파라미터 설정

*.audit_file_dest='/u01/app/oracle/admin/aracdb/adump'
*.audit_trail='db'
#*.cluster_database=true
*.compatible='12.2.0'
*.control_files='/oradata/aracdb/controlfile/control01.ctl','/oradata/aracdb/controlfile/control02.ctl'
*.db_block_size=8192
*.db_create_file_dest='/oradata/aracdb'
*.db_name='aracdb'
*.db_recovery_file_dest='/oradata/aracdb'
*.db_recovery_file_dest_size=10g
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=aracdbXDB)'
#family:dw_helper.instance_mode='read-only'
*.log_archive_format='%t_%s_%r.dbf'
*.nls_language='KOREAN'
*.nls_territory='KOREA'
*.open_cursors=300
*.pga_aggregate_target=1000m
*.processes=320
*.remote_login_passwordfile='exclusive'
*.sga_target=2998m
*.log_file_name_convert='+DATA','/oradata','+FRA','/oradata'
*.db_file_name_convert='+DATA','/oradata','+FRA','/oradata'

오라클 유저로 디렉토리 생성
/oradata/aracdb
/oradata/aracdb/onlinelog        <<== 리두 로그 경로 안만들었더니 에러 발생
/u01/app/oracle/admin/aracdb/adump
/u01/app/oracle/diag/rdbms/aracdb/aracdb/trace
/u01/app/oracle/diag/rdbms/aracdb/aracdb/cdump

-- 목적지 복제용 리스너 구성

LISTENER =
   (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = ora12c)(PORT = 1521))
     )
   )

SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
       (SID_NAME = aracdb)
       (ORACLE_HOME = /u01/app/oracle/product/12C/db_1)
     )
   )

목적지 NO MOUNT 모드 기동

SQL*Plus: Release 12.2.0.1.0 Production on Tue May 23 17:18:57 2023

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup nomount
ORACLE instance started.

Total System Global Area 3154116608 bytes
Fixed Size                  8625656 bytes
Variable Size             788529672 bytes
Database Buffers         2348810240 bytes
Redo Buffers                8151040 bytes
SQL> 


목적지
## tnsnames.ora
ARACDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.219.112)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = aracdb)
    )
  )

aracdb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora12c)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = aracdb)
    )
  )
-- 리스너 기동

[oracle@aracdb admin]$ lsnrctl start
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 25-JAN-2024 16:31:24
Copyright (c) 1991, 2016, Oracle.  All rights reserved.
Starting /u01/app/oracle/product/12C/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 12.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/12C/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/ora12c/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora12c)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                25-JAN-2024 16:31:24
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/12C/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/ora12c/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora12c)(PORT=1521)))
Services Summary...
Service "aracdb" has 1 instance(s).
  Instance "aracdb", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

 

-- 목적지에서 rman  접속 후 복제 명령어 실행
[oracle@aracdb admin]$ rman target sys/oracle@aracdb1 auxiliary sys/oracle@aracdb

Recovery Manager: Release 12.2.0.1.0 - Production on Thu Jan 25 16:31:34 2024

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ARACDB (DBID=2943394426)
connected to auxiliary database: ARACDB (not mounted)

RMAN> DUPLICATE DATABASE TO aracdb
2>   FROM ACTIVE DATABASE
3>   NOFILENAMECHECK;

Starting Duplicate Db at 24/01/25
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=261 device type=DISK
current log archived

contents of Memory Script:
{
   sql clone "create spfile from memory";
}
executing Memory Script

sql statement: create spfile from memory

contents of Memory Script:
{
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    3154116608 bytes

Fixed Size                     8625656 bytes
Variable Size                788529672 bytes
Database Buffers            2348810240 bytes
Redo Buffers                   8151040 bytes

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''ARACDB'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   sql clone "alter system set  db_unique_name = 
 ''aracdb'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   restore clone from service  'aracdb1' primary controlfile;
   alter clone database mount;
}
executing Memory Script

sql statement: alter system set  db_name =  ''ARACDB'' comment= ''Modified by RMAN duplicate'' scope=spfile

sql statement: alter system set  db_unique_name =  ''aracdb'' comment= ''Modified by RMAN duplicate'' scope=spfile

Oracle instance shut down

Oracle instance started

Total System Global Area    3154116608 bytes

Fixed Size                     8625656 bytes
Variable Size                788529672 bytes
Database Buffers            2348810240 bytes
Redo Buffers                   8151040 bytes

Starting restore at 24/01/25
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=135 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
output file name=/oradata/aracdb/controlfile/control01.ctl
output file name=/oradata/aracdb/controlfile/control02.ctl
Finished restore at 24/01/25

database mounted

contents of Memory Script:
{
   set newname for datafile  1 to 
 "/oradata/aracdb/datafile/system.265.1136924533";
   set newname for datafile  3 to 
 "/oradata/aracdb/datafile/sysaux.266.1136924577";
   set newname for datafile  4 to 
 "/oradata/aracdb/datafile/undotbs1.267.1136924603";
   set newname for datafile  5 to 
 "/oradata/aracdb/datafile/undotbs2.273.1136924729";
   set newname for datafile  7 to 
 "/oradata/aracdb/datafile/users.268.1136924605";
   restore
   from  nonsparse   from service 
 'aracdb1'   clone database
   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 24/01/25
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /oradata/aracdb/datafile/system.265.1136924533
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:35
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00003 to /oradata/aracdb/datafile/sysaux.266.1136924577
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:25
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00004 to /oradata/aracdb/datafile/undotbs1.267.1136924603
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00005 to /oradata/aracdb/datafile/undotbs2.273.1136924729
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00007 to /oradata/aracdb/datafile/users.268.1136924605
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
Finished restore at 24/01/25

sql statement: alter system archive log current
current log archived

contents of Memory Script:
{
   restore clone force from service  'aracdb1' 
           archivelog from scn  1728198;
   switch clone datafile all;
}
executing Memory Script

Starting restore at 24/01/25
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=23
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=24
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
Finished restore at 24/01/25

datafile 1 switched to datafile copy
input datafile copy RECID=10 STAMP=1159202130 file name=/oradata/aracdb/datafile/system.265.1136924533
datafile 3 switched to datafile copy
input datafile copy RECID=11 STAMP=1159202130 file name=/oradata/aracdb/datafile/sysaux.266.1136924577
datafile 4 switched to datafile copy
input datafile copy RECID=12 STAMP=1159202130 file name=/oradata/aracdb/datafile/undotbs1.267.1136924603
datafile 5 switched to datafile copy
input datafile copy RECID=13 STAMP=1159202130 file name=/oradata/aracdb/datafile/undotbs2.273.1136924729
datafile 7 switched to datafile copy
input datafile copy RECID=14 STAMP=1159202130 file name=/oradata/aracdb/datafile/users.268.1136924605

contents of Memory Script:
{
   set until scn  1728333;
   recover
   clone database
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 24/01/25
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 23 is already on disk as file /oradata/aracdb/ARACDB/archivelog/2024_01_25/o1_mf_1_23_lv43szth_.arc
archived log for thread 1 with sequence 24 is already on disk as file /oradata/aracdb/ARACDB/archivelog/2024_01_25/o1_mf_1_24_lv43t18x_.arc
archived log file name=/oradata/aracdb/ARACDB/archivelog/2024_01_25/o1_mf_1_23_lv43szth_.arc thread=1 sequence=23
archived log file name=/oradata/aracdb/ARACDB/archivelog/2024_01_25/o1_mf_1_24_lv43t18x_.arc thread=1 sequence=24
media recovery complete, elapsed time: 00:00:01
Finished recover at 24/01/25
Oracle instance started

Total System Global Area    3154116608 bytes

Fixed Size                     8625656 bytes
Variable Size                788529672 bytes
Database Buffers            2348810240 bytes
Redo Buffers                   8151040 bytes

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''ARACDB'' comment=
 ''Reset to original value by RMAN'' scope=spfile";
   sql clone "alter system reset  db_unique_name scope=spfile";
}
executing Memory Script

sql statement: alter system set  db_name =  ''ARACDB'' comment= ''Reset to original value by RMAN'' scope=spfile

sql statement: alter system reset  db_unique_name scope=spfile
Oracle instance started

Total System Global Area    3154116608 bytes

Fixed Size                     8625656 bytes
Variable Size                788529672 bytes
Database Buffers            2348810240 bytes
Redo Buffers                   8151040 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "ARACDB" RESETLOGS ARCHIVELOG 
  MAXLOGFILES    192
  MAXLOGMEMBERS      3
  MAXDATAFILES     1024
  MAXINSTANCES    32
  MAXLOGHISTORY      292
 LOGFILE
  GROUP   1 ( '/oradata/aracdb/onlinelog/group_1.260.1136924673', '/oradata/aracdb/onlinelog/group_1.270.1136924671' ) SIZE 200 M  REUSE,
  GROUP   2 ( '/oradata/aracdb/onlinelog/group_2.261.1136924673', '/oradata/aracdb/onlinelog/group_2.271.1136924671' ) SIZE 200 M  REUSE
 DATAFILE
  '/oradata/aracdb/datafile/system.265.1136924533'
 CHARACTER SET AL32UTF8

sql statement: ALTER DATABASE ADD LOGFILE 
  
  INSTANCE 'i2' 
  GROUP   3 ( '/oradata/aracdb/onlinelog/group_3.274.1136924835', '/oradata/aracdb/onlinelog/group_3.262.1136924835' ) SIZE 200 M  REUSE,
  GROUP   4 ( '/oradata/aracdb/onlinelog/group_4.275.1136924837', '/oradata/aracdb/onlinelog/group_4.263.1136924837' ) SIZE 200 M  REUSE

contents of Memory Script:
{
   set newname for tempfile  1 to 
 "/oradata/aracdb/tempfile/temp.272.1136924683";
   switch clone tempfile all;
   catalog clone datafilecopy  "/oradata/aracdb/datafile/sysaux.266.1136924577", 
 "/oradata/aracdb/datafile/undotbs1.267.1136924603", 
 "/oradata/aracdb/datafile/undotbs2.273.1136924729", 
 "/oradata/aracdb/datafile/users.268.1136924605";
   switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /oradata/aracdb/tempfile/temp.272.1136924683 in control file

cataloged datafile copy
datafile copy file name=/oradata/aracdb/datafile/sysaux.266.1136924577 RECID=1 STAMP=1159202165
cataloged datafile copy
datafile copy file name=/oradata/aracdb/datafile/undotbs1.267.1136924603 RECID=2 STAMP=1159202165
cataloged datafile copy
datafile copy file name=/oradata/aracdb/datafile/undotbs2.273.1136924729 RECID=3 STAMP=1159202165
cataloged datafile copy
datafile copy file name=/oradata/aracdb/datafile/users.268.1136924605 RECID=4 STAMP=1159202165

datafile 3 switched to datafile copy
input datafile copy RECID=1 STAMP=1159202165 file name=/oradata/aracdb/datafile/sysaux.266.1136924577
datafile 4 switched to datafile copy
input datafile copy RECID=2 STAMP=1159202165 file name=/oradata/aracdb/datafile/undotbs1.267.1136924603
datafile 5 switched to datafile copy
input datafile copy RECID=3 STAMP=1159202165 file name=/oradata/aracdb/datafile/undotbs2.273.1136924729
datafile 7 switched to datafile copy
input datafile copy RECID=4 STAMP=1159202165 file name=/oradata/aracdb/datafile/users.268.1136924605

contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script

database opened
Cannot remove created server parameter file
Finished Duplicate Db at 24/01/25

RMAN> 


접속 후 상태 확인

SQL*Plus: Release 12.2.0.1.0 Production on Thu Jan 25 16:37:44 2024

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
aracdb           OPEN

 

##################################################################################

채널 여러개 할당

복제 시에 채널 개수 만큼 패러럴 하게 복제

ex) 채널 2개 할당 

rman target sys/oracle@aracdb1 auxiliary sys/oracle@aracdb
run {
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate auxiliary channel stby1 type disk;
allocate auxiliary channel stby2 type disk;
duplicate database to aracdb from active database nofilenamecheck;
}

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2023. 5. 23. 17:28
반응형

[oracle@aracdb admin]$ rman target sys/oracle@aracdb1 auxiliary sys/oracle@aracdb

Recovery Manager: Release 12.2.0.1.0 - Production on Tue May 23 17:14:22 2023

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ARACDB (DBID=2943394426)
connected to auxiliary database: ARACDB (not mounted)

RMAN> DUPLICATE DATABASE TO aracdb
2>   FROM ACTIVE DATABASE
3>   NOFILENAMECHECK;

Starting Duplicate Db at 23/05/23
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=261 device type=DISK
current log archived

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''ARACDB'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   sql clone "alter system set  db_unique_name = 
 ''ARACDB'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   restore clone from service  'aracdb1' primary controlfile;
   alter clone database mount;
}
executing Memory Script

sql statement: alter system set  db_name =  ''ARACDB'' comment= ''Modified by RMAN duplicate'' scope=spfile

sql statement: alter system set  db_unique_name =  ''ARACDB'' comment= ''Modified by RMAN duplicate'' scope=spfile

Oracle instance shut down

Oracle instance started

Total System Global Area    3154116608 bytes

Fixed Size                     8625656 bytes
Variable Size                788529672 bytes
Database Buffers            2348810240 bytes
Redo Buffers                   8151040 bytes

Starting restore at 23/05/23
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=136 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
output file name=/oradata/aracdb/controlfile/control01.ctl
output file name=/oradata/aracdb/controlfile/control02.ctl
Finished restore at 23/05/23

database mounted

contents of Memory Script:
{
   set newname for datafile  1 to 
 "/oradata/aracdb/datafile/system.265.1136924533";
   set newname for datafile  3 to 
 "/oradata/aracdb/datafile/sysaux.266.1136924577";
   set newname for datafile  4 to 
 "/oradata/aracdb/datafile/undotbs1.267.1136924603";
   set newname for datafile  5 to 
 "/oradata/aracdb/datafile/undotbs2.273.1136924729";
   set newname for datafile  7 to 
 "/oradata/aracdb/datafile/users.268.1136924605";
   restore
   from  nonsparse   from service 
 'aracdb1'   clone database
   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 23/05/23
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /oradata/aracdb/datafile/system.265.1136924533
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:35
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00003 to /oradata/aracdb/datafile/sysaux.266.1136924577
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:26
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00004 to /oradata/aracdb/datafile/undotbs1.267.1136924603
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00005 to /oradata/aracdb/datafile/undotbs2.273.1136924729
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00007 to /oradata/aracdb/datafile/users.268.1136924605
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 23/05/23

sql statement: alter system archive log current
current log archived

contents of Memory Script:
{
   restore clone force from service  'aracdb1' 
           archivelog from scn  1457925;
   switch clone datafile all;
}
executing Memory Script

Starting restore at 23/05/23
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=12
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service aracdb1
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=13
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
Finished restore at 23/05/23

datafile 1 switched to datafile copy
input datafile copy RECID=6 STAMP=1137604617 file name=/oradata/aracdb/datafile/system.265.1136924533
datafile 3 switched to datafile copy
input datafile copy RECID=7 STAMP=1137604617 file name=/oradata/aracdb/datafile/sysaux.266.1136924577
datafile 4 switched to datafile copy
input datafile copy RECID=8 STAMP=1137604617 file name=/oradata/aracdb/datafile/undotbs1.267.1136924603
datafile 5 switched to datafile copy
input datafile copy RECID=9 STAMP=1137604617 file name=/oradata/aracdb/datafile/undotbs2.273.1136924729
datafile 7 switched to datafile copy
input datafile copy RECID=10 STAMP=1137604617 file name=/oradata/aracdb/datafile/users.268.1136924605

contents of Memory Script:
{
   set until scn  1458042;
   recover
   clone database
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 23/05/23
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 12 is already on disk as file /oradata/aracdb/ARACDB/archivelog/2023_05_23/o1_mf_1_12_l6rxmq27_.arc
archived log for thread 1 with sequence 13 is already on disk as file /oradata/aracdb/ARACDB/archivelog/2023_05_23/o1_mf_1_13_l6rxmrgm_.arc
archived log file name=/oradata/aracdb/ARACDB/archivelog/2023_05_23/o1_mf_1_12_l6rxmq27_.arc thread=1 sequence=12
archived log file name=/oradata/aracdb/ARACDB/archivelog/2023_05_23/o1_mf_1_13_l6rxmrgm_.arc thread=1 sequence=13
media recovery complete, elapsed time: 00:00:01
Finished recover at 23/05/23
Oracle instance started

Total System Global Area    3154116608 bytes

Fixed Size                     8625656 bytes
Variable Size                788529672 bytes
Database Buffers            2348810240 bytes
Redo Buffers                   8151040 bytes

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''ARACDB'' comment=
 ''Reset to original value by RMAN'' scope=spfile";
   sql clone "alter system reset  db_unique_name scope=spfile";
}
executing Memory Script

sql statement: alter system set  db_name =  ''ARACDB'' comment= ''Reset to original value by RMAN'' scope=spfile

sql statement: alter system reset  db_unique_name scope=spfile
Oracle instance started

Total System Global Area    3154116608 bytes

Fixed Size                     8625656 bytes
Variable Size                788529672 bytes
Database Buffers            2348810240 bytes
Redo Buffers                   8151040 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "ARACDB" RESETLOGS ARCHIVELOG 
  MAXLOGFILES    192
  MAXLOGMEMBERS      3
  MAXDATAFILES     1024
  MAXINSTANCES    32
  MAXLOGHISTORY      292
 LOGFILE
  GROUP   1 ( '/oradata/aracdb/onlinelog/group_1.260.1136924673', '/oradata/aracdb/onlinelog/group_1.270.1136924671' ) SIZE 200 M  REUSE,
  GROUP   2 ( '/oradata/aracdb/onlinelog/group_2.261.1136924673', '/oradata/aracdb/onlinelog/group_2.271.1136924671' ) SIZE 200 M  REUSE
 DATAFILE
  '/oradata/aracdb/datafile/system.265.1136924533'
 CHARACTER SET AL32UTF8

sql statement: ALTER DATABASE ADD LOGFILE 
  
  INSTANCE 'i2' 
  GROUP   3 ( '/oradata/aracdb/onlinelog/group_3.274.1136924835', '/oradata/aracdb/onlinelog/group_3.262.1136924835' ) SIZE 200 M  REUSE,
  GROUP   4 ( '/oradata/aracdb/onlinelog/group_4.275.1136924837', '/oradata/aracdb/onlinelog/group_4.263.1136924837' ) SIZE 200 M  REUSE
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 05/23/2023 17:17:25
RMAN-05501: aborting duplication of target database
RMAN-06136: ORACLE error from auxiliary database: ORA-00301: error in adding log file '/oradata/aracdb/onlinelog/group_3.274.1136924835' - file cannot be created
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 1

RMAN> exit'

오라클 rac to single 복제  시에 

리두 로그 경로를 미리 만들지 않으면  에러가 난다.

ASM TO ASM이면 에러 안 날꺼 같은데...

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2014. 8. 15. 13:18
반응형

출처 :https://hoing.io/archives/268

 

1. TEST Information

Items Description
Test Date 2011 / 12 / 04
CPU VirtualBox VCPUx4
Main Memory 2GB
O/S version RHEL 5.5
Host Name test1, test2
ORACLE_SID testdb1, testdb2
Oracle version 10.2.0.5

 

 

 

 

 

 

 

 

 

 

 

 

 

2. Scenario

 

1) 현재 testdb1 , testdb2  SID RAC(10.2.0.5) 에서 HOT Backup을 이용하여 clonedb를 생성

2) 복제 되는 instance SID copydb 로 할 것이며, single 로 복구를 시도 할 것이다.

3) RAC /oradata/testdb ,  single  /oradata3/copydb 로 복구 할 것이다.

 

 

 

3. HOT BACKUP

 

■ 테스트를 간편하게 하기 위해 alter database begin backup; 으로 백업 진행한다.

 

SQL> alter database begin backup;

 

 Redo Temp Tablespace 파일을 제외한 모든 datafile 을 복사 한다.

$ cp system01.dbf /oradata3/copydb/

$ cp sysaux01.dbf /oradata3/copydb/

$ cp undotbs01.dbf /oradata3/copydb/

$ cp undotbs02.dbf /oradata3/copydb/

$ cp users01.dbf /oradata3/copydb/

 

 

■ 복사 후 end backup  을 실행한다.

 

SQL> alter database end backup;

 

END Backup 을 실행한 시간을 확인한다.

SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') "Time" from dual;

 

Time

-------------------

2011-12-04:12:10:09

 

 

 

 

 

4. TEST Table Creation

 

■ 복사 후 복구 테스트를 위해서 테이블과 데이터를 입력한다.

 

■ 테이블 생성

SQL> create table test01 (no number) tablespace users;

 

■ 데이터 입력

 

BEGIN

for i in 1..1000 loop

insert into test01 values(i);

end loop;

commit;

END;

/

 

 

 log switch   checkpoint 발생

SQL> alter system switch logfile;   -- 수회 실행

 

 

 test table삭제

SQL> drop table test01 purge;

 

 

■ 삭제 시간 확인

SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') "Time" from dual;

 

Time

-------------------

2011-12-04:12:26:00

 

 

 

 

 

5. Ready to clonedb

 

 spfile  pfile을 생성

SQL> create pfile='$ORACLE_HOME/dbs/initCOPYDB.ora' from spfile;

 

 controlfile 재생성을 위해 trace 파일 생성

SQL> alter database backup controlfile to trace as '/oradata3/copydb/recon.sql';

 

 pfile 수정

아래 파라미터를 clonedb 환경에 맞게 수정 한다물론 디렉토리도 생성을 해야 한다.

*.audit_file_dest=

*.background_dump_dest=

*.control_files='

*.user_dump_dest='

*.db_name='testdb'

 

RAC 파라미터 변경아래와 같이 변경

*.instance_number=1

*.cluster_database=false

*.thread=1

*.undo_tablespace='UNDOTBS1'

 

 

 pfile 수정

create controlfile 절을 수정한다.

CREATE CONTROLFILE SET DATABASE "COPYDB" RESETLOGS  NOARCHIVELOG

   REUSE => SET

  NORESETLOGS => RESETLOGS

  

그 외 경로를 clonedb에 맞게 수정한다.

 

복구 하고 open  temp tablespace를 생성 함으로 temp tablespace 생성 절을 별도로 백업 해둔다

ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata3/copydb/temp01.dbf'

SIZE 524288000  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

 

아래와 같이 CHARACTER SET KO16MSWIN949;   까지 유지해서 파일을 작성한다.

 

 

STARTUP NOMOUNT

CREATE CONTROLFILE SET DATABASE "COPYDB" RESETLOGS  NOARCHIVELOG

    MAXLOGFILES 192

    MAXLOGMEMBERS 3

    MAXDATAFILES 1024

    MAXINSTANCES 32

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 (

    '/oradata3/copydb/redo01a.log',

    '/oradata3/copydb/redo01b.log'

  ) SIZE 300M,

  GROUP 2 (

    '/oradata3/copydb/redo02a.log',

    '/oradata3/copydb/redo02b.log'

  ) SIZE 300M,

  GROUP 3 (

    '/oradata3/copydb/redo03a.log',

    '/oradata3/copydb/redo03b.log'

  ) SIZE 300M,

  GROUP 4 (

    '/oradata3/copydb/redo04a.log',

    '/oradata3/copydb/redo04b.log'

  ) SIZE 300M

-- STANDBY LOGFILE

DATAFILE

  '/oradata3/copydb/system01.dbf',

  '/oradata3/copydb/undotbs01.dbf',

  '/oradata3/copydb/sysaux01.dbf',

  '/oradata3/copydb/undotbs02.dbf',

  '/oradata3/copydb/users01.dbf'

CHARACTER SET KO16MSWIN949;

 

 

 

 

6. Creation clonedb

 

 sid를 변경하고 컨트롤 파일을 재생성 한다.

$ export ORACLE_SID=COPYDB

 

SQL*Plus: Release 10.2.0.5.0 - Production on Sun Dec 4 12:48:19 2011

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

Connected to an idle instance

SQL> @recon.sql

 

 

■ 시간 기반으로 복구 한다.

 

복구를 진행할 세션에서 복구하기 편한 방식으로 시간 설정을 한다.

SQL> alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';

 

 

삭제한 시간이 2011-12-04:12:26:00 이기 때문에 24 분으로 복구 하겠다.

 

SQL> recover database until time '2011-12-04:12:24:00' using backup controlfile;

 

복구를 실시하면 아래와 같이 아카이브 파일을 필요로 한다.

ORA-00279: change 565796 generated at 12/04/2011 12:01:54 needed for thread 2

ORA-00289: suggestion : /oracle/product/102/db/dbs/arch2_14_768267462.dbf

ORA-00280: change 565796 for thread 2 is in sequence #14

 

위에서 알 수 있는 것은 thread 2(RAC에서 2번째 노드의 시퀀스 14번 을 가진 아카이브를 원하는

것이다 .

테스트 환경에서는 파일명이 arc_2_14_768267462.arc  이며경로 및 파일을 입력한다.

 

 

파일명 입력

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

/oradata/arch_testdb/arc_2_14_768267462.arc

 

 

이번에는 thread 1 change 565796 을 포함 한 아카이브 파일을 입력 해야 한다.

ORA-00279: change 565796 generated at  needed for thread 1

 

 

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

 

 

RAC 로 접속해서 쿼리를 수행하여 THREAD1의 565796 변경본이 포함된 아카이브 파일을 찾는다.

SQL> set lines 500

SQL> col name for a50

SQL> SELECT THREAD# ,SEQUENCE# , FIRST_CHANGE#, NEXT_CHANGE#, NAME,

TO_CHAR(FIRST_TIME,'YYYY-MM-DD:HH24:MI:SS') FIRST_TIME  FROM V$ARCHIVED_LOG;

 

 

 

THREAD#  SEQUENCE  # FIRST_CHANGE   # NEXT_CHANGE#      NAME                                   FIRST_TIME

----------  ---------- ------------- ------------ -------------------------------------------------------------------------------

           14       553454              567190      /oradata/arch_testdb/arc_2_14_768267462.arc    2011-12-04:05:52:04

           15       567190              567247      /oradata/arch_testdb/arc_2_15_768267462.arc    2011-12-04:12:20:05

           16        567247             567249      /oradata/arch_testdb/arc_2_16_768267462.arc    2011-12-04:12:20:09

           11       553456              567252    /oradata/arch_testdb/arc_1_11_768267462.arc   2011-12-04:05:52:05

           17       567249              567254      /oradata/arch_testdb/arc_2_17_768267462.arc    2011-12-04:12:20:12

           18       567254              567274      /oradata/arch_testdb/arc_2_18_768267462.arc    2011-12-04:12:20:15

           19       567274              567279      /oradata/arch_testdb/arc_2_19_768267462.arc    2011-12-04:12:21:12

           12       567252              567293      /oradata/arch_testdb/arc_1_12_768267462.arc    2011-12-04:12:20:14

 

확인 해 보면 arc_1_11_768267462.arc 파일인 것을 알 수 있다아래와 같이 경로와 파일명을 입력한다.

 

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

/oradata/arch_testdb/arc_1_11_768267462.arc

 

 

 

 

 

ORA-00279: change 567190 generated at 12/04/2011 12:20:05 needed for thread 2

ORA-00289: suggestion : /oracle/product/102/db/dbs/arch2_15_768267462.dbf

ORA-00280: change 567190 for thread 2 is in sequence #15

ORA-00278: log file '/oradata/arch_testdb/arc_2_14_768267462.arc' no longer

needed for this recovery

 

change 567190 for thread 2 is in sequence #15 메세지를 보면 THREAD2의 15 시퀀스 아카이브 파일을

필요로 한다는 것을 알 수 있다경로 및 파일명을 입력한다.

 

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

/oradata/arch_testdb/arc_2_15_768267462.arc

 

 

위와 같은 패턴으로 요청하는 아카이브 파일을 계속 적용해준다.

 

운영중인 RAC에 생성 된 아카이브 보다 더 높은 시퀀스를 요구 한다면 로그 스위치를 발생하여

생성한 아카이브를 적용 시켜준다.

 

계속 적용 시키면 아래와 같이 recovery가 되었다는 메세지를 볼 수 있다.

 

Log applied.

Media recovery complete.

 

resetlogs로 instance를 open한다

SQL> alter database open resetlogs;

  

Temp Tablespace 를 추가한다.

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata3/copydb/temp01.dbf'

SIZE 524288000  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

 

 

■ 예외 처리

아래와 같이 ORA-38856 가 나오게 되면 Unpulbished Bug-4355382 로써

오라클 문서ID: 334899.1 를 참조한다.

ERROR at line 1:

ORA-38856: cannot mark instance UNNAMED_INSTANCE_2 (redo thread 2) as enabled

 

pfile에 _no_recovery_through_resetlogs=TRUE  를 추가한 후 다시 resetlogs로 open한다.

 

open 후 test01 테이블이 복구 되었는지 조회해 본다.

 

select count(*) from test01;

  COUNT(*)

----------

      1000

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2012. 8. 8. 11:10
반응형

● clone DB를 이용한 incomplete recovery 실습1

  ◎ User Managed

실습 순서

1. 실습을 위한 환경 설정
   ① whole backup
   ② 테이블 생성 -> 데이터 입력 -> 테이블 삭제 (recovery 확인용)

2. clone DB를 이용한 복구
   ① control file 및 parameter file 준비
   ② datafile backup, online redo log file, archive log file 복사
   ③ startup nomount -> control file 생성 -> 불완전 복구
   ④ clone DB에서 export -> devdb로 import
   ⑤ clone database 종료 및 삭제



    1. 실습을 위한 환경 설정 : ① whole backup       


OS] export ORACLE_SID=devdb
OS] sqlplus / as sysdba
-- 기존의 backup 및 archived log file 삭제
SQL> !rm -rf $ORACLE_BASE/oradata/devdb_backup
SQL> !rm -rf $ORACLE_BASE/oradata/devdb_arch
-- archive log file 위치를 다시 설정
SQL> !mkdir $ORACLE_BASE/oradata/devdb_arch
SQL> alter system set log_archive_dest_1 = 'location=$ORACLE_BASE/oradata/devdb_arch/';
SQL> alter system switch logfile;
SQL> !ls $ORACLE_BASE/oradata/devdb_arch
  1_2_706222899.dbf
-- 정상종료 및 whole backup
SQL> shutdown immediate
SQL> !mkdir $ORACLE_BASE/oradata/devdb_backup
SQL> !cp $ORACLE_BASE/oradata/devdb/* $ORACLE_BASE/oradata/devdb_backup
SQL> startup
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
devdb 



    1. 실습을 위한 환경 설정 : ② 테이블 생성 -> 데이터 입력 -> 테이블 삭제 (recovery 확인용)


  SQL> drop table phil.t1 purge;
drop table phil.t1 purge
                *
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> create table phil.t1 (no number);
SQL> insert into phil.t1 values (1000);
SQL> insert into phil.t1 values (2000);
SQL> commit;
SQL> select * from phil.t1;
        NO
----------
      1000
      2000
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> !date                         
  2009. 12. 21. (월) 22:56:38 KST            -- 반드시 확인할 것.

SQL> alter system switch logfile;
SQL> drop table phil.t1 purge;
SQL> select * from phil.t1;
select * from phil.t1
                   *
ERROR at line 1:
ORA-00942: table or view does not exist



    2. clone DB를 이용한 복구 : ① control file 및 parameter file 준비


   SQL> !mkdir $ORACLE_BASE/oradata/devdb_clone

  SQL> alter database backup controlfile to trace;                 -- control file을 재생성할 수 있는 스크립트를 생성.
SQL> select d.value||'/'||p.value||'_ora_'||s.spid||'.trc' as trace_file_name
     from (select value from v$parameter where name = 'instance_name') p,
          (select value from v$parameter where name = 'user_dump_dest') d,
          (select spid  from v$process   where addr = (select paddr from v$session
                                                       where sid = (select sid from v$mystat
                                                                    where rownum = 1))) s;
     TRACE_FILE_NAME
     --------------------------------------------------------------------
     /u01/app/oracle/product/10.2.0/db_1/rdbms/log/devdb_ora_24567.trc
-- 컨트롤 파일 생성을 위한 준비
SQL> !cp /u01/app/oracle/product/10.2.0/db_1/rdbms/log/devdb_ora_24567.trc $ORACLE_BASE/oradata/devdb_clone/control_file_create.sql
-- 파라미터 파일을 위한 준비
SQL> create pfile='$ORACLE_HOME/dbs/initC1.ora' from spfile;
SQL> !ls $ORACLE_BASE/oradata/devdb_clone
  control_file_create.sql 
-- 다음처럼 control file 생성을 위한 명령을 편집한다.
SQL> !vi $ORACLE_BASE/oradata/devdb_clone/control_file_create.sql
CREATE CONTROLFILE set DATABASE "C1" RESETLOGS  ARCHIVELOG    -- set 부분, DB 이름 부분
    MAXLOGFILES 16
    MAXLOGMEMBERS 2
    MAXDATAFILES 30
    MAXINSTANCES 1
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/u01/app/oracle/oradata/devdb_clone/redo01_a.log',       -- devdb_clone 경로
    '/u01/app/oracle/oradata/devdb_clone/redo01_b.log'
  ) SIZE 20M,
  GROUP 2 (
    '/u01/app/oracle/oradata/devdb_clone/redo02_a.log',
    '/u01/app/oracle/oradata/devdb_clone/redo02_b.log'
  ) SIZE 20M
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/devdb_clone/system01.dbf',
  '/u01/app/oracle/oradata/devdb_clone/undotbs01.dbf',
  '/u01/app/oracle/oradata/devdb_clone/sysaux01.dbf',
  '/u01/app/oracle/oradata/devdb_clone/undo01.dbf',
  '/u01/app/oracle/oradata/devdb_clone/user_tab_ts.dbf',
  '/u01/app/oracle/oradata/devdb_clone/user_ind_ts.dbf'
CHARACTER SET US7ASCII
;
위의 내용만 두고 아래쪽은 모두 삭제한다.
SQL> -- 다음처럼 pfile을 편집한다.
SQL> !vi $ORACLE_HOME/dbs/initC1.ora
*.compatible='10.2.0'
*.control_files='/u01/app/oracle/oradata/devdb_clone/control01.ctl'
*.db_block_size=4096
*.db_name='C1'
*.log_archive_dest_1='location=$ORACLE_BASE/oradata/devdb_clone/'
*.pga_aggregate_target=60M
*.sga_target=200M
*.undo_management='auto'
*.undo_tablespace='undotbs01'



    2. clone DB를 이용한 복구 : ② datafile backup, online redo log file, archive log file 복사


  -- 백업해둔 데이터 파일 복사
  SQL> !ls $ORACLE_BASE/oradata/devdb_clone
control_file_create.sql
SQL> !cp $ORACLE_BASE/oradata/devdb_backup/*.dbf $ORACLE_BASE/oradata/devdb_clone
SQL> !ls $ORACLE_BASE/oradata/devdb_clone
control_file_create.sql  sysaux01.dbf  system01.dbf  temp01.dbf  undo01.dbf  undotbs01.dbf  user_ind_ts.dbf  user_tab_ts.dbf
-- 사용중인 online redo log 파일 복사
SQL> !cp $ORACLE_BASE/oradata/devdb/*.log $ORACLE_BASE/oradata/devdb_clone
SQL> !ls $ORACLE_BASE/oradata/devdb_clone
control_file_create.sql  redo01_b.log  redo02_b.log  system01.dbf  undo01.dbf     user_ind_ts.dbf
redo01_a.log             redo02_a.log  sysaux01.dbf  temp01.dbf    undotbs01.dbf  user_tab_ts.dbf
-- archived redo log 파일 복사
SQL> !cp $ORACLE_BASE/oradata/devdb_arch/* $ORACLE_BASE/oradata/devdb_clone
SQL> !ls $ORACLE_BASE/oradata/devdb_clone
1_19_706222899.dbf  1_22_706222899.dbf  control_file_create.sql  redo02_a.log  system01.dbf  undotbs01.dbf
1_20_706222899.dbf  1_23_706222899.dbf  redo01_a.log             redo02_b.log  temp01.dbf    user_ind_ts.dbf
1_21_706222899.dbf  1_24_706222899.dbf  redo01_b.log             sysaux01.dbf  undo01.dbf    user_tab_ts.dbf
SQL> exit



    2. clone DB를 이용한 복구 : ③ startup nomount -> control file 생성 -> 불완전 복구


[oracle@ora10gr2 oradata]$ export ORACLE_SID=C1
[oracle@ora10gr2 oradata]$ sqlplus / as sysdba
SQL> startup nomount
SQL> select instance_name, status from v$instance;
INSTANCE_NAME    STATUS
---------------- ------------
C1               STARTED
SQL> @ $ORACLE_BASE/oradata/devdb_clone/control_file_create.sql
SQL> select instance_name, status from v$instance;
INSTANCE_NAME    STATUS
---------------- ------------
C1               MOUNTED

SQL> -- 위에서 확인했던 날짜와 시간을 잘 확인해서 아래 명령을 완성한다.
SQL> recover database until time '2009-12-21 22:56:38' using backup controlfile;
ORA-00279: change 273942 generated at 12/21/2009 21:22:11 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/oradata/devdb_clone/1_14_706222899.dbf
ORA-00280: change 273942 for thread 1 is in sequence #14
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
--> auto 입력
... 생략 ...
ORA-00308: cannot open archived log
'/u01/app/oracle/oradata/devdb_clone/1_19_706222899.dbf'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
SQL> -- online redo log 파일을 계속 적용해야 하므로 파일 이름을 확인해서 사용한다.
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/devdb_clone/redo01_a.log
/u01/app/oracle/oradata/devdb_clone/redo01_b.log
/u01/app/oracle/oradata/devdb_clone/redo02_a.log
/u01/app/oracle/oradata/devdb_clone/redo02_b.log
SQL> recover database until time '2009-12-21 22:56:38' using backup controlfile;
ORA-00279: change 274060 generated at 12/21/2009 21:34:32 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/oradata/devdb_clone/1_19_706222899.dbf
ORA-00280: change 274060 for thread 1 is in sequence #19
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
--> /u01/app/oracle/oradata/devdb_clone/redo01_a.log 입력
SQL> select instance_name, status from v$instance;
INSTANCE_NAME    STATUS
---------------- ------------
C1               MOUNTED
SQL> alter database open resetlogs;
SQL> select * from phil.t1;
        NO
----------
      1000
      2000
SQL> exit



    2. clone DB를 이용한 복구 : ④ clone DB에서 export -> devdb로 import


 
[oracle@ora10gr2 devdb_clone]$ exp phil/phil file=t1.dmp tables=t1
About to export specified tables via Conventional Path ...
. . exporting table                             T1          2 rows exported
Export terminated successfully without warnings.
[oracle@ora10gr2 devdb_clone]$ export ORACLE_SID=devdb
[oracle@ora10gr2 devdb_clone]$ sqlplus phil/phil
SQL> select * from phil.t1;
select * from phil.t1
                   *
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> ! imp phil/phil file=t1.dmp tables=t1;
SQL> select * from phil.t1;
        NO
----------
      1000
      2000
SQL> exit



    2. clone DB를 이용한 복구 : ⑤ clone database 종료 및 삭제


[oracle@ora10gr2 devdb_clone]$ cd
[oracle@ora10gr2 ~]$ export ORACLE_SID=C1
[oracle@ora10gr2 ~]$ sqlplus / as sysdba
SQL> shutdown abort
SQL> exit
[oracle@ora10gr2 ~]$ ls /u01/app/oracle/oradata
[oracle@ora10gr2 ~]$ rm -rf /u01/app/oracle/oradata/devdb_clone
반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2011. 11. 23. 00:25
반응형

◈ logfile 정보 보기

set line 150
col tname format a10
col file_name format a40
col error format a10
col first_change# format 999,999,999,999
col OFFLINE_CHANGE# format 999,999,999,999
col ONLINE_CHANGE# format 999,999,999,999
col change# format 999,999,999,999
COL MEMBER format a45

SELECT A1.GROUP#, MEMBER, A1.STATUS, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG A1, V$LOGFILE B2
WHERE A1.GROUP# = B2.GROUP# ;


◈ 복구가 필요한 datafile list 보기

col change# format 9999999999999999999999

select t.name tname, d.name file_name, r.change#,d.status, d.enabled, OFFLINE_CHANGE#,
ONLINE_CHANGE#, to_char(ONLINE_TIME,'RR/MM/DD:HH24:MI:SS') ONTIME
from v$tablespace t, v$datafile d, v$recover_file r
where t.ts#=d.ts# and d.file#=r.file#;

◈ tablespace 와 file의 status 보기

col fname format a50

select t.name TNAME, d.name FNAME, d.status, d.enabled, h.error header_err
from v$tablespace t, v$datafile d, v$datafile_header h
where t.ts#=d.ts# and h.file#=d.file#;

◈ 복구에 필요한 archive파일 리스트 보기

col name format a50

select a.name, a.sequence# , a.first_change#,
to_char(a.first_time,'YYYY/MM/DD:HH24:MI:SS') fst_time,
to_char(a.next_time,'YYYY/MM/DD:HH24:MI:SS') next_time
from v$archived_log a, v$recovery_log r
where a.sequence#=r.sequence#;


◈ recovery file status 보기

select * from V$RECOVERY_FILE_STATUS;


◈ recovery progress 보기

select * from v$recovery_progress;

◈ recovery status 보기

select * from v$recovery_status;

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2011. 8. 31. 14:50
반응형
출처 : http://blog.naver.com/gseducation/20096197660

사용자 실수에 의한 장애를 Clone DB를 이용해서 복구할 수 있습니다.

관련 내용을 Eddy 블로그에 정리해 두었습니다.

 

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2011. 8. 31. 14:48
반응형
 

Clone Database를 이용한 복구 (RMAN을 이용할 경우)

 

RMAN을 이용해서 Duplicate(clone) database를 생성할 수 있다.

오라클의 매뉴얼에 자세한 순서와 설명이 있다.

 


아래 영어 설명은 매뉴얼 내용을 일부 발췌한 것이다.

  • By default, the DUPLICATE command creates the duplicate database from the most recent backups
    of the target database and then performs recovery to the most recent consistent point contained
    in the archived redo logs.

  • You can duplicate a database as it stood at a past point in time in the current incarnation,
    by using a RUN block with a SET UNTIL command, or by including an UNTIL clause with the DUPLICATE command to cause RMAN to recover the duplicate database to a past point in time within the current incarnation.

(1) Archive 모드임을 확인한 뒤에 백업을 수행한다.

 

[oracle@ora10gr2 ~]$ export ORACLE_SID=devdb
[oracle@ora10gr2 ~]$ sqlplus / as sysdba

SQL> startup force

SQL> archive log list


Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     0
Next log sequence to archive   1
Current log sequence           1

 

SQL> exit

 

[oracle@ora10gr2 ~]$ mkdir /u01/app/oracle/oradata/devdb_rman_backup
[oracle@ora10gr2 ~]$ export ORACLE_SID=devdb

[oracle@ora10gr2 ~]$ rman target /

 

RMAN> backup database format='/u01/app/oracle/oradata/devdb_rman_backup/devdb_%d_%s_%p.bus';

RMAN> exit

 

(2) 복구 완료를 확인할 테이블 생성

 

[oracle@ora10gr2 ~]$ sqlplus / as sysdba

SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;

SQL> create table phil.t2 (col1 varchar2(20));
SQL> insert into  phil.t2 values ('Recovery done!');
SQL> commit;

 

SQL> alter system switch logfile;
SQL> alter system switch logfile;

 

SQL> -- 복구의 기준이 되는 시간이므로 잘 기억하도록 한다.

SQL> !date

 

  2009. 12. 21. (월) 23:43:47 KST

 

(3) 유저 실수로 테이블이 삭제되는 상황 연출

 

SQL> alter system switch logfile;
SQL> alter system switch logfile;

SQL> -- 장애 발생
SQL> drop table phil.t2 purge;
SQL> exit

 

(4) Clone Database를 이용한 복구 시작


Task 1: Create an Oracle Password File for the Auxiliary Instance

 

[oracle@ora10gr2 ~]$ cd
[oracle@ora10gr2 ~]$ cd $ORACLE_HOME/dbs
[oracle@ora10gr2 dbs]$ orapwd file=orapwdevdbaux password=oracle entries=5

 

 Task 2: Establish Oracle Net Connectivity to the Auxiliary Instance

 

[oracle@ora10gr2 dbs]$ cd $ORACLE_HOME/network/admin
[oracle@ora10gr2 admin]$ vi tnsnames.ora

 

devdbaux =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.10)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = devdbaux)
    )
  )

 

Task 3: Create an Initialization Parameter File for the Auxiliary Instance

 

[oracle@ora10gr2 admin]$ export ORACLE_SID=devdb
[oracle@ora10gr2 admin]$ sqlplus / as sysdba

SQL> create pfile='$ORACLE_HOME/dbs/initdevdbaux.ora' from spfile;

SQL> !mkdir /u01/app/oracle/oradata/devdbaux

SQL> !vi $ORACLE_HOME/dbs/initdevdbaux.ora

 

DB_NAME=devdbaux
CONTROL_FILES='/u01/app/oracle/oradata/devdbaux/control01.ctl'
DB_FILE_NAME_CONVERT=('/u01/app/oracle/oradata/devdb', '/u01/app/oracle/oradata/devdbaux')
LOG_FILE_NAME_CONVERT=('/u01/app/oracle/oradata/devdb', '/u01/app/oracle/oradata/devdbaux')
db_block_size=4096
sga_target=200m
pga_aggregate_target=60m

 

SQL> exit

 

Task 4: Start the Auxiliary Instance

 

[oracle@ora10gr2 ~]$ export ORACLE_SID=devdbaux
[oracle@ora10gr2 ~]$ sqlplus / as sysdba
SQL> startup force nomount
SQL> exit


Task 5: Mount or Open the Target Database

 

[oracle@ora10gr2 ~]$ export ORACLE_SID=devdb
[oracle@ora10gr2 ~]$ sqlplus / as sysdba
SQL> startup force
SQL> exit

 

Task 6: Make Sure You Have the Necessary Backups and Archived Redo Logs

 

Make sure backups all target datafiles are accessible on the duplicate host.
Archived redo logs required to recover the duplicate database to the desired point in time

must be accessible at the same path by the node where the duplicate database is to be created.

 

 Task 7: Allocate Auxiliary Channels if Automatic Channels Are Not Configured

 

[oracle@ora10gr2 ~]$ export ORACLE_SID=devdbaux
[oracle@ora10gr2 ~]$ export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
[oracle@ora10gr2 ~]$ export NLS_LANG=american
[oracle@ora10gr2 ~]$ rman TARGET sys/oracle@devdb AUXILIARY /

 

RMAN> run {
 ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK;
 DUPLICATE TARGET DATABASE TO devdbaux UNTIL TIME '2009/12/21 23:43:47';
}

 

Task 8 : 마무리

 

[oracle@ora10gr2 ~]$ export ORACLE_SID=devdbaux
[oracle@ora10gr2 dbs]$ sqlplus / as sysdba

SQL> select * from phil.t2;

 

COL1
--------------------
Recovery done!


SQL> !exp phil/phil file=t2.dmp tables=t2
SQL> exit

 

[oracle@ora10gr2 dbs]$ export ORACLE_SID=devdb
[oracle@ora10gr2 dbs]$ sqlplus phil/phil

SQL> select * from t2;

 

select * from t2
              *
ERROR at line 1:
ORA-00942: table or view does not exist

 

SQL> !imp phil/phil file=t2.dmp tables=t2
SQL> select * from t2;

 

COL1
--------------------
Recovery done!

 

 

____________________________________________________________________________________________________________________

 

참고1.


A duplicate database is a copy of a target database

that you can run independently for a variety of purposes.

 

For example, you can use it to:

 

  - Test backup and recovery procedures

  - Export data such as a table that was inadvertently dropped from the production database,

    and then import it back into the production database

 

참고2.

 

As part of the duplicating operation, RMAN automates the following steps:

 

 - Creates a control file for the duplicate database

 - Restores the target datafiles to the duplicate database and performs incomplete recovery

   by using all available incremental backups and archived redo logs

 - Shuts down and starts the auxiliary instance

 - Opens the duplicate database with the RESETLOGS option after incomplete recovery

    to create the online redo logs (except when running DUPLICATE ... FOR STANDBY,

    in which case RMAN does not open the database)

 - Generates a new, unique DBID for the duplicate database (except when you create a standby database

   with DUPLICATE ... FOR STANDBY, in which case RMAN does not create a unique DBID)

 

During duplication, RMAN must perform incomplete recovery because the online redo logs in the target are not backed up and cannot be applied to the duplicate database. The farthest that RMAN can go in recovery of the duplicate database is the most recent redo log archived by the target database.

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2010. 3. 22. 11:12
반응형

출처:http://www.oracleinternal.com/

데 이터베이스를 복사하는 절차에 대해서 알아보겠습니다.
orcl DB를 clon으로 복사할것이며 대략적인 절차는 다음과 같습니다.

1. Parameter file 생성
2. Control file 생성
3. 새로운 데이터베이스에 필요한 디렉토리 생성
4. datafile 복사
5. clone DB로 접속후 control을 생성하기 위해 nomount로 시작합니다.
6. control file 생성
7. 데이터베이스를 오픈합니다.

1. Parameter file 준비
SQL> conn / as sysdba
Connected.
SQL> create pfile='$ORACLE_HOME/dbs/initclone.ora' from spfile;

File created.

생성된 pfile을 수정합니다.
SQL> host vi $ORACLE_HOME/dbs/initclone.ora
모든 인스턴스를 의미하는 *.을 치환을 통하여 제거합니다.
:%s/*.//g
메모리 사이즈를 경정하지 않습니다. 다음 부분이 들어가는 행을 삭제합니다.
db_cache_size, java_pool_size, large_pool_size, shared_pool_size, streams_pool_size
orcl이 들어간 부분을 clone으로 치환합니다.
:%s/orcl/clone/g
수정된 pfile 입니다.


audit_file_dest='/u01/app/oracle/admin/clone/adump'

background_dump_dest='/u01/app/oracle/admin/clone/bdump'

compatible='10.2.0.1.0'

control_files='/u01/app/oracle/oradata/clone/control01.ctl','/u01/app/oracle/oradata/clone/control02.ctl','/u01/app/oracle/oradata/clone/control03.ctl'

core_dump_dest='/u01/app/oracle/admin/clone/cdump'

db_block_size=8192

db_file_multiblock_read_count=16

db_name='clone'

db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

db_recovery_file_dest_size=2147483648

dispatchers='(PROTOCOL=TCP) (SERVICE=cloneXDB)'

job_queue_processes=10

open_cursors=300

pga_aggregate_target=94371840

processes=150

remote_login_passwordfile='EXCLUSIVE'

sga_target=285212672

undo_management='AUTO'

undo_tablespace='UNDOTBS1'

user_dump_dest='/u01/app/oracle/admin/clone/udump'


2. Control file 생성
Control file 생성 스크립트를 생성합니다.
SQL> alter database backup controlfile to trace;

Database altered.

SQL> host ls -t $ORACLE_BASE/admin/orcl/udump/ | head -1
orcl_ora_2213.trc

user_dump_dest 에서 생성된 스크립트를 찾습니다.
실제 경로는 다음을 통하여 확인할수 있습니다.
SQL> select value from v$parameter where name='user_dump_dest';

VALUE
----------------------------------------
/u01/app/oracle/admin/orcl/udump

가장 최근에 발생한 파일을 찾습니다.
SQL> host ls -t $ORACLE_BASE/admin/orcl/udump/ | head -1
orcl_ora_2213.trc

생성된 파일을 확인하고 활용하기 위해 복사합니다.
SQL> host cp $ORACLE_BASE/admin/orcl/udump/orcl_ora_2213.trc /home/oracle/control.sql

control.sql 파일을 편집합니다.
SQL> ed  /home/oracle/control.sql
[2. RESETLOGS case]를 검색하여 그 아래 내용을 활용할 것입니다.
/2. RESETLOGS case
dgg를 타이핑 하여 위의 내용은 모두 삭제합니다.(vi명령어)
orcl 을 clone로 치환합니다. 대소문자 따로 두번실행합니다.
:%s/orcl/clone/g
:%s/ORCL/CLONE/g
그 외에 적절하게 변경합니다. 다음은 최소한의 수정을 한 control file입니다.


CREATE CONTROLFILE SET DATABASE "CLONE" RESETLOGS  ARCHIVELOG


    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/clone/redo01.log'  SIZE 50M,
  GROUP 2 '/u01/app/oracle/oradata/clone/redo02.log'  SIZE 50M,
  GROUP 3 '/u01/app/oracle/oradata/clone/redo03.log'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/clone/system01.dbf',
  '/u01/app/oracle/oradata/clone/undotbs01.dbf',
  '/u01/app/oracle/oradata/clone/sysaux01.dbf',
  '/u01/app/oracle/oradata/clone/users01.dbf',
  '/u01/app/oracle/oradata/clone/example01.dbf',
  '/u01/app/oracle/oradata/clone/staging01.dbf',
  '/u01/app/oracle/oradata/clone/resum_ts.dbf',
  '/u01/app/oracle/oradata/clone/alter1.dbf'
CHARACTER SET WE8ISO8859P1
;

3. 새로운 데이터베이스에 필요한 디렉토리 생성
SQL> host mkdir -p $ORACLE_BASE/admin/clone/bdump
SQL> host mkdir -p $ORACLE_BASE/admin/clone/cdump
SQL> host mkdir -p $ORACLE_BASE/admin/clone/udump
SQL> host mkdir -p $ORACLE_BASE/admin/clone/adump
SQL> host mkdir -p $ORACLE_BASE/oradata/clone

4. datafile 복사
데이터파일을 복사하기 위해 원본 데이터베이스를 종료합니다.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

데이터파일을 복사합니다.
SQL> host cp $ORACLE_BASE/oradata/orcl/*.dbf $ORACLE_BASE/oradata/clone/

5. clone DB로 접속후 control을 생성하기 위해 nomount로 시작합니다.

OS$ export ORACLE_SID=clone
OS$ sqlplus / as sysdba

SQL> startup nomount
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size            1218992 bytes
Variable Size           92276304 bytes
Database Buffers      188743680 bytes
Redo Buffers            2973696 bytes

6. control file 생성
위 에서 편집하여 만들어준 control을 실행합니다.
SQL> @control

Control file created.

archive log file이 없지만 recover한번 해보겠습니다.
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 863069 generated at 10/28/2009 23:07:20 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/CLONE/archivelog/2009_10_28/o1_mf_1_11_%u_.arc
ORA-00280: change 863069 for thread 1 is in sequence #11


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
Media recovery cancelled.

7. 데이터베이스를 오픈합니다.
이제 불완전복구 방식으로 데이터베이스를 오픈합니다.
alter database open resetlogs;

Database altered.

데이터베이스 인스턴스 상태 조회
SQL> select status from v$instance;

STATUS
------------------------------------
OPEN

데이터베이스가 정상적으로 복사되어 오픈되었습니다.
반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2010. 3. 19. 21:59
반응형



SCN이 틀렸을 경우에 복구하는 방법인데요.
정말 위급한 복구 상황에 닥쳤을 경우에 유용하겠지요.
일반적인 복구의 개념이 아니라..
어거지로 어떻게든 복구해서 올려야 하는 상황에 사용하시길
바랍니다. 꼭 정말 위험한 상황에서 사용해야지.
일반적인 복구 상황에서 사용하시면 안됩니다.

아래에서.. 복구 작업이 끝난이후 꼭 해야 하는 것은..

DB재생성후 export후 import 하는 것이 권장된답니다.
그리고 tempfile 추가하는 것도 잊지 말구요.
undo도 깨뜨리고 하니 새로 생성하셔야 합니다.

최악의 복구시나리오시에.. 그래도 해야 할 것은.. system tablespace는 무조건 백업해두어야 합니다. system tablespace가 깨지면 'dul' 유틸을 통해서 블록을 읽으는 복구도 불가능하다고 하네요. system tablespace의 bootstrap이 깨지면 너무 오래된 백업이라면 object를 생성한 dictionary 정보가 없으니 당연히 못쓰겠지요..
아래에서도 마지막에 만든 k4 라는 테이블은 데이터는 있는데
테이블은 dictionary 정보에 없는 기이한 일이 될 수도 있겠지요.
system을 먼저 cp 백업하고. 테이블만들고 datafile을 백업한다면요..

_corrupted_rollback_segments=true => rollback segment가 깨졌음, commit을 했다고 오라클을 속임, _offline_rollback_segments 강제로 rollback segment를 offline 시킴(_corrupted~, _offline~ 은 같이사용
_allow_resetlogs_corruption=true =>redo log 의 한계범위 내에서 데이터파일의 SCN이 틀어져 있거나 또는 recover시에 archive를 찾지 못해서 fail났을 경우, 즉 current redo log를 통해서 복구가 불가능할 경우, 억지로 current redo log를 reset log 시키고 open하는 파라미터

ORA- 10501 event를 통해서 adjust scn은 아래와 같은 레벨이 깨졌을
경우 레벨을 올려가면서 복구하는 방법입니다.

10501, 00000, "periodically check selected heap"
// *Cause:
// *Action:
//    Level:  0x01 PGA
//       0x02 SGA
//       0x04 UGA
//       0x08 current call
//       0x10 user call
//       0x20 large allocation pool



begin backup을 하지 않고 cp로 복사해서 백업을 했을 경우 복구 방법 , archive도 없는 상태이며 SCN이 모두 틀림


1. 트랜잭션이 있는 상태에서 cp로 백업
vi kkk.sql
create table k1 tablespace data02 as select * from dba_segments;
insert into k1 select * from k1;
commit;
create table k2 tablespace data01 as select * from dba_objects;
insert into k2 select * from k2;
insert into k1 select * from k1;
commit;
create table k3 tablespace users as select * from dba_extents;
insert into k3 select * from k3;
commit;
vi kkk2.sql
insert into k1 select * from k1;
insert into k2 select * from k2;
insert into k3 select * from k3;
commit;

SQL> @kkk
@kkk2
@kkk2
@kkk2
@kkk2
@kkk2
@kkk2
@kkk2
SQL> !cp /data1/oradata/PROD/*.dbf PROD_CP
SQL> alter database backup controlfile to '/data1/oradata/PROD_CP/control01.ctl';
SQL> !cp /data1/oradata/PROD/system01.dbf PROD_CP
SQL> create table k4 tablespace users  as select * from dba_extents;

- archive도 없음
mv archive archive3
2. cp로 백업한 것을 restore함(datafile, controlfile만 존재, redo log는 없음)
mv PROD PROD_CP_ORG
mv PROD_CP PROD


3. recovery status 확인
SQL> startup
ORACLE instance started.
Total System Global Area  101799240 bytes
Fixed Size                   456008 bytes
Variable Size              50331648 bytes
Database Buffers           50331648 bytes
Redo Buffers                 679936 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


4. 복구 시도
archive 가 없으므로 controlfile trace에서 RESETLOGS ARCHIVELOG => RESETLOGS NOARCHIVELOG로 변경

(1) 일반적인 복구 시도했으나 archive가 없음
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done

SQL> recover database until cancel using backup controlfile;
ORA-00279: change 5531180 generated at 11/11/2005 00:20:07 needed for thread 1
ORA-00289: suggestion : /data1/oradata/archive/1_37.arc
ORA-00280: change 5531180 for thread 1 is in sequence #37

Specify log: {=suggested | filename | AUTO | CANCEL}
ORA-00308: cannot open archived log '/data1/oradata/archive/1_37.arc'
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data1/oradata/PROD/system01.dbf'

(2) resetlog open도 불가능함
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data1/oradata/PROD/system01.dbf'

(3) hidden parameter 적용
 initPROD.ora 파일에 아래를 추가

_offline_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3   $,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

_corrupted_rollback_segments=true

_allow_resetlogs_corruption=true

(4) controlfile 재생성
SQL> alter database backup controlfile to trace;
SQL> show parameter user_dump_dest
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                       string      /data1/oradata/admin/PROD/udump

- 트레이스에서 RESETLOGS ARCHIVELOG => RESETLOGS NOARCHIVELOG 로 변경

CREATE CONTROLFILE REUSE DATABASE "PROD" RESETLOGS NOARCHIVELOG
--  SET STANDBY TO MAXIMIZE PERFORMANCE
   MAXLOGFILES 16
   MAXLOGMEMBERS 2
   MAXDATAFILES 30
   MAXINSTANCES 3
   MAXLOGHISTORY 337
LOGFILE
 GROUP 1 '/data1/oradata/PROD/log01a.log'  SIZE 50M,
 GROUP 2 '/data1/oradata/PROD/log02a.log'  SIZE 50M,
 GROUP 3 '/data1/oradata/PROD/log03b.log'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
 '/data1/oradata/PROD/system01.dbf',
 '/data1/oradata/PROD/undotbs.dbf',
 '/data1/oradata/PROD/users01.dbf',
 '/data1/oradata/PROD/data01_02.dbf',
 '/data1/oradata/PROD/data02_02.dbf',
 '/data1/oradata/PROD/data01_03.dbf',
 '/data1/oradata/PROD/data01_04.dbf',
 '/data1/oradata/PROD/data01_01.dbf',
 '/data1/oradata/PROD/data02_01.dbf',
 '/data1/oradata/PROD/users02.dbf'
CHARACTER SET KO16KSC5601;
(5) DB재기동후 controlfile 재생성
SQL> startup nomount
ORACLE instance started.
Total System Global Area  101799240 bytes
Fixed Size                   456008 bytes
Variable Size              50331648 bytes
Database Buffers           50331648 bytes
Redo Buffers                 679936 bytes
SQL>
SQL> CREATE CONTROLFILE REUSE DATABASE "PROD" RESETLOGS NOARCHIVELOG
 2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
 3      MAXLOGFILES 16
 4      MAXLOGMEMBERS 2
 5      MAXDATAFILES 30
 6      MAXINSTANCES 3
 7      MAXLOGHISTORY 337
 8  LOGFILE
 9    GROUP 1 '/data1/oradata/PROD/log01a.log'  SIZE 50M,
10    GROUP 2 '/data1/oradata/PROD/log02a.log'  SIZE 50M,
11    GROUP 3 '/data1/oradata/PROD/log03b.log'  SIZE 50M
12  -- STANDBY LOGFILE
13  DATAFILE
14    '/data1/oradata/PROD/system01.dbf',
15    '/data1/oradata/PROD/undotbs.dbf',
16    '/data1/oradata/PROD/users01.dbf',
17    '/data1/oradata/PROD/data01_02.dbf',
18    '/data1/oradata/PROD/data02_02.dbf',
19    '/data1/oradata/PROD/data01_03.dbf',
20    '/data1/oradata/PROD/data01_04.dbf',
21    '/data1/oradata/PROD/data01_01.dbf',
22    '/data1/oradata/PROD/data02_01.dbf',
23    '/data1/oradata/PROD/users02.dbf'
24  CHARACTER SET KO16KSC5601;
Control file created.


(6) db를 resetlogs open하려하나 DB가 DOWN 됨
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 5531180 generated at 11/11/2005 00:20:07 needed for thread 1
ORA-00289: suggestion : /data1/oradata/archive/1_37.arc
ORA-00280: change 5531180 for thread 1 is in sequence #37

Specify log: {=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data1/oradata/PROD/system01.dbf'

ORA-01112: media recovery not started

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced

(7) alert log 분석
 - system tablespace에서 메모리를 관리할 때 오라클 내부적으로 사용하는 bootstrap 깨짐
 - 600 [4000] 에러가 발생, hidden parameter 을 써서 rollback semgent를 offline , corrupt
    시켰기 때문에 발생하는 것으로 판단됨
   
ARC1: Media recovery disabled
Fri Nov 11 00:48:00 2005
Errors in file /data1/oradata/admin/PROD/udump/prod_ora_12450.trc:
ORA-00600: internal error code, arguments: [4000], [5], [], [], [], [], [], []
Fri Nov 11 00:48:04 2005
Errors in file /data1/oradata/admin/PROD/udump/prod_ora_12450.trc:
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [4000], [5], [], [], [], [], [], []
Fri Nov 11 00:48:04 2005
Error 704 happened during db open, shutting down database
USER: terminating instance due to error 704
Instance terminated by USER, pid = 12450
ORA-1092 signalled during: alter database open resetlogs...

(8) DB재기동 및 controlfile , redo를 모두 지움, controlfile 재생성
SQL> startup nomount
ORACLE instance started.
Total System Global Area  101799240 bytes
Fixed Size                   456008 bytes
Variable Size              50331648 bytes
Database Buffers           50331648 bytes
Redo Buffers                 679936 bytes
SQL> !rm /data1/oradata/PROD/*.log
SQL> !rm /data1/oradata/PROD/*.ctl
SQL>
SQL> CREATE CONTROLFILE REUSE DATABASE "PROD" RESETLOGS NOARCHIVELOG
 2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
 3      MAXLOGFILES 16
 4      MAXLOGMEMBERS 2
 5      MAXDATAFILES 30
 6      MAXINSTANCES 3
 7      MAXLOGHISTORY 337
 8  LOGFILE
 9    GROUP 1 '/data1/oradata/PROD/log01a.log'  SIZE 50M,
10    GROUP 2 '/data1/oradata/PROD/log02a.log'  SIZE 50M,
11    GROUP 3 '/data1/oradata/PROD/log03b.log'  SIZE 50M
12  -- STANDBY LOGFILE
13  DATAFILE
14    '/data1/oradata/PROD/system01.dbf',
15    '/data1/oradata/PROD/undotbs.dbf',
16    '/data1/oradata/PROD/users01.dbf',
17    '/data1/oradata/PROD/data01_02.dbf',
18    '/data1/oradata/PROD/data02_02.dbf',
19    '/data1/oradata/PROD/data01_03.dbf',
20    '/data1/oradata/PROD/data01_04.dbf',
21    '/data1/oradata/PROD/data01_01.dbf',
22    '/data1/oradata/PROD/data02_01.dbf',
23    '/data1/oradata/PROD/users02.dbf'
24  CHARACTER SET KO16KSC5601;
Control file created.
SQL>
SQL> alter session set events '10015 trace name adjust_scn level 1';
Session altered.
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 5531188 generated at 11/11/2005 00:58:07 needed for thread 1
ORA-00289: suggestion : /data1/oradata/archive/1_1.arc
ORA-00280: change 5531188 for thread 1 is in sequence #1

Specify log: {=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data1/oradata/PROD/system01.dbf'

ORA-01112: media recovery not started

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced

(9) adjust_scn level을 늘려가면서 재시도
QL> startup mount
ORACLE instance started.
Total System Global Area  101799240 bytes
Fixed Size                   456008 bytes
Variable Size              50331648 bytes
Database Buffers           50331648 bytes
Redo Buffers                 679936 bytes
Database mounted.
SQL>
SQL> alter session set events '10015 trace name adjust_scn level 2';
Session altered.
SQL> recover database;
Media recovery complete.
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01139: RESETLOGS option only valid after an incomplete database recovery

SQL> alter database open;
Database altered.
반응형
Posted by [PineTree]