Clone DB Creation with Hot Backup on HP-UX oracle10g (ProDBA)
오라클 10g 에서 기존에 올라온 DB 복제 하는 방법입니다..
핫백업 받아 둔것과 트레이스로 컨트롤 파일을 떠서
기존 데이타 파일 복사와 컨트롤 파일 재생성으로 디비 복제 하는 방법입니다.
테스트 완료 된 내용입니다. 참고하시어 업무에 도움 되시길 바래요
+ Clone DB Creation with Hot Backup on HP-UX oracle10g +
1. 기존 DB가 noarchive mode 라면 archive log mode로 변경 작업
1.0 init$ORACLE_SID.ora 파일에
log_archive_dest='/oradata1/$ORACLE_SID/arch'
log_archive_format='arch_%t_%s_%r.arc'
#log_archive_start=TRUE --
under 9i 추가
1.1 col host_name for a20
col
instance_name for a20
col status for a10
select host_name,instance_name, status from
v$instance;
>> status = open 확인
archive log
list;
>> archive log status 확인
or
select db_unique_name, log_mode from v$database;
DB_UNIQUE_NAME
LOG_MODE
----------------------- ----------------------
확인
ORA102
NOARCHIVELOG
1.2 SQL> shutdown immediate >> DB 내려간 상태
확인후
SQL> startup mount 로 디비 올림
select
host_name,instance_name, status from v$instance;
>> status
= mounted 확인
아카이브 모드로 변경
alter database archivelog;
archive log list; 로 아카이브
모드로 변경되었는지 확인후
alter database open; 으로 디비 올림.
----------------------------- or
---------------------------------------
만약 접속된 세션이 없다면 ,
Database Open 상태에서
select host_name,instance_name,
status from v$instance;
>> status = open 확인
SQL> alter database close immediate; 로 내린다.
select
host_name,instance_name, status from v$instance;
>> status
= mounted 확인
아카이브 모드로 변경
alter database archivelog;
archive log list; 로 아카이브 모드로 변경되었는지 확인 후
shutdown
immediate
startup
----------------------------------------------------------------------------
1.3
select host_name,instance_name, status from v$instance;
>> status = open 확인
archive log list;
>> archive log mode 확인.
2. 간단한 test용 user를 만들어서 간단한 table 및 data를 넣는다.
2.1
test user 생성
create user test identified by test
default
tablespace users
temporary tablespace temp;
2.2 권한 부여
SQL> grant resource, connect to test; 로 권한 부여
2.3 table &
data 생성
SQL> conn test/test 로 접속
SQL> create table
test_table (
num number
);
SQL> begin
for i
in 1.. 10000 loop
insert into test_table (num) values (i);
end loop;
commit;
end;
/
SQL> select count(*) from test_table;
COUNT(*)
----------
10000
>> 복제된 DB에서 위 데이타 확인을 위한 사항.
3. Log swich를 일으킨다.
SQL> alter system switch logfile;
SQL> /
SQL>
/
4. Online backup을 받아 놓는다.
-- Controlfile
Backup
ALTER DATABASE BACKUP CONTROLFILE TO '/oradata1/CLONE/control.bak' REUSE
alter session set tracefile_identifier='ORA102_CONTROLFILE_BACKUP'
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
$] cd $ORACLE_HOME/admin/$ORACLE_SID/udump
$] ls
*ORA102_CONTROLFILE_*
...
ora102_ora_6948_ORA102_CONTROLFILE_BACKUP.trc
$] vi ora102_ora_6948_ORA102_CONTROLFILE_BACKUP.trc
하여 내용을 확인하자. (내용인 즉슨 create controlfile... 문이 있어야 된다.)
-- 조회 결과문의 헤더,피드백,시간,조회시간,번복 값 끄기 >> 조회 결과 값만 출력되게 하기위해..
set
head off
set feedback off
set time off
set timing off
set echo
off
-- 테이블 스페이스 비긴 백업 구문 조회로 명령어 얻기
select 'alter tablespace
'||tablespace_name||' begin backup;' from dba_tablespaces
where
status='ONLINE' and contents <> 'TEMPORARY'
alter tablespace SYSTEM begin backup;
alter tablespace UNDOTBS1 begin
backup;
alter tablespace SYSAUX begin backup;
alter tablespace USERS
begin backup;
alter tablespace YBJ_TBS begin backup;
alter tablespace
JYS_TEST begin backup;
alter tablespace HKH_TEST begin backup;
alter
tablespace TEST_JYS begin backup;
또는
alter database begin backup; 10g 부터..
-- 복사할 데이타 파일 조회로 명령어 얻기
select '!cp '||name||'
/oradata1/ORA102_backup/' from v$datafile;
!cp /oradata1/ORA102/system01.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/undotbs01.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/sysaux01.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/users01.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/ybj01.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/ybj02.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/ybj03.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/ybj04.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/jys01.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/jys02.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/jys03.dbf /oradata1/ORA102_backup/
!cp
/oradata1/hkh_test01.dbf /oradata1/ORA102_backup/
!cp
/oradata1/ORA102/test_jys.dbf /oradata1/ORA102_backup/
-- 테이블 스페이스 엔드 백업 구문 조회로 명령어 얻기
select 'alter tablespace
'||tablespace_name||' end backup;' from dba_tablespaces
where
status='ONLINE' and contents<>'TEMPORARY'
alter tablespace SYSTEM end backup;
alter tablespace UNDOTBS1 end
backup;
alter tablespace SYSAUX end backup;
alter tablespace USERS end
backup;
alter tablespace YBJ_TBS end backup;
alter tablespace JYS_TEST
end backup;
alter tablespace HKH_TEST end backup;
alter tablespace
TEST_JYS end backup;
또는
alter database end backup; 10g 부터..
5. Log swich 5번을 일으킨다.
SQL> alter system switch logfile;
SQL> /
SQL> /
SQL>
/
SQL> /
6. Backup 받은 파일과 controlfile의 trace를 이용하여 SID가 CLONE인 clone db를 하나 더
생성한다.
(datafile 위치는 임의 지정)
6.1. Backup 받은 데이타 파일들과 초기화파일을 CLONE DB에서 데이타 파일과 초기화 파일을 지정할 위치에 카피해서
넣어둔다.
$] cp /oradata1/ORA102_backup/*.dbf /oradata1/CLONE/
$] cp $ORACLE_HOME/dbs/initORA102.ora cp /oradata1/CLONE/init.ora
6.2.
CLONE DB 의 덤프 디렉토리를 생성한다.
$] cd $ORACLE_BASE/admin
$] mkdir CLONE
$]
cd CLONE
$] mkdir adump bdump cdump udump
6.3. CLONE DB 생성
시작
6.3.0 /etc/oratab 파일에 다음과 같이 추가하자.(기존 DB SID 아래 붙이면 된다.)
$] vi /etc/oratab
....
CLONE:/oracle10/app/oracle/product/102:N # ORACLE_SID:$ORACLE_HOME:<system boot 시 자동시작 여부 Y/N>
....
:wq
6.3.1
CLONE DB 용 orapwd 생성
$] cd $ORACLE_HOME/dbs
$] orapwd file=orapwCLONE
password=oracle entries=5
6.3.2 백업해둔 init.ora 파일을 CLONE DB에 맞게 경로 수정
및 db_name 바꺼주기.
$] vi /oradata1/CLONE/init.ora
-- 확인 사항 --
audit_file_dest
background_dump_dest
core_dump_dest
user_dump_dest
control_files
log_archive_dest
<SGA 영역들의 이름 앞에 붙는 SID : 있을경우만>
6.3.3
sqlplus 접속 후 sys 접속
$] sqlplus /nolog
SQL> conn sys as
sysdba
password : oracle
Connected.
6.3.4 백업해둔 init.ora 파일로 DB
nomount : 컨트롤 파일 재생성을 위해
SQL> startup nomount
pfile='/oradata1/CLONE/init.ora'
6.3.5 controlfile을 백업한 trace 파일을 열어 resetlogs 에 해당하는 부분의 sql 구문을
복사한다.
6.3.6 복사한 후 실행하 sql 문 생성.
6.3.7 복사한 구문 붙여넣기 한 후 데이타 파일 의 디비
이름을 클론db 이름으로 갱신을 위해
set DATABASE "CLONE" 을 써준다. 노아카이브로
올리기.(NOARCHIVELOG 옵션을 붙여준다.)
$] vi ctl.sql
CREATE CONTROLFILE SET DATABASE "CLONE" RESETLOGS
NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 2920
LOGFILE
GROUP 1
'/oradata1/ORA102/redo01.log' SIZE 50M,
GROUP 2
'/oradata1/ORA102/redo02.log' SIZE 50M,
GROUP 3
'/oradata1/ORA102/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'/oradata1/ORA102/system01.dbf',
'/oradata1/ORA102/undotbs01.dbf',
'/oradata1/ORA102/sysaux01.dbf',
'/oradata1/ORA102/users01.dbf',
'/oradata1/ORA102/ybj01.dbf',
'/oradata1/ORA102/ybj02.dbf',
'/oradata1/ORA102/ybj03.dbf',
'/oradata1/ORA102/ybj04.dbf',
'/oradata1/ORA102/jys01.dbf',
'/oradata1/ORA102/jys02.dbf',
'/oradata1/ORA102/jys03.dbf',
'/oradata1/hkh_test01.dbf',
'/oradata1/ORA102/test_jys.dbf'
CHARACTER
SET KO16KSC5601
;
:wq
SQL> @ctl.sql
6.3.8 아카이브 로그
복구 < 아카이브가 모두 있을 시 >
SQL> RECOVER DATABASE USING BACKUP
CONTROLFILE;
6.3.9 불완전 복구 < 아카이브가 부족한 부분이 있을 시 >
SQL>
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
6.3.10
Resetlogs 옵션으로 데이터베이스 OPEN
SQL> alter database open resetlogs;
Database altered.
SQL> select host_name,instance_name, status from v$instance; 로 디비 상태 확인.
6.3.11 Temp 는 가져오지 않았기 때문에 따로 생성 해준 후 디폴트로 설정.
SQL> create temporary
tablespace temp
Tempfile ‘/oradata1/CLONE/temp01.d b f’ size
100M;
SQL> select name,bytes,status from
v$tempfile;
NAME
BYTES STATUS
---------------------------------- -------------
--------------
/oradata1/CLONE/temp01.dbf 104857600
ONLINE
SQL> alter database default temporary tablespace temp;
Set linesize 200
Col property_name for a30
Col property_value for
a15
Col description for a40
SQL> select * from
database_properties
Where property_name like
‘%TEMP%’;
PROPERTY_NAME
PROPERTY_VALUE
DESCRIPTION
--------------------------------- ----------------------
----------------------------------------------
DEFAULT_TEMP_TABLESPACE
TEMP01 Name of default temporary tablespace
7. Clone db가 Noarchive log mode로 되었는지 확인
SQL>
archive log list;
8. DB 정상 open 확인 후 2번에서 만든 test용 table의 data를 확인한다.
SQL> conn test/test
Connected.
SQL> select * from tab;
SQL> select count(*) from
test_table;
COUNT(*)
----------
10000
9. 리스너를 생성한다. Port는 1527로 사용한다.
$]cd $TNS_ADMIN or cd
$ORACLE_HOME/network/admin
$]vi listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME =
/oracle10/app/oracle/product/102)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hp_host_name)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hp_host_name)(PORT = 1527))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
:wq
다음과 같이 차례대로 실행 한다.
$] lsnrctl
Lsnrctl > stop -> start ->
status
Connecting to
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=inno-hp)(PORT=1521)))
STATUS of the
LISTENER
------------------------
Alias
LISTENER
Version TNSLSNR for HPUX: Version 10.2.0.4.0 -
Production
Start Date 19-JAN-2009
19:59:50
Uptime 0 days 0 hr. 6 min. 2 sec
Trace
Level off
Security ON: Local OS
Authentication
SNMP OFF
Listener Parameter File
/oracle10/app/oracle/product/102/network/admin/listener.ora
Listener Log
File
/oracle10/app/oracle/product/102/network/log/listener.log
Listening Endpoints
Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=inno-hp.innolime.com)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=inno-hp.innolime.com)(PORT=1527)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services
Summary...
Service "CLONE" has 1 instance(s).
Instance "CLONE", status
READY, has 1 handler(s) for this service...
Service "CLONE_XPT" has 1
instance(s).
Instance "CLONE", status READY, has 1 handler(s) for this
service...
Service "ORA102" has 1 instance(s).
Instance "ORA102", status
READY, has 1 handler(s) for this service...
Service "ORA102_XPT" has 1
instance(s).
Instance "ORA102", status READY, has 1 handler(s) for this
service...
Service "PLSExtProc" has 1 instance(s).
Instance
"PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The
command completed successfully
10. 두 DB 간 test 를 해보자.
$]export ORACLE_SID=ORA102
$]sqlplus sys/oracle@CLONE as sysdba
SQL> show parameter
db_name
db_name : CLONE 으로 뜨면 성공
$]export ORACLE_SID=CLONE
$]sqlplus sys/oracle@ORA102 as sysdba
SQL> show parameter
db_name
db_name : ORA102 로 뜨면 성공