Last Updated on 5월 11, 2024 by Jade(정현호)
Contents
ASM 조작 유틸리티
ASMCMD는 ASM (Automatic Storage Management) 디스크 그룹 내에서 파일과 디렉토리를 쉽게 보고 조작하는 데 사용할 수 있는 명령 줄 유틸리티입니다.
디스크 그룹의 내용을 나열하고, 검색을 수행하고, 디렉토리와 별칭을 생성 및 제거하고, 공간 활용도를 표시할 수 있습니다.
이런 asmcmd에 11g 에서는 새로 제공되는 기능으로 로컬 인스턴스와 원격 인스턴스의 ASM 디스크 그룹 간 파일을 복사할 수 있거나 OS 의 영역에서 ASM 인스턴스 영역으로의 복사(반대 방향으로도) 가 구현되었습니다
asmcmd cp 를 사용하여 ASM 을 사용시 rman 으로 백업을 해야 하는 10g 의 방식과 다르게 Begin/End 백업이 가능하며, ASM 인스턴스간에 , OS 영역과 ASM 인스턴스 영역 간의 복사로 인하여 ASM 사용 방법이 더욱더 강력해졌다고 할 수 있습니다.
문서 내용 업데이트 - 2020/11/08
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
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
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 의 편의성을 위해 고정적인 이름이 필요하며 이전에 사용하는 파일이름 형태로 변경을 해주는 작업을 선행을 해야 합니다.
[참고] 해당 작업은 테스트성이나 기능의 동작 여부 확인에 목적을 두고 진행한 테스트입니다.
1) control_files 파라미터 변경
db shutdown 전 controlfile 위치를 변경합니다.
alter system set control_files='+DATA/orcl/controlfile/control01.ctl' scope=spfile;
2) db 를 정상 종료합니다.
SQL> shutdown immediate;
3) OS 영역으로 복사
asm 인스턴스 영역내에 있는 파일을 모두 OS 영역으로 복사합니다.
asmcmd cp +data/orcl/datafile/SYSTEM.260.752212741 /backup/system01.dbf
나머지 데이터 파일도 filesystem 사용시 파일명과 유사하게 복사합니다.
4) Redo 복사
ASM의 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
5) temp, control, spfile 백업
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 을 해야 하니 모든 기존 파일명을 꼭 별도로 기록해야 합니다.
6) 디렉토리 재생성
ASM 에서 OS 영역으로 복사 완료 후 parameterfile 디렉토리를 제외하고 기존 파일의 디렉토리를 삭제합니다.
ASMCMD> cd data/orcl
ASMCMD> rm –rf datafile onlinelog controlfile tempfile
디렉토리를 생성
ASMCMD> mkdir datafile onlinelog controlfile tempfile
7) ASM 으로 파일 복사
이제 다시 ASM 내로 복사를 합니다.
datafile => data/orcl/datafile
redo => data/orcl/onlinelog
controlfile => data/orcl/controlfile
tempfile => data/orcl/tempfile
예시)
$ asmcmd cp /backup/control01.ctl +data/orcl/controlfile
8) 마운트 및 rename
모든 파일을 다시 ASM에 복사하였다면 instance 를 mount 상태로 기동합니다.
SQL> startup mount
그다음 모든 file 을 rename 을 진행합니다.
SQL> alter database rename file '+data/orcl/onlinelog/group_1.257.752212723' to
'+data/orcl/onlinelog/redo01a.log';
9) DB Open
모든 데이터파일,redo log file, temp file 을 rename 하였다면 instance 를 open 합니다.
SQL> alter database open;
10) 조회
정상적으로 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 등 나머지 파일도 백업을 진행합니다.
Restore & Recovery
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 <-----
Conclusion
위의 backup&recovery는 asmcmd cp를 활용해보기 위한 하나의 예시였으며 정상적으로 기능이 동작하는 것을 확인하는데 목적이 이었습니다.
이전버전(10g) 에서는 불가능 하였던 ASM 인스턴스와 OS 간의 파일 이동이 가능해짐에 따라 위의 테스트 와 같은 경우 외에 사용하기에 따라 더 다양하게 활용할 수 있을 것도 같습니다.
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io