컨트롤 파일의 재생성(DB명 변경)



컨트롤 파일을 재생성하는 이유는 다음과 같다.

1. Media failure로 인해 모든 컨트롤 파일을 잃어버렸다.
2. 데이터베이스 이름을 변경하고 싶다.
3. 현재 지정된 리두로그파일 그룹, 리두로그파일 멤버, 아카이블 리두로그파일, 데이터파일, 인스턴스의 최대수를 변경하고 싶다.
  
여기서는 DB명을 변경하는 시나리오를 살펴보겠다.


SQL> startup mount
ORACLE instance started.

Total System Global Area  189102108 bytes
Fixed Size                    75804 bytes
Variable Size              89006080 bytes
Database Buffers           99942400 bytes
Redo Buffers                  77824 bytes
Database mounted.
SQL> alter database backup controlfile to trace;

Database altered.

SQL> show parameter user_dump_dest

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
user_dump_dest                       string  C:\oracle\admin\maddog\udump
SQL> host dir C:\oracle\admin\maddog\udump
C 드라이브의 볼륨: 로컬 디스크
볼륨 일련 번호: 48BB-0BA0

C:\oracle\admin\maddog\udump 디렉터리

2003-04-25  05:08p      <DIR>          .
2003-04-25  05:08p      <DIR>          ..
2003-04-25  02:52p                 664 ORA00348.TRC
2003-04-25  05:03p                 660 ORA00608.TRC
2003-04-25  02:48p             198,307 ORA00964.TRC
2003-04-25  05:03p                 618 ORA01216.TRC
2003-04-25  05:08p               1,853 ORA01512.TRC
               5개 파일         202,102 바이트
               2 디렉터리   5,677,813,760 바이트 남음

user_dump_dest에 생성된 컨트롤파일의 복사본을 적절히 편집한다.
이는 아래 명령으로 바로 편집할 수도 있고, 자주 쓰는 편집기로 수정해도 된다.
SQL> host edit C:\oracle\admin\maddog\udump\ORA01512.TRC

백업된 컨트롤파일의 내용을 함 보자.
SQL> host type C:\oracle\admin\maddog\udump\ORA01512.TRC
Dump file C:\oracle\admin\maddog\udump\ORA01512.TRC
Fri Apr 25 17:08:35 2003
ORACLE V8.1.7.0.0 - Production vsnsta=0
vsnsql=e vsnxtr=3
Windows 2000 Version 5.0 Service Pack 3, CPU type 586
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
Windows 2000 Version 5.0 Service Pack 3, CPU type 586
Instance name: maddog

Redo thread mounted by this instance: 1

Oracle process number: 14

Windows thread id: 1512, image: ORACLE.EXE


*** SESSION ID:(11.1) 2003-04-25 17:08:35.607
*** 2003-04-25 17:08:35.607
# The following commands will create a new control file and use it
# to open the database.
# Data used by the recovery manager will be lost. Additional logs ma
# be required for media recovery of offline data files. Use this
# only if the current version of all online logs are available.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "MADDOG" NORESETLOGS NOARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 254
    MAXINSTANCES 1
    MAXLOGHISTORY 1815
LOGFILE
  GROUP 1 'C:\ORACLE\ORADATA\MADDOG\REDO01.LOG'  SIZE 1M,
  GROUP 2 'C:\ORACLE\ORADATA\MADDOG\REDO02.LOG'  SIZE 1M,
  GROUP 3 'C:\ORACLE\ORADATA\MADDOG\REDO03.LOG'  SIZE 1M
DATAFILE
  'C:\ORACLE\ORADATA\MADDOG\SYSTEM01.DBF',
  'C:\ORACLE\ORADATA\MADDOG\RBS01.DBF',
  'C:\ORACLE\ORADATA\MADDOG\USERS01.DBF',
  'C:\ORACLE\ORADATA\MADDOG\TEMP01.DBF',
  'C:\ORACLE\ORADATA\MADDOG\TOOLS01.DBF',
  'C:\ORACLE\ORADATA\MADDOG\INDX01.DBF',
  'C:\ORACLE\ORADATA\MADDOG\DR01.DBF'
CHARACTER SET KO16KSC5601
;
# Recovery is required if any of the datafiles are restored backups,
# or if the last shutdown was not normal or immediate.
RECOVER DATABASE
# Database can now be opened normally.
ALTER DATABASE OPEN;
# No tempfile entries found to add.
#

SQL>


여기서는 다음과 같이 변경할 것이다.

DB명         : MADDOG -> DB
MAXDATAFILES : 254 -> 100 (테스트 용도라면 100개면 적당할 것이다.)
REUSE -> SET
NORESETLOGS -> RESETLOGS
RECOVER DATABASE 제거
ALTER DATABASE OPEN -> ALTER DATABASE OPEN RESETLOGS

변경한 것은 d:\temp\crtctl.sql 파일로 저장했고, 내용은 보면 다음과 같다.


SQL> host type d:\temp\crtctl.sql
STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "DB" RESETLOGS NOARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 100
    MAXINSTANCES 1
    MAXLOGHISTORY 1815
LOGFILE
  GROUP 1 'C:\ORACLE\ORADATA\DB\REDO01.LOG'  SIZE 1M,
  GROUP 2 'C:\ORACLE\ORADATA\DB\REDO02.LOG'  SIZE 1M,
  GROUP 3 'C:\ORACLE\ORADATA\DB\REDO03.LOG'  SIZE 1M
