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]
ORACLE/ADMIN2009. 9. 11. 20:42
반응형
Index of This Note:
-------------------

1) What is the National Character Set?
2) Which datatypes use the National Character Set?
3) How to know if I use N-type columns?
4) Should I worry when I upgrade from 8i or lower to 9i, 10g or 11g?
5) The NLS_NCHAR_CHARACTERSET is NOT changed to UTF8 or AL16UTF16 after upgrading to 9i.
6) Can I change the AL16UTF16 to UTF8 / I hear that there are problems with AL16UTF16.
7) Is the AL32UTF8 problem the same as the AL16UTF16 / do I need the same patches?
8) But I still want <characterset> as NLS_NCHAR_CHARACTERSET, like I had in 8(i)!
9) Do i need to set NLS_LANG to AL16UTF16 when creating/using the NLS_NCHAR_CHARACTERSET ?
10) I try to use AL32UTF8 as NLS_NCHAR_CHARACTERSET but it fails with ORA-12714
11) I have the message "( possible ncharset conversion )" during import.
12) Can i use AL16UTF16 as NLS_CHARACTERSET ?
13) I'm inserting <special character> in a Nchar or Nvarchar2 col but it comes back as ? ...
14) Do i need to change the NLS_NCHAR_CHARACTERSET in 8i to UTF8 BEFORE upgrading to 9i/10g?
15) Having a UTF8 NLS_CHARACTERSET db is there a advantage to use AL16UTF16 N-types ?
16) I have a message in the DBUA (Database Upgrade Assistant) about NCHAR type when upgrading from 8i..
17) How to go from an UTF8 NLS_NCHAR_CHARTERSET to AL16UTF16?

1) What is the National Character Set?
--------------------------------------

The National Character set (NLS_NCHAR_CHARACTERSET) is a character set
which is defined in addition to the (normal) database character set and
is used for data stored in NCHAR, NVARCHAR2 and NCLOB columns.

Your current value for the NLS_NCHAR_CHARACTERSET can be found with this select:

select value from NLS_DATABASE_PARAMETERS where parameter='NLS_NCHAR_CHARACTERSET';

You cannot have more than 2 charactersets defined in Oracle:
The NLS_CHARACTERSET is used for CHAR, VARCHAR2, CLOB columns;
The NLS_NCHAR_CHARACTERSET is used for NCHAR, NVARCHAR2, NCLOB columns.

NLS_NCHAR_CHARACTERSET is defined when the database is created
and specified with the CREATE DATABASE command.
The NLS_NCHAR_CHARACTERSET defaults to AL16UTF16 if nothing is specified.

From 9i onwards the NLS_NCHAR_CHARACTERSET can have only 2 values:
UTF8 or AL16UTF16 who are Unicode charactersets.
See Note 260893.1 Unicode character sets in the Oracle database
for more info about the difference between them.

Al lot of people think that they *need* to use the NLS_NCHAR_CHARACTERSET to have
UNICODE support in Oracle, this is not true, NLS_NCHAR_CHARACTERSET (NCHAR, NVARCHAR2)
is in 9i always Unicode but you can perfectly use "normal" CHAR and VARCHAR2 columns for storing unicode
in a database who has a AL32UTF8 / UTF8 NLS_CHARACTERSET.
See also point 15.

When trying to use another NATIONAL characterset the CREATE DATABASE command will
fail with "ORA-12714 invalid national character set specified"

The character set identifier is stored with the column definition itself.

2) Which datatypes use the National Character Set?
--------------------------------------------------

There are three datatypes which can store data in the national character set:

NCHAR - a fixed-length national character set character string.
The length of the column is ALWAYS defined in characters
(it always uses CHAR semantics)

NVARCHAR2 - a variable-length national character set character string.
The length of the column is ALWAYS defined in characters
(it always uses CHAR semantics)

NCLOB - stores national character set data of up to four gigabytes.
Data is always stored in UCS2 or AL16UTF16, even if the
NLS_NCHAR_CHARACTERSET is UTF8.
This has very limited impact, for more info about this please see:
Note 258114.1 Possible action for CLOB/NCLOB storage after 10g upgrade
and if you use DBMS_LOB.LOADFROMFILE see
Note 267356.1 Character set conversion when using DBMS_LOB

If you don't know what CHAR semantics is, then please read
Note 144808.1 Examples and limits of BYTE and CHAR semantics usage

If you use N-types, DO use the (N'...') syntax when coding it so that Literals are
denoted as being in the national character set by prefixing letter 'N',
for example:

create table test(a nvarchar2(100));
insert into test values(N'this is a NLS_NCHAR_CHARACTERSET string');


3) How to know if I use N-type columns?
---------------------------------------

This select list all tables containing a N-type column:

select distinct OWNER, TABLE_NAME from DBA_TAB_COLUMNS where DATA_TYPE in ('NCHAR','NVARCHAR2', 'NCLOB');

On a 9i database created without (!) the "sample" shema you will see these rows (or less) returned:

OWNER TABLE_NAME
------------------------------ ------------------------------
SYS ALL_REPPRIORITY
SYS DBA_FGA_AUDIT_TRAIL
SYS DBA_REPPRIORITY
SYS DEFLOB
SYS STREAMS$_DEF_PROC
SYS USER_REPPRIORITY
SYSTEM DEF$_LOB
SYSTEM DEF$_TEMP$LOB
SYSTEM REPCAT$_PRIORITY

9 rows selected.

These SYS and SYSTEM tables may contain data if you are using:

* Fine Grained Auditing -> DBA_FGA_AUDIT_TRAIL
* Advanced Replication -> ALL_REPPRIORITY, DBA_REPPRIORITY, USER_REPPRIORITY
DEF$_TEMP$LOB , DEF$_TEMP$LOB and REPCAT$_PRIORITY
* Advanced Replication or Deferred Transactions functionality -> DEFLOB
* Oracle Streams -> STREAMS$_DEF_PROC


If you do have created the database with the DBCA and included
the sample shema then you will see typically:

OWNER TABLE_NAME
------------------------------------------------------------
OE BOMBAY_INVENTORY
OE PRODUCTS
OE PRODUCT_DESCRIPTIONS
OE SYDNEY_INVENTORY
OE TORONTO_INVENTORY
PM PRINT_MEDIA
SYS ALL_REPPRIORITY
SYS DBA_FGA_AUDIT_TRAIL
SYS DBA_REPPRIORITY
SYS DEFLOB
SYS STREAMS$_DEF_PROC
SYS USER_REPPRIORITY
SYSTEM DEF$_LOB
SYSTEM DEF$_TEMP$LOB
SYSTEM REPCAT$_PRIORITY

