ORACLE/SQL2009. 11. 2. 16:33
반응형

1.무결성 제약조건 6가지

 1) primarty key

 2)foreign key

 3)unique

 4)check

 5)default 정의

 6)null 값허용

 

 

2.primary key(기본키)

 1)crate 시 생성

 ㄱ)  create table usertb1 (userid nchar(8) not null primary key, ........)--제약조건 자동생성됨

 ㄴ) create table usertb1(userid nchart(8) not null constraint pk_userid primary key, ....) -- 제약조건 이름 강제 설정

 

2) alter (수정)시 생성

alter table usertb1

add constraint pk_userid --제약조건 이름 설정

primary key (userid) --userid를 기본키로 설정

 

단, userid(기본키 설정할려는 항목)이  null일경우 에러가남

그럴경우 먼저. not null로 변경해줘야함

 

예) alter table usertb1

     alter column userid nchar(8) not null

 

cf)identity 속성으로 지정한경우 자동 not null 임

 

3.foreign key(외래키)

 1) craete 시 생성

ㄱ)create table buytb1 ( num int not null primary key, userid  nchar(8) not null foreign key reperences usertb1(userid), ...)

ㄴ)create table buytb1 ( num int not null primary key, userid nchar(8) not null  constraint fk_usertb1_buytb1 foreign key reperences usertb1(userid)..)

 

2)alter 사용

alter table buytb1

add constraint fk_usertb1_buytb1--제약조건 이름 설정

foreign key (userid) - 참조키 설정(buytb1의 항목)

references usertb1(userid) -- 참조할 기본키

on update cascade-- usertb1의 기본키가 변경될시 buytb1의 userid도 자동변경

on delete cascade -- 기준테이블에 삭제일어날경우 외래키테이불도 삭제가 일어나도록 설정

 

 

단, 만약 usertb1 의 userid 와 buytb1의 userid 에 일치하지 않은 항목이 있으면. 에러남

그런경우 동일하지 않은 기존데이터를 무시하고 키설정

alter table buytb1 with nocheck -- with nocheck 속성 추가

 

 

4.unique 제약조건

중복되지 않는 유일한 값을 입력해야함 (null허용 , 단 중복되면 안됨으로 1개의 null만 허용)

 

1)create 시 생성

create table usertb1 (userid ............addr nchar(30) null unique)

create table usertb1(userid........ addr nchar(30) null constraint ak_addr unique)

create table usertb1(userid.... addr nchar(30) null, constraint ak_addr unique(addr)) -- 먼저 생성후 별도로 제약조건 추가

 

2)alter 사용

alter table usertb1
add constraint ak_addr --제약조건 이름 설정

unique(addr)

 

 

5.check 제약조건

check 제약조건은 입력되는 데이터를 점검하는 기능을 수행한다

(예 전화번호 국번, 출생년도 조절)

 

1) 예제1

출생년도가 1900년 이후 그리고 현재의 연도 이전

alter table usertb1

add constraint ck_birthYear

check

(birthyear >= 1900 and birthyear <= year(getdate()))

 

2)예제2

전화번호 국번 제약

alter table usertb1

add constraint ck_mobile1

check

(mobile1 in ('010', '011', '016', '017', '018', '019'))

 

3) with nocheck 옵션

전화번호 국번 제약조건을 걸때 이미 012라는 번호가 들어있는경우

국번체크 제약조건에 위배되지만 . 무시하고 넘어갈때 사용

alter table usertb1

with nocheck

add constraint ck_mobile1

check(mobile in ('010', '011', '016', '017', '018', '019'))

 

6.default 정의

default 정의는 데티너를 입력하지않았을때 자동으로 입력되는 디폴드 값을 정의 하는 방법이다

1)create시 정의

create table usertb1( userid .... birthYear int not null default year(getdate()), addr nchar(2) not null default '서울')

 

2)alter사용(for 문 사용해야함)

alter table usrtb1

add constraint cd_addr

default year(getdate()) for birthYear

go

 

3)insert시 default사용

insert into usertb1 valuse('wjn',.......default, defalut) --디폴트값사용

insert into usertb1 (userid, name ) values('wtw'.'우태운') --열이름이 명시되지않으면 default로 설정된값이 해당열에 자동입력됨

insert into usertb1valuse('hyh',......'1965','경기') --  값이 직접 명기되면 default 값은 무시됨

 

 

7.제약조건 삭제

 

alter table usertb1

drop constraint 제약조건이름

 

단,pk는 fk먼저 삭제해야함

 

cf)현재 table의  constraint 보기  :  exec sp_help table이름

 

 


반응형

'ORACLE > SQL' 카테고리의 다른 글

case  (0) 2010.01.03
NVL,DECODE  (0) 2010.01.03
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2  (0) 2009.09.11
ROLLUP , CUBE , GROUPING  (0) 2009.09.02
Oracle 널값(null)에 대하여 정리  (0) 2009.08.21
Posted by [PineTree]
ORACLE/ADMIN2009. 10. 30. 10:10
반응형

1.해당하는 PK를 삭제한다
: ALTER TABLE TABLE명 DROP CONSTRAINT PK명;

 

2.변경하고자 하는 COLUMN으로 Unique Index를 생성한다.
: CREATE UNIQUE INDEX PK명 ON TABLE명(COLUMN명) TABLESPACE TABLESPACE명;

 

3.PK에 속성을 추가한다.
: ALTER TABLE TABLE명 ADD CONSTRAINT PK명 PRIMARY KEY(COLUMN명);

 

-----------------------------------------------------------------------------

 

 

-- PK 제거하기

Alter TABLE 테이블이름 drop primary key cascade

 

--PK추가 하기

ALTER TABLE 테이블이름 ADD CONSTRAINT 인덱스 이름 PRIMARY KEY(field1, field2)


-----------------------------------------------------------------------------

1. PK INDEX Create

 

ALTER TABLE TABLE_NAME
        ADD CONSTRAINTS PK_INDEX_NAME
            PRIMARY KEY (PK_1, PK_2, PK_3)
            USING INDEX
            TABLESPACE TABLESPACE_NAME
            STORAGE(    INITIAL     1280K
                        NEXT        1280K
                        PCTINCREASE 0   );

2. INDEX Create

 

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(PK_1, PK_2, PK_3)

TABLESPACE TABLESPACE_NAME

STORAGE ( INITIAL 5M NEXT 5M PCTINCREASE 0 );

 

3. PK_INDEX Drop

 

ALTER TABLE TABLE_NAME DROP CONSTRAINT INDEX_NAME;

 

4. INDEX Drop

 

DROP INDEX INDEX_NAME;



반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2009. 10. 19. 13:57
반응형

오라클 10g 에서 기존에 올라온 DB 복제 하는 방법입니다..

 

핫백업 받아 둔것과  트레이스로 컨트롤 파일을 떠서

 

기존 데이타 파일 복사와 컨트롤 파일 재생성으로 디비 복제 하는 방법입니다.

 

테스트 완료 된 내용입니다. 참고하시어 업무에 도움 되시길 바래요

 

+ Clone DB Creation with Hot Backup on HP-UX oracle10g +

 

