Oracle 11g 에서 향상된 ASMCMD CP기능

Last Updated on 12월 4, 2020 by 태랑(정현호)

문서 업데이트 - 2020/11/08

ASM 를 조작하고 사용할 수 있는 유틸리티


ASMCMD는 ASM (Automatic Storage Management) 디스크 그룹 내에서 파일과 디렉토리를 쉽게보고 조작하는 데 사용할 수있는 명령 줄 유틸리티입니다.

디스크 그룹의 내용을 나열하고, 검색을 수행하고, 디렉토리와 별칭을 생성 및 제거하고, 공간 활용도를 표시 할 수 있습니다.


이런 asmcmd에 11g 에서는 새로 제공되는 기능으로 로컬 인스턴스와 원격 인스턴스의 ASM 디스크 그룹 간 파일을복사 할 수 있거나 OS 의 영역에서 ASM 인스턴스 영역으로의 복사(반대 방향으로도) 가 구현되었습니다


asmcmd cp 를 사용하여 ASM 을 사용시 rman 으로 백업을 해야 하는 10g 의 방식과 다르게 Begin/End 백업이 가능하며, ASM 인스턴스간에 , OS 영역과 ASM 인스턴스 영역간의 복사로 인하여 ASM 사용 방법이 더욱더 강력해 졌다고 할 수 있습니다.




1. Copy : Instance => OS


먼저 ASM 인스턴스와 OS 간의 파일 복사가 이루어 지는 지를 확인해보도록 하겠습니다.

ORACLE_SID 환경변수를 +ASM 으로 지정후 asmcmd 를 실행하게 됩니다.
Single 환경임으로 +ASM 이며, RAC 의 경우 +ASMn 이되며 n 은 노드 번호가 되게 됩니다.

1 번노드 => +ASM1
2 번노드 => +ASM2

[oracle]$ export ORACLE_SID=+ASM
[oracle]$ asmcmd
ASMCMD>



아래와 같이 data/orcl/datafile  안에 orcl 인스턴스의 데이터 파일이 존재하는 것을 확인 할 수 있습니다.
ASMCMD> cd data/orcl/datafile

ASMCMD> ls 
SYSAUX.261.752212761
SYSTEM.260.752212741
UNDOTBS1.262.752212779
USERS.264.752212813

cp 명령으로 USERS.264.752212813 을 복사를 해보도록 하겠습니다.
ASMCMD> cp USERS.264.752212813 /oracle/USERS
copying +data/orcl/datafile/USERS.264.752212813 -> /oracle/USERS


/oracle 위치를 ls 로 조회해보면 아래와 같이 USERS 파일이 복사됨을 확인 할 수 있습니다.

[oracle]$ ls /oracle

USERS    admin    cfgtoollogs   diag media oraInventory product


/oracle/USERS 파일을 복사할 때 아래와 같이 파일의 모든 경로를 기술해주어야 합니다.
[oracle]$ asmcmd cp   /oracle/USERS   +data





2. Copy : OS => Instance


이번에는 OS 에 있는 USERS 파일을 +DATA/ 위치로 복사 해보겠습니다.

asmcmd 의 명령어를 실행하는 방법은 2 가지 입니다.

asmcmd 를 접속하여 수행하거나 asmcmd du 와 같이 asmcmd 뒤에 내부명령어를 실행하면 됩니다.


주의 해야 할 점은 os 의 경로를 모두 기술해주어야 합니다.
ASMCMD> cp /oracle/USERS +data
copying /oracle/USERS -> +data/USERS

ASMCMD> cd DATA
ASMCMD> ls
ORCL/
USERS


파일삭제는 다음과 같이 실행 합니다.
ASMCMD> rm –rf USERS



asmcmd 로 접근하지 않고 아래와 같이 실행할 수도 있습니다.

[oracle]$ asmcmd rm +DATA/USERS





3. HOT BACKUP


인스턴스와 OS 간의 파일복사가 가능하기 때문에 기존의 Begin/End Backup 형태의 HOT BACKUP 을 시도해보겠습니다.


백업 전 확인 해볼 사항이 있습니다.


위에서 보이듯이 현재 tablespace 에 해당하는 데이터파일은 파일명.파일번호
로 존재 하고 있습니다.


OS 영역에서 ASM 영역으로 파일명.파일번호 형태로 되어있는 파일은 ASM 영역내로 복사 할 수 없습니다

아래 예시)
먼저 users. 264.752244043 파일을 /oracle 위치로 이름 그대로 복사를 시도 합니다.
$ asmcmd cp  +data/orcl/datafile users.264.752244043    /oracle 



