Describe 테이블스페이스와데이타파일과온라인백업 here {{{ ========================================== 테이블스페이스와 데이타 파일과 온라인 백업 ========================================== 오라클의 3구성 요소라구 하면...메모리, 프로세스, 파일로 볼 수 있습니다... 테이블스페이스는 논리적인 오라클의 구조를 말합니다... 이 논리적인 테이블스페이스와 연관되는 것이 바로 데이타 파일입니다.. 테이블스페이스가 논리적으로 존재하면 해당 테이블스페이스에 속하는 데이타 파일도 존재해야 합니다.. 이 관계가 깨진다면 데이타베이스 시스템의 오류이지여.. 다시 말하면 테이블스페이스 하나당 여러개이 데이타 파일을 가질수 있으며, 또한 여러개의 세그먼트로 구성됩니다.. 테이블스페이스는 최소 한개이상 존재해야 합니다... 그 기본적으로 존재하는 테이블스페이스가 system tablespace입니다.. 시스템 테이블스페이스는 데이타베이스의 동작을 위해서 꼭 필요한 테이블스페이스입니다.. 시스템 테이블스페이스에는 데이타 사전 정보와 프로시저, 패키지등의 정의가 정의되어 있습니다.. 기본적으로 일반사용자가 생성되거나 일반사용자의 데이타가 이 시스템 테이블스페이스에 저장되지만 오라클 정도의 DBMS를 쓴다면...당연히 디스크 입/출력을 줄이기 위해서 시스템 테이블스페이스는 분리되어야 합니다...(머 공부용으로는 상관이 없지만요..) 시스템 테이블스페이스는 시스템 테이블스페이스를 위한 롤백 세그먼트도 포함하고 있습니다.. 시스템 테이블스페이스 이외에....테이블 스페이스는 다음과 같습니다.. SQL> select tablespace_name from dba_tablespaces; TABLESPACE_NAME ------------------------------ SYSTEM TOOLS RBS TEMP USERS INDX DRSYS 7 개의 행이 선택되었습니다. 시스템 테이블스페이스를 제외하면 6개입니다.. 이것은 기본적으로 오라클을 설치하면 이렇게 잡힙니다.. 각각의 테이블스페이스를 분리하는 것은 디스크 I/O 경합을 줄이는데 이유가 있는 것입니다... 기본적인 테이블스페이스의 야그는 끝났구여... 이제 테이블스페이스를 만들어 봅시다..생성시 DBA 권한이 있는 사용자만 테이블스페이스를 생성할 수 있구여.. 문법은 오라클 메뉴얼을 참고하시면 되겠습니다..저의 자료실에 있으니까 다운받으셔서 참고하시구여.. 직접 실습을 해보도록 하겠슴다.. 모든 옵션을 예에서 다 써보면서 각각을 보겠습니다.. SQL> create tablespace data1 2 datafile '/export/home/oracle/8i/oradata/data1.dbf' size 5M 3 default storage( initial 50k next 50k minextents 10 maxextents 121 pctincrease 0); 테이블 영역이 생성되었습니다. default storage 에 있는 값들은 익스텐트에 관한 기본 값입니다.. 익스텐트를 할당할때 기본적으로 저런 형식에 맞추어 확장해 나간다는 의미입니다.. reuse라는 값을 사용해 봅시다.. 앞에서 생성한 테이블스페이스를 지운다음 다시 사용하는 명령을 실행해 봅시다.. SQL> drop tablespace data1; 테이블 영역이 삭제되었습니다. SQL> !ls /export/home/oracle/8i/oradata ORCL data1.dbf <---------------------- 운영체제상의 파일로는 그냥 남아있다..즉,논리적인 부분만 끊어버린 것이다.. SQL> create tablespace data1 2 datafile '/export/home/oracle/8i/oradata/data1.dbf' reuse; 테이블 영역이 생성되었습니다. 다음은 online/off라인 옵션을 써서 테이블스페이스를 생성당시 활성화/비활성화 시키는 옵션을 사용해서 테이블스페이스를 하나 생성해보겠습니다.. 테이블스페이스 생성의 기본값은 online 입니다...여기서는 offline으로 비활성화 시켜보겠습니다.. SQL> create tablespace data2 2 datafile '/export/home/oracle/8i/oradata/data2.dbf' size 5M 3 default storage (initial 8k next 8k minextents 10 maxextents 121 pctincrease 0) 4 offline; 테이블 영역이 생성되었습니다. SQL> select tablespace_name, status from dba_tablespaces; TABLESPACE_NAME STATUS ------------------------------ --------- SYSTEM ONLINE TOOLS ONLINE RBS ONLINE TEMP ONLINE USERS ONLINE INDX ONLINE DRSYS ONLINE DATA1 ONLINE DATA2 OFFLINE <------------- 지금 생성한 data2 테이블스페이스가 offline 인것을 확인 9 개의 행이 선택되었습니다. PERMANENT/TEMPORARY 옵션을 사용해서 임시와 영구 테이블스페이스를 생성해보겠습니다.. 기본값은 PERMANENT 인데...TEMPORARY 옵션을 사용해서 임시 테이블스페이스를 생성해보겠습니다.. 즉, 임시테이블스페이스를 생성하면 임시객체를 저장할지를 설정해주는 옵션입니다.. SQL> create tablespace temp_data 2 datafile '/export/home/oracle/8i/oradata/temp_data.dbf' size 5M 3 temporary; 테이블 영역이 생성되었습니다. SQL> select tablespace_name, contents from dba_tablespaces; TABLESPACE_NAME CONTENTS ------------------------------ --------- SYSTEM PERMANENT TOOLS PERMANENT RBS PERMANENT TEMP TEMPORARY USERS PERMANENT INDX PERMANENT DRSYS PERMANENT DATA1 PERMANENT DATA2 PERMANENT TEMP_DATA TEMPORARY <-------------- 임시 테이블스페이스가 생성된것 확인 10 개의 행이 선택되었습니다. 마지막으로 생성한 파일이 다 채워졌을 경우 자동으로 데이타 파일을 확장하는 옵션인 AUTOEXTEND를 사용해서 테이블스페이스를 생성해보겠습니다.. 형식은 다음과 같습니다.. AUTOEXTEND [OFF | ON] NEXT integer(K or M) MAXSIZE [UNLIMITED | integer(K or M)] OFF를 해주면 이 기능을 비활성화 시킨다는 의미입니다... 중요한 것은 MAXSIZE 입니다.. 여기서 무한대로 잡아준다면...하드디스크를 몽땅 다쓴다는 의미인데... 만약 디스크가 모자랄 경우에는 에러를 발생시킵니다... 아래예는 기냥 실습을 위해서 만든 것입니다... 자동확장이란 것두...오라클에서 보면 추가적인 작업입니다...즉, 서버에 부하가 걸릴수 있다는 것입니다.. 그러므로 테이블스페이스의 크기(데이타 파일의 크기)를 현실에 맞추어...또는 예상되는 데이타의 양에 맞추어 설정을 해야 하겠습니다.. SQL> create tablespace autoextend_ts 2 datafile '/export/home/oracle/8i/oradata/autoextend_data.dbf' size 500k 3 autoextend on next 500k maxsize 10m; 테이블 영역이 생성되었습니다. SQL> create table test (id number) 2 tablespace autoextend_ts; 테이블이 생성되었습니다. SQL> select tablespace_name, bytes from dba_data_files; TABLESPACE_NAME BYTES ------------------------------ ---------- TOOLS 10485760 DRSYS 20971520 USERS 20971520 INDX 20971520 RBS 157286400 TEMP 20971520 SYSTEM 283115520 DATA1 5242880 DATA2 5242880 TEMP_DATA 5242880 AUTOEXTEND_TS 516096 <------------------확인.. 11 개의 행이 선택되었습니다. SQL> declare 2 i number := 0; 3 begin 4 while i < 500000 loop 5 insert into test values (i); 6 i := i + 1; 7 end loop; 8 end; 9 / <----------- 좀 기둘리세용~ PL/SQL 처리가 정상적으로 완료되었습니다. SQL> select tablespace_name, bytes from dba_data_files; TABLESPACE_NAME BYTES ------------------------------ ---------- TOOLS 10485760 DRSYS 20971520 USERS 20971520 INDX 20971520 RBS 235929600 TEMP 20971520 SYSTEM 283115520 DATA1 5242880 DATA2 5242880 TEMP_DATA 5242880 AUTOEXTEND_TS 8257536 <------------ 자동확장 된것이 보인다.. 11 개의 행이 선택되었습니다. SQL> create tablespace local_manage_ts 2 datafile '/export/home/oracle/8i/oradata/local_manage_data.dbf' size 5M 3 extent management local uniform size 128k; 테이블 영역이 생성되었습니다. 마지막에 보여준 예는 확장장역을 관리하는데...한블럭이 8k라고 가정한 것입니다.. 즉, 하나의 확장영역은 총 16개의 블럭으로 구성된다는 것입니다... 테이블스페이스도 물론 수정할 수 있습니다... 관련문법에는 백업에 관련된 옵션도 있습니다.. 이 백업에 관련된 것도 해보구여... 흠..관련 문법은 역시 메뉴얼을 참고하시구여... 역시 모든 옵션을 동원해서 테이블스페이스를 변경하는 예를 보겠습니다.. 먼저 테이블스페이스의 제한된 저장공간이 모질랄 경우에 대해서 생각해 보겠습니다.. 방법은 두가지입니다.. 테이블스페이스에 데이타파일을 추가시키는 것이구... 또하나는 alter database 명령을 통해서 데이타파일의 크기를 재정의하는 것입니다.. data1 테이블스페이스에 크기를 늘려보겠습니다... SQL> alter tablespace data1 2 add datafile '/export/home/oracle/8i/oradata/data1_1.dbf' size 2M; 테이블 영역이 변경되었습니다. SQL> select a.tablespace_name, b.name 2 from dba_data_files a, v$datafile b 3 where a.file_id = b.file# 4 and a.tablespace_name = 'DATA1'; TABLESPACE_NAME NAME ------------------------------ ---------------------------------------------- DATA1 /export/home/oracle/8i/oradata/data1.dbf DATA1 /export/home/oracle/8i/oradata/data1_1.dbf SQL> select tablespace_name, status from dba_tablespaces; TABLESPACE_NAME STATUS ------------------------------ --------- SYSTEM ONLINE TOOLS ONLINE RBS ONLINE TEMP ONLINE USERS ONLINE INDX ONLINE DRSYS ONLINE DATA1 ONLINE DATA2 OFFLINE <------------- ONLINE 으로 변경해보자.. TEMP_DATA ONLINE AUTOEXTEND_TS ONLINE LOCAL_MANAGE_TS ONLINE 12 개의 행이 선택되었습니다. SQL> alter tablespace data2 2 online; 테이블 영역이 변경되었습니다. SQL> select tablespace_name, status from dba_tablespaces 2 where tablespace_name = 'DATA2'; TABLESPACE_NAME STATUS ------------------------------ --------- DATA2 ONLINE 다음은 백업에 관련된 옵션을 살펴보겠습니다... 옵션에 [begin | end] backup 이란 것이 보입니다.. 이것은 온라인(데이타베이스가 open상태) 일때 백업을 하는 것을 의미합니다.. 여기서는 DATA1 테이블스페이스를 백업해보겠습니다.. SQL> alter tablespace data1 2 begin backup; alter tablespace data1 * 1행에 오류: ORA-01123: 온라인 백업을 시작할 수 없습니다 매체 복구가 사용 불가로 되어 있습니다 헐헐~ 에러가 나는 군여... 왜그럴까요??? 아직 하지는 않았지만...온라인 백업은 아카이브로그 모드에서만 작동을 하게됩니다.. 데이타베이스가 운영중이기 때문에....백업하는 동안 무슨 변화가 일어난다면 안돼기 때문입니다.. 아카이브 로그 모드는 온라인 리두로그 파일을 오프라인 스토리지에 한번더 백업하는 것을 의미합니다... 아카이브 로그 모드로 운영중이라면 상당히 안정적으로 데이타베이스를 운영할 수 있지만... 추가적인 저장장치와 또한 추가적인 서버의 작업이기 때문에....성능에 영향을 줄 수 있습니다.. 그러면 아카이브 로그 모드로 변환을 해보겠습니다... 먼저 데이타베이스를 내린다음 파라미터 파일을 수정한후 다시 startup시켜줘야 합니다.. 추가할 파라미터는 다음과 같습니다.. log_archive_start = true log_archive_dest = '/export/home/oracle/8i/oradata/archive log_archive_format = %.arc SQL> !vi $ORACLE_HOME/dbs/initORCL.ora . . . . . # INSTRUCTIONS: Edit this file and the other INIT files it calls for # your site, either by using the values provided here or by providing # your own. Then place an IFILE= line into each instance-specific # INIT file that points at this file. # # NOTE: Parameter values suggested in this file are based on conservative # estimates for computer memory availability. You should adjust values upward # for modern machines. # ############################################################################### AUDIT_TRAIL =DB log_archive_start = true log_archive_dest = /export/home/oracle/8i/oradata/archive log_archive_format = %.arc db_name = "ORCL" db_domain = yasicom . . . . . . SQL> connect sys/chage_on_install as sysdba 연결되었습니다. SQL> shutdown 데이터베이스가 닫혔습니다. 데이터베이스가 마운트 해제되었습니다. ORACLE 인스턴스가 종료되었습니다. SQL> startup mount <------------ 데이타베이스에 변경을 가하려면 mount까지만 해야 한다.. ORACLE 인스턴스가 시작되었습니다. Total System Global Area 87818400 bytes Fixed Size 73888 bytes Variable Size 70795264 bytes Database Buffers 16777216 bytes Redo Buffers 172032 bytes 데이터베이스가 마운트되었습니다. SQL> alter database archivelog; <--------------- 아카이브 로그 모드로 바꾼다.. 데이타베이스가 변경되었습니다. SQL> alter database open; 데이타베이스가 변경되었습니다. SQL> archive log list; 데이터베이스 로그 모드 아카이브 모드 자동 아카이브 사용 아카이브 대상 /export/home/oracle/8i/oradata/archive 가장 오래된 온라인 로그 순서 4108 아카이브할 다음 로그 4109 현재 로그 순서 4110 SQL> 이제 온라인 백업을 해보겠습니다... 아카이브 로그 모드로 변환한뒤....온라인 백업을 합니다.. 온라인 백업은 간단합니다... 테이블스페이스를 백업모드로 변환한뒤..관련 데이타 파일을 다른 곳을 복사한후.. 백업모드를 풀어주면 끝납니다... 하나의 테이블스페이스를 백업하므로 오라클에서는 부분백업이라고 하거나... 데이타베이스가 오픈 상태에서 백업하으로...오픈백업 또는 온라인 백업이라고 합니다... 직접 해보겠습니다.. SQL> alter tablespace data1 begin backup; <------ 테이블스페이스를 백업모드로 전환 테이블 영역이 변경되었습니다. SQL> !cp /export/home/oracle/8i/oradata/data1.dbf /export/home/oracle/8i/data01_20011209.dbf <--- 운영체제상으로 복사 SQL> !cp /export/home/oracle/8i/oradata/data1_1.dbf /export/home/oracle/8i/data02_20011209.dbf SQL> !ls /export/home/oracle/8i Apache data01_20011209.dbf jis odg precomp svrmgr JRE data02_20011209.dbf jlib oem_webstage rdbms sysman admin dbs jsp oracore relnotes wwg assistants doc ldap oradata root.sh xdk bin install lib ord slax classes jar md otrace sqlj converters javavm network owm sqlplus ctx jdbc ocommon plsql starterdb SQL> alter tablespace data1 end backup; <------- 백업모드를 풀어준다.. 테이블 영역이 변경되었습니다. SQL> connect system/manager 연결되었습니다. SQL> alter tablespace data2 offline; 테이블 영역이 변경되었습니다. SQL> alter tablespace data2 2 rename datafile '/export/home/oracle/8i/oradata/data2.dbf' to '/export/home/oracle/8i/oradata/data2_a.dbf'; alter tablespace data2 * 1행에 오류: ORA-01525: 데이터 파일을 이름 변경시 오류가 생겼습니다 ORA-01141: 데이터 9 파일 이름 바꾸기를 하는데 오류 - 새로운 '/export/home/oracle/8i/oradata/data2_a.dbf' 파일이 없습니다 ORA-01110: 9 데이터 파일: '/export/home/oracle/8i/oradata/data2.dbf' ORA-27037: 파일 상태를 얻을 수 없습니다 Intel SVR4 UNIX Error: 2: No such file or directory Additional information: 3 SQL> !mv /export/home/oracle/8i/oradata/data2.dbf /export/home/oracle/8i/oradata/data2_a.dbf SQL> alter tablespace data2 2 rename datafile '/export/home/oracle/8i/oradata/data2.dbf' to '/export/home/oracle/8i/oradata/data2_a.dbf'; 테이블 영역이 변경되었습니다. SQL> alter tablespace data2 online; 테이블 영역이 변경되었습니다. SQL> select a.tablespace_name, b.name 2 from dba_data_files a, v$datafile b 3 where a.file_id = b.file# and a.tablespace_name = 'DATA2'; TABLESPACE_NAME NAME ------------------------------ -------------------------------------------- DATA2 /export/home/oracle/8i/oradata/data2_a.dbf <------ 이름이 바뀌었다.. 이제 테이블스페이스를 삭제해보자... 아까 만든..autoextend_ts 테이블스페이스를 삭제해보자.. SQL> drop tablespace autoextend_ts; drop tablespace autoextend_ts * 1행에 오류: ORA-01549: 테이블스페이스가 비어있지 않으므로 INCLUDING CONTENTS 옵션을 사용해 주십시오 <------ test테이블이 들어 있어서 지워지지 않는다.. SQL> drop tablespace autoextend_ts 2 including contents; <-------------- 이 옵션을 사용해야 테이블스페이스에 존재하는 모든 객체와 함께 삭제될 수 있다.. 테이블 영역이 삭제되었습니다. SQL> !ls $ORACLE_HOME/oradata ORCL autoextend_data.dbf data1_1.dbf local_manage_data.dbf archive data1.dbf data2_a.dbf temp_data.dbf SQL> !rm $ORACLE_HOME/oradata/autoextend_data.dbf <--------------------------------------- 논리적인 부분만 끊어진 상태이므로 OS상에서 해당 파일을 지워줘야 한다.. SQL> !ls $ORACLE_HOME/oradata ORCL data1.dbf data2_a.dbf temp_data.dbf archive data1_1.dbf local_manage_data.dbf 이제 데이타베이스 수준에 데이타 파일을 다뤄봅시다... 일반적으로 운영체제는 동시에 열수 있는 파일이 얼마 되질 않습니다. 그러므로 몇 개의 큰 데이터 파일을 유지하는 것이 작은 파일을 많이 갖는 것보다는 유리하다고 볼수 있습니다. 일반적으로 생각해도 파일은 각각의 크기를 가지고 있습니다. 물론 오라클의 파일들도 각각의 크기를 가지고 있습니다. 이는 테이블스페이스과 관련이 있습니다. 예를 들면, SYSTEM 테이블스페이스는 최소 하나의 데이터 파일을 가지고 있습니다. 파일의 구성은 SYSTEM 테이블스페이스가 가지고 있는 데이터 파일의 격리입니다. 즉, 다른 데이터파일등과 다른 디스크에 저장하는 하는 것입니다. 이것은 사용자가 자주 접근하는 SYSTEM 테이블스페이스가 포함하는 데이터 파일에 대한 디스크의 경합을 줄이는데 목적이 있습니다. 즉, 성능이 향상된다는 것이죠.. 성능부분에 대해서는 나중에 더 다루어 보도록 하고, 여기서는 좀더 일반적인 것을 알아보도록 하겠습니다. 오라클 인스턴스의 상한값은 DB_FILES의 매개변수로 제어된다. 이 값은 인스턴스를 사용하는 동안에만 적용됩니다. 자..매개변수 파일을 열어보자.. 앞쪽에서 DB_FIELS 매개변수를 쉽게 찾을 수 있을 것입니다. DB_FILES와 MAXDATAFILES의 사용은 옵션입니다. 이 값을 정해주지 않으면 기본적인 데이터 파일수는 운영체제에 따릅니다. 아마도 파라미터 파일에 최대값이 나타나 있을 것입니다..주석으로 표시되어서… 웬만하면 권장값을 사용하는 것이 좋습니다.. SQL> alter tablespace users 2 add datafile 'E:\ORACLE\ORADATA\ORCL\USERS03.DBF' size 5M 3 autoextend on 4 next 64k 5 maxsize 5M; 테이블 영역이 변경되었습니다. SQL> alter database datafile 'E:\ORACLE\ORADATA\ORCL\USERS03.DBF' 2 autoextend off; 데이타베이스가 변경되었습니다. 주의할 것은 alter tablespace 문장이 아니라 alter database라는 것입니다. 즉, 비활성화는 데이터베이스 차원에서 변경시켜야 된다는 소리죠... 이보다 더 명시적인 직접적이 사용자의 개입을 알아봅시당.. 바로 위에서 생성한 데이터 파일의 크기를 줄여보구여.. SQL> alter database datafile 'E:\ORACLE\ORADATA\ORCL\USERS03.DBF' 2 resize 4M; 데이타베이스가 변경되었습니다. 방금 크기를 줄였었는데..이는 아무때나 되는 것이 아닙니다… 벌써 4M가 넘는 데이터들이 데이터 파일을 차지하고 있으면 데이터 파일을 줄어들지 않고 에러를 리턴할 것입니다. 이런 식으로 다시 위 데이터 파일을 원상태로 해봅시다.. SQL> alter database datafile 'E:\ORACLE\ORADATA\ORCL\USERS03.DBF' 2 resize 5M; 데이타베이스가 변경되었습니다. SQL> alter database datafile 'E:\ORACLE\ORADATA\ORCL\USERS03.DBF' 2 autoextend on; 데이타베이스가 변경되었습니다. 아주 쉽습니다… 다음은 데이터 파일의 가용성에 관한 것을 알보도록 하겠습티다.. 가용성에 대한 것은 ARCHIVELOG MODE에서 데이터 파일의 온라인 설정과 NOARCHIVELOG MODE에서 데이터 파일을 오프라인으로 설정하는 것입니다 주의해야 하는 것은 SYSTEM 테이블스페이스에 있는 파일 외에는 테이블스페이스를 오프라인으로 설정해서 일시적으로 테이블스페이스의 모든 데이터 파일을 사용하지 못하도록 할 수 있다는 것입니다.. 테이블스페이스를 다시 온라인으로 설정하려면 테이블스페이스에 이 파일들을 남겨 두어야 합니다. NOARCHIVELOG MODE에서는 데이터 파일을 오프라인으로 설정하고 바로 DROP할 수 있다. SQL> alter database datafile 'E:\ORACLE\ORADATA\ORCL\USERS03.DBF' OFFLINE DROP; 다음은 데이터 파일 이름 변경 및 위치를 재지정하는 것입니다... 이것은 위에서 해봤기 때문에 설명하고 넘어갑니다.. 주의할 것은 SYSTEM 테이블스페이스에 있는 데이터 파일이름을 변경하거나 위치를 재지정하려면 데이터베이스가 마운트되었거나 닫힌 상태이여 합니다. 이유는 SYSTEM 테이블스페이스를 오프라인으로 설정할 수 없기 때문입니다. 방법은 단일 테이블스페이스에 속한 데이터파일의 이름을 재지정하거나 위치를 재지정하는 것과 비스무리합니다. 데이터 파일의 데이터 블록의 검증은 파라미터 파일의 DB_BLOCK_CHECKSUM을 TRUE로 설정합니다. DBWR 프로세스가 각 블록의 체크섬을 계산하여 블록의 헤더에 저장합니다. 체크섬을 사용하여 다음에 데이터 블록을 읽을 때 블록 훼손을 발견할 수 있습니다. 훼손된 블록이 발생하면 ORA-01578 에러를 리턴합니다. 한가지 생각해야 될 점은 DB_BLOCK_CHECKSUM을 TRUE로 설정함으로서 기존에 안하던 짓을 하게끔 하므로 오버헤드가 발생한다는 것입니다. 다음은 데이터파일에 관련된 데이터 딕셔너리에 있는 것들이다. USER_EXTENTS DBA_EXTENTS USER_SEGMENTS DBA_SEGMENTS USER_FREE_SPACE DBA_FREE_SPACE DBA_USERS DBA_TS_QUOTAS USER_TABLESPACES DBA_TABLESPACES DBA_DATA_FILES V$DATAFILE }}}