1. 기존 DB가 noarchive mode 라면  archive log mode로 변경 작업

 

  1.0     init$ORACLE_SID.ora 파일에
          log_archive_dest='/oradata1/$ORACLE_SID/arch'
          log_archive_format='arch_%t_%s_%r.arc'
          #log_archive_start=TRUE -- under 9i 추가
  
  1.1     col host_name for a20
             col instance_name for a20
            col status for a10
         
      select host_name,instance_name, status from v$instance;
             >> status = open 확인 
      archive log list;
             >> archive log status 확인
      or

      select db_unique_name, log_mode from v$database;


       DB_UNIQUE_NAME               LOG_MODE
       ----------------------- ----------------------     확인
       ORA102                                 NOARCHIVELOG
 
  1.2     SQL> shutdown immediate >> DB 내려간 상태 확인후
            SQL> startup mount 로 디비 올림
           select host_name,instance_name, status from v$instance;
             >> status = mounted 확인
          

          아카이브 모드로 변경

          alter database archivelog; 
          archive log list; 로 아카이브 모드로 변경되었는지 확인후
          alter database open; 으로 디비 올림.       
  
   -----------------------------   or   ---------------------------------------
  
          만약 접속된 세션이 없다면 , 
          Database Open  상태에서
           select host_name,instance_name, status from v$instance;
             >> status = open 확인
          SQL> alter database close immediate; 로 내린다.
          select host_name,instance_name, status from v$instance;
             >> status = mounted 확인

          아카이브 모드로 변경
          alter database archivelog; 

          archive log list; 로 아카이브 모드로 변경되었는지 확인 후
          shutdown immediate
          startup     
  
   ----------------------------------------------------------------------------
  
  1.3     select host_name,instance_name, status from v$instance;
               >> status = open 확인
            archive log list;
               >> archive log mode 확인.

 

2. 간단한 test용 user를 만들어서 간단한 table 및 data를 넣는다.
 
  2.1 test user 생성
  create user test identified by test
  default tablespace users
  temporary tablespace temp; 
  
  2.2 권한 부여
  SQL> grant resource, connect to test; 로 권한 부여
 
  2.3 table & data 생성
  SQL> conn test/test 로 접속
 
  SQL> create table test_table (
    num number
    );
  
  SQL> begin
    for i in 1.. 10000 loop
            insert into test_table (num) values (i);
    end loop;
    commit;
    end;
    /

  SQL> select count(*) from test_table;

      COUNT(*)
      ----------
      10000

 

>> 복제된 DB에서 위 데이타 확인을 위한 사항.

 

3. Log swich를 일으킨다.

 SQL> alter system switch logfile;
 SQL> /
 SQL> /
 
4. Online backup을 받아 놓는다.
   
 -- Controlfile Backup

 ALTER DATABASE BACKUP CONTROLFILE TO '/oradata1/CLONE/control.bak' REUSE

 alter session set tracefile_identifier='ORA102_CONTROLFILE_BACKUP'

 ALTER DATABASE BACKUP CONTROLFILE TO TRACE

 $] cd $ORACLE_HOME/admin/$ORACLE_SID/udump
 $] ls *ORA102_CONTROLFILE_*
 ...
 ora102_ora_6948_ORA102_CONTROLFILE_BACKUP.trc

 $] vi ora102_ora_6948_ORA102_CONTROLFILE_BACKUP.trc

하여 내용을 확인하자. (내용인 즉슨 create controlfile... 문이 있어야 된다.)

 

 -- 조회 결과문의 헤더,피드백,시간,조회시간,번복 값 끄기   >>  조회 결과 값만 출력되게 하기위해..
 set head off
 set feedback off
 set time off
 set timing off
 set echo off

 

 -- 테이블 스페이스 비긴 백업 구문 조회로 명령어 얻기
 select 'alter tablespace '||tablespace_name||' begin backup;' from dba_tablespaces
 where status='ONLINE' and contents <> 'TEMPORARY'

 

 alter tablespace SYSTEM begin backup;
 alter tablespace UNDOTBS1 begin backup;
 alter tablespace SYSAUX begin backup;
 alter tablespace USERS begin backup;
 alter tablespace YBJ_TBS begin backup;
 alter tablespace JYS_TEST begin backup;
 alter tablespace HKH_TEST begin backup;
 alter tablespace TEST_JYS begin backup;

 

 또는

 

 alter database begin backup;  10g 부터..

 

 -- 복사할 데이타 파일 조회로 명령어 얻기
 select '!cp '||name||' /oradata1/ORA102_backup/' from v$datafile;

 

 !cp /oradata1/ORA102/system01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/undotbs01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/sysaux01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/users01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj02.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj03.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj04.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/jys01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/jys02.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/jys03.dbf /oradata1/ORA102_backup/
 !cp /oradata1/hkh_test01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/test_jys.dbf /oradata1/ORA102_backup/

 

 -- 테이블 스페이스 엔드 백업 구문 조회로 명령어 얻기
 select 'alter tablespace '||tablespace_name||' end backup;' from dba_tablespaces
 where status='ONLINE' and contents<>'TEMPORARY'

 

 alter tablespace SYSTEM end backup;
 alter tablespace UNDOTBS1 end backup;
 alter tablespace SYSAUX end backup;
 alter tablespace USERS end backup;
 alter tablespace YBJ_TBS end backup;
 alter tablespace JYS_TEST end backup;
 alter tablespace HKH_TEST end backup;
 alter tablespace TEST_JYS end backup;
  
 또는

 

 alter database end backup; 10g 부터..

 

5. Log swich 5번을 일으킨다.

 SQL> alter system switch logfile;
 SQL> /
 SQL> /
 SQL> /
 SQL> /
   

