//구글광고

오라클 DB - JSP vo(beans), DAO, DTO 생성 스크립트 v3


이전포스트에서 사용하던 스크립트를 조금 다듬었다.

(이전포스트 : http://kimazfactory.tistory.com/40 )

사용방법
1 ) sqlplus 에서 해당 유저로 로그인 하여 mktbltovo3.sql 을 실행한다.


2) ENTER TABLE_NAME > 라는 프롬프트가 뜨면 테이블 명을 입력한다.

이전버전에는 대문자로만 입력했어야 하는데 이제 대소문자 가리지 않게 수정했다.



테이블 이름을 입력하면 해당 테이블에 제일처음

VO를 만들기 위한 선언문이 나오고


2번째 화면에 DAO 에 insert 문을 생성하기 위한 SQL구문과

set 구문을 생성해준다.


이번 버전에서 물음표와 컬럼이름 뒤에 컴마를 수정했다.



3번째 화면에서 셀렉트 구문을 생성하기 위해서 사용하는

Vo에 값을 set 하는 구문을 생성해준다.



버그 제보 및 기능개선을 비밀 댓글로

출처는 표기해서 가져가시고 비밀 댓글로 퍼간다는 멘트정도 남겨주시고

드래그해서 컨트롤 C  안되는 곳에는 절대 배포 금지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
REM ********************************************************
REM * 명    칭 : mkTblToVo
REM * 목    적 : 테이블 컬럼을 jsp용 VO 로 변경해주는 스크립트
REM *
REM *
REM * 파라미터 :  p1, p2, p3 ..
REM *
REM * 작 성 자 :  2018/06/01  김과장 (kimazfactory@gmail.com)
REM * 수정이력 :   v3 컴마수 맞추기
REM * 메    모 :   12/04 Select DAO 용 구문 추가
REM *                12/06 컴마수 맞추기
REM ********************************************************
SET SERVEROUTPUT ON size 1000000
SET PAGESIZE 10000
SET FEEDBACK OFF
SET ECHO OFF
SET VERIFY OFF
SET LINESIZE 300
SET HEADING OFF
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI';
ACCEPT TABLE_NAME PROMPT 'ENTER TABLE_NAME >'
declare
 lvar_col_name   varchar2(512) := '';
 lvar_data_type  varchar2(512) := '';
 lvar_index1 number:=0;
 lvar_index2 number:=0;
 CURSOR cur_column IS
        select column_name, data_type from user_tab_cols where table_name=upper('&TABLE_NAME'order by COLUMN_ID;
 begin
 OPEN cur_column;
dbms_output.put_line('');
dbms_output.put_line('VO information of table : &TABLE_NAME');
dbms_output.put_line('');
dbms_output.put_line('----------------------------------------------');
dbms_output.put_line('');
 LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      EXIT WHEN cur_column%NOTFOUND;
          IF    lvar_data_type = 'VARCHAR2'  then dbms_output.put_line('private String '||lvar_col_name||';');
          ELSIF lvar_data_type = 'NUMBER'  then dbms_output.put_line('private int '||lvar_col_name||';');
          ELSIF lvar_data_type = 'DATE'  then dbms_output.put_line('private Timestamp '||lvar_col_name||';');
          ELSE dbms_output.put_line('--Check it!!!-- '||lvar_col_name||';');
          END IF;
 END LOOP;
  CLOSE cur_column;
  OPEN cur_column;
  dbms_output.put_line('');
  dbms_output.put_line('----------------------------------------------');
  dbms_output.put_line('');
dbms_output.put_line('Insert DAO Query for : &TABLE_NAME');
  dbms_output.put_line('');
  dbms_output.put('String sql="insert into &TABLE_NAME (');
 lvar_index1 :=0;
 LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      IF cur_column%NOTFOUND THEN
      EXIT;
      ELSE
           IF  lvar_index1 > 0 THEN
            dbms_output.put(',');
           END IF;
      END IF;
      dbms_output.put(lvar_col_name);
      lvar_index1 :=  lvar_index1+1;
END LOOP;
  dbms_output.put(') values (');
  CLOSE cur_column;
    OPEN cur_column;
 lvar_index1 :=0;
 LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      IF cur_column%NOTFOUND THEN
      EXIT;
      ELSE
           IF  lvar_index1 > 0 THEN
            dbms_output.put(',');
           END IF;
      END IF;
      dbms_output.put('?');
      lvar_index1 :=  lvar_index1+1;
 END LOOP;
  dbms_output.put(')";');
  CLOSE cur_column;
  dbms_output.put_line('');
  OPEN cur_column;
lvar_index2:=1;
  LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      EXIT WHEN cur_column%NOTFOUND;
          IF    lvar_data_type = 'VARCHAR2'  then dbms_output.put_line('pstmt.setString('||lvar_index2||', dVo.get'||lvar_col_name||'());');
          ELSIF lvar_data_type = 'NUMBER'  then dbms_output.put_line('pstmt.setInt('||lvar_index2||', dVo.get'||lvar_col_name||'());');
          ELSIF lvar_data_type = 'DATE'  then dbms_output.put_line('pstmt.setTimestamp('||lvar_index2||', dVo.get'||lvar_col_name||'());');
          ELSE dbms_output.put_line('--Check it!!!-- '||lvar_col_name||';');
          END IF;
  lvar_index2:=lvar_index2+1;
 END LOOP;
  CLOSE cur_column;
  dbms_output.put_line('');
  dbms_output.put_line('----------------------------------------------');
  dbms_output.put_line('');
dbms_output.put_line('SELECT DAO Query for : &TABLE_NAME');
  dbms_output.put_line('');
  OPEN cur_column;
  lvar_index2:=1;
  LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      EXIT WHEN cur_column%NOTFOUND;
          IF    lvar_data_type = 'VARCHAR2'  then dbms_output.put_line('Vo.set'||lvar_col_name||'(rs.getString('||lvar_index2||'));');
          ELSIF lvar_data_type = 'NUMBER'  then dbms_output.put_line('Vo.set'||lvar_col_name||'(rs.getInt('||lvar_index2||'));');
          ELSIF lvar_data_type = 'DATE'  then dbms_output.put_line('Vo.set'||lvar_col_name||'(rs.getTimestamp('||lvar_index2||'));');
          ELSE dbms_output.put_line('--Check it!!!-- '||lvar_col_name||';');
          END IF;
  lvar_index2:=lvar_index2+1;
 END LOOP;
  CLOSE cur_column;
  end;
/
cs




여기서  다운로드 하세요 >>>   

mkTblToVo3.sql




'oracle > sql' 카테고리의 다른 글

[오라클 내장함수1] oracle 문자열 함수  (0) 2018.11.21



ORACLE 내장함수 1. 문자열함수

ORACLE 문자열 함수


아래는 모두 단일행(Single row return) 함수다.



문자열 내장함수 표


 함수명

인자(입력값)

 리턴값 

LOWER

문자열

입력값을 소문자로 반환 

UPPER 

문자열

입력값을 대문자로 반환 

INITCAP 

문자열 

입력값의 첫문자를 대문자로, 나머지는 소문자로 반환 

 LPAD

문자열1, n[문자열 2] 

문자열1의 좌측에 문자열2의 문자를 채워 n자리로 만들어서 리턴 

RPAD 

문자열1, n[문자열 2] 

문자열 1의 우측에 문자열2의 문자를 채워 n 자리를 만들어서 리턴 

 SUBSTR

문자열, n[,m] 

 문자열의 n번째 문자부터 m개의 문자를 리턴

INSTR 

문자열1, 문자2 

문자열1 에서 문자2가 나오는 최초의 위치를 리턴 

 LTRIM

문자열 [.SET] 

문자열의 좌측부터 시작해서 SET문자열이 안나올때까지 문자를 삭제

  RTRIM

문자열 [.SET] 

문자열의 우측부터 시작해서 SET문자열이 안나올때까지 문자를 삭제 

 SOUNDEX

문자열 

지정한 단어와 발음이 동일한 문자열을 리턴 

 TRANSLATE

문자열, S1, S2 

모든 S1을 S2로 치환 한 후 리턴 

 CHR

문자열 

지정된수치와 일치하는 ASCII 코드를 리턴 

 ASCII

문자열 

지정된 문자의 ASCII 코드값을 리턴 

 REPLACE

문자열, STR1, STR2 

문자열에서 STR1을 모두 STR2로 치환후 리턴, STR2를 입력하지 않으면 문자열에서 STR1을 모두 삭제 

 CONCAT

 문자열1, 문자열2

문자열1과 문자열 2를 합쳐서 리턴한다.  

 TRIM

LEADING / TRAILING/ BOTH 혹은 트림할 문자열 + FROM 원문자열 

trim(LEADING 트림할문자열 FROM 원본문자열 ) : 문장의 앞에서 트림할 문자열 제거

trim(TRAILING 트림할문자열 FROM 원본문자열 ) : 문장의 위에서 트림

trim(BOTH 트림할문자열 FROM 원본문자열) : 양쪽에서 다 트림

TRIM(원본문자열) : 앞 뒤 공백을 제거

TRIM() : null 을 반환

LENGTH

 문자열

입력한 캐릭터셋으로 계산한 문자열의 길이를 반환

바이트를 반환 하고 싶으면 LENGTHB를 사용



1. lower 함수


 SQL> select lower('HELLO WORLD') from dual;


LOWER('HELL

-----------

hello world


SQL>




2. upper 함수


SQL> select upper('hello world') from dual;


UPPER('HELL

-----------

HELLO WORLD


SQL>

 


3. initcap 함수


SQL> select initcap('hello WORLD') from dual;


INITCAP('HE

-----------

Hello World


SQL>

 


4. LPAD 함수


SQL> select lpad('hello world',3) from dual;


LPA

---

hel


SQL>




SQL>  select lpad('hello world',166,'o') from dual;


LPAD('HELLOWORLD',166,'O')

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

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooohello

 world




만약 숫자 1, 2 나오는 컬럼이 있는데 이를 6자리로 000001 이렇게 채워야 할때 사용


SQL>  select lpad('1',6,'0') from dual;


LPAD('

------

000001


SQL>



SQL>  select lpad('133',6,'0') from dual;

LPAD('
------
000133

SQL>

이런식으로 6자리로 채워준다.


5. RPAD 함수


 LPAD와는 반대로 우측에 자릿수 채우기 위해서 사용


SQL> select rpad('1',6,'*') from dual;


RPAD('

------

1*****


SQL>


전체 출력하는 개수는 가운데 6의 숫자로 결정 나머지는 기존문자가 자릿수보다 크면
자릿수만큼만 기존문자를 출력
기존문자가 자릿수보다 작으면 작은 부분만큼 변형문자로 채워줌


6. substr 함수


SQL> select substr('Hello World',3) from dual;


SUBSTR('H

---------

llo World


SQL>


문자를 특정 인덱스 부터 시작해서 출력해줌

시작인덱스만 지정하면 시작부터 끝까지

종료인덱스를 지정하면 시작부터 종료까지


SQL> select substr('Hello World',3,5) from dual;


SUBST

-----

llo W


SQL>


 


7.instr 함수

SQL> select INSTR('Hello World','h') from dual;


INSTR('HELLOWORLD','H')

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

                      0


SQL> select INSTR('Hello World','Hello') from dual;


INSTR('HELLOWORLD','HELLO')

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

                          1


SQL> select INSTR('Hello World','llo') from dual;


INSTR('HELLOWORLD','LLO')

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

                        3


SQL>

 



'oracle > sql' 카테고리의 다른 글

oracle vo, DAO, DTO 생성 스크립트 v3  (0) 2018.12.06

오라클 설치할때 nix 환경에서 runinstaller 화면 느림현상


오라클 nix 계열에서 설치할 때 , x windows 환경에서 runInstaller 수행하면

Gui 화면에서 엄청 느려져서 설치가 불가능할 경우가 있다.

한글 폰트 때문에 느려지는 현상이 생길 수 있다.

아래의 명령어로 언어를 영어로 변경해보자.

export LANG=c 


그러면 runInstaller 및 각종 gui 가 빠르게 동작할 수 있다.


가끔 복구하러 9i 같은거 설치하러 가면 xmanager 3.0 말고 2.x 버전을 사용해야 정상적으로 동작하는 경우도 있다.


클릭이 죽어도 안된다 할때에는 스페이스 바를 누르면 클릭이 되니까 텝으로 조정해서 스페이스로 해결하자.





윈도우 서버에서 sqlplus "/as sysdba" 접속불가 문제


mstsc 로 윈도우서버 오라클 설치나 점검 할때 sqlplus "/as sysdba" 가 가끔 안먹는 문제가 있다.

(오라클 환경변수나 세팅이 잘 되어 있는 운영중인 환경일때 )

1. 오라클 서버가 맞는지 확인

윈도우+R 키를 누르면 실행 창이 뜬다. 
services.msc 를 입력하자.



오라클 서버가 맞으면 oracleservice%SID값% 으로 실행 중이라고 떠있을 것이다.




가끔 원격 환경에서 딴서버 들어가서 삽질할 때가 있다.

2. 관리자 그룹사용자로 로그인 해 있는지 확인한다.

3. 아주 가끔 mstsc 하면 console 을 잡지 못할때가 있다.

console 옵션을 줘서 mstsc로 접속을 해보자 

mstsc /console





4. 이렇게 해도 안되면 오라클 환경변수들이 제대로 들어가있는지 확인해보자


ORACLE_HOME

ORACLE_SID

.. 등등


5. 가끔 콘솔로 죽어도 안되는 경우 서버 재부팅까지 해본경우도 있긴 하지만, 딱 한번 있었던 일이다.



또 문제가 발생할 경우 해결 케이스를 계속 업데이트할 예정이다.

오라클 테이블별 사이즈 조회하기


1. 모든 유저별 테이블 단위 사이즈 조회하기(단위 MB)


아래 쿼리는 system 유저로 접속해서 수행하며 모든 테이블의 크기를 MB 단위로 표현해준다.


select owner, segment_name, bytes/1024/1024 from dba_segments where segment_type='TABLE'







2. 내 테이블만 조회 하기


아래 쿼리는 내가 접속한 유저의 테이블의 용량을 MB단위로 표현해준다.


select segment_name, bytes/1024/1024 from user_segments where segment_type='TABLE'

 






Redo log 란?

- 오라클 데이터베이스에서 일어나는 모든 변화를 기록하는 파일이다.
- 최소 2그룹 1멤버의 구성이 필요하다.

오라클 redo log 파일은 오라클 데이터베이스에서 일어나는 모든 입력, 수정, 삭제 와 같은 트랜젝션이 발생할 경우
변경되는 내용을 벡터 형태로 기록하는 파일로써 오라클 데이터베이스의 트랜젝션 속도에 매우 영향을 미치는 중요한 파일이며
redo 라는 이름에서 알수 있듯이 복구를 위해 사용되는 파일이다.

redo log 파일은 일정 공간을 할당해 놓고 재사용하는 파일이며, 온라인백업(Online backup 혹은 Hot Backup) 을 위해 Archive log 모드로
데이터베이스를 운영하면 재사용되는 시점의 redo log  파일이 Archive log 파일로 복사된다.

데이터베이스의 모든 변경내역이 벡터 형태로 저장되기 때문에 Archive log 파일의 이빨이 빠지면 이빨 빠진데 까지만 복구된다는 말이 있는데,
이는 redo log 파일의 특징 때문이다.


관련뷰(view)

v$log
v$logfile



관리포인트

checkpoint not complete. 메세지가 자주 일어나는 경우 redo log 파일 크기를 키우거나 늘려주면 해결될 수 있다.

모든 데이터베이스 I/O 의 시작이므로 redo log 파일의 위치는 빠른 디스크에 두는 것이 좋다.

그룹당 멤버를 여러개 둘 수 있다. 멤버라는 것은 복사본이다. redolog 가 깨지면 데이터의 불완전 복구밖에 할 수 없기 때문에

중요한 부분이라 여러개의 복제본을 둔다. (보통은 2개정도 )

관련 명령어

alter database switch logfile;   // 강제 로그 스위치를 일으킨다. 

alter system checkpoint;


리두로그 그룹 추가 

alter database add logfile group 4
('/db/redo04.log','/db2/redo04.log') size 200m;

리두로그 그룹 삭제 

alter database drop logfile group 4;



추가와 삭제는 온라인 중에 가능하지만

관련뷰를 조회 해서 current 혹은 active 상태면 삭제할 수 없다.


새로운 그룹을 추가한다음에 alter system switch log file; 해서 로그 스위치를 일으킨 다음에

삭제하거나 그래도 사용중이라고 뜨면 checkpoint 를 발생시킨뒤 삭제하면 된다.


튜닝포인트

redo log 관련하여 성능의 개선이 되는지 여부를 확인하는 방법은 sysstat 에서 Execution 의 수를 비교해보면 알 수 있다.

예를들어 redo log 파일을 20메가로 했을경우와 극단적으로 20g를 했을 경우 트랜젝션이 밀집되는 시간에 redo log 파일의 크기를 변경해놓고

execution 수를 비교해보면 차이가 눈에 확 나타난다, 단 리두로그 파일의 크기가 커지면 check point 시의 시간이 오래걸리고

중간에 데이터베이스의 장애시 redo log 파일이 손상될 경우 증발되는 데이터가 커지기 때문에 주의를 요한다.

디스크중에 가장 빠른곳에 약간의 공간을 잡아서 redo log 파일을 배치해 두면 트랜젝션에서의 속도 향상을 체감 할 수 있다.


관련 장애 케이스

보통 데이터베이스에 redo01.log redo02.log 이렇게 생성해놓기 떄문에 윈도우 서버의 경우 드물게 정리 프로그램을 사용하여 log 파일을
전체 삭제 해버리는 경우가 발생할 수 있다. 보통은 지워지지 않으나(사용중이기 떄문에) 드물게 지워져서 장애를 유발하는 경우가 있어
일부는 redo01.rdo 형태로 파일명을 생성해 놓기도 한다.

linux , unix 등의 환경에서 개발자가 소스프로그램이나 import 데이터등을 업로드할때 공간이 부족해 보여서 log니까 지워도 상관없겠지 해서
지우는 경우도 간혹 발생한다.

현제 current redo log 를 삭제할 경우 현재 시점으로 복구는 불가능하니까 주의한다.


각종 보안 점검 후,

오라클 기동 불가 해결방법 모음


각종 보안 조치를 하다보면 오라클이 기동이 안될때가 있다

이러한 케이스들을 쭈욱 모아서 업데이트 할 예정이다.


케이스 1. 리스너(listener) 기동 불가


보통 보안점검 후 한참 있다가 DB 내릴일 있어서 내렸다가 올리면

리스너가 기동 안되는 경우가 많다.


대부분 바로 알아채기는 어려움


다음의 명령어를 oracle 유저로 수행해본다.

cat /etc/hosts 


해당 명령어의 결과가 나오면 다음으로 넘어가고 권한이 없다고 안열리면 권한을 풀어주자.




케이스 2. 아카이브 로그 full 


매우 드물게 아카이브 경로 권한을 뺏어서 안되는 경우가 있다.

아카이브 공간이 읽고쓰기가 잘 되는지 확인해보자


이 경우는 작업하고 잠시 있다가, 로그스위치가 발생할 때 hang 이 걸려있을 것이다.


해당 케이스는 bdump 에 alert_$ORACLE_SID.log 파일을 열어보면 archiver fail.. 등의 에러메세지가 나와있을 것이다.



df -k 

 


등의 명령어로 일단 여유공간이 충분한지 보고, 


alert log 에서 archive 관련 오류메세지가 없는지 확인해보자.




케이스 3. 사용자 기간 만료


데이터베이스 유저의 기간을 만료시키게 설정 할 경우 기간 만료로 서비스 하다가 중단되는 경우가 있다.
was로 커넥션 풀로 설정되어 있다면, 내리기 전까진 모르고 다시 기동할때 안된다던지
페이지에서 다이렉트 커넥트 부분에서 안된다던지의 증상이 나타난다.

sqlplus "/as sysdba" 로 접속한다.


select username, account_status from dba_users;

 

쿼리로 조회를 해본다.

사용자다 expired 혹은 lock 등의 상태로 나오면 풀어준다


lock 의 경우


alter user 유저명 account unlock;

 




케이스 4. 사용자 패스워드 대소문자 구분


보안을 강화 하다보면 오라클 parameter 에 case sensitive 를 true 로 해놓는 경우도 있다.

이럴경우 패스워드 대소문자를 가린다.


기존에 안해놓다가, 보안 강화후 해놓으면 접속이 안된다.


다음의 커멘드로 파라미터를 확인한다.

true 로 되어있으면 false로 바꾸던지 어플리케이션에서 대소문자 가려서 접속하자.


sqlplus "/as sysdba" 로 관리자로 접속하자.


show parameter case 

로 파라미터를 조회 하면


 

parameter                value

==========        =======

case_sensitive           true


로  나올것이다. 11g 기본값이 true 이기 때문에 무조건 true가 나쁜건 아니다.

password 대소문자 때문에 접속이 안될때 해주는 것이다.




케이스 5. 사용자 패스워드 실패 잠금


암호 10번 틀리면 잠기게 되어 있어서, 암호 틀려서 잠기는 경우도 많다.
낮은버전에서 그냥쓰다가 업그레이드 하거나 잘 쓰다가 보안지적사항 나와서 걸어놓고 처음 걸리면
이런 문제가 생길수 있다.

증상은 이전껀 잘되고 새로운건 안되는 경우
이미 커넥션 맺혀져 있는건 잘되고 새로 커넥션 맺는건 안될때 사용자 계정이 잠겼습니다 라는 에러메시지가 나온다

sqlplus "/as sysdba" 로 접속한다.


select username, account_status from dba_users;

 

쿼리로 조회를 해본다.

사용자다 expired 혹은 lock 등의 상태로 나오면 풀어준다


암호를 바꿔주거나 풀어주면 된다.



계속 케이스 나올때마다 업데이트 할 예정이다.

오라클(oracle) freespace 간편조회 script


일부 온라인 배포된 오라클 데이터베이스의 freespace 조회 스크립트는 파일 하나하나 별로 사이즈가 길게 나와 

테이블 스페이스별 freespace 로 깔끔하게 나오게 만든 버전 입니다.


일부 간편버전 스크립트 중에 dba_freespace 의 bytes 가 0일 경우( 즉 freespace가 없을경우) 해당 행이 조회 되지 않는 것이 있었습니다.

아래의 스크립트는 그 버그를 수정한 것 입니다.


 

column "NAME" format a20

column "FILECNT" format 999999

column "TOTAL(MB)" format 999,999,999.99

column "USED(MB)" format 999,999,999.99

column "FREE(MB)" format 999,999,999.99

column "MAXBYTE(MB)" format 999,999,999.99

column "FREE(%)" format 999.99


set linesize 120

set pagesize 100


SELECT tbs.tablespace_name as "NAME", tbs.FILECNT as "FILECNT", tbs.TOTAL as "TOTAL(MB)"

              , (tbs.TOTAL - nvl(fr.FREE,0)) as "USED(MB)" ,  nvl(fr.FREE,0) as "FREE(MB)"

              , nvl(tbs.MAX,0) as "MAXBYTE(MB)",  nvl(fr.FREE,0)/tbs.TOTAL *100 as "FREE(%)"

FROM   (select tablespace_name, sum(bytes/1024/1024) as "FREE" 

                   from dba_free_space

                  group by tablespace_name) fr,

                (select tablespace_name, sum(bytes/1024/1024) as "TOTAL", count(*) as "FILECNT",

                  sum(maxbytes/1024/1024) as "MAX"

                  from dba_data_files

                  group by tablespace_name) tbs

WHERE tbs.tablespace_name = fr.tablespace_name (+)

ORDER BY "FREE(%)" ;




( 제꺼 퍼가실때는 출처나 사용법을 꼭 명기해주시고 -  오라클 및 서버 명령어, 스크립트는 모든 경우에 적용하실수 있는게 아닙니다.

상황및 사용법이 나오게, 그리고 드래그 할 수 없게는 절대 가져가지마세요, 엔지니어나 공부하시는 분들에게 다 타이핑 하게 할수 없습니다 

일부러 드래그 해서 편히 쓰시라고 표에 따로 적어놓은 겁니다.)



" 출처나 사용법을 명기하셨더라도, 

절대 드래그-복사(Ctrl-c) 금지설정을 해놓은 페이지,블로그,카페에는 제 자료 일체 가져가지 마시기 바랍니다. "



사용하면 이렇게 나옵니다.


위의 표의 내용을 freespace.sql 로 저장하여 수행한 것 입니다.


컬럼 설명


NAME  : 테이블 스페이스의 이름.

FILECNT : 해당 테이블 스페이스의 파일 수.

TOTAL(MB) : 총 파일시스템에 할당된 용량(단위, 메가 바이트 ).

USED(MB) : 사용된 용량( 단위 , 메가바이트 ).

FREE(MB) : 여유공간 ( 단위, 메가바이트 ),

MAXBYTE(MB ) : 자동 증가할 수 있는용량 ( 단위, 메가바이트 )

    - 주의점

     1)  최대 증가가능용량이 32GB 라고 하더라도 실제 서버의 파일시스템에 공간이 없으면 더이상 늘어나지 않습니다. 

     2)  만약, 한 테이블 스페이스에 3개의 파일이 있고(FILECNT가 3)  그중에 1개의 파일만 32GB로 최대 자동 증가가 되어있다면

        MAXBYTES 는 32기가로 표현됩니다. 따라서 TOTAL 보다 MAXBYTE가 작을 수 도 있는점 있습니다.

        이럴땐, 파일별 용량을 표시해주는 스크립트(인터넷에서 돌아다니는 스크립트) 로 각 파일별 여유공간을 확인하시기 바랍니다.

        본 스크립트는 간편하게 한방에 조회 하게 축약된 축약본입니다.

FREE(%) : 전체 TOTAL 에서 Free 남은 비율 입니다. (자동 증가될 수 있는 용량은 고려하지 않음 )




ORANGE 나 SQL Tool 에서 수행할 때는 SELECT ~ 부터 붙여넣으시면 됩니다.


우리 회사가 갑자기 체코에 지사를 세운답니다.

오라클 DB 설계를 해야하는데 체코어는 캐릭터셋을 어떻게 설계하죠?


오라클 데이터베이스를 설계할때 많은 고민을 하게 하는것이 캐릭터 셋이다.
최근에 제조업들이 유럽으로 진출하기 위해서 거점을 두는 곳이 체코인데 한국에서 개발하는 개발자들이 체코어 데이터베이스를 설계할때 고려할 사항을 검토해 보자.


1. 캐릭터셋 

 문자열의 집합이다. 영어 알파벳을 1바이트 한글은 2바이트 이렇게 우리는 상식으로 알고있다.
조금더 어렵게 내려가보면 내가 완성형 한글 '가' 를 입력했다고 치자. 
이게 파일 시스템에 저장될 때는 ASCII 문자표에 KO16KSC5601(완성형) 페이지의 코드표에 맞게 2바이트의 '가' 에 해당하는 값 'B0A1'을 저장할 것이다.
이를 데이터베이스에서 읽을때 2바이트 단위로 읽으면서 B0A1 이 나오면 '가' 로 바꾸어서 표현해 주는 방식이다.

그럼 한글을 표현하는 캐릭터 셋은 무었일까?

KO16KSC5601(완성형)
KO16MSWIN949(조합형)
UTF8 ( 3바이트 다국어 )

이 3개의 캐릭터 셋은 한국어를 저장하고 꺼낼 수 있다.

2. 체코어는 어떤 캐릭터셋을 사용할까?

  체코어(Czech) EE8ISO8859P2, EE8MSWIN1250 캐릭터셋 군에 속한다.


캐릭터 셋군에 들어가는 다른언어는 중앙유럽에 필요한 언어들 Czech 포함한 Hungarian, Polish 이며 유로 심볼은 포함되지 않으며. 체코어로 1바이트를 차지 한다.


이중에 , 

EE8MSWIN1250 euro 심볼을 포함함으로(TM 마크 ) 윈도우 클라이언트를 많이 사용하며 TM마크등에서 ? 표시가 나는 것을 방지하기 위해  EE8MSWIN1250 추천할 수 있다.


3. 하지만 본사가 한국이라 한국어 매니저들이 들어가는 값은 한국어 인데?

(즉 한국어와 체코어가 동시에 들어가야 하는 상황 )

만약 한국어와 체코어를 병행해서 사용할 일이 있다면 UTF-8 혹은 AL32UTF8 을 사용하면 된다.

이때의 캐릭터 바이트 계산은 아래의 표와 같다. 
(UTF-8 과 AL32UTF-8의 차이는 4byte 문자 지원여부 AL32UTF-8 이 4byte지원함.)

       아스키 문자 : 1바이트 , 한글 3바이트, 유럽언어 2바이트, 유로심볼 3바이트



이렇게 정리할 수 있다.



오라클 실습 환경 구축시에 8080 포트를 점유하는 apex 서비스 끄는 방법

(disable oracle apex service 8080 port )


오라클 xe를 설치하고 이클립스로 tomcat 서버를 등록하면 8080 포트가 충돌이 나서 
8090 이런식으로 잡기도 한다.


이는 오라클 xe에 기본적으로 들어있는 APEX 서비스가 8080 으로 등록되어 있어 포트 충돌 때문에 mysql환경에서 작업하던 사람들은
매우 심각한 빡침을 느끼기도 하고,

APEX외에도 보통 SQL DEVELOPER 등의 무료툴이 많기 때문에 사용하지 않으려고 하기도 하고,

보안 문제 때문에 사용을 하지 않는 경우도 있다.


이런 저런 문제들 때문에 꺼버리는 방법이다.

1. 오라클 유저로 접속한다


   su - oracle


2. 오라클 관리자 권한으로 접속


  sqlplus "/as sysdba"


3. apex 서비스 종료


  exec dbms_xdb.sethttpport(0);

 



apex 서비스는 사용하고 싶지만 8080 포트에서 변경하고 싶을 때는 다음과 같이 수행한다.



1. 오라클 유저로 접속한다


  su - oracle


2. 오라클 관리자 권한으로 접속


  sqlplus "/as sysdba"


3. 현재 apex 포트 조회


 select dbms_xdb.gethttpport() from dual;


4. 포트 변경


 exec dbms_xdb.sethttpport(변경할포트번호);


 



기본적으로 데이터베이스 서버는 외부에 포트를 열어두지 않고 안에 꽁꽁 숨겨둬야 한다.

그런데 잘 알려진 8080 포트로 web 서비스가 DB와 연관되어 열려있다면

보안에 취약해질수 있다.


털리면 DB의 모든 내용이 웹으로 친절하게 조회가 되어 버리기 때문에...


개인적으로 어지간하면 끄고 쓰는 편이다.



+ Recent posts