15 rows selected.

The OE and PM tables contain just sample data and can be dropped if needed.

4) Should I worry when I upgrade from 8i or lower to 9i, 10g or 11g?
--------------------------------------------------------------------

* When upgrading from version 7:

The National Character Set did not exist in version 7,
so you cannot have N-type columns.
Your database will just have the -default- AL16UTF16 NLS_NCHAR_CHARACTERSET
declaration and the standard sys/system tables.
So there is nothing to worry about...

* When upgrading from version 8 and 8i:

- If you have only the SYS / SYSTEM tables listed in point 3)
then you don't have USER data using N-type columns.

Your database will just have the -default- AL16UTF16 NLS_NCHAR_CHARACTERSET
declaration after the upgrade and the standard sys/system tables.
So there is nothing to worry about...

We recommend that you follow this note:
Note 159657.1 Complete Upgrade Checklist for Manual Upgrades from 8.X / 9.0.1 to Oracle9i

- If you have more tables then the SYS / SYSTEM tables listed in point 3)
(and they are also not the "sample" tables) then there are 3 possible cases:

* Again, the next to points are *only* relevant when you DO have n-type USER data *

a) Your current 8 / 8i NLS_NCHAR_CHARACTERSET is in this list:

JA16SJISFIXED , JA16EUCFIXED , JA16DBCSFIXED , ZHT32TRISFIXED
KO16KSC5601FIXED , KO16DBCSFIXED , US16TSTFIXED , ZHS16CGB231280FIXED
ZHS16GBKFIXED , ZHS16DBCSFIXED , ZHT16DBCSFIXED , ZHT16BIG5FIXED
ZHT32EUCFIXED

Then the new NLS_NCHAR_CHARACTERSET will be AL16UTF16
and your data will be converted to AL16UTF16 during the upgrade.

We recommend that you follow this note:
Note 159657.1 Complete Upgrade Checklist for Manual Upgrades from 8.X / 9.0.1 to Oracle9i

b) Your current 8 / 8i NLS_NCHAR_CHARACTERSET is UTF8:

Then the new NLS_NCHAR_CHARACTERSET will be UTF8
and your data not be touched during the upgrade.

We still recommend that you follow this note:
Note 159657.1 Complete Upgrade Checklist for Manual Upgrades from 8.X / 9.0.1 to Oracle9i

c) Your current 8 / 8i NLS_NCHAR_CHARACTERSET is NOT in the list of point a)
and is NOT UTF8:

Then your will need to export your data and drop it before upgrading.
We recommend that you follow this note:
Note 159657.1 Complete Upgrade Checklist for Manual Upgrades from 8.X / 9.0.1 to Oracle9i

For more info about the National Character Set in Oracle8 see Note 62107.1

5) The NLS_NCHAR_CHARACTERSET is NOT changed to UTF8 or AL16UTF16 after upgrading to 9i.
----------------------------------------------------------------------------------------

That may happen if you have not set the ORA_NLS33/ORA_NLS10 environment parameter
correctly to the 9i/10g Oracle_Home during the upgrade.
Note 77442.1 ORA_NLS (ORA_NLS32, ORA_NLS33, ORA_NLS10) Environment Variables explained.

You may see errors like "ORA-12714: invalid national character set specified"

We recommend that you follow this note for the upgrade:
Note 159657.1 Complete Upgrade Checklist for Manual Upgrades from 8.X / 9.0.1 to Oracle9i

Strongly consider to restore your backup and do the migration again or log a
TAR, refer to this note and ask to assign the TAR to the NLS/globalization
team. That team can then assist you further.

However please do note that not all situations can be corrected,
so you might be asked to do the migration again...

Note: do NOT use the UTLNCHAR.SQL or N_SWITCH.SQL script!
This will not help and make things only worse...

Provide the output of this select:

select distinct OWNER, TABLE_NAME, DATA_TYPE from DBA_TAB_COLUMNS where DATA_TYPE in ('NCHAR','NVARCHAR2', 'NCLOB');

when logging a SR.

6) Can I change the AL16UTF16 to UTF8 / I hear that there are problems with AL16UTF16.
--------------------------------------------------------------------------------------

6a) If you do *not* use N-types then there is NO problem at all with AL16UTF16
because you are simply not using it and we strongly advice you the keep
the default AL16UTF16 NLS_NCHAR_CHARACTERSET.

6b) If you *do* use N-types then there will be a problem with 8i clients and
lower accessing the N-type columns (note that you will NOT have a problem
selecting from "normal" non-N-type columns).
More info about that is found there:
Note 140014.1 ALERT Oracle8/8i to Oracle9i/10g using New "AL16UTF16" National Character Set
Note 236231.1 New Character Sets Not Supported For Use With Developer 6i And Older Versions

If this is a situation you find yourself in we recommend to simply use UTF8
as NLS_NCHAR_CHARACTERSET or create a second 9i db using UTF8 as NCHAR and use this as "inbetween" between the 8i and the 9i db
you can create views in this new database that do a select from the AL16UTF16 9i db
the data will then be converted from AL16UTF16 to UTF8 in the "inbetween" database and that can
be read by oracle 8i

This is one of the 2 reasons why you should use UTF8 as NLS_NCHAR_CHARACTERSET.
If you are NOT using N-type columns with pre-9i clients then there is NO reason to go to UTF8.

6c) If you want to change to UTF8 because you are using transportable tablespaces from 8i database
then check if are you using N-types in the 8i database that are included in the tablespaces that you are transporting.

select distinct OWNER, TABLE_NAME from DBA_TAB_COLUMNS where DATA_TYPE in ('NCHAR','NVARCHAR2', 'NCLOB');

If yes, then you have the second reason to use UTF8 as as NLS_NCHAR_CHARACTERSET.

If not, then leave it to AL16UTF16 and log a tar for the solution of the ORA-19736
and refer to this document. (see also point 8 in this note)

6D) You are in one of the 2 situations where it's really needed to change from
AL16UTF16 to UTF8 then the correct steps to go from AL16UTF16 to UTF8 are:

6D1) install csscan:

Note 458122.1 Installing and configuring CSSCAN in 8i and 9i
Note 745809.1 Installing and configuring CSSCAN in 10g and 11g

6D2) For 9i:

* export all the user N-data

* drop/truncate all the user N-data
-- If you do not drop all N-data then you will run into
-- ORA-12717: Cannot issue ALTER DATABASE NATIONAL CHARACTER SET when NCLOB, NCHAR or NVARCHAR2 data exists

* run csscan to check if everything is ok

csscan FULL=Y TONCHAR=UTF8 LOG=check CAPTURE=Y ARRAY=1000000 PROCESS=2