6. Backup 받은 파일과 controlfile의 trace를 이용하여 SID가 CLONE인 clone db를 하나 더 생성한다.
  (datafile 위치는 임의 지정)

 

 6.1. Backup 받은 데이타 파일들과 초기화파일을 CLONE DB에서 데이타 파일과 초기화 파일을 지정할 위치에 카피해서 넣어둔다.
        $] cp /oradata1/ORA102_backup/*.dbf /oradata1/CLONE/
        $] cp $ORACLE_HOME/dbs/initORA102.ora cp /oradata1/CLONE/init.ora
 
 6.2. CLONE DB 의 덤프 디렉토리를 생성한다.
 $] cd $ORACLE_BASE/admin
 $] mkdir CLONE
 $] cd CLONE
 $] mkdir adump bdump cdump udump
 
 6.3. CLONE DB 생성 시작

 

 6.3.0 /etc/oratab 파일에 다음과 같이 추가하자.(기존 DB SID 아래 붙이면 된다.)

    $] vi /etc/oratab

     ....

     CLONE:/oracle10/app/oracle/product/102:N   # ORACLE_SID:$ORACLE_HOME:<system boot 시 자동시작 여부 Y/N>

     ....

    

     :wq

  
  6.3.1 CLONE DB 용 orapwd 생성
 $] cd $ORACLE_HOME/dbs
 $] orapwd file=orapwCLONE password=oracle entries=5
 
  6.3.2 백업해둔 init.ora 파일을 CLONE DB에 맞게 경로 수정 및 db_name 바꺼주기.
 $] vi /oradata1/CLONE/init.ora
-- 확인 사항 -- 

 audit_file_dest
  background_dump_dest
  core_dump_dest
  user_dump_dest
  control_files
   log_archive_dest
   <SGA 영역들의 이름 앞에 붙는 SID : 있을경우만>
 
   6.3.3 sqlplus 접속 후 sys 접속
 $] sqlplus /nolog
 SQL> conn sys as sysdba
 password : oracle
 Connected.
 
  6.3.4 백업해둔 init.ora 파일로 DB nomount : 컨트롤 파일 재생성을 위해
 SQL> startup nomount pfile='/oradata1/CLONE/init.ora'

   6.3.5 controlfile을 백업한 trace 파일을 열어 resetlogs 에 해당하는 부분의 sql 구문을 복사한다.
   6.3.6 복사한 후 실행하 sql 문 생성.
   6.3.7 복사한 구문 붙여넣기 한 후 데이타 파일 의 디비 이름을 클론db 이름으로 갱신을 위해
         set DATABASE "CLONE" 을 써준다. 노아카이브로 올리기.(NOARCHIVELOG 옵션을 붙여준다.)

  $] vi ctl.sql
  CREATE CONTROLFILE SET DATABASE "CLONE" RESETLOGS NOARCHIVELOG
  MAXLOGFILES 16
  MAXLOGMEMBERS 3
  MAXDATAFILES 100
  MAXINSTANCES 8
  MAXLOGHISTORY 2920
  LOGFILE
   GROUP 1 '/oradata1/ORA102/redo01.log'  SIZE 50M,
   GROUP 2 '/oradata1/ORA102/redo02.log'  SIZE 50M,
   GROUP 3 '/oradata1/ORA102/redo03.log'  SIZE 50M
  -- STANDBY LOGFILE
  DATAFILE
   '/oradata1/ORA102/system01.dbf',
   '/oradata1/ORA102/undotbs01.dbf',
   '/oradata1/ORA102/sysaux01.dbf',
   '/oradata1/ORA102/users01.dbf',
   '/oradata1/ORA102/ybj01.dbf',
   '/oradata1/ORA102/ybj02.dbf',
   '/oradata1/ORA102/ybj03.dbf',
   '/oradata1/ORA102/ybj04.dbf',
   '/oradata1/ORA102/jys01.dbf',
   '/oradata1/ORA102/jys02.dbf',
   '/oradata1/ORA102/jys03.dbf',
   '/oradata1/hkh_test01.dbf',
   '/oradata1/ORA102/test_jys.dbf'
  CHARACTER SET KO16KSC5601
  ;
 :wq
 
 SQL> @ctl.sql
 
 6.3.8 아카이브 로그 복구 < 아카이브가 모두 있을 시 >
 SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
 
 6.3.9 불완전 복구 < 아카이브가 부족한 부분이 있을 시 >
 SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
 
 6.3.10 Resetlogs 옵션으로 데이터베이스 OPEN
 SQL> alter database open resetlogs;

 Database altered.

 SQL> select host_name,instance_name, status from v$instance; 로 디비 상태 확인.

 

 6.3.11 Temp 는 가져오지 않았기 때문에 따로 생성 해준 후 디폴트로 설정.
 SQL> create temporary tablespace temp
       Tempfile ‘/oradata1/CLONE/temp01.d b f’ size 100M;
      
 SQL> select name,bytes,status from v$tempfile;
 
 NAME                                                            BYTES               STATUS
---------------------------------- ------------- --------------
/oradata1/CLONE/temp01.dbf             104857600        ONLINE

SQL> alter database default temporary tablespace temp;

 

 Set linesize 200
 Col property_name for a30
 Col property_value for a15
 Col description for a40
 
SQL> select * from database_properties
              Where property_name like ‘%TEMP%’;
             
 PROPERTY_NAME                                     PROPERTY_VALUE            DESCRIPTION
--------------------------------- ---------------------- ----------------------------------------------
DEFAULT_TEMP_TABLESPACE                  TEMP01                              Name of default temporary tablespace

 

7. Clone db가 Noarchive log mode로 되었는지 확인
 
 SQL> archive log list;

 

8. DB 정상 open 확인 후 2번에서 만든 test용 table의 data를 확인한다.

 SQL> conn test/test

 Connected.
 SQL> select * from tab;
 SQL> select count(*) from test_table;

    COUNT(*)
    ----------
     10000

 

9. 리스너를 생성한다. Port는 1527로 사용한다.
 $]cd $TNS_ADMIN or cd $ORACLE_HOME/network/admin
        $]vi listener.ora
 
 SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
       (SID_NAME = PLSExtProc)
       (ORACLE_HOME = /oracle10/app/oracle/product/102)
       (PROGRAM = extproc)
     )
   )

 LISTENER =
    (DESCRIPTION_LIST =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = hp_host_name)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = hp_host_name)(PORT = 1527))
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
    )  
:wq

 

다음과 같이 차례대로 실행 한다.
   $] lsnrctl
Lsnrctl > stop -> start -> status

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=inno-hp)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for HPUX: Version 10.2.0.4.0 - Production
Start Date                19-JAN-2009 19:59:50
Uptime                    0 days 0 hr. 6 min. 2 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle10/app/oracle/product/102/network/admin/listener.ora
Listener Log File         /oracle10/app/oracle/product/102/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=inno-hp.innolime.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=inno-hp.innolime.com)(PORT=1527)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "CLONE" has 1 instance(s).
  Instance "CLONE", status READY, has 1 handler(s) for this service...
Service "CLONE_XPT" has 1 instance(s).
  Instance "CLONE", status READY, has 1 handler(s) for this service...
Service "ORA102" has 1 instance(s).
  Instance "ORA102", status READY, has 1 handler(s) for this service...
Service "ORA102_XPT" has 1 instance(s).
  Instance "ORA102", status READY, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
  

10. 두 DB 간  test 를 해보자.

 

$]export ORACLE_SID=ORA102
$]sqlplus sys/oracle@CLONE as sysdba
SQL> show parameter db_name
db_name : CLONE 으로 뜨면 성공 

 

$]export ORACLE_SID=CLONE
$]sqlplus sys/oracle@ORA102 as sysdba
SQL> show parameter db_name
db_name : ORA102 로 뜨면 성공


반응형
Posted by [PineTree]
ORACLE/SCRIPT2009. 10. 13. 14:51
반응형
10G

select sql_text,PARSING_SCHEMA_NAME,module,LAST_ACTIVE_TIME from v$sqlarea
where  PARSING_SCHEMA_NAME='유저명'  and module='JDBC Thin Client' and rownum < 11
order by last_active_time desc


8I

select SQL_TEXT,PARSING_USER_ID,MODULE,FIRST_LOAD_TIME from v$sqlarea
where     module='JDBC Thin Client' and rownum <11


tkprof   파일.trc   변환할파일명  sys=no explain=id/pwd

반응형
Posted by [PineTree]
ORACLE/SCRIPT2009. 10. 12. 17:48
반응형


select owner,object_name,original_name,type,createtime,droptime from dba_recyclebin
order by 1;


반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 10. 9. 21:38
반응형

기존에는 테이블을 새로 작성(reorg)  작업을 통해

커진 테이블 스페이스 크기를 복구 가능하였으나

10g 부터는 shrink 기능을 이용하여 손쉽게 테이블을 줄일수 있게 되었다.

Shrink 기능은 HWM(High Water Mark)를 줄일수 있는 기능이다.


- 사전 확인 사항

init.ora 파일내에 compatible = 10.2 이상인것을 확인

ASSM (Automatic Segment Space Management) 테이블 스페이스여만 가능

각 테이블 조회 방법은

SELECT obj.owner
,obj.table_name
,(CASE WHEN NVL(idx.cnt, 0) < 1 THEN 'YES' ELSE 'NO' END) shrinkable
FROM dba_tables obj,
(SELECT table_name, COUNT(rownum) cnt
FROM dba_indexes
WHERE index_type LIKE 'FUN%'
GROUP BY table_name) idx
WHERE obj.table_name = idx.table_name(+)
AND obj.tablespace_name = upper('&1')

쿼리를 통해 (테이블 스페이스 명을 인자값으로)

확인 가능하다.

1. 테이블 검색 방법

SELECT * FROM TABLE(DBMS_SPACE.ASA_RECOMMENDATIONS());

아래와 같이 테이블의 DBA_SEGMENTS에서 볼수 있는 크기와

축소 가능 크기가 조회된다.

SEGMENT_OWNER SEGMENT_NAME SEGMENT_TYPE PARTITION_NAME ALLOCATED_SPACE USED_SPACE RECLAIMABLE_SPACE
MAX_TI SMR_IF_LOG TABLE
6761793074 5910149080 851643994
MAX_TI SMR_IF_LOG_I01 INDEX
478455081 420139142 58315939
MAX_TI SMR_IF_LOG_I02 INDEX
411921243 398204079 13717164


2. 축소하기

가장 먼저 행들을 이동 가능하도록 변경한다.

위의 SMR_IF_LOG 테이블을 기준으로 설명하겠다.

ALTER TABLE SMR_IF_LOG ENABLE ROW MOVEMENT;

--> 반대로는 ALTER TABLE SMR_IF_LOG DISABLE ROW MOVEMENT; 이다..

이제 SHRINK 기능을 수행할수 있으며

다음 3가지 형태로 가능하다

① ALTER TABLE SMR_IF_LOG SHRINK SPACE; 
    -- SMR_IF_LOG 테이블의 공간만 TABLESPACE로 환원

② ALTER TABLE SMR_IF_LOG SHRINK SPACE CASCADE;
    -- 모든 관련 OBJECT까지 TABLESPACE으로 공간 환원

③ ALTER TABLE SMR_IF_LOG SHRINK SPACE COMPACT;
   -- 행들만 이동시킴.



※ SHRINK 를 적용 시킬  없는 테이블
UNDO segments
temporary segments
clustered tables
tables with a column of datatype LONG
LOB indexes
IOT mapping tables and IOT overflow segmnets
tables with MVIEWS with ON COMMIT
tables with MVIEWS which are based on ROWIDs.


SELECT --*
       'ALTER TABLE '||SEGMENT_NAME||' ENABLE ROW MOVEMENT;   '||CHR(10)||CHR(13)||
       'ALTER TABLE '||SEGMENT_NAME||' SHRINK SPACE COMPACT;  '||CHR(10)||CHR(13)||
       'ALTER TABLE '||SEGMENT_NAME||' SHRINK SPACE ;         '||CHR(10)||CHR(13)||
       'ALTER TABLE '||SEGMENT_NAME||' SHRINK SPACE CASCADE;  '||CHR(10)||CHR(13)||
       'ALTER TABLE '||SEGMENT_NAME||' DISABLE ROW MOVEMENT;  '||CHR(10)||CHR(13)
  FROM USER_SEGMENTS a
 WHERE 1=1
   AND a.segment_type = 'TABLE'


select * from table(dbms_space.asa_recommendations());

select job_name, program_name
from dba_scheduler_jobs
where job_name like '%SPACE%';


select program_name, program_action
from dba_scheduler_programs
where program_name = 'AUTO_SPACE_ADVISOR_PROG';
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 10. 7. 14:16
반응형
1. REDO
 - 모든 변경사항을 REDO로그에 기록한다.
 - REDO로그는 Online REDO와 Archuved REDO로그로 구성된다.
    Online REDO 로그는 2개 이상의 파일로 구성되어 있어,
    현재 사용중인 로그 파일이 꽉 차면 다음 로그 파일로 스위칭
    이때 꽉 차여진 로그 파일을 다른 위치로 백업래 준 파일을 Archived REDO로그 이다.
 - 목적 3가지
  - 데이타 복구 : Archived REDO이용
  - 버퍼캐시복구 : 인스턴스가 비정상적종료시 그떄까지 작업내용이 잃어버리게 됨.
                          재기동 되면 Online REDO로그에 저장된 기록사항을 읽어와 마지막
                          채크포인트와 사고발생직전까지 수행한 트랜젹션을 재현
  - Fast Commit(IO속도 차 극복) : 데이타 버퍼 블록을 디스크에 기록하는 작업은 Random엑세스 방식,
                                              Append방식 Append방식이 상대적으로 빠르게 때문에 우선 변경사항을
                                              Append방식으로 기록하고 동기화는 후에 배치방식으로 일괄수행.
 - REDO로그 버퍼를 REDO로그에 기록하는 시점
  - 3초마다 DBWR프로세스부터 신호흫 받을때
  - 로그 버퍼의 1/3이 차거나 기록된 REDO레코드량이 1MB를 넘을떄
  - 사용자 커킷 또는 롤백 명령이 날릴때
  
2. UNDO
 - 각 트랜지션별로 UNDO세그먼트를 할당해주고 그 트랜지션이 발생시킨 테이블과 인댁스에
    대한 변경사항을 UNDO레코드 단위로 UNDO세그먼트 블록에 기록.
 - 목적 3가지
  - 트랜지션 롤백
  - 트랜지션 리커버리(인스턴스 리커버리시 롤백단계)
  - READ Consistency(읽기 일관성)
  타 DBMS는 Lock를 통해 일기 일관성을 구현하지만,
  오라클에서는 UNDO데이타를 이용해서 읽기 일관성을 구현한다.  
             읽기 일관성이란 Transaction이 진행되는 동안 Database의 다른 사용자는 이 Consistent Read에 의해
             Commit되지 않은 변경 사항을 볼 수 없는 기능 입니다.  
 - UNDO레코드에 기록되는 내용
  - Insert : 추가된 레코드의 rowid
  - Update : 변경되는 컬럼에 대한 before image
  - Delete : 지워지는 로우의 모든 컬럼의 대한 before image
------------------------------------------------------------------------------------
REDO 와 UNDO를 차이점에서 바라본 관점.
------------------------------------------------------------------------------------
REDO 는 UNDO를 포함 합니다.
REDO 는 시스템 장애시 복구를 위해 사용 합니다.
복구시에 UNDO 데이터도 같이 복구하구요. Commit 되지 않은 데이터를 Rollback 하게 됩니다.
UNDO 는 Rollback 시에도 사용 되지만 Read Consistency(읽기 일관성) 을 위해서 도 사용 됩니다.
REDO 는 모든 변경사항(UNDO 포함)을 기록 합니다.
복구는 UNDO 를 통해서 복구를 하게 됩니다. 즉, ROLLBACK을 한다는 말이죠.
시스템 장애가 발생하게 되면 UNDO 데이터도 모두 날아가게 되겠죠.
결국 시스템 장애시 REDO 데이터를 이용해서 마지막 CHECK POINT 부터 장애까지의 DB BUFFER CACHE 를 복구하게 됩니다.
이게 완료가 되면 UNDO DATA 를 이용하여 COMMIT 되지 않은 데이터를 모두 ROLLBACK 함으로써 복구를 완료하게 됩니다.
결국 REDO 가 UNDO 를 복구하고 최종적으로 UNDO가 복구를 하게 됩니다.
UNDO(안한것 처럼)는 되돌리는 것 이라고 보시면 될거에요.
어떤 세션에서 DML을 발생시키면 commit이나 rollback을 날리기 전까지 이전 정보를 저장하기 위해서
UNDO 블럭에 해당 정보를 기록하죠.. 해당 세션이 트렌젝션 중에 비정상적으로 종료가 되었다면,
안한것 처럼(UNDO) 다시 원복해야 되니까요.
REDO(다시 함)는 위에 설명에도 있듯이 인스턴스 실패시(DB가 내려감) 데이터 파일에 쓰여지지 않은 커밋된 데이터를 복구한다고 되어 있습니다.
좀 더 설명을 해드리자면 커밋을 날릴 경우 LGWR가 로그 파일에 변경된 정보를 기록하게 되고
그 다음에 DBWR이 버퍼캐쉬에 있는 변경 사항에 대해서 데이터 파일에 내려 쓰게 됩니다.
이는 복구 정보가 더 중요해서 그런 것이라고 이해하시면 됩니다(복구 정보가 있으면 재적용이나 되돌릴 수 있으므로).
DB가 비정상적으로 내려가면, 데이터 파일에 쓰여지지 않은 정보들이 리두로그에 기록되어 있으므로
리두로그에서 정보를 가져와 다시 적용(REDO)하는 것입니다.
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 10. 6. 18:37
반응형


TABLE에서 모든 행을 삭제하는 방법에는 다음과 같은 세 가지 OPTION이 있다.

 1. DELETE 명령어 사용
 
     DELETE 명령어를 사용하여 TABLE의 행을 삭제할 수 있다.
     예를 들어 EMP TABLE에서 모든 행을 삭제하는 명령문은 다음과 같다.
 
     SQL>DELETE FROM emp;
 
     ◈ DELETE 문을 사용할 때 TABLE이나 CLUSTER에 행이 많으면 행이 삭제 될 때마다
         많은 SYSTEM 자원이 소모된다.
         예를 들어 CPU 시간,REDO LOG 영역,  TABLE이나 INDEX에 대한 ROLLBACK SEGMENT
         영역 등의 자원이 필요하다.
     ◈ TRIGGER가 걸려있다면 각 행이 삭제될 때 실행된다.
     ◈ 이전에 할당되었던 영역은 삭제되어 빈 TABLE이나 CLUSTER에 그대로 남아 있게 된다.
        
 
2. DROP 과 CREATE 명령어 사용
 
     TABLE을 삭제한 다음 재생성할 수 있다.
     예를 들어 EMP TABLE을 삭제하고 재생성하는 명령문은 다음과 같다.
 
     SQL>DROP TABLE emp;
     SQL>CREATE TABLE emp (......);
 
     ◈ TABLE이나 CLUSTER를 삭제하고 재생성하면 모든 관련된 INDEX, CONSTRAINT,
         TRIGGER도 삭제
되며, 삭제된 TABLE이나 CLUSTERED TABLE에 종속된 OBJECTS는
         무효화 된다
.
     ◈ 삭제된 TABLE이나 CLUSTERED TABLE에 부여된 권한도 삭제된다.
 
 
3. TRUNCATE 명령어 사용
 
     SQL명령어 TRUNCATE를 사용하여 TABLE의 모든 행을 삭제할 수 있다.
     예를 들어 EMP TABLE을 잘라내는 명령문은 다음과 같다.
 
     SQL>TRUNCATE TABLE emp:
 
     ◈ TRUNCATE 명령어는 TABLE이나 CLUSTER에서 모든 행을 삭제하는 빠르고
         효율적인 방법
이다.
     ◈ TRUNCATE 명령어는 어떤 ROLLBACK 정보도 만들지 않고 즉시 COMMIT한다.
     ◈ TRUNCATE 명령어는 DDL 명령문으로 ROLLBACK될 수 없다.
     ◈ TRUNCATE 명령문은 잘라 버릴 TABLE과 관련된 구조(CONSTRAINT, TRIGGER 등)과
         권한에 영향을 주지 않는다. 
  
     ◈ TRUNCATE 명령문이 TABLE에서 ROW를 삭제하면 해당 TABLE에 걸려 있는 TRIGGER는
         실행되지 않는다
.
     ◈ AUDIT 기능이 ENABLE되어 있으면, TRUNCATE 명령문은 DELETE 문에 해당하는
         AUDIT 정보를 생성하지 않는다. 대신 발생한 TRUNCATE 명령문에 대한
         단일 AUDIT RECORD를 생성한다.
반응형
Posted by [PineTree]
ORACLE/SCRIPT2009. 9. 28. 14:12
반응형
select to_char(completion_time,'yyyymmdd') DAY, count(*)  CNT From v$archived_log
where   to_char(completion_time,'yyyymmdd') >='20090901'
group by to_char(completion_time,'yyyymmdd')
order by to_char(completion_time,'yyyymmdd')   desc;
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 9. 15. 14:13
반응형
------------------------------------------------------------------------
ㅁ초기 size는 400k 공간, 필요시 다음번 400kb 증가하고 그 다음에는
size가 자동으로 증가하여 최대 10m 까지 사용할 수 있는 데이블스페이스 생성
------------------------------------------------------------------------
create tablespace tbs_02
datafile 'tbs_02.dat' size 400k
Autoextend on next 400k maxsize 10m;

select tablespace_name, file_name , bytes, blocks, status, autoextensible
from dba_data_files
where tablespace_name='TBS_02';

------------------------------------------------------------------------
ㅁ 전체 size 는 10mb 이고 공간이 더 필요할 경우 모든 extent 는 128kb로 증가
------------------------------------------------------------------------
create tablespace tbs_03
datafile 'c:\oradata\tbs_03.dbf' size 10m
extent management local
uniform size 128k;

------------------------------------------------------------------------
ㅁ 자동으로 segment 공간을 관리해주는 테이블 스페이스 생성 ==> 사용권장
------------------------------------------------------------------------
CREATE TABLESPACE auto_seg_ts
DATAFILE 'C:\ORADATA\auto_seg_ts.dbf' SIZE 1M
EXTENT MANAGEMENT LOCAL ----------> coalesce 작업필요없다.
SEGMENT SPACE MANAGEMENT AUTO ; ----------> latch 획득 필요 없다.

------------------------------------------------------------------------
ㅁ OMF 테이블 스페이스 생성
------------------------------------------------------------------------
select value from v$parameter where name='db_create_file_dest';
===> Data file 이 생성되는 목적지

alter system set db_create_file_dest='c:\oradata' scope=spfile;
===> Data file 이 생성되어지는 목적지 변경

SQL> shutdown immediate
SQL> startup

SQL> create tablespace omf_ts1;
===>'db_create_file_dest' 에 설정한 경로에 size가 무제한 자동으로 증가하는
100MB의 Data File이 랜덤한 이름으로 생성되어짐.

SQL> select file_name, tablespace_name, bytes, autoextensible
from dba_data_files
where tablespace_name='OMF_TS1';

SQL> create tablespace omf_ts2 datafile autoextend off; (100m차면 끝.. 자동증가 없음)
SQL> drop tablespace omf_ts1 including contents and datafiles;
====> 테이블스페이스 와 포함된 object그리고 os상 파일까지 모두 삭제


=================================
테이블스페이스 공간조회 스크립트
=================================

-------------------------------------------------------------------
accept v_tbsname prompt '테이블스페이스명: '
set verify off

select A.totbytes, A.totblocks, B.freebytes, B.freeblocks,
A.totbytes - B.freebytes "Usedbytes",
A.totblocks - B.freeblocks "Usedblocks"
from
(select tablespace_name,
sum(bytes) totbytes, sum(blocks) totblocks
from dba_data_files
where tablespace_name=upper('&v_tbsname')
group by tablespace_name
) A,
(select tablespace_name,
sum(bytes) freebytes, sum(blocks) freeblocks
from dba_free_space
where tablespace_name=upper('&v_tbsname')
group by tablespace_name
) B
where A.tablespace_name = B.tablespace_name
/

set verify on

------------------------------------------------------------------


=====================================
Tablespace 에 Datafile 추가
=====================================

=== 테이블 스페이스 생성 ===
SQL> create tablespace test1
datafile 'C:\oracle\oradata\ddba120\test1.dbf' size 1m
extent management local
segment space management auto;


=== 테이블 스페이스 남은 공간 보기 ===
select * from dba_free_space
where tablespace_name = 'TEST1';

==== 어느 블럭에 테이블이 쓰이나? ====

SELECT segment_name , extent_id, block_id, bytes, blocks
from dba_extents
where owner='SCOTT'
AND segment_name in ('EMP2','EMP3','EMP4','EMP5','EMP6','EMP7','EMP8');

[테이블스페이스 공간이 없을때 할 수 있는 작업]---------------------

[1방법] 데이타 파일을 추가 (권장)
alter tablespace test1
add datafile 'C:\oracle\oradata\ddba120\test11.dbf' size 1M;

[2방법] 용량을 늘린다.
alter database datafile
'C:\oracle\oradata\ddba120\test11.dbf' resize 2m;
--------------------------------------------------------------------------

===== 현재 segments를 사용중인 tablespace 검색해보자 =====

SELECT distinct tablespace_name from dba_segments;

--> 방금 생성한 test1 테이블 스페이스는 없다
--> 왜? 테이블이나 인덱스 같은 segments를 생성하지 않아서


select * from dba_tablespaces;

--> 테이블 스페이스가 모두 보여진다.

--------------------------------------------------------------
그럼~ 테이블 스페이스중에 object가 한개도 없는 것을 찾으려면
--------------------------------------------------------------

select tablespace_name
from dba_tablespaces
minus ================> 차집합
select distinct tablespace_name
from dba_segments;


=================================
Tablespace의 Online/Offline 설정
=================================


SQL> SELECT tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE ---> 읽고 쓰기 가능 DML가능!
UNDOTBS1 ONLINE


==== 해당 테이블이 저장되는 테이블 스페이스 ====

SQL> select tablespace_name from dba_tables
where table_name ='DEPT' AND OWNER='SCOTT';

TABLESPACE_NAME
------------------------------
SYSTEM


===== 테이블스페이스 offline만들기 ======
SQL> create table scott.dept2
tablespace users
as
select * from scott.dept;

SQL> alter tablespace users offline;

SQL> select tablespace_name, status from dba_tablespaces; --> 상태조회
SQL> select * from scott.dept;
==> 실행 가능

SQL> select * from scott.dept2;
==> 실행 거부 왜? offline이니까


===== 테이블스페이스 read only 만들기 ======
SQL> alter tablespace users online;
SQL> alter tablespace users read only;
==> select만 되어진다.


===== 테이블스페이스 read write만들기 ======
SQL> alter tablespace users read write;
==> 다시 online으로 복귀

---> 해당 유저의 기본테이블 스페이스 보기

select default_tablespace
from dba_users
where username = 'SCOTT';

---> 기본 테이블스페이스 변경

alter user scott
default tablespace system;
(변경되어질 테이블스페이스)

=========================
데이타 파일 이동
=========================

Users Tablespace의 C:\oracle\oradata\ddba120\users01.dbf를
D:\로 이동시키고자 한다.


SQL> create table scott.kh
(name varchar2(20));
SQL> insert into scott.kh values('송파교육원');
SQL> alter tablespace users offline; --> offline으로 우선 만든다

SQL> alter tablespace users
rename datafile 'C:\oracle\oradata\ddba120\USERS01.DBF'
to 'D:\ORADATA2\USERS01.DBF';
---> 변경할 위치를 적어주죠~~!!!

SQL> alter tablespace users online;
SQL> select tablespace_name, status from dba_tablespaces;
--> online/offline 상태조회

SQL> select tablespace_name, file_name, status from dba_data_files
where tablespace_name='USERS' ;
--> 데이타파일 상태조회

------------------
USERS
D:\ORADATA2\USERS01.DBF
AVAILABLE


---------------------------------------------------
---- 다시 원상복귀 그러나 다른 밥법!!! 기대하시랏!!!----
---------------------------------------------------

SQL> SHUTDOWN IMMEDIATE
'D:\ORADATA2\USERS01.DBF' 있는 것을 잘라내서
'C:\oracle\oradata\ddba120\USERS01.DBF' 로 붙여넣기

SQL> startup mount

SQL> alter database
rename file 'D:\ORADATA2\USERS01.DBF'
to 'C:\oracle\oradata\ddba120\USERS01.DBF' ;

SQL> alter database open;

SQL> select tablespace_name, file_name, status from dba_data_files
where tablespace_name='USERS' ;

------------------
USERS
C:\ORACLE\ORADATA\DDBA120\USERS01.DBF
AVAILABLE

datafile 관리하기

1. Logical Database Structure
 

-Segement :  data, index, rollback, temporary
-보통 Oracle block=db_block 는 OS block 의 2배가 적당

2. SYSTEM and Non-SYSTEM Tablespace
   - SYSTEM Tablespace : data dictionary 정보, SYSTEM rollback segment
   - Non-SYSTEM Tablespace : Rollback segments, Temporary segments, App' data, App' index

3. CREATE TABLESPACE

   CREATE TABLESPACE tablespace
      DATAFILE filespec [autoextend_clause]
      [,       filespec [autoextend_clause]]...
      [MINIMUM EXTENT integer [K|M]]
      [DEFAULT storage_clause]
      [PERMANENT|TEMPOARY]    -- default PERMANENT
      [ONLINE|OFFLINE]        -- default ONLINE

   예) CREATE TABLESPACE app_data
       DATAFILE '/DISK4/app01.dbf' SIZE 100M,
                '/DISK5/app02.dbf' SIZE 100M
       MINIMUM EXTENT 500K
       DEFAULT STORAGE (INITIAL 500K NEXT 500K
                        MAXEXTENTS 500 PCTINCREASE 0) ;

   * Storage Parameters
     - INITIAL : first extent의 size를 정한다. 최소 size는 2blocks이다. (2 * DB_BLOCK_SIZE)
           default는 5 bolcks (5 * DB_BLOCK_SIZE)
     - NEXT : 다음 extent의 size를 정한다. 최소 size는 1block 이다.
           default는 5 bolcks (5 * DB_BLOCK_SIZE)
     - MINEXTENTS : segment가 생성되었을 때 할당된 extent의 갯수.
           default는 1
     - PCTINCREASE n : 다음에 extent가 생성될 때 이전 extent보다 n% 증가된 size (PCT: percent)
           default는 50
     - MAXEXTENTS : segment가 갖을 수 있는 extent의 최대 수

4. Temporary Tablespace
  
   CREATE TABLESPACE sort
   DATAFILE '/DISK2/sort01.dbf' SIZE 50M
   MINIMUM EXTENT 1M
   DEFAULT STORAGE (INITIAL 2M NEXT 2M
                    MAXEXTENTS 500 PCTINCREASE 0)
   TEMPORARY ;

5. Tablespace의 size 설정 (data file을 추가하면서...)

   ALTER TABLESPACE app_data
   ADD DATAFILE
       '/DISK5/app03.dbf' SIZE 200M ;

6. Data File이 꽉차면 자동으로 datafile을 증가하게 만드는 방법.

   ALTER TABLESPACE app_data
   ADD DATAFILE
       '/DISK6/app04.dbf' SIZE 200M
   AUTOEXTEND ON NEXT 10M
   MAXSIZE 500M ;

   * 3가지 방법이 있다.
     1) CREATE DATABASE
     2) CREATE TABLESPACE DATAFILE
     3) ALTER TABLESPACE ADD DATAFILE

7. 기존에 존재하는 datafile의 size를 resize하는 방법

   ALTER DATABASE DATAFILE
         '/DISK5/app02.dbf' RESIZE 200M ;

8. Changing the Storage Settings

   ALTER TABLESPACE app_data
   MINIMUM EXTENT 2M ;

   ALTER TABLESPACE app_data
   DEFAULT STORAGE
      (INITIAL 2M NEXT 2M
       MAXEXTENTS 999) ;

9. Tablespace OFFLINE/ONLINE
   - tablespace가 만들어지면 default가 ONLINE이다.
   - OFFLINE이 되면 다른 user의 access가 불가능하다.
   - SYSTEM tablespace는 OFFLINE이 불가!
   - transaction이 끝나지 않은 tablespace는 OFFLINE 불가!

   ALTER TABLESPACE tablespace
     { ONLINE | OFFLINE [NORMAL|TEMPORARY|IMMEDIATE] }
   - Normal : checkpoint를 적용시키고 offline한다.
   - Temporary : datafile 중에서 online datafile에만 checkpoint를 적용시키고 offline한다.
   - Immediate : checkpoint 없이 offline한다.

   예) ALTER TABLESPACE app_data OFFLINE ;

10. Moving Data File : ALTER TABLESPACE
   - 반드시 offline 한 상태에서 한다.
   - target data file이 반드시 존재해야 한다.

   ALTER TABLESPACE app_data
   RENAME DATAFILE '/DISK4/app01.dbf'
   TO              '/DISK5/app01.dbf' ;

11. Moving Data File : ALTER DATABASE
   - 반드시 database가 mount 상태여야 한다.
   - target data file이 반드시 존재해야 한다.
   - shutdown하고 host상태에서 datafile을 제거해야 한다.

   ALTER DATABASE RENAME FILE
         '/DISK1/system01.dbf' TO '/DISK2/system01.dbf' ;

12. READ-ONLY Tablespace 상태
   - 오직 select만 할 수 있다.
   - CREATE는 안되고... DROP은 할 수 있다.
   - user들이 data변경을 못하고, backup과 recovery가 쉽다.

   ALTER TABLESPACE app_data
   READ ONLY

   ALTER TABLESPACE app_data
   READ WRITE   -- read only 상태를 다시 read write상태로 바꿔준다.

   * 주의점!
     - tablespace가 반드시 online상태여야 한다.
     - active transaction이 허용되지 않아야 한다.
     - tablespace가 active rollback segment를 갖고 있으면 안된다.
     - online backup중엔 못한다.

13. DROP TABLESPACE
   - file 삭제는 host에 나가서 삭제를 해야 한다.

   DROP TABLESPACE app_data
   INCLUDING CONTENTS AND DATAFILES;
  
   * including contents를 안썼을 때, tablespace가 비워져 있어야만 drop이 된다.
     including contents는 데이터가 들어 있어도 tablespace를 삭제하겠다는 뜻이다.

14. DBA_TABLESPACES : tablespace 정보를 갖고 있다.
   - TABLESPACE_NAME, NEXT_EXTENT, MAX_EXTENTS, PCT_INCREASE, MIN_EXTLEN, STATUS, CONTENTS

   SVRMGR> SELECT tablespace_name, initial_extent, next_extent,
        2         max_extents, pct_increase, min_extlen
        3    FROM dba_tablespaces ;

15. DBA_DATA_FILES : file에 관한 정보를 갖고 있다.
   - FILE_NAME, TABLESPACE_NAME, BYTES, AUTOEXTENSIBLE, MAXBYTES, INCREMENT_BY

select file_name, tablespace_name, bytes,
autextensible, maxbytes, increment_by
FROM dba_data_files ;

16. Contol File 정보
   - V$DATAFILE : ts#, name, file#, rfile#, status, enabled, bytes, create_bytes
   - V$TABLESPACE : ts#, name

   SVRMGR> SELECT d.file#, d.name, d.status, d.enabled,
        2  d.bytes, d.create_bytes, t.name
        3  FROM v$datafile d, v$tablespace t
        4  WHERE t.ts#=d.ts# ;

17. Temp File Autoextend ON

- autoextend 설정 상태 확인

  SQL > select * from dba_temp_files;  -- temp tablespace


- autoextend on

  SQL > alter database tempfile 'D:\ORACLE\ORADATA\URISVC\LBS_TEMP.ORA' autoextend on next 100M;


데이터파일을 이용해 핫스팟 찾아내기

select name, phyrds, phywrts  from v$datafile a, v$filestat b   where a.file#=b.file#

데이블스페이스에 공간할당해도 extent가 안될 때

select tablespace_name, sum(bytes), max(bytes) from dba_free_space  group by tablespace_name;

데이터 파일 확인하는 법

테이블스페이스 정보

-          dba_tablespaces

-          v$tablespace

테이터 파일 정보

-          dba_data_files

-          v$datafile

임시 파일 정보

-          dba_temp_files

-          v$tempfile

-          

select file_name, tablespace_name, bytes from dba_data_files;


테이블스페이스에 데이터파일 크기 키우기

alter database

datafile ‘/oradata2/RMTESTDB/tools/tools01.dbf’ resize 500M;



--------------------------------------------------------------------------------

[ Lab ]


--------------------------------------------------------------------------------

1. 현재의 Tablespace와 Data file들을 확인하십시오.
$ sqlplus system/manager
SQL> select * from dba_tablespaces ;
SQL> select file_name, tablespace_name, bytes
  2  from dba_data_files ;
 
2. DATA01 tablespace의 size를 늘이기 위하여, datafile을 하나 더 추가하십시오.
SQL> alter tablespace data01
  2  add datafile '$ORACLE_HOME/DATA/DISK6/data01b.dbf' size 500k ;
SQL> select file_name, tablespace_nmae, bytes
  2  from dba_data_files ;
 
3. 문제2 에서 추가한 datafil의 size를 1M 로 resize 하십시오.
SQL> alter database datafile
  2  '$ORACLE_HOME/DATA/DISK6/data01b.dbf'
  3  resize 1M ;
SQL> select file_name, tablespace_name, bytes
  2  from dba_data_files ;
 
4. 문제2 에서 추가한 datafile의 size가 자동적으로 extend 될 수 있도록 하십시오.
SQL> alter database datafile
  2  '$ORACLE_HOME/DATA/DISK6/data01b.dbf'
  3  autoextend on next 100k maxsize 2m ;
SQL> select file_name, tablespace_name, bytes, autoextensible
  2  from dba_data_files ;
 
5. INDX01 tablespace의 datafile을 DISK6으로 옮기시오.
SQL> alter tablespace indx01 offline ;
SQL> select name, status from v$datafile ;
SQL> host
$ mv $ORACLE_HOME/DATA/DISK3/indx01.dbf $ORACLE_HOME/DATA/DISK6/indx01.dbf
$ exit
SQL> alter tablespace indx01 rename datafile
  2  '$ORACLE_HOME/DATA/DISK3/indc01.dbf'
  3  to
  4  '$ORACLE_HOME/DATA/DISK6/indx01.dbf' ;
SQL> alter tablespace indx01 online ;
SQL> select name, status from v$datafile ;

6. RONLY Tablespace를 read only로 바꾸고, 추가적인 테이블을 생성해 보십시오. 무슨 일이 발생하며 이유는 무엇입니까?
SQL> create table t1(t1 number) tablespace ronly ;
SQL> alter tablespace ronly read only ;
SQL> select name, enabled, status from v$datafile ;
SQL> create table t2(t2 number) tablespace ronly ;    ==> error 발생 확인!

7. RONLY Tablespace를 삭제하십시오.
SQL> drop tablespace ronly including contents ;
SQL> select * from v$tablespace ;
SQL> host

$ rm $ORACLE_HOME/DATA/DISK1/ronly.dbf

EX>
 

데이터 파일 추가

alter tablespace INDX1

add datafile '/oradata10/indx02.dbf'

size 2000M,

'/oradata10/indx03.dbf'

size 2000M,

'/oradata10/indx04.dbf'

size 2000M,

'/oradata10/indx05.dbf'

size 2000M;

alter tablespace H

add datafile ‘/oradata2/H2.dbf’

size 200M

alter tablespace I

add datafile ‘/oradata3/I2.dbf’

size 200M

alter tablespace J

add datafile ‘/oradata4/J2.dbf’

size 200M

alter tablespace K

add datafile ‘/oradata5/K2.dbf’

size 200M

alter tablespace L

add datafile ‘/oradata6/L2.dbf’

size 200M

alter tablespace M

add datafile ‘/oradata2/M2.dbf’

size 200M

alter tablespace N

add datafile ‘/oradata3/N2.dbf’

size 200M

alter tablespace O

add datafile ‘/oradata4/O2.dbf’

size 200M

alter tablespace P

add datafile ‘/oradata5/P2.dbf’

size 200M

alter tablespace Q

add datafile ‘/oradata6/Q2.dbf’

size 200M



TEMP TABLESPACE가 꽉 찾을 경우

/* 임시 테이블스페이스 TEMP9를 새로 만든다.  */

