까막군's 주접 블로그

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

[Network] Window 라우터 테이블 추가하기

2007/07/19 10:06, 글쓴이 까막군

route 명령을 이용해 패킷이 전달되는 경로를 확인하거나 지정할 수 있다. 192.168.1.0 네트워크의 트래픽을 192.168.0.10으

로 전달하고자 한다면 ‘route add’ 명령을 사용하며, ‘route print’ 명령으로 라우팅 테이블을 확인한다.


c:\> route add  192.168.1.0  mask 255.255.255.0  192.168.0.10
c:\> route print


게이트웨이가 2개 이상 있을때(잘 이해가 안갈수도 있다. 그렇지만 그런경우 허다하다.) 나가는 트래픽을 제어하기 위해서 쓰게 된다.

단점은 모든 작업을 수동으로 해줘야 한다는 점인데...
예를 들어서 한번 보자.
default gateway가 192.168.0.1로 잡혀있고, 192.168.0.2라는 Gateway를 또하나 생성(이후 gate2라고 명명)했다고 하자.

라우트 명령어를 이용해서 바꾸기 전까지는 모든 트래픽은 default게이트웨이를 통해서 나가게 된다.
이렇게 나가는 트래픽중 http://www.naver.com/으로 가는 트래픽을 gate2로 이동시킨다고 하면...

우선 http://www.naver.com/의 아이피대역을 알기위해서
c:\>nslookup http://www.naver.com/
Non-authoritative answer:
Name:    http://www.naver.com/
Address:  211.218.150.200


Whois로 검색한결과 kornet에서 아직 할당하지 않은 IP대역으로 나오므로 그냥 IP하나만 이동시킨다.

그럼 default gateway에서

      route add 211.218.150.200 mask 255.255.255.255 gw 192.168.0.2

이렇게 하면 디폴트게이트웨이로 왔던 트래픽이 다시 되돌아서 gate2를 통해서 나가게 된다.


       User                           Default gateway                    http://www.bsdkorea.org/
    192.168.0.3 → → → → → → 192.168.0.1                                 ↑ ↓
        ↑                                       ↓                                        ↑ ↓
        ↑                                       ↓                                        ↑ ↓
        ↑                                       ↓                                        ↑ ↓
        ↑                                     gate2→ → → → → → → → → →  ↓
         ← ← ← ← ← ← ← ← 192.168.0.2  ← ← ← ← ← ← ← ← ← ← 

대략 이러한 현상으로...

주의 : 위 명령어는 휘발성 명령어로서 서버가 꺼지면 사라지게 된다.
      많이 추가 하는 경우에는 rc.boot에 파일로 만들어 넣거나 interface에 추가하는 방법이 있다.

route add x.x.x.x[네트워크주소] mask 255.255.255.x.[마스크] y.y.y.yp게이트웨이주소]

add 다음에 -p 옵션을 주면 컴퓨터가 다시 부팅되어도 유지가 된다.

persistent 의 머릿글자를 쓴것 같다.


크리에이티브 커먼즈 라이센스
Creative Commons License
2007/07/19 10:06 2007/07/19 10:06

맨 위로

[Oracle] Shared Pool Area 튜닝하세~

2007/07/18 17:14, 글쓴이 까막군

공유풀영역(Shared Pool Area)에는 사용자가 실행했던 sql문이 Library cache Area에 저장되어져 있고 추후 동일한 sql문이 전달되면 저장된 실행 계획에 의해 실행된다.


공유풀 영역을 검색하기 위해 V$SQLAREAV$SQLTEXT 자료사전에서 검색할 수 있다.


SELECT sql_text, version_count, loads, invalidations, parse_calls, sorts

FROM v$sqlarea

WHERE sql_text NOT LIKE '%$%'

AND command_type IN (2,3,6,7)

AND UPPER(sql_text) like '%tableName%'

ORDER BY sql_text

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

tableName과 관련된 sql query를 모두 확인할 수 있으며 기타 정보를 볼 수 있다.


[가장 많은 데이터 버퍼 캐시 영역을 사용하는 SQL]

SELECT sql_text, executions, disk_reads, buffer_gets

FROM v$sqlarea

WHERE UPPER(sql_text) like '%tableName%'

ORDER BY buffer_gets

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

[가장 많은 DISK-I/O 가 유발되는 SQL]

SELECT sql_text, executions, disk_reads, buffer_gets

FROM v$sqlarea

WHERE UPPER(sql_text) like '%tableName%'

ORDER BY disk_reads

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


데이터베이스를 재시동하면 공유 풀 영역이 다 차거나 단편화 현상이 발생할 때의 문제를 해결할 수 있지만 그렇지 못한 경우에

ALTER SYSTEM FLUSH SHARED_POOL