aways run csscan with / as sydba

* csscan will ask:


Current database character set is UTF8. <- this is the current NLS_CHARACTERSET

Enter new database character set name: > <-*just hit enter here*


* check that you see in the check.txt file this:

All character type data in the data dictionary remain the same in the new character set
All character type application data remain the same in the new character set


* then you can do a ALTER DATABASE NATIONAL CHARACTER SET UTF8;
Shutdown the listener and any application that connects locally to the database.
There should be only ONE connection the database during the WHOLE time and that's
the sqlplus session where you do the change.

1. Make sure the parallel_server parameter in INIT.ORA is set to false or it is not set at all.
If you are using RAC see
Note 221646.1 Changing the Character Set for a RAC Database Fails with an ORA-12720 Error

2. Execute the following commands in sqlplus connected as "/ AS SYSDBA":

SPOOL Nswitch.log
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE NATIONAL CHARACTER SET UTF8;
SHUTDOWN IMMEDIATE;

3. Restore the parallel_server parameter in INIT.ORA, if necessary.

* import the user N-data again

6D3) for 10g and up:

* export any user N-data
* drop/truncate any user N-data
* Truncate these 2 xdb tables if

SQL>select LOCALNAME from XDB.XDB$QNAME_ID;
SQL>select NMSPCURI from XDB.XDB$NMSPC_ID;

gives 7 rows

SQL>truncate table XDB.XDB$QNAME_ID
SQL>truncate table XDB.XDB$NMSPC_ID

if you have more rows log a SR.

* run csscan to check if everything is ok

csscan FULL=Y TONCHAR=UTF8 LOG=check CAPTURE=Y ARRAY=1000000 PROCESS=2

always run csscan with / as sydba

* csscan will ask:


Current database character set is UTF8. <- this is the current NLS_CHARACTERSET

Enter new database character set name: > <-*just hit enter here*


* check that you see in the check.txt file this:

All character type data in the data dictionary remain the same in the new character set
All character type application data remain the same in the new character set

* after that run csalter ( using alter database is in a 10g system for the national characterset not really a problem, but csalter is the official way)

Shutdown the listener and any application that connects locally to the database.
There should be only ONE connection the database during the WHOLE time and that's
the sqlplus session where you do the change.

Then you do in sqlplus connected as "/ AS SYSDBA":


-- Make sure the parallel_server and CLUSTER_DATABASE parameter are set
-- to false or it is not set at all.
-- If you are using RAC you will need to start the database in single instance
-- with CLUSTER_DATABASE = FALSE
sho parameter CLUSTER_DATABASE
sho parameter PARALLEL_SERVER
-- check if you are using spfile
sho parameter pfile
-- if this "spfile" then you are using spfile
-- in that case note the
sho parameter job_queue_processes
sho parameter aq_tm_processes
-- (this is Bug 6005344 fixed in 11g )
-- then do

shutdown immediate
startup restrict
SPOOL Nswitch.log
@@?\rdbms\admin\csalter.plb
-- if you are using spfile then you need to also
-- ALTER SYSTEM SET job_queue_processes=<original value> SCOPE=BOTH;
-- ALTER SYSTEM SET aq_tm_processes=<original value> SCOPE=BOTH;

shutdown
startup


* after this update the XDB tables again with these inserts:

(these inserts can also be found in the $ORACLE_HOME/rdbms/admin/catxdbtm.sql script)

insert into xdb.xdb$nmspc_id values ('http://www.w3.org/XML/1998/namespace', HEXTORAW('01'));
insert into xdb.xdb$nmspc_id values ('http://www.w3.org/XML/2000/xmlns', HEXTORAW('02'));
insert into xdb.xdb$nmspc_id values ('http://www.w3.org/2001/XMLSchema-instance', HEXTORAW('03'));
insert into xdb.xdb$nmspc_id values ('http://www.w3.org/2001/XMLSchema', HEXTORAW('04'));
insert into xdb.xdb$nmspc_id values ('http://xmlns.oracle.com/2004/csx', HEXTORAW('05'));
insert into xdb.xdb$nmspc_id values ('http://xmlns.oracle.com/xdb', HEXTORAW('06'));
insert into xdb.xdb$nmspc_id values ('http://xmlns.oracle.com/xdb/nonamespace', HEXTORAW('07'));

insert into xdb.xdb$qname_id values (HEXTORAW('01'), 'space', HEXTORAW('01'), HEXTORAW('10'));
insert into xdb.xdb$qname_id values (HEXTORAW('01'), 'lang', HEXTORAW('01'), HEXTORAW('11'));
insert into xdb.xdb$qname_id values (HEXTORAW('03'), 'type', HEXTORAW('01'), HEXTORAW('12'));
insert into xdb.xdb$qname_id values (HEXTORAW('03'), 'nil', HEXTORAW('01'), HEXTORAW('13'));
insert into xdb.xdb$qname_id values (HEXTORAW('03'), 'schemaLocation', HEXTORAW('01'), HEXTORAW('14'));
insert into xdb.xdb$qname_id values (HEXTORAW('03'), 'noNamespaceSchemaLocation', HEXTORAW('01'), HEXTORAW('15'));
insert into xdb.xdb$qname_id values (HEXTORAW('02'), 'xmlns', HEXTORAW('01'), HEXTORAW('16'));

commit;

* import any user N-data


important:

Do NOT use the UTLNCHAR.SQL or N_SWITCH.SQL script.
Using this a to try to go from UTF8 to AL16UTF16 (or inverse)
will corrupt existing NCHAR data !!!!!!
It is to be used only in specific conditions when upgrading from 8i to 9i

7) Is the AL32UTF8 problem the same as the AL16UTF16 / do I need the same patches?
----------------------------------------------------------------------------------
No, they may look similar but are 2 different issues.

For information about the possible AL32UTF8 issue please see
Note 237593.1 Problems connecting to AL32UTF8 databases from older versions (8i and lower)

8) But I still want <characterset> as NLS_NCHAR_CHARACTERSET, like I had in 8(i)!
---------------------------------------------------------------------------------

This is simply not possible.

From 9i onwards the NLS_NCHAR_CHARACTERSET can have only 2 values: UTF8 or AL16UTF16.

Both UTF8 and AL16UTF16 are unicode charactersets, so they can
store whatever <characterset> you had as NLS_NCHAR_CHARACTERSET in 8(i).

If you are not using N-types then keep the default AL16UTF16 (or use UTF8 if you really want),
it doesn't matter if you don't use the N-types.

There is one condition in which this "limitation" can have a undisired affect,
when you are importing an Oracle8i Transportable Tablespace into Oracle9i
you can run into a ORA-19736 (as wel with AL16UTF16 as with UTF8).