[oracle]$ ls -l
-rw-r----- 1 oracle dba 5251072 May 31 00:31 users.264.752244043

위와 같이 파일명.파일번호로 존재하는 파일을 다시 ASM 영역내로 복사를 하게 되면 아래와 같은 에러 메세지를 받게 됩니다.



$ asmcmd cp   /oracle/users.264.752244043    +data
copying /oracle/users.264.752244043 -> +data/users.264.752244043 ASMCMD-08016: copy source->'/oracle/users.264.752244043' and target- >'+data/users.264.752244043' failed
ORA-19505: failed to identify file "+data/users.264.752244043"
ORA-17502: ksfdcre:4 Failed to create file +data/users.264.752244043
ORA-15046: ASM file name '+data/users.264.752244043' is not in single-file creation form
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 258
ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)


상위 버전에서는 명령어 수행하는 화면 대신 ASM alert.log 에 에러가 기록 됩니다.
2020-11-08T03:39:28.405534+09:00
Errors in file /oracle/base/diag/asm/+asm/+ASM1/trace/+ASM1_ora_4361.trc:
ORA-15046: ASM file name '+DATA/USE.268.10554' is not in single-file creation form



위에서 USERS 파일을 ASM에 COPY 한 파일을 ls –l 로 조회 해보면 아래와 같이 파일은 심볼릭 링크 인 것을 알 수 있으며 그와 매핑된 원본 파일은 datafile 디렉토리에 users.파일번호 형태로 존재 하는 것을 알 수 있습니다

ASMCMD> ls -l
ASM/
ORCL/
USERS => +DATA/ASM/DATAFILE/USERS.258.1055906917



그래서 파일명.파일번호 가 붙은 파일을 복사하려고 하면 에러가 발생 되게 됩니다.


그럼 위에서 +data/USERS 파일을 지우고 다시 OS 영역에서 ASM 으로 복사를
해보면 아래와 같이 원본파일에 붙은 파일번호가 또 다르게 생성됩니다.

users => +DATA/ASM/DATAFILE/users.272.752546357

그렇기 때문에 Backup & Restore 의 편의성을 위해 고정적인 이름이 필요하며 이전에 사용하는 파일이름 형태로 변경을 해주는 작업을 선행을 해야 합니다.



[참고] 해당 작업은 테스트성이나 기능의 동작 여부 확인에 목적을 두고 진행한 테스트 입니다.

db shutdown 전 controlfile 위치를 변경 합니다.
alter system set control_files='+DATA/orcl/controlfile/control01.ctl' scope=spfile;

db 를 정상 종료합니다.
SQL> shutdown immediate;

asm 인스턴스 영역내에 있는 파일을 모두 OS 영역으로 복사합니다.
asmcmd cp +data/orcl/datafile/SYSTEM.260.752212741 /backup/system01.dbf



나머지 데이터 파일도 filesystem 사용시 파일명과 유사하게 복사합니다.

data/orcl/onlinelog 위치로 이동합니다.
ASMCMD> ls
group_1.257.752212723
group_2.258.752212729
group_3.259.752212733

위와 같이 redo 가 존재 하는데 redo log file 도 cp 를 실행 합니다.
ASMCMD> cp group_1.257.752212723 /backup/redo01a.log 
ASMCMD> cp group_2.258.752212729 /backup/redo02a.log 
ASMCMD> cp group_3.259.752212733 /backup/redo03b.log

data/orcl/tempfile 위치로 이동합니다.
ASMCMD> ls
TEMP.263.752212799


temp 파일도 cp 로 복사를 합니다.
ASMCMD> cp TEMP.263.752212799 /backup/temp01.dbf


+data/orcl/controlfile 로 이동하여 control 파일을 복사합니다.
ASMCMD> cp Current.256.752212721 /backup/control01.ctl


spfile 을 pfile 로 백업 받습니다.
create pfile='/oracle/init.ora' from spfile='+DATA/orcl/spfileorcl.ora';


추후 rename file 을 해야 하니 모든 기존 파일명을 꼭 별도로 기록해야 합니다.


ASM 에서 OS 영역으로 복사 완료후 parameterfile 디렉토리를 제외 하고 기존 파일의 디렉토리를 삭제합니다.
ASMCMD> cd data/orcl
ASMCMD> rm –rf datafile onlinelog controlfile tempfile


디렉토리를 생성
ASMCMD> mkdir datafile onlinelog controlfile tempfile