명령어를 이용하여 공유 풀 영역을 클리어할 수 있다.


Library Cache Area가 다 차 있는 경우 새 sql문이 들어오면 waiting시킨 후 sql문중 가장 오래된 정보를 찾아 제거하고 새 sql문을 확보된 빈 공간에 저장한다. 이것을 AGING 메커니즘이라고 한다.

이러한 공간관리는 삭제되었던 sql문이 사용자에 의해 호출되면 구문분석 작업을 다시 해야하므로 또 다른 sql문의 성능저하를 가져올 수 있다.


이런 경우 공유 풀 영역의 크기를 더 할당해 주어 해결할 수 있다.


그럼 라이브러리 캐시 영역의 크기가 작아 성능 저하가 되는지 아니면 너무 크게 잡혀 있어 메모리 낭비가 이뤄지고 있는지를 알아보자.

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


SELECT GETS, GETHITS, GETHITSRATION

FROM v$librarycache

WHERE namespace = 'SQL AREA'

      GETS    GETHITS GETHITRATIO
---------- ---------- -----------
 104582838   96367941  .921450812

로더된 회수/로더하려고 한 회수 의 비율(GETHITRATIO)이 90%이상일 때 사용자가 요청한 구문분석 정보를 저장하기에 충분한 공간을 할당하고 있다고 볼 수 있다.

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


SELECT SUM(PINS), SUM(RELOADS), SUM(RELOADS)/SUM(PINS)

FROM v$librarycache

SUM(PINS) SUM(RELOADS) SUM(RELOADS)/SUM(PINS)
--------- ------------ ----------------------
540523167       473878             .000876702

오래된 sql문이 삭제되고 다시 그 문장이 실행될 때 reloads 컬럼값이 증가하는데 PINS칼럼에 대한 RELOADS칼럼의 비율이 1%미만일 때 좋은 성능을 기대할 수 있다.

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


SELECT NAMESPACE, PINS, RELOADS, INVALIDATIONS

FROM v$librarycache

sql문에서 정의된 객체가 다른 사용자에 의해 삭제된 상태가 얼마나 발생했는지를 분석하는 방법으로 invalidation컬럼이 높은 값이 출력되거나 계속적으로 증가 값을 보인다면 고유 풀 영역이 작아서 성능이 저하되고 있음을 의미한다.


SHARED_POOL_SIZE=[크기]

SHARED_POOL_RESERVED_SIZE=[크기] -- PL/SQL 블록으로 실행된 구문분석 정보 저장


를 수정해 적당한 값으로 설정한다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2007/07/18 17:14 2007/07/18 17:14

맨 위로

[Oracle] 컬럼명 수정하기!

2007/07/10 10:23, 글쓴이 까막군

ALTER TABLE TB_NAME RENAME COLUMN A_COL_NAME TO B_COL_NAME ;

볼드체를 수정하라!!!!

'ㅂ'ㅋ

Oracle 9iR2 버전 이상에서 적용된다.

그 이하 버전일시.

1.direct-load이용하기

create table new_table as select 컬럼명들... from old_table;
rename old_table to temp;
rename new_table to old_table;

확인

drop table temp;
alter table old_table add constraint PK_name primary key (기본키명);

2.딕션얼리 테이블변경하기 - 권장하고싶지 않음!!!!!!!!!!!!!!!!!!!!!!!!

(주의 : 복구시 적용이 안될 수 있으니 변경 후
full백업을 한번 받아놓으시면 됩니다.)

 //Connect as sys user
conn sys/change_on_install

 //owner
SELECT username,user_id from dba_users
where username = 'User_Name';

 //run the following script
SELECT obj# from obj$
where name = 'Table_Name'
and OWNER# = from previous query dba_users;

 SELECT col# from col$
where obj# = from previous query obj#
and name = 'column_name';

update col$
set name = 'new_column_name'
where obj# = from previous query obj#
and col# = from previous query col#;


Alter system flush shared_pool;

 
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/07/10 10:23 2007/07/10 10:23

맨 위로

[Oracle] SELECT FOR UPDATE NOWAIT | WAIT 기능 소개

2007/06/04 10:54, 글쓴이 까막군
No. 17947

SELECT FOR UPDATE NOWAIT | WAIT 기능 소개
=========================================

PURPOSE
-------
오라클 데이터베이스에서는 선택된 행들에 대하여 배타적인 LOCK을 설정할 수
있는 기능인 FOR UPDATE 구문을 제공하고 있다.

여기서는 FOR UPDATE 구문의 전반적인 개관과 9i 신기능으로 소개된 WAIT로
TIMEOUT을 설정하는 방법을 아래와 같이 살펴본다.