Simply provide the 8i output of:

select distinct OWNER, TABLE_NAME from DBA_TAB_COLUMNS where DATA_TYPE in ('NCHAR','NVARCHAR2', 'NCLOB');

In that case log a TAR, refer to this note and ask to assign the TAR to the
NLS/globalization team. That team can then assist you to work around this
issue in a easy way.
Do NOT try to change the national characterset in 8i to AL16UTF16 or update system tables
like you find sometimes on "oracle dba sites" on the internet if you don't want to
test your backup strategy.

9) Do i need to set NLS_LANG to AL16UTF16 when creating/using the NLS_NCHAR_CHARACTERSET ?
------------------------------------------------------------------------------------------

As clearly stated in
Note 158577.1 NLS_LANG Explained (How does Client-Server Character Conversion Work?)
point "1.2 What is this NLS_LANG thing anyway?"

* NLS_LANG is used to let Oracle know what characterset you client's OS is USING
so that Oracle can do (if needed) conversion from the client's characterset to the
database characterset.

NLS_LANG is a CLIENT parameter has has no influence on the database side.

10) I try to use AL32UTF8 as NLS_NCHAR_CHARACTERSET but it fails with ORA-12714
-------------------------------------------------------------------------------

From 9i onwards the NLS_NCHAR_CHARACTERSET can have only 2 values:
UTF8 or AL16UTF16.

UTF8 is possible so that you can use it (when needed) for 8.x backwards compatibility.
In all other conditions AL16UTF16 is the preferred and best value.
AL16UTF16 has the same unicode revision as AL23UTF8,
so there is no need for AL32UTF8 as NLS_NCHAR_CHARACTERSET.

11) I have the message "( possible ncharset conversion )" during import.
------------------------------------------------------------------------

in the import log you see something similar to this:

Import: Release 9.2.0.4.0 - Production on Fri Jul 9 11:02:42 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to: Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
JServer Release 9.2.0.4.0 - Production
Export file created by EXPORT:V08.01.07 via direct path
import done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
export server uses WE8ISO8859P1 NCHAR character set (possible ncharset conversion)

This is normal and is not a error condition.

- If you do not use N-types then this is a pure informative message.

- But even in the case that you use N-types like NCHAR or NCLOB then this is not a problem:

* the database will convert from the "old" NCHAR characterset to the new one automatically.
(and - unlike the "normal" characterset - the NLS_LANG has no impact on this conversion
during exp/imp)

* AL16UTF16 or UTF8 (the only 2 possible values in 9i) are unicode characterset and so
can store any character... So no data loss is to be expected.

12) Can i use AL16UTF16 as NLS_CHARACTERSET ?
----------------------------------------------

No, AL16UTF16 can only be used as NLS_NCHAR_CHARACTERSET in 9i and above.
Trying to create a database with a AL16UTF16 NLS_CHARACTERSET will fail.

13) I'm inserting <special character> in a Nchar or Nvarchar2 col but it comes back as ? ...
--------------------------------------------------------------------------------------------------

see point 14 in Note 227330.1 Character Sets & Conversion - Frequently Asked Questions

14) Do i need to change the NLS_NCHAR_CHARACTERSET in 8i to UTF8 BEFORE upgrading to 9i/10g?
--------------------------------------------------------------------------------------------

No, see point 4) in this note.

15) Having a UTF8 NLS_CHARACTERSET db is there a advantage to use AL16UTF16 N-types ?
-------------------------------------------------------------------------------------

There might be 2 reasons:

a) one possible advantage is storage (disk space) for NCHAR/NVARCHAR2.

UTF8 uses 1 up to 3 bytes, AL16UTF16 always 2 bytes.

If you have a lot of non-western data (cyrillic, Chinese, Japanese, Hindi languages..)
then it can be advantageous to use N-types for those columns seen those characters will use
3 bytes in UTF8 and 2 bytes in AL16UTF16.

For western data (english, french, spanish, dutch, german, portuguese etc...)
UTF8 will use in most cases less disk space then AL16UTF16.

Note 260893.1 Unicode character sets in the Oracle database

This is NOT true for NCLOB and CLOB, they are both encoded a internal fixed-width Unicode character set
Note 258114.1 Possible action for CLOB/NCLOBrage after 10g upgrade
so they will use the same amount of disk space.

b) other possible advantage is extending the limits of CHAR semantics

For a single-byte character set encoding, the character and byte length are
the same. However, multi-byte character set encodings do not correspond to
the bytes, making sizing the column more difficult.

Hence the reason why CHAR semantics was introduced. However, we still have some
physical underlying byte based limits and development has choosen to allow full usage
of the underlying limits. This results in the following table giving the maximum amount
of CHARarcters occupying the MAX datalength that can be stored for a certain
datatype in 9i and up.

The MAX colum is the MAXIMUM amount of CHARACTERS that can be stored
occupying the MAXIMUM data length. Seen that UTF8 and AL32UTF8 are VARRYING
charactersets this means that a string of X chars can be X to X*3 (or X*4 for AL32) bytes.

The MIN col is the maximum size that you can *define* and that Oracle can store if all data
is the MINIMUM datalength (1 byte for AL32UTF8 and UTF8) for that characet.

N-types (NVARCHAR2, NCHAR) are *always* defined in CHAR semantics, you cannot define them in BYTE.

All numbers are CHAR definitions.


UTF8 (1 to 3 bytes) AL32UTF8 (1 to 4 bytes) AL16UTF16 ( 2 bytes)
MIN MAX MIN MAX MIN MAX
CHAR 2000 666 2000 500 N/A N/A

VARCHAR2 4000 1333 4000 1000 N/A N/A

NCHAR 2000 666 N/A N/A 1000 1000

NVARCHAR2 4000 1333 N/A N/A 2000 2000

(N/A means not possible)

This means that if you try to store more then 666 characters
that occupy 3 bytes in UTF8 in a CHAR UTF8 colum you still will get a
ORA-01401: inserted value too large for column
(or from 10g onwards: ORA-12899: value too large for column )
error, even if you have defined the colum as CHAR (2000 CHAR)
so here it might be a good idea to define that column as NCHAR
that will raise the MAX to 1000 char's ...

Note 144808.1 Examples and limits of BYTE and CHAR semantics usage

Disadvantages using N-types:

* You might have some problems with older clients if using AL16UTF16
see point 6) b) in this note
* Be sure that you use (AL32)UTF8 as NLS_CHARACTERSET , otherwise you will run into
point 13 of this note.
* Do not expect a higher *performance* by using AL16UTF16, it might be faster
on some systems, but that has more to do with I/O then with the database kernel.
* Forms 6i/9i does not support NCHAR / NVARCHAR2.
This is documented in the 6i Forms online help.
and in Note 258195.1 Oracle9 Features not yet Supported in Forms 9i
* If you use N-types, DO use the (N'...') syntax when coding it so that Literals are
denoted as being in the national character set by prepending letter 'N', for example:

create table test(a nvarchar2(100));
insert into test values(N'this is NLS_NCHAR_CHARACTERSET string');

Normally you will choose to use Char/Varchar2 (using a (AL32)UTF8 NLS_CHARACTERSET)
for simplicity, to avoid confusion and possible other limitations who might be
imposed by your application or programming language to the usage of N-types.

16) I have a message running DBUA (Database Upgrade Assistant) about NCHAR type when upgrading from 8i .
--------------------------------------------------------------------------------------------------------

see point 16 in Note 227330.1 Character Sets & Conversion - Frequently Asked Questions

17) How to go from an UTF8 NLS_NCHAR_CHARTERSET to AL16UTF16?
-------------------------------------------------------------

Befor going from UTF8 to AL16UTF16 you need to see that you don't have any
NCHAR bigger then 1000 CHAR or NVARCHAR2 column bigger then 2000 CHAR

select distinct OWNER, TABLE_NAME, COLUMN_NAME, CHAR_LENGTH from DBA_TAB_COLUMNS where DATA_TYPE='NCHAR' and CHAR_LENGTH > 1000;
select distinct OWNER, TABLE_NAME, COLUMN_NAME, CHAR_LENGTH from DBA_TAB_COLUMNS where DATA_TYPE='NVARCHAR2' and CHAR_LENGTH > 2000;

or the ALTER DATABASE NATIONAL CHARACTER SET AL16UTF16; / Csalter will fail

You will need to adapt those columns after exporting the User N-data (if any).

you can ignore for the moment SYS.DBA_FGA_AUDIT_TRAIL|SQL_TEXT if this is 4000 and change to AL16UTF16
-> select CHAR_LENGTH from DBA_TAB_COLUMNS where OWNER='SYS' and TABLE_NAME='DBA_FGA_AUDIT_TRAIL' and COLUMN_NAME='SQL_TEXT';
And then after the change to AL16UTF16 run SQL> @?\rdbms\admin\catfga.sql

The procedure is just the same as in point 6D) simply use AL16UTF16 instead of UTF8 as characterset.

Related Documents:
------------------
Note 62107.1 The National Character Set in Oracle8
Note 227330.1 Character Sets & Conversion - Frequently Asked Questions
Note 227332.1 NLS considerations in Import/Export - Frequently Asked Questions

Note 158577.1 NLS_LANG Explained (How does Client-Server nversion Work?)
Note 159657.1 Complete Upgrade Checklist for Manual Upgrades from 8.X.0.1 to Oracle9i
Note 278725.1 utlnchar.sql and n_switch.sql fail with ORA-01735 on "non-standard" object names
Note 260893.1 Unicode character sets in the Oracle database
Note 144808.1 Examples and limits of BYTE and CHAR semantics usage

Note 237593.1 Problems connecting to AL32UTF8 databases from older versions (8i and lower)
Note 140014.1 ALERT Oracle8/8i to Oracle9i using New "AL16UTF16" National Character Set
Note 236231.1 New Character Sets Not Supported For Use With Developer 6i And Older Versions

Note 258114.1 Possible action for CLOB/NCLOB storage after 10g upgrade
Note 267356.1 Character set conversion when using DBMS_LOB

For further NLS / Globalization information you may start here:
Note 60134.1 Globalization Technology (NLS) - Frequently asked Questions
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 8. 25. 11:23
반응형

1. 새로운 undo tablespace를 다음과 같이 생성한다.

CREATE UNDO TABLESPACE UNDOTBS2
DATAFILE '/oradata/undotbs02.dbf' SIZE 2048M;

2. undo tablespace의 이름을 변경하려면 다음과 같이 실행한다.

ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS2;

3 기존 undo tablespace 를 drop한다.

DROP TABLESPACE "UNDOTBS1" INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

4. drop 한 undo datafile을 지운다





반응형

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

ORACLE TABLESPACE 관리  (0) 2009.09.15
The National Character Set in Oracle 9i, 10g and 11g  (0) 2009.09.11
Table생성 스크립트 파일 뽑아내기  (0) 2009.08.12
인덱스의 유효성 검사  (6) 2009.07.03
SPFILE 사용  (0) 2009.06.29
Posted by [PineTree]
ORACLE/ADMIN2009. 8. 12. 20:54
반응형
Table생성 스크립트 파일 뽑아내기 

작성자 : 한준희
출처 : www.en-core.com 질문과 답변 게시판..


[질문]

현재 DB에 존재하는 Table에 대하여
Create Table .. Storage부분 포함하여
스크립파일로 뽑아낼수 있는 방법이 있나요?



[답변]

방법은 있습니다.

일단 스텝을 알려드릴테니 한번 해보시길...
( 어제도 이 작업을 통해 스크립트를 뽑았는데..^^)

스크립팅할 유저명과 패스워드를 scott/tiger라 하겠습니다.


1) export를 할때 데이터는 만들지 않고 schema image만 뽑아냅니다.
(만약 export를 받은 파일이 이미 있으시다면 1번 항목은 생략하셔도 됩니다.)

exp scott/tiger file=exp.dmp compress=n rows=n



2) 1번 스텝과 같이 해서 성공한 export dump파일을 이용하여 create script를 만드는 방법입니다.
이 방법은 import라는 유틸리티를 사용하여 작업을 합니다.

imp scott/tiger file=exp.dmp indexfile=create_table.sql full=y



3) 요렇게 하면 create_table.sql이라는게 생성됩니다.
vi나 편집기로 여시면 REM이라는 코멘트로 앞부분이 막혀 있을 겁니다.
이걸 모두 없애시면 그야말로 DBMS내에 있는 형태 그대로 만들어진 Table Create Scripts입니다.

반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 7. 3. 19:43
반응형

1. 분석 자료의 수집


인덱스 분석 자료를 수집 합니다.

  - 모든 인덱스 블록을 검사하여 블록 훼손을 조사합니다.     

  - 인덱스에 대한 정보를 가지고 있는 INDEX_STATS 데이터 사전에 기록 됩니다.
 
 




SQLPLUS storm/storm


-- 인덱스 분석
SQL>ANALYZE INDEX board_pk VALIDATE STRUCTURE;
 
인덱스가 분석 되었습니다.

 


2. 인덱스 분석 수집 정보 확인
 

 ANALYZE INDEX명령을 수행 한 후 INDEX_STATS를 조회 합니다.
  