다시 ASM 내로 복사를 합니다.
datafile => data/orcl/datafile
redo => data/orcl/onlinelog 
controlfile => data/orcl/controlfile 
tempfile => data/orcl/tempfile



EX)
$ asmcmd cp /backup/control01.ctl +data/orcl/controlfile



모든 파일을 다시 ASM에 복사 하였다면 instance 를 mount 상태로 기동 합니다.
SQL> startup mount


그다음 모든 file 을 rename 을 진행 합니다.
EX)
SQL> alter database rename file '+data/orcl/onlinelog/group_1.257.752212723' to
'+data/orcl/onlinelog/redo01a.log';



모든 데이터파일,redo log file, temp file 을 rename 하였다면 instance 를 open 합니다.
SQL> alter database open;



정상적으로 open 된 이후 datafile 등을 조회해 보겠습니다.
SQL> select tablespace_name, file_name from dba_data_files; 
TABLESPACE_NAME FILE_NAME 
------------------------------ ----------------------------------------
SYSTEM +DATA/orcl/datafile/system01.dbf
SYSAUX +DATA/orcl/datafile/sysaux01.dbf
UNDOTBS1 +DATA/orcl/datafile/undotbs01.dbf
USERS +DATA/orcl/datafile/users01.dbf


SQL> select tablespace_name, file_name from dba_temp_files; 
TABLESPACE_NAME FILE_NAME 
-----------------------------------------
TEMP +DATA/orcl/tempfile/temp01.dbf



SQL> select member from v$logfile; 
MEMBER 
-------------------------------------------------- 
+DATA/orcl/onlinelog/redo01a.log 
+DATA/orcl/onlinelog/redo02a.log 
+DATA/orcl/onlinelog/redo03a.log


모든 파일의 이름을 기존 filesystem 유형과 유사하게 변경이 되어 ASM으로 이동되었습니다.
이제 hotbackup 을 진행 할 것이며 기존 방법과 매우 유사하게 진행될것 입니다.

기존에는cp 로 하였던 명령어를 asmcmd 가 더 붙는다의 차이정도 밖에 없다고 생각하시면 됩니다.



위와 같은 방법으로 sysaux, undotbs1 , users 등 나머지 파일의 백업을 진행 합니다.





4. Restore & Recover


asm 은 ORACLE 의 resource 이기 때문에 사용중인 datafile 에 대한 체크를 하고 있습니다.

그러므로 OS 와 달리 사용중인 파일을 rm 으로 지우려고 할 때 아래와 같은 에러 메세지와 함께 삭제가 거부 되게 됩니다.

ASMCMD> ls
sysaux01.dbf
system01.dbf
undotbs01.dbf
users01.dbf


ASMCMD> rm -rf users01.dbf
ORA-15032: not all alterations performed
ORA-15028: ASM file '+data/orcl/datafile/users01.dbf' not dropped;
currently being accessed (DBD ERROR: OCIStmtExecute)

그렇기 때문에 users 테이블 스페이스를 offline 시키고 asmcmd 내에서 users01.dbf 데이터파일을 rm 으로 삭제 하고 online 순으로 진행 하도록 하겠습니다.



삭제를 진행 하고 아래와 같이 online 을 하게 되면 당연히 에러는 발생되게 됩니다.
SQL> alter tablespace users online; alter tablespace users online
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file ORA-01110: data file 4: '+DATA/orcl/datafile/users01.dbf'


파일시스템에 백업된 파일을 restore 합니다.
$ asmcmd cp /backup/users01.dbf +data/orcl/datafile


datafile 을 recover 를 진행 합니다.
SQL> recover datafile '+DATA/orcl/datafile/users01.dbf';

Media recovery complete.


테이블스페이스를 online 합니다.
SQL> alter tablespace users online;
Tablespace altered.



아래와 같이 users 테이블스페이가 정상적으로 online 이 된 것을 확인할 수 있습니다.

SQL> select TABLESPACE_NAME, STATUS from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM   ONLINE
SYSAUX   ONLINE
UNDOTBS1 ONLINE
TEMP    ONLINE
USERS   ONLINE





5. Conclusion


위의 backup&recovery는 asmcmd cp를 활용해보기 위한 하나의 예시였으며 정상적으로 기능이 동작하는 것을 확인 하는데 목적이 이었습니다.


이전버전(10g) 에서는 불가능 하였던 ASM 인스턴스와 OS 간의 파일 이동이 가능해짐에 따라 위의 테스트 와 같은 경우 외에 사용하기에 따라 더 다양하게 활용할 수 있을 것도 같습니다.

답글 남기기