Advanced Oracle Document CONVERT to ASM and Non-ASM Author: Hyun-Ho, Jung Site: http://www.commit.co.kr Email: admin@commit.co.kr cleanto@naver.com Creation Date: 2011-12 - 13
CONVERT to ASM and Non-ASM 1. TEST Information Items Description Test Date 2011 / 12 / 13 CPU VirtualBox VCPUx4 Main Memory 2GB O/S version RHEL 5.5 Host Name ORACLE_SID test1, test2 TESTDB1, TESTDB2 Oracle version 10.2.0.5 2. Scenario&Environment 1) 10gR2(10.2.0.5) 버전으로 Clusterware 와 S/W는설치가되어있는상태이다. 2) Non-ASM 파일과 ASM 파일간 Convert 를진행할것이다. 3) Single Instance에서 RAC 변환할때 Target DB(RAC) 의 Storage Type이 ASM 을사용할때해당문서를적용할수있으며, 그외다른요건에의해서도 convert 를사용할수있다 4) 테스트환경에서는 Non-ASM 파일은 CFS(Redhat GFS2) 영역에존재한다. 5) ASM의 DiskGroup 명은 DATA 이다. 6) 11gR1 이상사용중이라면해당방법외 11g NF인 ASM CP 기능을이용할수있다. <Service Name> 2 Customer Only
3. Non-ASM File To ASM Convert 대상확인 온라인상으로작업하기위해 begin backup 명령을실행하고 convert 를하게되면에러가발생 된다. 그러므로 Instance 를 shutdown 후진행해야한다. shutdown 하기전데이터파일조회를한다. SQL> select tablespace_name, file_name from dba_data_files; TABLESPACE_NAME FILE_NAME ------------------------------ ---------------------------------------- USERS /oradata/testdb/users01.dbf UNDOTBS2 /oradata/testdb/undotbs02.dbf SYSAUX /oradata/testdb/sysaux01.dbf UNDOTBS1 /oradata/testdb/undotbs01.dbf SYSTEM /oradata/testdb/system01.dbf 위의파일이 Convert 대상이된다. temp 는 convert 가않된다. 필요하다면생성해서사용한다. shutdown -> mount shutdown 후 mount 단계로 open 한다. RMAN 을이용해 convert 진행 rman 으로접속한다. $ rman target / Recovery Manager: Release 10.2.0.5.0 - Production on Tue Dec 13 21:34:30 2011 Copyright (c) 1982, 2007, Oracle. All rights reserved. connected to target database: TESTDB (DBID=2551595590) <Service Name> 3 Customer Only
커맨드문법은아래와같다 convert datafile '/ 위치 / 파일명.dbf' format '+DATA'; 특별히이름을지정하지않으면 OMF 규칙에따라이름이지정되며, 이름을지정하고자한다면 아래와같이경로와파일명까지지정한다. convert datafile '/oradata/testdb/users01.dbf' format '+DATA/TESTDB/DATAFILE/users01.dbf'; 여러파일을동시에진행하기위해서는아래와같이진행할수있다. RMAN> convert datafile 2> '/oradata/testdb/system01.dbf', 3> '/oradata/testdb/sysaux01.dbf', 4> '/oradata/testdb/undotbs01.dbf', 5> '/oradata/testdb/undotbs02.dbf', 6> '/oradata/testdb/users01.dbf' 7> format '+data'; 위와같이작업하면파일의이름을원하는데로지정할수는없게된다. convert 명령어를통해 convert 하였다면 asmcmd 로들어가서확인해본다. 필자는 datafile rename 을위해이름을지정하여 convert 하였다. 데이터파일이많다면아래쿼리를응용하여스크립트를추출한다. set lines 500 set heading off col file_name for a40 select 'convert datafile ''' file_name ''' format ''' '+DATA/TESTDB/DATAFILE' SUBSTR(file_name,16,15) ''';' from dba_data_files; rename file 후 open 한다. alter database rename file '/oradata/testdb/users01.dbf' to '+DATA/TESTDB/DATAFILE/users01.dbf'; alter database rename file '/oradata/testdb/undotbs02.dbf' to '+DATA/TESTDB/DATAFILE/undotbs02.dbf'; alter database rename file '/oradata/testdb/sysaux01.dbf' to '+DATA/TESTDB/DATAFILE/sysaux01.dbf'; alter database rename file '/oradata/testdb/undotbs01.dbf' to '+DATA/TESTDB/DATAFILE/undotbs01.dbf'; alter database rename file '/oradata/testdb/system01.dbf' to '+DATA/TESTDB/DATAFILE/system01.dbf'; <Service Name> 4 Customer Only
위커맨드는아래쿼리를이용해서추출하였다. set lines 500 set heading off col file_name for a40 select 'alter database rename file ''' file_name ''' to ''' '+DATA/TESTDB/DATAFILE' SUBSTR(file_name,16,15) ''';' from dba_data_files; open 후 Instance 상태및 datafile 위치를조회해본다. SQL> select status from v$instance; STATUS ------------ OPEN SQL> select file_name from dba_data_files; FILE_NAME ---------------------------------------- +DATA/testdb/datafile/users01.dbf +DATA/testdb/datafile/undotbs02.dbf +DATA/testdb/datafile/sysaux01.dbf +DATA/testdb/datafile/undotbs01.dbf +DATA/testdb/datafile/system01.dbf 4. ASM To Non-ASM File Users Tablespace offline 위에서 ASM 파일로변환한 users01.dbf 파일을다시 Non-ASM File 로변환하겠다. 테스트의편의성을위해 users 테이블스페이스를 offline 시킨후진행하겠다. SQL> alter tablespace users offline; <Service Name> 5 Customer Only
RMAN 에접속한다. rman 으로접속한다. $ rman target / Recovery Manager: Release 10.2.0.5.0 - Production on Tue Dec 13 23:20:01 2011 Copyright (c) 1982, 2007, Oracle. All rights reserved. connected to target database: TESTDB (DBID=2551595590) RMAN 을이용해 convert 진행 convert datafile '+DATA/testdb/datafile/users01.dbf' format '/oradata/testdb/convert/users01.dbf'; rename datafile 후 users Tablespace online alter database rename file '+DATA/testdb/datafile/users01.dbf' to '/oradata/testdb/convert/users01.dbf'; rename 후 users Tablespace 를 online 시킨다. SQL> alter tablespace users online; 테이블스페이스와데이터파일의상태를조회한다. SQL> select tablespace_name, file_name, status from dba_data_files; TABLESPACE_NAME FILE_NAME STATUS ------------------------------ ---------------------------------------- --------- USERS /oradata/testdb/convert/users01.dbf AVAILABLE UNDOTBS2 +DATA/testdb/datafile/undotbs02.dbf AVAILABLE SYSAUX +DATA/testdb/datafile/sysaux01.dbf AVAILABLE UNDOTBS1 +DATA/testdb/datafile/undotbs01.dbf AVAILABLE SYSTEM +DATA/testdb/datafile/system01.dbf AVAILABLE 위치가변경되었으며, 상태도 AVAILABLE 인것을확인할수있다. <Service Name> 6 Customer Only
5. Not Exists Instance Instance 가존재하지않을때 위의테스트는 Database Instance 가존재할때를기반으로테스트가진행되었다. 가령 Single 에서 RAC 로변환하기위해서 Clusterware 설치 -> S/W( 엔진 ) 설치 -> ASM 인스턴스생성 순으로진행하여 Database 가존재하지않고기존 Single Instance 의 Datafile 을이용해야할때는 어떻게해야할까? single 에서사용하던 datafile 은 /oradata2/ha 위치에 ha 이라는 SID 로존재한다. RAC 변환하면서 COPYDB 로 SID 도변경하겠다. 파라미터파일작성 nomount 단계로 open 하기위해서는파라미터파일이존재해야한다 RAC 로변환및 ASM convert 하기위해서몇가지를수정추가한다. SQL> create pfile='/oracle/init_ha.ora' from spfile; *.control_files='+data/copydb/datafile/control01.ctl','+data/copydb/datafile/control02.ctl' 컨트롤파일을재생성을해야하며, 재생성을통해서 ASM 영역에생성을한다. 그렇기때문에컨트롤위치는 ASM 영역으로지정한다 cluster 관련파라미터를추가한다 *.cluster_database_instances = 2 *.undo_management=auto COPYDB1.undo_tablespace='UNDOTBS1' COPYDB1.instance_number=1 COPYDB1.thread=1 COPYDB2.instance_number=2 COPYDB2.thread=2 COPYDB2.undo_tablespace='UNDOTBS2' *.cluster_database = false dump_dest 를변경한다. *.audit_file_dest='/oracle/admin/copydb/adump' <Service Name> 7 Customer Only
*.background_dump_dest='/oracle/admin/copydb/bdump' *.core_dump_dest='/oracle/admin/copydb/cdump' *.user_dump_dest='/oracle/admin/copydb/udump' 해당위치에디렉토리를생성해준다. db_name 변경 *.db_name='copydb' 편집한컨트롤파일을 $ORACLE_HOME/dbs/initCOPYDB1.ora 이름으로복사한다. 컨트롤파일재생성 rman convert 를이용할수없는파일은컨트롤파일, redolog file, temp file 이다. 그렇기때문에컨트롤파일을재생성하면서 ASM 영역에생성을할것이다. 컨트롤파일을 TRACE 형태로생성한다. SQL> alter database backup controlfile to trace as '/oracle/recon.sql'; 전 ) CREATE CONTROLFILE REUSE DATABASE "HA" NORESETLOGS ARCHIVELOG 후 ) CREATE CONTROLFILE SET DATABASE "COPYDB" RESETLOGS NOARCHIVELOG 위에서변경한이유는테스트상 SID 와디렉토리경로를겹치는부분이있어서 SID 를변경 한것이며, 기존 SID 를사용할것이라면 REUSE / NORESETLOGS 를사용해도된다. SINGLE DB 는현재 archivelog Mode 중이며, 테스트의편의성을위해서변환되는 RAC 는 No archivelog Mode 로구성하기위해서 NOARVHIELOG 로기술한것이기때문에 꼭 NOARCHIVELOG 로해야하는것은아님을밝혀둔다. SID 의변경유무와상관없이 ASM 영역내로재생성해야하기때문에반드시재생성을 한다. <Service Name> 8 Customer Only
asmcmd 로접속해디렉토리를생성한다. $ export ORACLE_SID=+ASM1 $ asmcmd ASMCMD> cd DATA ASMCMD> mkdir COPYDB ASMCMD> mkdir COPYDB/DATAFILE 기존 Single Database shutdown 후컨트롤파일재생성 single 로운영중인 ha 인스턴스를종료한다. SQL> shutdown immediate; sid 를변경후컨트롤파일재생성을진행한다 $ export ORACLE_SID=COPYDB1 SQL> @recon.sql RMAN 을이용해서 convert rman 에접속후아래와같이 convert 명령을내리면 convert datafile '/oradata2/ha/users01.dbf' format '+DATA/COPYDB/DATAFILE/users01.dbf'; 아래와같이에러가발생한다. Starting backup at 14-DEC-11 using channel ORA_DISK_1 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of backup command at 12/14/2011 01:56:34 RMAN-06592: must specify FROM PLATFORM 에러메시지에서힌트를얻을수있는데 FROM PLATFORM 을기술해달라고한다. 해당정보는공통적인정보로써 open 된인스턴스에서아래쿼리를실행해조회해보면된다. <Service Name> 9 Customer Only
SELECT * FROM V$TRANSPORTABLE_PLATFORM; 결과는아래와같다. PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT ----------- ---------------------------------------- -------------- 1 Solaris[tm] OE (32-bit) Big 2 Solaris[tm] OE (64-bit) Big 7 Microsoft Windows IA (32-bit) Little 10 Linux IA (32-bit) Little 6 AIX-Based Systems (64-bit) Big 3 HP-UX (64-bit) Big 5 HP Tru64 UNIX Little 4 HP-UX IA (64-bit) Big 11 Linux IA (64-bit) Little 15 HP Open VMS Little 8 Microsoft Windows IA (64-bit) Little 9 IBM zseries Based Linux Big 13 Linux x86 64-bit Little 16 Apple Mac OS Big 12 Microsoft Windows x86 64-bit Little 17 Solaris Operating System (x86) Little 18 IBM Power Based Linux Big 19 HP IA Open VMS Little 20 Solaris Operating System (x86-64) Little OS 별각기다른 ENDIAN_FORMAT 정보를담고있는뷰를조회한것이다. RMAN 에서 FROM PLATFORM 에서기술해달라는플랫폼명은위에서참조해서기재하면된다. convert datafile '/oradata2/ha/users01.dbf' format '+DATA/COPYDB/DATAFILE/users01.dbf'; FROM 플렛폼은위의커맨드에서빨간색으로되어있는 Source 부분을지칭하는것이다. 가령 users01.dbf 파일이원래윈도우에서사용중인파일이고해당파일을 Linux 의 ASM 영역에 convert 할것이라면아래와같이 source OS 의정보를입력해주면된다. FROM PLATFORM 'Microsoft Windows x86 64-bit' 테스트환경은리눅스환경임으로커맨드는아래와같이된다. convert datafile '/oradata2/ha/users01.dbf' FROM PLATFORM 'Linux x86 64-bit' <Service Name> 10 Customer Only
format '+DATA/COPYDB/DATAFILE/users01.dbf'; FROM 절까지기술한후실행하면아래와같이정상적으로복사되는것을확인할수있다. 같은방법으로 system, sysaux,undo 등모든데이터파일을 convert 한다. 위에서언급했듯이 temp,redo 를제외하고모든데이터파일을 convert 한다. 데이터파일경로를변경후 open 한다. datafile 은아래처럼변경을한다. alter database rename file '/oradata2/ha/undotbs02.dbf' to '+DATA/COPYDB/DATAFILE/undotbs02.dbf'; alter database rename file '/oradata2/ha/sysaux01.dbf' to '+DATA/COPYDB/DATAFILE/sysaux01.dbf'; alter database rename file '/oradata2/ha/undotbs01.dbf' to '+DATA/COPYDB/DATAFILE/undotbs01.dbf'; alter database rename file '/oradata2/ha/system01.dbf' to '+DATA/COPYDB/DATAFILE/system01.dbf'; alter database rename file '/oradata2/ha/users01.dbf' to '+DATA/COPYDB/DATAFILE/users01.dbf'; recover 진행 SQL> recover database using backup controlfile; ORA-00279: change 721438 generated at 12/16/2011 01:36:24 needed for thread 1 ORA-00289: suggestion : /oracle/product/102/db/dbs/archarc_1_3_769925721.arc ORA-00280: change 721438 for thread 1 is in sequence #3 Specify log: {<RET>=suggested filename AUTO CANCEL} 위에서요구하는변경본이있는파일은 redo log 파일일것임으로현재리두로그파일을 적용해본다. 아래와같이나온다면다음리두를, 그래도나오면다른리두로그를입력한다. ORA-00310: archived log contains sequence 2; sequence 3 required ORA-00334: archived log: '/oradata2/ha/redo02.log' 맞는리두로그파일을입력하면아래와같이복구가완료되었다는메세지를볼수있다. Log applied. Media recovery complete. resetlogs 로 open 한다. SQL> alter database open resetlogs; <Service Name> 11 Customer Only
tempfile 추가 ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/COPYDB/DATAFILE/temp01.dbf' SIZE 1024M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M; redo 로그파일추가삭제 group1 과 2 에맴버를각각하나씩추가한다. alter database add logfile member '+DATA/COPYDB/DATAFILE/redo01a.log' to group 1; alter database add logfile member '+DATA/COPYDB/DATAFILE/redo02a.log' to group 2; redolog file 은아래쿼리로조회해서 active, inactive 상태를조회한다. SQL>set linesize 500 SQL> col member format a35 SQL> col IS_RECOVERY_DEST_FILE format a25 SQL> select b.thread#,a.group#,b.first_change#, a.member, b.bytes/1024/1024 MB,b.status, 2 a.type TYPE 3 from v$logfile a, v$log b 4 where a.group# = b.group# 5 order by a.group#, a.member; THREAD# GROUP# FIRST_CHANGE# MEMBER MB STATUS TYPE ---------- ---------- ------------- ----------------------------------- ---------- ---------------- ------- 1 1 721440 +DATA/copydb/datafile/redo01a.log 200 CURRENT ONLINE 1 1 721440 /oradata2/ha/redo01.log 200 CURRENT ONLINE 1 2 0 +DATA/copydb/datafile/redo02a.log 200 UNUSED ONLINE 1 2 0 /oradata2/ha/redo02.log 200 UNUSED ONLINE 1 3 0 /oradata2/ha/redo03.log 200 UNUSED ONLINE 현재 group3 이 unused 중이라바로삭제가가능하기때문에삭제를한다. alter database drop logfile group 3; 2 번인스턴스용 (Thread2) Redolog 를생성한다. SQL> alter database add logfile thread 2 group 3 ('+DATA/COPYDB/DATAFILE/redo03a.dbf') size 100M, group 4 ('+DATA/COPYDB/DATAFILE/redo04a.dbf') size 100M; <Service Name> 12 Customer Only
활성화한다. SQL> alter database enable public thread 2; 다시위의쿼리로조회하면서 alter system switch logfile 과 alter sysem checkpoint 를이용하여 group 1 과 group 2 를 inactive 로만든다. ASM 영역이아닌기존이 filesystem 에있는 redolog 파일을 삭제해야한다. redo 로그상태를조회해서 inactive 가된그룹의맴버를삭제한다. alter database drop logfile member '/oradata2/ha/redo01.log'; alter database drop logfile member ' /oradata2/ha/redo02.log'; 이렇게추가삭제를반복하면아래와같이 4 개의그룹파일이 ASM 에위치하게된다. THREAD# GROUP# FIRST_CHANGE# MEMBER MB STATUS TYPE ---------- ---------- ------------- ----------------------------------- ---------- ---------------- ------- 1 1 721716 +DATA/copydb/datafile/redo01a.log 200 INACTIVE ONLINE 1 2 721766 +DATA/copydb/datafile/redo02a.log 200 CURRENT ONLINE 2 3 721695 +DATA/copydb/datafile/redo03a.dbf 100 CURRENT ONLINE 2 4 0 +DATA/copydb/datafile/redo04a.dbf 100 UNUSED ONLINE undotbs 를생성 2 번인스턴스 (THREAD2) 의 undotbs 를생성 ( 존재한다면생성하지않아도된다 ) SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '+DATA/COPYDB/DATAFILE/undotbs02.dbf' size 1024M; 여기까지진행했다면모든데이터파일 (undo, temp 포함 ) 이 ASM 영역으로위치해있을것이다. 아래쿼리로조회해보자 select file_name from dba_data_files union all select file_name from dba_temp_files; +DATA/copydb/datafile/undotbs02.dbf +DATA/copydb/datafile/users01.dbf +DATA/copydb/datafile/sysaux01.dbf +DATA/copydb/datafile/undotbs01.dbf <Service Name> 13 Customer Only
+DATA/copydb/datafile/system01.dbf +DATA/copydb/datafile/temp01.dbf 컨트롤파일을조회해본다. SQL> show parameter control control_files string +DATA/copydb/datafile/control0 1.ctl, +DATA/copydb/datafile/c ontrol02.ctl 2 개의 controlfile 이 ASM 영역에위치해있다. 파라미터수정후 RAC convert 다시파라미터파일을열어서아래파라미터를수정한다. 전 ) *.cluster_database = false 후 ) *.cluster_database = true 파라미터파일을수정후데이터베이스를재시작한다. 인스턴스가 open 된후아래 sql 을수행한다. SQL> @?/rdbms/admin/catclust.sql spfile 생성 create spfile='+data/copydb/datafile/spfilecopydb.ora' from pfile='/oracle/product/102/db/dbs/initcopydb1.ora'; ( 한줄로붙여서실행 ) spfile 을만든후 1 번서버에서는 initcopydb1.ora 을 rename( 백업 ) 하고 1 번에서 initcopydb1.ora, 2 번서버에서 initcopydb2.ora 를만든다 내용은아래와같이 SPFILE 을가리키도록한다. SPFILE='+DATA/COPYDB/DATAFILE/spfileCOPYDB.ora' <Service Name> 14 Customer Only
위에서생성한 dump_dest 디렉토리를 2 번서버에서도동일하게생성한다. *.audit_file_dest='/oracle/admin/copydb/adump' *.background_dump_dest='/oracle/admin/copydb/bdump' *.core_dump_dest='/oracle/admin/copydb/cdump' *.user_dump_dest='/oracle/admin/copydb/udump' clusterware 의 Resource 로등록한다. srvctl 명령어를이용하여 database 를등록한다. 형식은아래와같다. $ srvctl add database -d COPYDB -o /oracle/product/102/db -p +DATA/COPYDB/DATAFILE/spfileCOPYDB.ora 각옵션의의미는아래와같다 -d : database의이름 -o : oracle 홈디렉토리 -p : 파라미터파일경로 srvctl 명령어를이용하여 instance 를등록한다. 형식은아래와같다. $ srvctl add instance -d COPYDB -i COPYDB1 -n test1 $ srvctl add instance -d COPYDB -i COPYDB2 -n test2 -i : 인스턴스명 -n : 각노드의호스트명 resource 확인 리소스등록까지모두마친후 crs_stat -t 를통해리소스상태를확인한다. 아래와같이 database 및 instance 리소스가 OFFLINE 이라면리소스시작커맨드를실행한다. ora...b1.inst application OFFLINE OFFLINE ora...b2.inst application OFFLINE OFFLINE ora.copydb.db application OFFLINE OFFLINE $ crs_start -all 커맨드실행후다시확인해보면모두 ONLINE 상태로변경된것을확인할수있다. ora...b1.inst application ONLINE ONLINE test1 ora...b2.inst application ONLINE ONLINE test2 ora.copydb.db application ONLINE ONLINE test2 <Service Name> 15 Customer Only