SQL>SELECT blocks,  btree_space,  used_space,  pct_used "사용율(%)",
                    lf_rows,  del_lf_rows "삭제행"
        FROM  INDEX_STATS;
  
  
      BLOCKS BTREE_SPACE USED_SPACE  사용율(%)    LF_ROWS     삭제행
   ---------- -----------    ----------       ----------    ----------    ----------
         5          23984             12489                53                  892            51
1 row selected.
 
 
  - 인덱스가 삭제된 행이 많으면 인덱스를 재구축 해야 합니다.

  - 예를 들어 LF_ROW에 대한 DEL_LF_ROWS의 비가 30%를 초과하면 인덱스를 재구축 해야 합니다.
  
 
-- 인덱스의 재구축..
SQL>ALTER INDEX board_pk
        REBUILD  ;

 인덱스가 변경되었습니다.
 
 
-- 분석 자료의 수집
SQL>ANALYZE INDEX board_pk VALIDATE STRUCTURE;
 
인덱스가 분석되었습니다.
 
 
-- 다시 index_stats를 조회 하면 삭제행이 0으로 나오는 것을 확인 할 수 있습니다.
SQL>SELECT blocks, btree_space, used_space, pct_used "사용율(%)",
                   lf_rows, del_lf_rows "삭제행"
        FROM INDEX_STATS;
 
    BLOCKS BTREE_SPACE USED_SPACE  사용율(%)    LF_ROWS     삭제행
   ---------- -----------    ----------    ----------    ----------    ----------
              5          24032         11775              49                841              0
 

  ================================================
    * 데이터베이스 정보공유 커뮤니티 oracleclub.com
    * 강좌 작성자 : 김정식 (oramaster _at_ naver.com)
  ================================================
※ oracleclub 강좌를 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
※ oracleclub 강좌는 개인의 학습용으로만 사용 할 수 있습니다. 학원 홍보용이나 수익을 얻기 위한 용도로
    사용을 하시면 안됩니다. ^^
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 6. 29. 15:14
반응형
9I의 SPFILE 사용에 대해서
========================


PURPOSE
-------
Oracle9i부터는 database의 initial parameter를 지정하는 initSID.ora file외에
server parameter file이라고 불리는 spfileSID.ora가 새로 소개되었다.
이 spfile을 사용하게 되면 alter system을 통해 database가 운영 중에
parameter를 수정할 수 있게 되면서 parameter 수정때마다 database를 restart
시켜야 하는 필요을 줄여주고, 앞으로 소개될 dynamic한 server tuning에
중요한 역할을 할 수 있다.

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

이 문서에서는 이러한 spfile에 대해서 실제 사용하면서 알아두어야 할 다음과
같은 내용에 대해서 정리하였다.


1. spfile을 vi로 직접 변경한 경우의 영향
2. db open시 spfile을 읽었는지 확인하는 방법
3. initSID.ora를 spfileSID.ora로 migration하거나 그 반대의 방법
4. alter system으로 parameter변경시 scope에 대해서
5. v$parameter와 v$spparameter에 대해서 (static parameter 확인)


1. spfileSID.ora 화일을 vi로 직접 변경한 경우의 영향

spfile이 크기 않은 관계로 vi등으로 읽으면 마치 text 화일처럼 parameter가
보이는데 이 화일은 실제로는 binary file로 직접 변경하면 안된다.
특히 이 화일의 header에는 checksum과 기본적인 meta-data 정보등을
포함하여 manual하게 변경하게 되면 이 checksum의 값이 맞지 않게 되면서,
이후 startup시 이 화일을 읽지 않고 initSID.ora file을 읽게 된다.

db를 운영하면서 spfile에 계속 parameter가 변경된 경우라면 이러한 문제로
tuning등을 통해 변경된 parameter value를 모두 잃게될 수 있는것이다.


2. db open 시 spfile을 읽었는지 확인하는 방법

db가 open 시에 참조한 initial parameter file이 무엇인지를 확인하기
위해서는 다음과 같이 조회하면 된다.

SQL> show parameter pfile

NAME TYPE VALUE
------------------------------ ----------- ---------------------
spfile string ?/dbs/spfile@.ora


여기에서 ?는 ORACLE_HOME을 나타내고 @는 SID를 나타낸다.


3. initSID.ora를 spfileSID.ora로 migration하거나 그 반대의 방법

spfile을 사용하다가 그 화일의 내용을 initSID.ora에 backup 차원에서
반영시켜 두거나, 혹은 spfile대신 initSID.ora를 사용하고자 하는 경우,
또는 반대로 initSID.ora를 참조하여 spfileSID.ora를 생성하고 하는
경우 다음과 같이 간단히 작업하면 된다.

SQL>connect / as sysdba
SQL>create pfile='initORA9i.ora' from spfile='spfileORA9i.ora';
SQL>create spfile='spfileORA9i.ora' from pfile='initORA9i.ora';

위 문장에서 화일명 대신 직접 directory까지 절대 path로 지정할 수 있고,
화일명은 임의로 지정 후 나중에 사용시 initSID.ora나 spfileSID.ora 형태로
만들어줄 수 있다.

default인 $ORACLE_HOME/dbs directory이고 SID가 붙는 이름 형태이면 간단히,
다음과 같이 지정하여도 된다.

SQL>create pfile from spfile;
SQL>create spfile from pfile;

sysdba 권한이 없으면 권한 부족 오류가 발생한다.

4. alter system으로 parameter 변경 시 scope에 대해서

spfile을 사용하게 되면 앞에서도 언급한 것과 같이 spfile을 직접 변경하는
대신 alter system command를 통해 initial parameter를 수정할 수 있다.

단 이때 alter system command 뒤에 scope를 지정할 수 있는 데 scope로
지정가능한 값은 memory/spfile/both 세가지가 된다.
memory가 이중 default여서 scope를 지정하지 않으면 memory가 된다.

memory: 변경이 현재 상태에만 영향을 미치며 db가 restartup되면,
변경 이전값으로 돌아간다.
spfile: 변경 내용을 spfile에만 저장하고 현재 상태에는 영향을 미치지
않게 한다.
static parameter의 경우는 이 scope만이 지정가능하다.
즉, spfile을 사용하더라도 static parameter에 대해서는 db
운영중에 바로 값을 변경하여 restartup없이 반영하는 것은 불가능
한 것이다.
both: 변경 내용을 현재상태에도 바로 반영하고, spfile에도 반영시켜,
이후 rebooting시에도 영향을 미치도록 한다.

지정하는 방법은 다음과 같다.

SQL>alter system set open_cursors=300;
SQL>alter system set open_cursors=300 scope=spfile;
SQL>alter system set open_cursors=300 scope=both;