CREATE TEMPORARY TABLESPACE TEMP9 TEMPFILE
  'C:\ORACLE\ORADATA\JJUDB\TEMP09.DBF' SIZE 846M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

EX)

alter user JJU_POS temporary tablespace TEMP9;


select 'alter user '|| username||' temporary tablespace temp9;' from all_users;

/* 다음으로 기본 임시 테이블스페이스를 새로 만든걸로 바꿉니다.  */
alter database default temporary tablespace temp9;


drop tablespace temp including contents ;

--Oracle 9i 이상부터는 기본적으로 System tablespace는 LOCAL이다
--9i 이전은 DICTIONARY 이었다.

만일 기존 temp가 돌고 있는 경우...

오라클 내렸다 MOUNT 상태에서 DROP 하고 데이타베이스 OPEN한다.

SQL> startup mount
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
데이터베이스가 마운트되었습니다.
SQL> alter database datafile 'C:\ORACLE\ORADATA\JJUDB\DATA\BSC_D.DBF' offline d
op ;

데이타베이스가 변경되었습니다.

SQL> drop tablespace bsc_i_ts ;
drop tablespace bsc_i_ts
*
1행에 오류:
ORA-01109: 데이터베이스가 개방되지 않습니다


SQL> alter database open ;

데이타베이스가 변경되었습니다.