DATAFILE
  'C:\ORACLE\ORADATA\DB\SYSTEM01.DBF',
  'C:\ORACLE\ORADATA\DB\RBS01.DBF',
  'C:\ORACLE\ORADATA\DB\USERS01.DBF',
  'C:\ORACLE\ORADATA\DB\TEMP01.DBF',
  'C:\ORACLE\ORADATA\DB\TOOLS01.DBF',
  'C:\ORACLE\ORADATA\DB\INDX01.DBF',
  'C:\ORACLE\ORADATA\DB\DR01.DBF'
CHARACTER SET KO16KSC5601;
ALTER DATABASE OPEN RESETLOGS;

먼저 DB를 shutdown한다. 컨트롤파일은 nomount모드에서 생성가능하다.
DB생성 또한 nomount모드에서 수행하는 것도 알아두면 좋겠다. 연관해서 기억하면 좋겠지요?
윈도에는 좀 특이한 점이 있기 때문에 아래에 있는 것과 같이 oradim명령으로 한번더 수행해준다.
(관리도구 - 서비스를 보면 shutdown명령후에도 DB가 시작상태에 있는 것을 볼 수 있다.)
컨트롤파일을 새로 생성하기 때문에 이전의 컨트롤 파일을 제거한다.
SQL> shutdown
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> host oradim -shutdown -SID maddog
SQL> host del c:\oracle\oradata\db\control*.*

이제 실행하면 된다.
maddog으로 되어 있는 부분을 db로 변경해야 한다.
우선 C:\oracle\ora81\database의 initmaddog.ora 파일을 initdb.ora파일명으로 변경한다.
initdb.ora에 maddog이라고 되어 있는 모든 것들을 울트라에디트등의 편집기를 이용해 db로 모두 변경한다.
윈도에서는 레지스트리도 변경해줘야 한다. 아래의 레지스트리키의 maddog을 모두 db로 변경한다.
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0
maddog이라는 이름의 디렉토리를 db로 변경한다.

[notice]
레지스트리 키 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 에서 ORA_db_AUTOSTART의 값이 false로 되어 있으면, 관리도구 - 서비스에서 오라클 시작시 오라클 인스턴스만 올라오게 된다.
인스턴스뿐만 아니라 DB도 같이 올라오게 하려면 이를 true로 변경하면 된다.


SQL> host move c:\oracle\oradata\maddog c:\oracle\oradata\db
        1개 파일을 이동했습니다.

admin쪽은 자꾸 액세스가 거부되어서 창을 모두 닫고 수행했다.
D:\>move c:\oracle\admin\maddog c:\oracle\admin\db
        1개 파일을 이동했습니다.

서비스에 기존의 maddog을 제거한다.
D:\>oradim -delete -sid maddog

서비스에 새로운 db를 등록한다. 관리도구 - 서비스에 OracleServicedb 가 등록된 것을 확인한다.
상태가 시작됨으로 표시되어 있다.
D:\>oradim -new -sid db -startmode m -pfile c:\oracle\admin\db\pfile\initdb.ora

C:\oracle\ora81\database\PWDmaddog.ora을 C:\oracle\ora81\database\PWDdb.ora로 변경한다.

메시지를 영어로 보이도록 변경한다.
에러메시지가 한글로는 깨지는 경우가 많다.
D:\>set NLS_LANG=AMERICAN_AMERICA.KO16KSC5601

이제 새로만든 crtctl.sql파일을 수행해준다.

D:\>sqlplus /nolog

SQL*Plus: Release 8.1.7.0.0 - Production on 금 Apr 25 17:52:54 2003

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

SQL> connect internal
Connected to an idle instance.
SQL> @d:\temp\crtctl.sql
ORACLE instance started.

Total System Global Area  189102108 bytes
Fixed Size                    75804 bytes
Variable Size              89006080 bytes
Database Buffers           99942400 bytes
Redo Buffers                  77824 bytes

Control file created.


Database altered.

SQL> show parameter db_name

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
db_name                              string  db
SQL> select * from v$database;

      DBID NAME      CREATED   RESETLOGS_CHANGE# RESETLOGS
---------- --------- --------- ----------------- ---------
PRIOR_RESETLOGS_CHANGE# PRIOR_RES LOG_MODE     CHECKPOINT_CHANGE#
----------------------- --------- ------------ ------------------
ARCHIVE_CHANGE# CONTROL CONTROLFI CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
--------------- ------- --------- --------------------- -------------------
CONTROLFI OPEN_RESETL VERSION_T OPEN_MODE
--------- ----------- --------- ----------
3609131437 DB        25-APR-03            187893 25-APR-03
                 187846 25-APR-03 NOARCHIVELOG             187894
              0 CURRENT 25-APR-03                  4309              187923
25-APR-03 NOT ALLOWED 25-APR-03 READ WRITE


SQL>


마지막으로 Net8을 사용하고 있다면, tnsnames.ora와 listener.ora도 필요에 따라 maddog으로 된 부분을 db로 변경한다.


This article comes from dbakorea.pe.kr (Leave this line as is)

출처 : http://www.superuser.co.kr

'IT > Oracle' 카테고리의 다른 글

Oracle Data Migration - exp, imp procedure  (0) 2008.11.20
Cold backup  (0) 2008.09.29
Oracle admin tip  (0) 2008.07.25
Oracle Situation  (0) 2008.07.23
Export / Import  (0) 2008.07.23

+ Recent posts