단, spfile을 참조하지 않고 init.ora를 참조하여 db가 open한 경우 이러한
alter system 명령을 통해 initial parameter를 변경하려고 하면
다음과 같은 오류가 발생한다.

특히 spfile에 외부의 변경이 가해져 spfile이 참조되지 않은 경우에 주로
다음 오류를 만날 수 있다.

ORA-02095: specified initialization parameter cannot be modified


5. v$parameter와 v$spparameter에 대해서 (static parameter 확인)

initial parameter의 종류에는 db가 운영 중에는 바로 그 값을 변경하여
반영시킬 수 없고, 다음 startup 후에만 변경된 값이 영향을 주게되는
parameter가 있다.
이러한 parameter를 static parameter라고 부른다.

이 static parameter의 경우는 그래서 alter system으로 변경하더라도,
scope=spfile 로만 지정 가능한 것이다.
이러한 static parameter를 scope를 지정 안 해서 memory로 하거나 both로
하게 되면 4번에서 설명한 ORA-2095 오류가 발생하게 된다.

그럼 static parameter는 어떻게 확인할 수 있는가?

SQL>select name, issys_modifiable from v$parameter;

여기에서 보면, issys_modifiable의 값으로 다음 세 가지가 나타난다.

FLASE: static parameter로 scope=spfile로만 값을 변경 가능하다.
즉 값을 변경해도 이후 startup 시부터 영향을 미치게 된다.
IMMEDIATE: 값을 변경하면 현재 session부터 바로 영향을 받게된다.
DEFERRED: 변경된 값이 이후 접속되는 session부터 영향을 준다.


alter system을 통해 parameter를 변경하는 경우 변경된 값이 반영이 잘
되었는가를 확인하려면 다음과 같이 show parameter나 v$parameter를
조회하고, 현재 반영은 안 되었더라도 spfile에 저장은 되었는지를 확인하
려면 v$spparameter를 조회하면 된다.

SQL>show parameter open_cursors
SQL>select value from v$prameter where name = 'open_cursors';
SQL>select value from v$spparameter where name = 'open_cursors';

즉, scope=spfile로 parameter를 변경한 경우는 v$spparameter에만 변경
된 값이 나타나고, show parameter나 v$parameter에서는 변경 전 값이
나타나게 된다.
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 6. 11. 14:09
반응형
출처 : http://pigmon.tistory.com/144?srchid=BR1http%3A%2F%2Fpigmon.tistory.com%2F144

DBLink를 이용할 일이 있어서 찾아보다가 나온 내용을 정리한다.

CREATE PUBLIC DATABASE LINK "Link명"
CONNECT TO DB이용자ID
IDENTIFIED BY "DB이용자비밀번호"
USING '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 원격DB IP)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = 원격DB SID)
    )
  )';


DB링크 이용
쿼리
SELECT * FROM foo@DBLink

Function
SELECT function@DBLink명(parameter...) FROM dual
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 4. 22. 09:43
반응형

LOB, LONG, LONG RAW 데이터 타입 간의 비교


PURPOSE
-------------
이 문서는 LOB 데이터 타입과 LONG이나 LONG Raw 데이터 타입의 차이점 및 LOB 사용에 따라 발생하는 제약 사항을 기술하는 데 목적이 있다.

Explanation
---------------
LOB (Large Object)는 LONG이나, LONG RAW 데이터 타입과 유사하지만, 일부 차이점이 존재한다.

1.
테이블의 한 ROW에 여러 LOB 컬럼이 있을 수 있는 반면, LONG 또는 LONG RAW 컬럼은 한 ROW에 하나 밖에 사용될 수 없다.

2. LOB는 사용자 정의 데이터 타입 (user-defined datatype)의 속성 (attribute) 으로 사용될 수 있는 반면, LONG이나 LONG RAW는 속성으로 사용될 수 없다.

3.
LONG 또는 LONG RAW는 값 전체가 테이블 내에 저장이 되는 반면, LOB는 테이블 컬럼
내에 LOB locator만 저장이된다.
BLOB과 CLOB (내부 LOB) 데이터는 별도의 테이블스페이스에 저장시킬 수 있으며, BFILE (외부 LOB) 데이터는 데이터베이스 외부의 별도 파일로 존재한다. 따라서 LOB 컬럼을 액세스할 경우에는, locator 값만 return되는 반면, LONG이나 LONG RAW 컬럼을 액세스할 경우에는, 전체 값이 return된다.

4. LOB 데이터는 4GB까지 저장이 가능하며, BFILE 컬럼이 가리키는 파일 크기는 4GB 이내에서 OS에서 지원하는 최대 크기까지 가능하다. 액세스 가능한 범위는 1부터 (232-1) 까지이다. 한편 LONG이나 LONG RAW 데이터 타입에서는 2GB 까지만 지원이 가능하다.

5. 데이터에 대한 랜덤 액세스 기능 또는 데이터 조작을 할 경우 LOB를 사용하는 것이 LONG 또는 LONG RAW를 사용하는 것에 비해 훨씬 많은 기능을 사용할 수 있다.

6.
LOB는 랜덤 액세스가 가능한 반면, LONG 타입에 저장된 데이터는 처음부터 원하는 지점까지 순차적으로 읽어 처리하여야 한다.

7.
LOB 데이터에 대한 replication을 local 또는 remote에서 수행할 수 있는 반면, LONG / LONG RAW 컬럼 데이터는 replication이 되지 않는다.

8.
LONG 컬럼의 데이터는 TO_LOB()라는 함수를 사용하여 LOB로 변환 가능하지만,
LOB를 LONG / LONG RAW로 변환 하는 기능은 제공되지 않는다
.



한편, LOB 사용을 하는데 다음과 같은 제약 사항이 따른다.

1. LOB는 클러스터 테이블에서는 사용할 수 없으며, 따라서 클러스터 키로도 사용할 수 없다.

2.
LOB 컬럼은 GROUP BY, ORDER BY, SELECT DISTINCT 등에 사용할 수 없으며
JOIN 에도 사용할 수 없다.
그러나 LOB 컬럼을 사용하는 테이블에 대한 UNION ALL은 지원이 된다. UNION MINUS나 SELECT DISTINCT는 OBJECT TYPE의 MAP이나 ORDER 함수가 정의된 경우 사용할 수 있다.

3. LOB 컬럼은 ANALYZE ... COMPUTE/ESTIMATE STATISTICS 명령 사용 시에도
analyze 되지 않는다.

4. LOB는 파티션된 IOT (Index Organized Table)에는 사용할 수 없다. 그러나
파티션 되어 있지 않은 IOT에는 사용할 수 있다.