default temporary tablespace 변경하기

No. 12096

(9I) DEFAULT TEMPORARY TABLESPACE의 개념과 사용 예제
===================================================

PURPOSE
-------

   Space Management와 관련된 Oracle 9i의 새로운 기능 중 Default
   Temporary Tablespace에 대하여 알아보기로 한다.


Explanation
-----------

데이터베이스 user를 생성할 때, 명시적으로 Temporary Tablespace를 지정하
지 않으면 기본적으로 SYSTEM 테이블스페이스가 할당되고, 모든 temporary
data는 이 SYSTEM 테이블스페이스에 저장된다. 9i에서는 데이터베이스 전체
에 걸쳐 사용될 Default Temporary Tablespace로 임의의 Temporary
Tablespace를 정의할 수 있다.

만일 별도의 Temporary Tablespace를 생성하고, 이를 Default Temporary
Tablespace로 지정하면 Temporary data를 저장할 공간으로 불필요하게
SYSTEM 테이블스페이스를 사용할 이유가 없게 된다. (데이터베이스 생성 시
정의할 수 있다.)
데이터베이스 운영 중 아래와 같이 동적으로 변경할 수 있으며, 이 경우 기
존 사용자의 Default Temporary Tablespace도 함께 변경이 된다.

SQL> ALTER DATABASE ora9i DEFAULT TEMPORARY TABLESPACE dts2;