1. FOR UPDATE with no option
2. FOR UPDATE NOWAIT(= WAIT 0)
3. FOR UPDATE WAIT integer (0 ~ 4294967295, second)
4. FOR UPDATE OF

Explanation
-----------
1. FOR UPDATE with no option
- 이 경우 오라클은 LOCK을 획득하기까지 무한정 기다린다.


2. FOR UPDATE NOWAIT[= WAIT 0]
- LOCK을 획득하지 못하면 ORA-00054와 함께 바로 실패한다(Example I).
  (FOR UPDATE WAIT 0 도 같이 동작한다)

Example I

-- 모든 예제는 SESSION1이 이미 LOCK을 점유하고 있는 상황을 가정 --

V901:SESSION2> select ename  from scott.emp where empno=7900 for update nowait;
select ename  from scott.emp where empno=7900 for update nowait
                         *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

V901:SESSION2> select ename  from scott.emp where empno=7900 for update wait 0;
select ename  from scott.emp where empno=7900 for update wait 0
                         *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified


3. UPDATE WAIT integer(0 ~ 4294967295, second)

- WAIT 다음 주어지는 정수 만큼 동안 LOCK을 획득하기 위해 재시도한다.
  그러나 주어진 시간동안 LOCK을 획득하지 못하면 ORA-30006와 함께
  해당 SQL문은 실패한다(Example I).
  WAIT 다음에 integer 설정하지 않거나 integer의 최대값(4294967295)을
  초과하는 값을 설정하면 ORA-30005 에러를 만나게 된다(Example II,III).

Example I

V901:SESSION2> select ename  from scott.emp where empno=7900 for update wait 5;
select ename  from scott.emp where empno=7900 for update wait 5
                         *
ERROR at line 1:
ORA-30006: resource busy; acquire with WAIT timeout expired


Example II

V901:SESSION2> select ename  from scott.emp where empno=7900 for update wait;
select ename  from scott.emp where empno=7900 for update wait
                                                            *
ERROR at line 1:
ORA-30005: missing or invalid WAIT interval

Example III

V901:SESSION2>  select ename  from scott.emp for update wait 4294967296;

ERROR at line 1:
ORA-30005: missing or invalid WAIT interval


4. FOR UPDATE OF

- FOR UPDATE 구문은 FROM 절에 기술된 복수개의 테이블의 해당행에 모두
  LOCK을 설정한다(Example I)
  이 때 OF 를 기술함으로 하여 특정 TABLE의 행에만 LOCK을 설정할 수 있다(Example II)

* 주의
- FROM 절에 DUMMY로 열거된 TABLE인 경우(즉 JOIN 조건이 없어서 Cartesian product로 연산되는 경우),
  OF 절이 없다면 모든 TABLE, 행에 LOCK이 설정된다(Example III)

Example I

SELECT empno, sal, comm
    FROM emp, dept
    WHERE job = 'CLERK'
        AND emp.deptno = dept.deptno
        AND loc = 'NEW YORK'
    FOR UPDATE;

COL OBJECT_NAME FORMAT a20
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
    FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
    WHERE A.SID=B.SID
        AND B.ID1=C.OBJECT_ID
        AND B.TYPE='TM'
        AND C.OBJECT_NAME IN ('EMP','DEPT');


       SID    SERIAL# TYPE OBJECT_NAME
---------- ---------- ---- --------------------
        16       1184 TM   DEPT
        16       1184 TM   EMP

Example II

SELECT empno, sal, comm
    FROM emp, dept
    WHERE job = 'CLERK'
        AND emp.deptno = dept.deptno
        AND loc = 'NEW YORK'
    FOR UPDATE OF emp.sal;

COL OBJECT_NAME FORMAT a20
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
    FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
    WHERE A.SID=B.SID
        AND B.ID1=C.OBJECT_ID
        AND B.TYPE='TM'
        AND C.OBJECT_NAME IN ('EMP','DEPT');


       SID    SERIAL# TYPE OBJECT_NAME
---------- ---------- ---- --------------------
        16       1184 TM   EMP

Example III

SELECT empno, sal, comm
    FROM emp, dept
    FOR UPDATE;


COL OBJECT_NAME FORMAT a20
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
    FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
    WHERE A.SID=B.SID
        AND B.ID1=C.OBJECT_ID
        AND B.TYPE='TM'
        AND C.OBJECT_NAME IN ('EMP','DEPT');

       SID    SERIAL# TYPE OBJECT_NAME
---------- ---------- ---- --------------------
        16       1184 TM   DEPT
        16       1184 TM   EMP


Reference Documents
-------------------
Oracle9i SQL Reference
Release 2 (9.2)
Part Number A96540-01

http://otn.oracle.com/docs/products/ora ··· 32066347
    
from www.oracle.co.kr
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/06/04 10:54 2007/06/04 10:54

맨 위로