5. LOB는 VARRAY에는 사용할 수 없다.

6. NCLOB은 OBJECT TYPE의 속성(attribute)으로 사용될 수 없으나, 메소드 정의를
하는 데는 NCLOB 파라미터를 사용할 수 있다.


Reference Documents
-------------------
Oracle8i Application Developer's Guide
Note:107441.1

출처 : Technical Bulletin



반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 4. 15. 16:04
반응형
☞ 데이터베이스 링크(Database Link)

   데이터베이스 링크는 클라이언트 또는 현재의 데이터베이스에서 네트워크상의 다른 데이터베이스에
접속하기 위한 접속 설정을 정의하는 오라클 객체 입니다.


◈ 우선 고려되어야 사항은 ORACLE INSTANCE가 두개이상이고 각각의 HOST NAME과 ORACLE_SID는
    다르고  NLS_CHARACTER_SET은 동일하게 되어 있어야 합니다.

  - 만약 같은 MECHINE에서  INSTANCE의 ORACLE_SID가 같다면 TNS ERROR가 발생 합니다.
  - 또한 미래를 위해 다른 MECHINE이라 할지라도 ORACLE_SID는 규칙에 의해 다르게 가져가는
    것이 좋습니다.
  - 그리고 NLS_CHARACTER_SET이 동일하게 되어 있지 않으면 DATA 입출력시 ?????로 나타납니다.
  - 데이터베이스 링크로 연결되는 서버에 리스너가 꼭 띄어져 있어야 됩니다


[Syntax]


 - PUBLIC : 오라클 시노님과 마찬가지로 PUBLIC 옵션을 사용하면 공용 데이터베이스 링크를 생성
                할 수 있습니다.  PUBLIC 옵션을 사용하지 않으면 링크를 생성한 자신만 사용 할 수 있습니다.

 - link_name : 데이터베이스 링크의 이름을 지정 합니다.

 - service_name : 네트워크 접속에 사용할 오라클 데이터베이스 네트워크 서비스명을 지정 합니다.

 - username, password : 오라클 사용자명과 비밀번호를 지정 합니다.

 

☞ 데이터베이스 링크의 사용

-- 데이터베이스 링크 생성 예제

SQL>CREATE DATABASE LINK test_server
       CONNECT TO scott IDENTIFIED BY tiger USING ’testdb’;

 이 데이터베이스 링크 생성 문장에서 USING다음에 오는 testdb는 tnsnames.ora파일에 정의되어
있어야 합니다.

====== tnsnames.ora =====
testdb =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 211.109.12.123)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oracle)
    )
  )
=========================
 
-- 데이터베이스 링크를 통한 데이터의 조회..
SQL>SELECT ename FROM emp@test_server;
 
 
--시노님을 생성해서 사용하면 더욱더 편리하게 사용 할 수 있습니다.
SQL> CREATE SYNONYM emplink FOR emp@test_server;  
 
 
-- 시노님을 통한 조회
SQL>SELECT ename FROM emplink;    
 
 
데이터베이스 링크의 삭제..
SQL>DROP DATABASE LINK test_server;

  ================================================
    * 데이터베이스 정보공유 커뮤니티 oracleclub.com
    * 강좌 작성자 : 김정식 (oramaster _at_ naver.com)
  ================================================


반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 4. 10. 17:28
반응형

출처 : http://www.oracleclub.com/article/24469

[ DB Server의 dba group 아닌 다른 Unix 계정에 대해서 sqlplus 및 TNSNAMES.ORA 참조 환경 구성 ]

단계 1. DB Server의 dba group 아닌 Unix 계정에 대해서 sqlplus 등을 실행 권한 부여하기

단계 2. DB Server의 dba group 아닌 Unix 계정에 대해서 tnsnames.ora Lookup 권한 부여하기

단계 1) 실행 화일 권한 부여하기

예제    : Oracle DBMS 가 설치된 UNIX/LINUX 에 다른 계정(dba group)이 아닌 경우,
          $ORACLE_HOHE/bin 에 존재하는 화일(거이 여기 존재 sqlplus, tkprof, exp, imp) 에 권한 부여하기
         
Summary : Oracle Database 가 설치된 곳에서 Oracle_Home 아래의 Bin(실행화일 sqlplus 등) 에 대한 퍼미션이
          Oracle Patch 중 제한적으로 바뀌면 이것을 허용(덜 보안적으로) 하기 위해서는 아래 쉘을 실행 한다.
          $ cd $ORACLE_HOME/install  $ ./changePerm.sh

출처 : 메타링크
문서 번호 : 공지:438676.1
The script is located in the ORACLE_HOME/install directory on Unix and Linux systems (there is no equivalent for Windows).
This script ships with Oracle Database versions 9.2.0.8 and Oracle 10g releases.
Output when the changePerm.sh script is executed:

$ cd $ORACLE_HOME/install
$ ./changePerm.sh
-------------------------------------------------------------------------------
Disclaimer: The purpose of this script is to relax permissions on some of the
files in the database Oracle Home so that all clients can access them.
Please note that Oracle Corporation recommends using the most restrictive file
permissions as possible for your given implementation. Running this script
should be done only after considering all security ramifications.
-------------------------------------------------------------------------------

Do you wish to continue (y/n) : y
Finished running the script successfully

Please see /tmp/changePerm_err.log for errors and /tmp/changePerm.log for the log of events

This script should be run by Oracle Software owner to relax the permission and can be run while database processes are active.

단계 2 ) TNSNAMES.ORA 공유하기
 
 UNIX 환경에서 ORACLE 과 다른 그룹에서 SQLPLUS / EXPORT / TNSPING 을 사용하기 위해서는
 changePerm.sh을  수행 하여 화일 Permission 을 부여 하고, PATH 를 지정하면 가능하다.
 그렇다면 이제 TNSNAMES.ORA 를 공유 하기 위해서는 어떻게 해야 할까?
 답은 TNS_ADMIN 을 통해서 가능하다.
 주의 사항 : tnsnames.ora 화일에 대한 퍼미션이 있어야 한다.
 tnsnames.ora 를 Lookup 할 필요가 있는 계정의 .profile 에 아래와 같이 설정한다.
 $ id
 testuser
 $ more .profile
 # Setting PATH for sqlplus / tnsping / exp / imp
 export ORACLE_BASE=/app/oracle
 export ORACLE_HOME=$ORACLE_BASE/product/10.2.0
 export PATH=$ORACLE_HOME/bin:$PATH:
 # Setting PATH for tnsnames.ora
 export TNS_ADMIN=$ORACLE_HOME/network/admin

반응형
Posted by [PineTree]