Temporary type으로 만든 datafile은 dba_temp_files view를 보면 된다.


Restrictions on Default Temporary Tablespace
--------------------------------------------

­새로운 Default Temporary Tablespace가 가용하기 전에 기존 Default
Temporary Tablespace를 drop할 수 없다.

­Default Temporary Tablespace를 Permanent Tablespace로 변경할 수 없다.
Default Temporary Tablespace는 SYSTEM Tablespace이거나 Temporary Type
Tablespace이어야만 한다.

­Default Temporary Tablespace는 OFFLINE으로 변경될 수 없다.


Example
-------

As SYSTEM
- 원래대로 Default Temporary Tablespace를 SYSTEM으로 복원

SQL> alter database ora9i default temporary tablespace system;


- 데이터베이스 user 생성 시 Temporary Tablespace 확인:SYSTEM tablespace
  사용

SQL> create user omf_test identified by omf_test;

SQL> select username, temporary_tablespace from dba_users where
     username = 'OMF_TEST'

USERNAME                       TEMPORARY_TABLESPACE
------------------------------ ----------------------------------------
OMF_TEST                       SYSTEM


- Default Temporary Tablespace를 TEMP tablespace(temporary type)로
  변경 :
  기존 사용자(OMF_TEST)의 Temporary Tablespace가 SYSTEM에서 TEMP로 변경
  됨을 알 수 있다.

SQL> alter database ora9i default temporary tablespace temp;

SQL> select username, temporary_tablespace from dba_users where
     username = 'OMF_TEST'

USERNAME                       TEMPORARY_TABLESPACE
------------------------------ ----------------------------------------
OMF_TEST                       TEMP


- 이제는 데이터베이스 user를 생성할 때, Temporary Tablespace가 SYSTEM이
  아닌 TEMP가 됨을 확인

SQL> drop user omf_test;

SQL> create user omf_test identified by omf_test;

SQL> select username, temporary_tablespace from dba_users where
     username = 'OMF_TEST'

USERNAME                       TEMPORARY_TABLESPACE
------------------------------ ----------------------------------------
OMF_TEST                       TEMP

SQL> drop user omf_test;


Reference Documents
-------------------
<Note:138212.1>

<데이타 파일별 용량 확인 쿼리>

SELECT  SYSDATE "Check Time",
                  b.file_name "FILE_NAME",
                  b.tablespace_name "TABLESPACE_NAME",
                  TO_CHAR((b.bytes / 1024),'999,990,999') "TOTAL SIZE(KB)", -- 총 Bytes
                  TO_CHAR((((b.bytes - sum(nvl(a.bytes,0)))) / 1024),'999,990,999') "USED(KB)",
                  TO_CHAR(((sum(nvl(a.bytes,0))) / 1024),'999,990,999') "FREE SIZE(KB)",
                  TRUNC(((sum(nvl(a.bytes,0)) / (b.bytes)) * 100),2) "FREE %"
                  FROM DBA_FREE_SPACE a, DBA_DATA_FILES b
WHERE a.file_id(+) = b.file_id
GROUP BY b.tablespace_name, b.file_name, b.bytes
ORDER BY b.tablespace_name;

 
[출처 Bywoong Blog]
반응형
Posted by [PineTree]