ORACLE/ADMIN2010. 11. 23. 18:12
반응형

-Analyze는 Serial Statistics Gathering 기능만 있는 반면, dbms_stats는 Parallel Gathering기능이있다.

-Analyze는 파티션의 통계정보를 각 파티션 테이블과 인덱스에 대해서 수집하고,

Golbal Statistics는 파티션 정보를 가지고 계산하므로, 부정확할 수 있다.

그러므로 파티션 또는 서브파티션이 있는 객체에는 DBMS_STATS을 사용 하여야 한다.

-DBMS_STATS는 전체 클러스터에 대해서는 통계정보를 수집하지 않는다. 그러므로 Analyze를 사용한다.

-DBMS_STATS는 CBO와 관련된 통계정보만을 수집한다.

즉, 테이블의EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT 등은 수집되지 않는다.

-DBMS_STATS는 사용자가 지정한 통계정보 테이블에 수집된 통계정보를 저장할수있고,

딕셔너리로 각 컬럼, 테이블, 인덱스, 스키마등을 반영 할 수 있다.

-DBMS_STATS는 IMPORT/EXPORT 기능 및 추가적인 기능이 많다.

이 기능을 이용하여 운영 DB의 통계정보를 개발장비의 통계정보로

복사할 수 있으므로 개발장비의 팰린을 운영장비와 같게 만들 수 있다.(메뉴얼 참조)

 

Optimizer statistics 생성은 시간과 자원이 많이 드는 작업입니다.

Optimizer를 지원하기 위한 통계 생성 작업에서 Optimizer가 Cost 계산에 고려하지 않는

정보를 만들기 위해서 시간과 자언을 사용할 필요는 없을 것입니다.

 

그래서 아래 내용이 피룡하다면 여전히 analyze 명령을 사용해야 합니다.

 

ANALYZE 명령

 

analyze 명령은 DBMS_STATS 패키지를 사용하기 전에 사용했던 명령으로, 유사한 통계자료를 수집하는데

사용된다. DBMS_STATS 패키지가 통계 자료 수집에 더 우수하기 때문에 오라클은 패키지의 사용을 권장하지만,

DBMS_STATS 패키지로 수ㅡ집할 수 없는 통계 자료는 다음과 같습니다.

 

- VALIDATE 또는 LIST CHAINED ROWS 절의 사용

- 통계 자료 예측시 행의 샘플 개수

- 프리리스트 블록 관련 정보와 같은 옵티마이저에 의해 사용되지 않는 통계 자료 수집.

 

SQL> ANALYZE TABLE table_name VALIDATE STRUCTURE;

 

test방법

 

1세션과 2세션으로 구분하여 test하면된다.

 

 1 session t1 analyze

 2 session t2 dbms_stats

SQL> create table t1 (c1 number, c2 varchar2(10), c3 varchar2(10));

테이블이 생성되었습니다.

SQL> exec p('select * from user_tables where table_name = ''T1'' ')
---------------------------------------------------
TABLE_NAME                    : T1
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      :
BLOCKS                        :
EMPTY_BLOCKS                  :
AVG_SPACE                     :
CHAIN_CNT                     :
AVG_ROW_LEN                   :
AVG_SPACE_FREELIST_BLOCKS     :
NUM_FREELIST_BLOCKS           :
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   :
LAST_ANALYZED                 :
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.
SQL> analyze table t1 compute statistics;

Table analyzed.

SQL> exec p('select * from user_tables where table_name = ''T1'' ')
---------------------------------------------------
TABLE_NAME                    : T1
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 0
BLOCKS                        : 0
EMPTY_BLOCKS                  : 7
AVG_SPACE                     : 0
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 0
AVG_SPACE_FREELIST_BLOCKS     : 0
NUM_FREELIST_BLOCKS           : 0
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 0
LAST_ANALYZED                 : 23-NOV-2010 16:27:57
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

 

PL/SQL procedure successfully completed.

SQL> insert into t1 select level, 'test1', 'test2' from dual connect by level <= 1000;

1000 rows created.
SQL> analyze table t1 compute statistics;

Table analyzed.

SQL> exec p('select * from user_tables where table_name = ''T1'' ')
---------------------------------------------------
TABLE_NAME                    : T1
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 1000
BLOCKS                        : 3
EMPTY_BLOCKS                  : 4
AVG_SPACE                     : 1114
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 19
AVG_SPACE_FREELIST_BLOCKS     : 1698
NUM_FREELIST_BLOCKS           : 1
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 1000
LAST_ANALYZED                 : 23-NOV-2010 16:30:07
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.

 SQL> create table t2(c1 number, c2 varchar2(10), c3 varchar2(10));

Table created.

SQL> exec p('select * from user_tables where table_name = ''T2'' ')
---------------------------------------------------
TABLE_NAME                    : T2
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      :
BLOCKS                        :
EMPTY_BLOCKS                  :
AVG_SPACE                     :
CHAIN_CNT                     :
AVG_ROW_LEN                   :
AVG_SPACE_FREELIST_BLOCKS     :
NUM_FREELIST_BLOCKS           :
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   :
LAST_ANALYZED                 :
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------


PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats(user,'T2')

PL/SQL procedure successfully completed.

SQL> exec p('select * from user_tables where table_name = ''T2'' ')
---------------------------------------------------
TABLE_NAME                    : T2
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 0
BLOCKS                        : 0
EMPTY_BLOCKS                  : 0
AVG_SPACE                     : 0
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 0
AVG_SPACE_FREELIST_BLOCKS     : 0
NUM_FREELIST_BLOCKS           : 0
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 0
LAST_ANALYZED                 : 23-NOV-2010 16:28:36
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : YES
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.

SQL> insert into t2 select level, 'test1', 'test2' from dual connect by level <= 1000;

1000 rows created.

SQL> exec dbms_stats.gather_table_stats(user,'T2')

PL/SQL procedure successfully completed.

SQL> exec p('select * from user_tables where table_name = ''T2'' ')
---------------------------------------------------
TABLE_NAME                    : T2
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 1000
BLOCKS                        : 3
EMPTY_BLOCKS                  : 0
AVG_SPACE                     : 0
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 15
AVG_SPACE_FREELIST_BLOCKS     : 0
NUM_FREELIST_BLOCKS           : 0
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 1000
LAST_ANALYZED                 : 23-NOV-2010 16:30:39
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : YES
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.

 

 위 결과와 같이 analyze 와 dbms_stats의 차이는

 EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_SPACE_FREELIST_BLOCKS, NUM_FREELIST_BLOCKS들을

수집하느냐 안하느냐를 볼수있다.

그리고 AVG_ROW_LEN값이 틀려지고 AVG_ROW_LEN yes냐 no의 차이도있다.

 


반응형
Posted by [PineTree]
ORACLE/ADMIN2010. 11. 23. 18:00
반응형
출 처 : http://blog.naver.com/clearsn?Redirect=Log&logNo=90100665253


++히스토그램 생성 방법++

exec dbms_stats.gather_table_stats(user_name, 'table_name', method_opt=>'option');

 

user_name : 유저명

table_name : table이름

option :

for all columns size 1 : 모든 column 에 대해서 histogram을 수집하지 않는다.

- Oracle이 Data 분포를 고려하여 Bucket Size를 계산한다.

for all columns size auto : column이 predicate로 사용된적이 있는 경우에만 histogram을 수집

for all columns size skewonly :predicate로 사용된적이 없어도 histogram을 수집

-

for all indexed columns size skewonly : index가 존재하는 컬럼에 대해서만 histogram을 수집

for columns c1 size 5 c2 size skewonly : 개별 column 별로 bucket size 를 할당

for all hidden columns size skewonly : function based index 에 의해 생성된 hidden column에 대한 histogram을 수집

[출처] Histogram 생성 방법.|작성자 dnflfl



반응형
Posted by [PineTree]
ORACLE/ADMIN2010. 11. 8. 17:50
반응형

문자셋과 인코딩의 정의

  • 문자셋 (charset, Character Set)
하나의 언어권에서 사용하는 언어를 표현하기 위한 모든 문자(활자)의 모임을 문자셋(charater set)이라고 한다. 다시 말하면 우리가 얘기하는 언어를 책으로 출판할 때 필요한 문자(활자)를 모두 모은 것이라고 생각하면 된다. 추가적으로 부호와 공백 등과 같은 특수 문자도 문자셋에 포함된다.
영어의 경우 알파벳 대소문자와 특수 문자 등으로 간단하게 문자셋을 구성할 수 있지만 한글의 경우 출판에서 가,나,다 등으로 출판함으로 훨씬 다양한 문자셋을 가지고, 또한 한자를 병행해서 사용함으로 문자셋의 범위는 더욱 넓어진다.
  • 추상적인 글자 셋은 여러 개의 인코딩을 가질 수 있다.
  • MIME 문자셋은 IANA에서 정의하며 인터넷 및 XML 파일에서 사용한다.
  • 인코딩 (encoding)
인코딩은 문자셋을 컴퓨터가 이해할 수 있는 바이트와 매핑하는 규칙이다. 예를 들면 ASCII Code에서 A,B,C 등은 문자셋이고 A는 코드 65, B는 코드 66 등 바이트 순서와 매핑한 것이 인코딩이다. 따라서 문자셋을 어떻게 매핑하느냐에 따라 하나의 문자셋이 다양한 인코딩을 가질 수 있다.
  • 추상적인 문자셋을 구체적인 bit-stream으로 표기하는 방법
  • 여러가지 문자셋을 동시에 표시할 수 있다.
  • 대부분의 인코딩에서는 대소문자를 구분하지 않는다.
  • 대한민국 문자셋(charater set)에서 가장 많이 사용하는 인코딩은 "UTF-8", "KSC5601", "ISO-8859-1" 이다.
  • 문자셋(인코딩)의 예
  • 한글 : 8bit KSC5601 (8bit EUC-KR, 7bit ISO-2022-KR, ISO-2022-Int)
  • 영문 : KSC5636, US-ASCII (둘 간의 차이는 화페 단위 뿐)
  • 한글+영문 : KSC5861 (EUC-KR), KSC5636 + KSC5601를 모두 포함한다.
  • 유니코드 : 4byte Unicode < ISO-10646 UCS (ISO-8859-1, UTF-8, UTF-16)

문자셋과 인코딩은 동일한 명칭을 가질 수 있어 서로 혼용하여 사용되는 경우가 많다.
EUC-KR은 원래 유닉스용 표준이었는데 인터넷으로 확장되어 사용된다.
KSC5601은 인터넷에서 원활한 한글(완성형) 사용을 위하여 정의된 표준이다.
EUC (Extended UNIX Code), UTF (UCS Transformation format)

기본 인코딩

  • Windows : 시스템 언어와 관련된 코드 페이지를 따름
    • 영문 Windows는 CP1252 인코딩을 사용
    • 한글 Windows는 MS949 인코딩을 사용
  • Unix : LANG 환경 변수로 지정된 로케일에 해당하는 인코딩
    • Solaris는 LANG 환경 변수가 ko, ko_KR일 경우 EUC-KR 인코딩을 사용
    • HP는 LANG 환경 변수가 ko_KR, ko_KR.eucKR일 경우 EUC-KR 인코딩을 사용
    • Unix에서 locale -a 명령을 사용하여 LANG 환경 변수에 지정 가능한 문자셋을 확인할 수 있다.
  • HTML : ISO-8859-1와 ISO-10646
  • XML : UTF-8
  • 웹 브라우져 : 내부적으로 모두 유니코드로 처리를 한다.
  • HTTP/1.0 : ISO-8859-1
  • HTTP (URL,URI) : US-ASCII, %hexadecimal_code, JavaScript escape() 함수 사용
  • Java : 유니코드 2.0
  • 직렬화된 Java Class : UTF-8
  • J2EE : ISO-8859-1
  • Oracle : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)




다양한 환경에서 인코딩 설정

웹 브라우져 설정

  1. "도구 -> 인터넷 옵션 -> 언어" 메뉴를 선택한다.
  2. 영어[en]와 한국어[ko]를 추가하고 원하는 언어를 가장 상단에 위치한다.

JVM 설정

  • 일반적으로 LANG 환경 변수를 설정해 주면 자동으로 설정이 된다.
locale -a                               Solaria unix 명령어로 지원 가능한 encoding을 확인한다.
env LANG ko csh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
LANG=ko ksh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
  • JVM 옵션 설정 (UTF-8, ISO-8859-1, KSC5601)
-Dfile.encoding=8859_1                  필수 항목
-Dfile.client.encoding=8859_1
-Dclient.encoding.override=8859_1 JVM 버전에 따라 (사용안함)
  • JSP를 사용하여 JVM 옵션 확인 (encoding.jsp)
file.encoding = <%= System.getProperty("file.encoding") %><br>
file.client.encoding = <%= System.getProperty("file.client.encoding") %><br>
client.encoding.override = <%= System.getProperty("client.encoding.override") %><br>

HTML 설정

HTML 파일을 UTF-8로 만들어 저장한다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

XML 설정

XML 파일을 UTF-8로 만들어 저장한다.

<?xml version="1.0" encoding="UTF-8" ?>

JSP 설정

JSP 파일을 UTF-8로 만들어 저장한다.

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html;charset=UTF-8" %>

Servlet 설정

HTTP 요청의 인코딩 지정

request.setCharacterEncoding("UTF-8");

HTTP 응답의 인코딩 지정

response.setContentType("text/html; charset=UTF-8");

web.xml 설정

<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=UTF-8</mime-type>
</mime-mapping>

Default Oracle Database 문자셋

  • Default Oracle Database 문자셋 : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)
  • AL32UTF8, KO16KSC5601 (KSC5601), WE8ISO8859P1 (8859_1)
  • Default Oracle Database 문자셋 확인 방법
sqlplus system/manager

select parameter || ' : ' || value parameter_value
from NLS_DATABASE_PARAMETERS
where parameter = 'NLS_CHARACTERSET'
or parameter = 'NLS_NCHAR_CHARACTERSET';

select name || ' : ' || substr(value$, 1, 40) parameter_value
from sys.props$
where name = 'NLS_CHARACTERSET';

select parameter || ' : ' || value parameter_value
from NLS_INSTANCE_PARAMETERS, V$NLS_PARAMETERS, NLS_SESSION_PARAMETERS;
  • Oracle Database 문자셋 변경 방법
환경 변수 또는 %ORACLE_HOME%/dbs/init[SID].ora 을 설정한다.
NLS_LANG='American_America.Ko16ksc5601'
ORA_NLS33='$ORACLE_HOME/ocommon/nls/admin/data'
NLS_DATE_FORMAT='YYYY-MM-DD'
  • DriverManager에서 문자셋 설정 방법
java.util.Properties props = new java.util.Properties();
props.put("charSet", "KSC5601" );
DriverManager.getConnection(dbUrl, props);
반응형
Posted by [PineTree]
ORACLE/ADMIN2010. 10. 22. 10:08
반응형

 

PCTFREE
럭내에 행을 수정하거나 업데이트 발생 있는 행의 크기 증가에 대비하여 예약된 공간. 초기 입력시에는 공간을 제외하고 입력된다. PCTFREE 부족하면 데이터 수정이나 업데이트 행이전(ROW MIGRATION) 발생하게 된다.

PCTUSED
새로운 행이 블록에 추가되기 전에 행데이터와 오버헤드에 대해 사용될수 있는 블록의 최소 퍼센트이다. , 기존의 데이터가 수정이나 삭제등으로 PCTUSED보다 값이 작아지면 블록에 한하여 입력이 가능하다. 

INITRANS
블록에 동시에 엑세스 가능한 트렉젝션의 초기수를 나타낸다. (기본값 : 1)
INITRANS
낮게 설정하는 경우는 테이블이 크고 테이블에 엑세스하는 사용자의 수가 적을 경우이고, 높게 설정하는 경우는 엑세스하는 사용자가 많을 경우이다. 

MAXTRANS
동시에 엑세스 가능한 트렉젝션의 최대값으로 INITRANS 상대적 개념이다. (기본값 : 255)
MAXTRNAS
너무 낮은 경우 트렉젝션을 초과한 사용자가 엑세스한 경우 앞의 사용자가 커밋이나 롤백하기 까지 기다려야하는 경우가 발생한다. 

FREELIST
테이블로 데이터를 INSERT 하기 위하여 미리 할당하는 프리 블록의 리스트 수를 지정. 

NOCACHE
NOCACHE
옵션은 'DB 캐시를 사용하지 않겠다' 파라미터로서 이것을 CACHE 지정하면 한번에 20개의 값을 캐시한다. 기본값은 NOCACHE이다.

ex)
USING INDEX 
TABLESPACE TSI_BIO01 PCTFREE 20
STORAGE ( INITIAL 16384 NEXT 471556096 PCTINCREASE 80 ))
TABLESPACE TSD_BIO01
PCTFREE 20
PCTUSED 80
INITRANS 1
MAXTRANS 255
STORAGE ( 
INITIAL 1064960
NEXT 1048576
PCTINCREASE 0
MINEXTENTS 1
MAXEXTENTS 2147483645
FREELISTS 1 FREELIST GROUPS 1 )
NOCACHE; 


PCTFREE, PCTUSED 필요한가?
ROW CHANNING
현상과 ROW MIGRATION 현상에 대하여 알아야 한다.
ROW CHANNING
DB_BLOCK_SIZE보다 너무 데이터가 들어왔을 경우 인접한 다른 블록까지 데이터가 넘어가는 것을 말한다.
이런 경우, 만약에 데이터의 특징을 가진다면 LOB TYPE으로 다른 TABLESPACE 저장하는 것이 옳다.
지만 ROW CHANNING 일반적인 현상이다. 물론 9I 경우엔 파라미터에 DB_?K_CACHE_SIZE 주고 ?K CREATE TABLESPACE ~~ BLOCKSIZE ?K; 정하면 DB_BLOCK_SIZE 보다 BLOCK_SIZE 가지는 TABLESPACE 만들고 안에 데이터를 넣는다면 ROW CHANNING 방지할 있다.
경우 ROW CHANNING 어쩔 없는 현상이다.
하지만, ROW MIGRATION 막아야 하는 사항이다.
이것을 예를 들어 보자.

a. A
라는 테이블에 10번째 값을 INSERT
b.
이어서 11번째 값을 INSERT
c.
그런데 10번째 값을 유저가 UPDATE시켰는데, UPDATE 데이터가 예전의 데이터보다 크기가 크다!
d.
이때 DB BLOCK 11번째 때문에 여유공간이 없어서 다른 BLOCK으로 해당 데이터를 이동을 하게 된다.

이런 경우가 자주 일어나는 것은 좋지 않다. 그래서 PCTFREE, PCTUSED이라는 개념이 생긴 것이다.

PCTFREE 10, PCTUSED 40
이라고 한다면?
초기 블록에 데이터가 들어가다가 PCTUSED 40% 넘겼다. 그래도 계속해서 INSERT 한다.
그러다가 PCTFREE 10% 데이터가 90%넘게 채워질 경우에는 이상 데이터가 들어가지 않고 블록에 여유공간을 남겨둔다.
FILE HEADER
에서 FREELIST라는 것을 관리하는데 이것은 SEGMENT 들어갈 빈공간이 있는지를 확인하는 것이다.
상의 경우에서 데이터 기록량이 90% 넘기면 (, PCTFREE공간이 10% 이하가 된다면) 블록을 FREELIST에서 제거를 하고 블록은 INSERT 중단하고 다른 FREELIST 등록된 블록에 데이터를 넣을 것이다.
나중에 데이터가 UPDATE 경우를 블록의 10%만큼 미리 준비하는 것이다.

만약, 블록의 데이터마저 줄어든다면?
90%
보다 줄어들 경우 계속해서 0까지 줄어든다면, 블록을 FREELIST에서 삭제된 상황이니 이상 INSERT 되지 않는다.
경우를 대비하여 어떤 기준을 마련해두어야 한다.
PCTUSED
이렇게 BLOCK 데이터가 없어질 경우의 최소값을 말한다.
, 최소한 PCTUSED 만큼은 데이터가 들어가서 DB BLOCK 낭비를 최소화 하자 것이다.
이것이 PCTUSED 필요한 이유이다.

90%
이상으로 데이터를 채운 블록에서 데이터가 삭제되어 90% 미만로 떨어지게 되었다.
PCTFREE값이 10% 보다 여유공간이 생기는 것이다. 하지만 오라클은 PCTFREE 10%보다 여유공간이 생겨도 FREELIST 블록을 추가하지 않는다. , 데이터가 점점 줄다가 60%정도의 데이터가 되더라도 FREELIST 등록하지 않는다.

PCTUSED
보다 적어지는 상황이 생길 경우는?
PCTUSED 40%
보다 적어지는 상황이 생길 경우가 되어서야 비로소 데이터를 넣을 있도록 FREELIST 등록한다. 
하지만 9I에서는 PCTFREE, PCTUSED 방법은 권하지 않는다.
SEGMENT SPACE MANAGEMENT AUTO
절을 넣어서 AUTO 관리하도록 한다.

AUTO방식
AUTO
방식의 경우는 PCTFREE 관리한다.
블록을 25% 4개로 나눠 관리하는 방식이다. AUTO 쓰면 데이터 블록의 낭비를 막고 ROW MIGRATION 해결해준다. 수동은 권하지 않음!!!

STORAGE ( INITIAL 16384 NEXT 471556096 PCTINCREASE 80 ))
이상에서 STORAGE 절은 EXTENT할당 방식을 말한다.
두가지 방식이 있는데, 8I에서는 DEFAULT EXTENT 할당할 때에 DICTIONARY EXTENT MANAGED TABLESPACE 사용했다.
물론 이때도 LOCALLY EXTENT MANAGED TABLESPACE 만들 수는 있다.
9I
에서는 LOCALLY EXTENT MANAGED TABLESPACE DEFAULT값이다.

이상의 차이는 EXTENT 할당하는 방식에 따른다.
DICTIONARY EXTENT TABLESPACE
생성할 경우엔 테이블스페이스의 EXTENT 할당시에 정보를 SYSTEM TABLESPAE BASE TABLE에서 가져온다.
지만, EXTENT할당을 여기저기서 하다보니 SYSTEM TABLESPACE 조회해서 EXTENT 어디를 할당하면 것인지 확인하고 EXTENT 할당 할당정보를 SYSTEM TABLESPACE 저장한다. (병목현상 심함!)

그러나, LOCALLY EXTENT MANAGE TABLESPACE 경우엔 그렇지 않다.
SYSTEM TABLESPACE
BASE TABLE에서 EXTENT 여유공간 정보를 가져오는 것이 아니라 해당 데이터파일 헤더에 직접 BITMAP BLOCK으로 저장된다.
그래서 EXTENT할당시에 SYSTEM TABLESPACE에서 찾아서 할당하는 것이 아니라 자신이 속한 테이터파일의 헤더의 BITMAP BLOCK에서 찾겠죠. (경합현상이 거의 발생하지 않는다!)
오라클사에서는 DICTIONARY 방식을 사용하지 말고 LOCALLY TABLESPACE 사용하도록 권한다.

9I
에서 SYSTEM TABLESPACE LOCALLY TABLESPACE 경우, 일반 TABLESPACE생성시 DEFAULT STORAGE(DICTIONARY 방식) 사용되지 않는다. (에러발생!)
하지만 SYSTEM TABLESPACE DICTIONARY TABLESPACE 경우엔 DEFAULT STORAGE(DICTIONARY 방식) 통해서 CREATE TABLESPACE 사용할 있다.

만약, CREATE TABLE 절에 STORAGE 준다면 어떻게 될까?
이런 경우 EXTENET MANAGEMENT LOCAL 방식의 경우엔 질문사항인 STORAGE 절을 주게 되면 모두 무시된다. , TABLESPACE에서 정한 UNIFORM SIZE대로(DEFAULT라면 1M 만큼) EXTENT 할당한다. 

SYSTEM TABLESPACE
DICTIONARY TABLESAPCE라면?
경우에는 일반 TABLESPACE 만들 경우에 DEFAULT STORAGE절을 지정할 있다. 하지만, CREATE TABLE 명령에서 질문과 같이 STORAGE절을 주게 되면 TABLESPACE 설정은 모두 무시되고 CREATE TABLE 설정을 따른다.

STORAGE ( INITIAL 16384 NEXT 471556096 PCTINCREASE 80 ))
무엇을 뜻하는가?
SYSTEM TABLESPACE
LOCALLY EXTENT MANAGED TABLESPACE에서는 이상의 절을 이용하는 것이 불가능하므로, DICTIONARY EXTENT MANAGED TABLESAPCE라고 있다. 또한 TABLESPACE DICTIONARY EXTENT MANAGED TABLESAPCE이다. 

CREATE TABLE TEST ( ID NUMBER ) STORAGE STORAGE ( INITIAL 16384 NEXT 471556096 PCTINCREASE 80 ));
기에 테이블에 EXTENT 16384 바이트만큼을 미리 할당한다. EXTENT안에 DB BLOCK들에 데이터가 들어갔는데 데이터가 많이 들어가서 모두 데이터가 찼을 경우 새로운 EXTENT 할당 한다. 이때에 NEXT 만큼을 할당하는 것이다.
PCTINCREASE 80
다음의 경우, 80% 만큼 크게 늘어난다는 것이다. 

EXTENT1
에서는 16384
EXTENT2
에서는 16384 + 471556096
EXTENT3
에서는 (16384 + 471556096 + 471556096 ) * ( 1 + 0.8 )

이렇게 PCTINCREASE 쓰게 되면 쓸데없이 한꺼번에 EXTENT 할당받으므로 다른 TABLE에서 만큼 공간을 쓰지 못하게 된다. 따라서, PCTINCREASE 쓰면 안된다!
그리고, DICTIONARY방식은 쓰지 말고 LOCALLY 방식으로 UNIFORM SIZE 지정하라!
UNIFORM SIZE
대부분의 경우 10M 정도로 UNIQUE하게 주면 적당하다. (너무 크면 안됨!)

여러 테이블의 데이터가 들어가는데 너무 많은 EXTENT 생겨서 다른 테이블의 데이터와 섞이지 않나?
SMON
이라는 오라클 프로세스가 알아서 하므로, 고려할 없다.


최종 정리

PCTFREE 20
: UPDATE
위해서 DB BLOCK 최소한 20% 정도의 공간을 남겨두겠다.

PCTUSED 80
: PCTFREE
인한 공간낭비를 막기 위해서 최소한 80% 만큼의 데이터는 넣겠다.

INITRANS 1
: SEGMENT
트랜젝션이 최소 한개 이상 걸릴 있도록 한다.

MAXTRANS 255
: SEGMENT
트랜잭션이 최대 255개까지 걸릴 있도록 한다.

INITIAL 1064960
:
초기의 EXTENT 크기

NEXT 1048576
:
초기 EXTENT할당후 EXTENT 부족할 경우 다음 EXTENT 할당 크기

PCTINCREASE 0
: 0%
늘이겠다. (무시됨!)

MINEXTENTS 1
:
최소한의 EXTENT 할당하겠다.(INITIAL 10K 인데 MINEXTENTS 2 라면? TABLE 생성하면서 20K 미리 할당. 20부터 시작.)

MAXEXTENTS 2147483645
:
최대한의 EXTENT. (현재값은 데이터가 커지면 문제있다)

FREELISTS 1 FREELIST GROUPS 1
:
데이터블록의 SEGMENT관리에서 한개 FREELIST에서 FREE BLOCK 찾고 데이터를 넣는 것에 많은 트랜잭션이 처리를 경우 성능이 나빠지게 된다. 그래서 FREELIST 경우에 여러개가 있으면 분산이 가능하다. FREELIST GROUP FREELIST 몇개를 FREELIST GROUP으로 사용한다는 의미이다.

EXTENT : 보조 기억 장치에서, 파일이 연속적으로 기록되어 있는 일련의 블록
 

반응형
Posted by [PineTree]
PineTree/CAR2010. 10. 7. 17:38
반응형

신차길들이기 목적

1. 차량의 성능을 최상상태로 발휘하도록 유지

2. 내구성 향상과 연비향상

3. 배기가스로 인한 환경오염 등을 줄이기 위하여 신차 길들이기를 하여야 한다.  

 

1. 출발은 예열을 한 후에 하는 게 좋다.

시동직후에 급출발은 엔진마모가 있을 수 있기 때문에 피하고 시동걸고 어느정도 예열 후에 서서히 출발해야 엔진과 변속기에 무리를 주지 않는다. 따라서 시동을 건 후 여름철에는 약 30초~1분, 겨울철에는 약2~3분 정도 공회전 상태에서 기다린 후 정상온도가 되면 출발하는 것이 좋다.

 

2. 급가속, 과속, 급제동은 삼가 해야한다.

급가속 - 급가속은 많은 연료를 필요로 하고 엔진부하가 커져 불완전 연소가 일어나게 된다. 또한, 엔진오일의 열화로 인한 유해가스의 배출량도 많아지게 된다.

과속 - 과속은 엔진회전수가 과도하게 올라가며 이로 인해 기계적인 마모가 심하게 일어나 엔진의 수명을 단축시킨다.

급제동 - 급제동은 현가장치나 하체부품 등이 제자리를 잡도록 하는데 전혀 도움이 되지 않는다.


 

3. 수동변속기의 경우 변속은 변속시점에 맞추어 한다.

수동변속기 - 엔진의 회전수가 2,000~3,000 RPM 정도를 유지하면서 변속을 해야 엔진과 변속기에 무리를 주지 않는다.

자동변속기 - 자동변속기는 자동으로 변속이 이루어지지만 변속기에 무리를 주지 않기 위해서 가속 페달을 급하게 밟거나 놓지 않는 것이 좋다.

 

 

 

 

다음은 자동차 정비 경력 10년 이상 되신 기술자들이 권장하는 자동차 관리 법칙을 정리하여 보았다. 

 

1. 출고 약 1,000km~2,000Km 정도 운행을 하면 엔진오일을 교환하는것이 좋다.

Why?

: 엔진은 금속으로 된 여러 가지 부품들이 조합되어 서로 마찰을 하면서 지선운동과 회전운동을 하게 되는데 엔진이 새것일 때는 엔진내부의 각각의 부품들이 서로 마찰되면서 금속가루가 발생되기 때문..(사실 현재의 신차들은 마모가 거의 없다고 하지만 그래도 신차이니까^^) 그래서 최초 1,000km정도, 늦어도 2000Km 운행을 하였을 때 엔진오일을 교환하여 줌으로서 엔진내부의 금속가루를 제거하여 주는 것이다. 또, 엔진오일 교환시 오일필터도 반드시 같이 교환하여 준다.

 

2. 5,000km주행 시 까지는 엔진 회전 수를 3,000rpm이상 넘기지 않는 게 좋다.

Why?

: 엔진의 내구성은 엔진이 원활히 회전할 수 있도록 엔진내부의 각각의 부품들이 적당히 마모되어야 하는데 주행거리가 약5,000km미만에서는 부품들이 적절히 마모되어가는 과정이기 때문에 이 시기에 엔진의 회전 수를 무리하게 높여 주행을 하게 되면 엔진내부의 부품들이 필요이상으로 마모되어 소음을 유발하거나 내구성이 떨어질 수 있다.

 

3. 아침 시동시에 반드시 1~2분 이상 공회전 후 운행하는 게 좋다.

Why?

: 운행을 마치고 차량을 정차하게 되면 엔진내부의 오일은 엔진의 밑쪽인 오일팬에 모이게 되고 결과적으로 엔진의 상단부위에는 엔진오일이 거의 없는 상태가된다. 이때 시동을 걸게 되면 엔진이 회전을 하면서 충분한 엔진오일이 공급되지 못하여 각종 부품의 마모가 발생된다. 그래서, 엔진시동 후 엔진오일이 엔진의 내부를 완전히 순화하는데 소요되는 시간은 약 1분 정도 소요되기 때문에 시동을 걸고 약 1분 이상 공회전을 하여 엔진오일이 충분히 순환된 후 운행을 하여야만 엔진의 마모를 최대한 억제할 수 있다.

 

4. 출발시에는 천천히 출발하고 탄력으로 운행을 하는 게 좋다.

Why?

: 차량이 정차하였다가 출발시에는 주행 중일 때보다 많은 동력을 필요로 하게 되는데 출발시 급격히 출발을 시도하면 엔진에 부하가 필요이상으로 걸리게 되어 엔진의 내구성에 치명적인 영향을 주게 되고 연료의 소모도 급상승하며 엔진이외의 차량부품에 무리가 생겨 결과적으로 차량의 수명을 단축하게 된다. 또, 주행 중에 가속을 하기 위하여 악셀

페달을 많이 밟게 되면 동력이 많이 필요하기 때문에 엔진은 연료의 분사량을 늘리게 되어 연료의 소모가 촉진된다.

 

5. 코너 진입시 충분히 속도를 줄인다.

Why?

: 차량이 직진을 하다가 선회하게 되면 원심력에 의하여 차량은 선회하는 방향의 반대방향으로 무게 중심이 이동하여 차량의 중량과 원심력이 작용하기 때문에 차량에 많은 하중이 걸리게 되며 이때 차량의 속도를 높이면 높일수록 이 하중은 증가하게 되어 차량 하체 각 부품들이 하중을 받아 파손이 되거나 수명이 단축되어 주행시 소음을 유발하거나 코너링시 차량이 쏠리는 롤링현상이 발생하게 될 수 있다. 특히, 바퀴와 차량을 지지하여 주는 부품들은 더욱 큰 하중을 받게 된다.

 

6. 약 10,000km이상 주행을 하면 고속도로에서 차량최고속도를 내본다.

Why?

: 일반적으로 고속주행을 자주하는 차량과 고속주행을 하지 않는 차량은 최고 속도가 차이가 나거나 가속력이 차이가 나게 되는데 이는 엔진의 부품들이 엔진이 고속으로 회전할 수 있도록 적당히 마모되지 않아서 발생하는 현상이다.

고속주행시에 무리하게 가속 폐달을 밟게 되면 연료의 소모나 엔진부품에 무리가 올 수 있기 때문에 일단 차량이 탄력을 받게 되면 가속 폐달을 지긋하게 밟아 천천히 가속하여 최고속도까지 운행을한다. 이렇게 하면 차량이 고속주행시 시원하게 주행할 수 있다. 하지만, 일단 탄력을 받아 주행을 하게 되어 악셀 폐달을 밟았다가 놓았다 하면서 차량의 속도를 변화시키게 되면 오히려 엔진부품에 손상이 올 수 있기 때문에 속도의 변화를 적게 하여야 엔진이 고속주행에 원활하도록 각종 부품이 적절히 마모되게 된다.

 

7. 약 10,000km정도 운행을 하면 변속기 오일을 교환한다.

Why?

: 변속기는 내부의 많은 금속으로 된 기어들로 구성이 되어 있어서 차량이 주행을 하게 되면 기어들이 서로 맞물리면서 속도와 토크를 변화시키게 된다. 이때 운행 중에 각 기어들의 마찰로 인하여 금속가루가 나오게 되기 때문에 약 10,000km정도 운행시에 변속기 오일을 교환하여 금속 가루들을 제거해 주어야만 한다.

 

8. 엔진오일은 메이커에서 권장하는 오일 이상의 오일을 사용한다.

Why?

: 엔진오일은 엔진 부품들의 원활한 회전과 엔진의 냉각을 위하여 필요한 것이며 시동이 걸려 엔진이 회전을 하게 되면 엔진의 고열과 엔진에서 발생하는 유해가스 등으로 엔진오일이 산화, 부식되어 엔진오일이 가져야 하는 열에 대한 점도 특성이 저하되고 윤활성도 떨어지게 된다. 이렇게 되면 엔진부품의 마모가 촉진되어 엔진 수명이 단축되게 된다. 그래서, 엔진오일을 교환하는 것이며 가급적 좋은 제품을 사용하게 되면 열에 대한 오일의 점도 변화가 적고 윤활성이 좋아서 윤활 및 냉각을 잘 할 수 있어 엔진내구성을 증대시키게 된다.

 

 

 

자동차오래타기 

적정한 시기에 소모품을 교환하는게 좋다.

....엔진오일 : 매 5,000km

....밋숀오일 : 매 40,000km(자동 : 60,000km)

....점화플러그 : 매 20,000 ~ 30,000km

....연료휠터 : 매 40,000km

....벨트 : 매 30,000km(타이밍 벨트 : 70,000km)

급출발을 삼간다. ( 급출발시 연료소모 및 각종부품의 소모가 많다.)

급제동을 삼간다. ( 급제동시 각종 부품에 무리가 올 수 있다.)

초기 시동시 충분한 워밍업을 실시한다.(약 2 ~ 3분), 필요이상의 공회전은 좋지 않으니 장시간 정차시 엔진정지 

  필요없는 화물은 적재하지 말자.

적정시기에 기어변속을 하며(2,000 ~ 2,500rpm), 가능한 정속주행을 한다. 

과속을 하지 않는다. ( 무리한 과속은 엔진의 마모와 차량하체 부분의 손상을 촉진시킨다.)

엔진을 고회전으로 운행하지 않는다. ( 2,000 ~ 3,000rpm이 적정하다.)

적어도 한달에 한번은 물세차를 한다. 3개월에 한 번쯤은 세차후 왁스작업을 한다.

해변이나 험한 주행 후에는 반드시 물세차를 한다.

문을 열고 닫을 때 부드럽게 한다.

유리창은 유리세정제로 닦는다.

타이어는 적정 공기압을 주기적으로 체크하며, 10,000km마다 위치교환을 한다.

주차시에는 가급적 서리 또는 비를 맞히지 않는다.

주기적으로 차량 일상 점검을 하여 고장을 사전에 막는다.

 

기타...

엔진오일 - 새차의 경우 처음에는 천에서 이천키로 주행 후 갈아주고, 그 후로는 오천에서 칠천키로 정도마다 교환하는게 좋다. 장거리를 많이 뛰는 경우에는 갈아주는 기간이 짧다던가 하는 유동성이 있고, 갈때는 연료필터 까지 함께 갈아주는 것이 좋다.

냉각수-주기적으로 점검

브래이크액, 미션오일 등등 - 보통 3만킬로 주행거리가 넘으면, 점검해서 교체해 주는 것이 좋다.

브레이크 라이닝 - 만5천-~2만키로 정도에 브레이크가 밀린다고 느껴지면 교체. 라이닝은 앞바퀴굴림의 차일경우, 앞바퀴가 먼저 마모가 되므로 1만5천에 한쪽, 3만에 앞뒤 다, 이런 식의 관리가 편하다.

데리-밧데리 주기적으로 점검하고 특히 겨울에 소모가 심하니 겨울 준비 할 때 꼭 점검한다.

 

같은 차량이라도 운전자의 차량운행 습관에 따라 차량 성능이 많이 달라질 수 있으니 항상 차량 길들이기에 관심을 갖는 습관이 좋다.


반응형
Posted by [PineTree]
ORACLE/ADMIN2010. 10. 7. 17:37
반응형
제품 : SQL*NET

작성날짜 : 2002-11-29

(9I) 다른 장비에 있는 REMOTE LISTENER 설정하여 로컬 데이타베이스 사용하기
==================================================

PURPOSE


아래의 test는 9i 데이터베이스에서 remote machine에 있는 listener을 사용하는 방법에
대해 다룬다.


Explanation & Example



데이터베이스가 운영중인 machine 은 'krint-5' 이며
listener을 띄울 machine은 'krind2'이다.


< remote machine(krind2)에서의 작업 >

1. remote machine(krind2)에 listener.ora을 만든다.
아래와 같이 SID_LIST_LISTENER 절은 필요치 않으며 LISTENER절만 있으면 된다.
만약 remote machine에도 데이타베이스가 존재한다면 그 데이타베이스를 나타내는
SID_LIST_LISTENER 절을 포함해도 상관이 없다.

ex)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = krind2)(PORT = 1901))
)
)
)

2. 위와 같이 setup한후 listener를 시작한다.

lsnrctl start

< local machine(krint-5)에서의 작업 >

1. local machine에서 init<SID>.ora에 remote listener을 등록한다.
(만약 spfile을 사용한다면 그에 맞게 수정한다)

*.dispatchers="(protocol=tcp)(disp=4)"
*.remote_listener="(address=(protocol=tcp)(host=krind2)(port=1901))"

( 참고 : listener port응 어떤것을 사용해도 무방하다)

2. 위와 같이 setup이 끝나면 데이타베이스를 새로 시작한다.

< remote machine(krind2)에서의 확인 >

1. remote machine에서 listener.log을 확인한다.

29-NOV-2002 19:31:08 * service_register * ORA920 * 0
29-NOV-2002 19:31:17 * service_update * ORA920 * 0
29-NOV-2002 19:31:20 * service_update * ORA920 * 0

ORA920 이 instance_name 이다.

2. "lsnrctl service" 확인한다.

/home/ora901/product/901/network/admin> lsnrctl ser

LSNRCTL for Linux: Version 9.0.1.4.0 - Production on 29-NOV-2002 19:32:18

Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=krind2)(PORT=1901)))
Services Summary...
Service "ORA920" has 1 instance(s).
Instance "ORA920", status READY, has 5 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
"D006" established:0 refused:0 current:0 max:1002 state:ready
DISPATCHER <machine: krint-5, pid: 5506>
(ADDRESS=(PROTOCOL=tcp)(HOST=krint-5.kr.oracle.com)(PORT=41748))
"D005" established:0 refused:0 current:0 max:1002 state:ready
DISPATCHER <machine: krint-5, pid: 5504>
(ADDRESS=(PROTOCOL=tcp)(HOST=krint-5.kr.oracle.com)(PORT=41747))
"D004" established:0 refused:0 current:0 max:1002 state:ready
DISPATCHER <machine: krint-5, pid: 5502>
(ADDRESS=(PROTOCOL=tcp)(HOST=krint-5.kr.oracle.com)(PORT=41746))
"D003" established:0 refused:0 current:0 max:1002 state:ready
DISPATCHER <machine: krint-5, pid: 5500>
(ADDRESS=(PROTOCOL=tcp)(HOST=krint-5.kr.oracle.com)(PORT=41745))
The command completed successfully

< Client에서 접속해 보기 >

1. 연결을 위해 tnsnames.ora 을 수정한다.

r_list.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = krind2)(PORT = 1901))
)
(CONNECT_DATA =
(SERVICE_NAME = ORA920)
)
)

2. sqlplus등으로 점속을 해 본다.
remote machine에 있는 listener.log을 보면 remote listener을 이용하여
local machine에 있는 데이타베이스에 접속이 잘 되었음을 알수 있다.

29-NOV-2002 19:36:48 * (CONNECT_DATA=(SID=ORA920)(CID=(PROGRAM=PLUS33W.EXE)(HOST
=jooyeon-kr)(USER=jooyeon))) * (ADDRESS=(PROTOCOL=tcp)(HOST=152.69.41.120)(PORT=
2865)) * establish * ORA920 * 0

( 참고 : 반드시 MTS을 사용해야 하며 그렇지 않다면 작동하지 않는다.)

RELATED DOCUMENTS


<Note:206550.1>
반응형
Posted by [PineTree]
PineTree/CAR2010. 10. 2. 08:35
반응형

정비업체를 찾는 운전자들이 항상 하는 걱정은 '바가지'다. 몇 가지 소모품만 교환하면 될 것이라고 여겼는데 "여기저기 고칠 게 많은 문제 투성이"이라는 정비업체 직원 말이 미덥지는 않지만 "내 말대로 하지 않으면 사고 나도 자기는 모르겠다"는 은근한 협박이 마음에 거슬리기도 한다.

‘바가지를 씌우지 않고 정직하게 고쳐주는’ 정비업체를 찾고 싶지만 그 방법을 몰라 어쩔 수 없이 지갑을 열게 된다. 사실 기술 좋고 양심적인 정비업체나 정비사를 찾는 방법은 그다지 어렵지 않다.

1. 정비 상담과 견적서부터 받아라

정비업체에서 바가지를 쓰지 않으려면 정비업체에 가기 전에 자동차시민운동연합 등 자동차 관련 소비자단체나 자동차 관련 사이트 내 ‘정비상담’ 코너에서 정보를 얻은 뒤 업체를 방문하는 게 좋다.

정비를 받고 난 뒤에는 견적서를 발급받아 비용을 살펴본 뒤 예상보다 많이 나왔는지, 근처의 다른 업체보다 비싸지는 않은 지 따져봐야 한다. 자동차관리법시행규칙에는 점검·정비견적서를 소비자에게 발급토록 돼 있다.

2. 발품과 손품을 팔아라

여러 개 정비업체를 고른 뒤 비교견적을 내보는 것도 필요하다. 엔진오일이나 에어컨가스, 자동변속오일 등을 점검할 때는 비교견적이 비용절감 효과를 크게 발휘한다.

장거리주행이나 타지에서 긴급한 고장이 발생했을 때 처음 가는 업체가 예상보다 많은 돈을 요구하거나 10만원 이상 정비 비용이 들어갈 경우 단골 정비업체에 전화로라도 확인해 적정 여부를 따져봐야 한다.

3. 싼 값에 현혹되지 마라

유난히 싼 값에 정비해 준다는 정비업체는 조심해야 한다. 미끼상품을 내세워 과잉정비를 하거나 미끼품목 외에는 오히려 더 비싸게 비용을 물리는 업체들이 전국 곳곳에 도사리고 있다.

또 정비를 받고 난 뒤 가격을 흥정하는 건 금물. 정비하기 전에 견적을 내달라고 하고, 견적 비용이 예상보다 비싸거나 정비 품목이 많을 때는 다른 정비업체의 견적을 받거나 조언을 구하는 게 낫다.

4. 부품의 품질도 중요하다

어떤 부품을 사용하는지도 꼼꼼히 살펴봐야 한다. 싼 값에 고쳐준다면서 포장만 국산이고 실제로는 저질 중국산인 부품이 많다. 타이밍벨트, 필터, 전조등, 플러그, 연료펌프 등이 주로 국산으로 둔갑된다.

타이밍벨트의 경우 순정품은 8만㎞까지 쓸 수 있지만 저질 중국산 제품은 그 절반도 못 쓰고 끊어진다.

몇 만원 아끼려고 저질 타이밍벨트를 사용했다가는 갑작스레 벨트가 끊어져 엔진헤드 손상이 일어나 100만원 이상 추가 비용이 발생할 수 있다.

정비 명세서에 부품 원산지를 적어두면 나중에 정비업체가 원산지를 속였을 때 피해를 보상받을 수도 있다.

5. 정비명세서는 꼭 보관하라

정비가 끝났다고 모든 게 끝나는 것은 아니다. 정비업체와 관련된 소비자 불만의 80%는 정비가 완료된 뒤 알게 되는 경우가 많은 과잉정비다.

이 같은 피해를 줄이려면 자동차 사후관리 점검 및 정비명세서를 반드시 정비업체에 요구해 교부받아야 한다. 나중에 과잉 또는 부실 정비가 발견되면 정비명세서에 근거해 피해를 구제받을 수 있기 때문이다. 정비업체가 사후관리를 거부하면 30만원의 과태료를 부과받게 된다.

반응형
Posted by [PineTree]
PineTree/CAR2010. 9. 29. 20:25
반응형
자동차를 구성하는 여러 가지 부품 중에 가장 핵심적 역할을 하는 것이 엔진입니다.
자동차 관리 항목 중에서 가장 우선 살펴야 하는 항목도 당연히 엔진 부분인데,
처음 자동차를 구매했거나 혹은 경력이 쌓여 새차를 구매한 사람이라도 
이 엔진을 어떻게 길을 들여야 하나 하고 고민하기 마련입니다.
 
요즘은 예전과는 달리 차량이 출고되기 전에 실린더 내부를 가공하는 작업이 이루어지고
또한 자동차 제조기술이 향상되어서 엔진을 길들일 필요는 없다고 말을 하지만
어느 정도의 엔진 길들이기는 필요하다는 게 차량 전문가들의 공통된 의견입니다.
 
1. 신차를 인도받은 후
 
신차를 구입한 후 1천 킬로미터까지는 어느 정도 길들여질 필요가 있습니다.
엔진 가동 초기에는 각기 다른 과정으로 가공되어 길들여지지 않은 부품들이 서로 부드럽지 않은 상태로
맞물려 구동되기 때문에 상대 부품과의 궁합을 맞추기 위한, 또 하나의 새로운 과정을 겪기 때문입니다.
길들여지는 동안에는 엔진 회전수와 궁합 부위인 각 부분의 접촉부에 무리를 주는 부하 조건들이 많으면 많을수록
엔진의 마모도 커지게 되기 때문에 조심스레 운전을 해야겠지요.
 
급격한 출발과 급제동을 삼가하시구요. 주행중에도 어느정도 조심스러운 운전이 필요합니다.
rpm 2000의 내외에서 최대 시속 100km 정도까지만 속도를 내면서 조심스럽게 달립니다.
과하게 정체되는 구간이라든가 급경사가 심한 곳은 되도록 삼가고 주말에 가볍게 국도를 달려보는게 좋죠.
 
 
2. 1000km 이상 달린 후
 
보통은 필요가 없다고 말하지만 정말 소중히 관리하고 싶다면
1000km 정도를 주행한 후 엔진오일을 교환해주는 것이 좋습니다.
조금 아깝다싶으시면 5000km 이내에서라도 한 번 갈아주세요~
그 후에는 수시로 엔진오일의 색상과 양을 확인하시면서 보충하시거나 교환하시면 됩니다.
 
이 시기부터는 자동차 내부 부품들이 마찰을 덜하게 되고 저항도 적어지게 되면서
각 기계들의 성능이 점점 궤도에 오르는 시기인데요 이때 한 번 엔진오일을 갈아주면 좋겠죠.
 
주변에서 차량이 1년만 지나도 소음이 커지고 문제가 많아진다고들 하는데요
저는 제가 관리한 여러가지 차종중에 단 한대도 이런 문제를 겪은 적이 없습니다.
성급한 일반화의 오류겠지만 그래도 이렇게 초기에 관리를 신경써주면 확실히 좋다고 믿고 있습니다.
 
 
3. 2000km 이상 달린 후
 
이 때는 자동차의 각 부품들이 자리를 잘 잡은 상태겠죠?
자동차도 습관이 듭니다. 너무 저속으로만 달리면 자동차 역시 필요할 때 제 기능을 못합니다
마음 단단히 먹고 고속도로에 올라봅니다. 구태여 심하게 과속을 할 필요야 없습니다만
과속카메라를 눈치껏 살피면서 규정속도를 넘겨서 달려줍니다.
심한 소음이나 진동없이 가속과 감속이 순조로운지도 살펴보고 내 차의 성능도 만끽해 봅니다.

4. 엔진을 위한 평소 운전습관
 
* 여름철에는 2분가량 겨울철에는 5분가량 예열을 하고 후열 역시 2분가량 해줍니다.
이 역시 요즘 차에는 그다지 필요없다고들 합니다만 예열 후 rpm이 1000밑으로 내려갈때 출발하는게 좋습니다.
자동차 길들이기와 마찬가지로 귀찮더라도 초기에 이 예열 후 운전하는 습관을 잘 들이면 소음과 진동감소에 좋구요
자동차가 멈추고 나서도 2분가량 엔진을 쉬게 해주고 시동을 끄는것이 좋습니다.
엔진도 사람과 같이 준비운동이 필요합니다. 또한 마무리 운동도 필요하죠.
하루에 이 5분가량의 습관이 조용하고 떨림없는 내 차를 만드는데 정말 중요하다는 점 잊지 마세요.
 
* 내 차를 사랑한다면 엔진룸을 자주 열어보세요. 각종 오일류 및 냉각수 등을 수시로 점검해줍니다.
그냥 동네 카센터에서 차를 맡겨놓고 알아서 고쳐달라는 건 이젠 바보들이나 하는 행동입니다.
트렁크에 장갑 한짝을 상시 구비해두고 한가한 날마다 엔진룸을 열어보고 체크를 해봅니다.
 
* 가끔 엔진룸을 청소 해줍니다.
동네 카센터에 가면 어느곳에나 고압 에어컴프레셔가 구비되어있습니다.
웃는 낯으로 들러 잠시 쓰겠다고 하면 아무도 돈받지 않습니다.
엔진룸을 열고 싹 한번씩 먼지를 털어주면 좋겠죠?

저두모르는 부분이 많이 있어서 횐님들에게 도움이 될까싶어서
퍼왔습니다 많은 도움이 되었으면 좋겠습니다 ^^
반응형

'PineTree > CAR' 카테고리의 다른 글

신차 길들이기  (0) 2010.10.07
양심 카센터 선택 5계명  (0) 2010.10.02
자동차 회사 로고에 담긴 이야기들  (0) 2010.08.13
2010 NEWSM5에 관한 질문 및 답변정리  (0) 2010.08.07
보험사가 알려주지 않는 상식  (0) 2010.06.08
Posted by [PineTree]
PineTree/Invitation2010. 9. 2. 11:37
반응형
i n v i t a t i o n

티스토리 초대장

+ 남은 초대장 수 :9

안녕하세요!

티스토리에 보금자리를 마련하시려는 여러분께 초대장을 배포해 드리려고 합니다.

나만의, 내 생각을, 내 기억을 담는 소중한 블로그를 만들고 싶다면 티스토리로 시작해보세요!

티스토리 블로그는 초대에 의해서만 가입이 가능합니다. 원하시는 분은 아래 댓글(New Comment)로 신청해 주시면 초대장을 보내드립니다. 댓글(New Comment)남길때 이메일(Email)입력란에 이메일주소 정확히 입력해주셔야합니다.(이메일주소로 초대장이발급됩니다.)

초대장을 보내드리고 일주일이내 개설하시지 않으신 분들은 초대장이 회수되오니 바로 개설해주세요! 개설하신 후에 댓글남겨주는 센스 ^^




Yes
이런 분들께 드립니다!
1. 다른 블로그를 사용해보셨던 분
2. 이메일 주소가 정상적인 분
3. 블로그를 시작하려는 이유를 남겨주신 분!
No
이런 분들께 드리지 않아요!
1. 이메일 주소가 의심되는 분!
2. 이메일 주소를 남기지 않으신 분
3. 이유도 없이 달라고 하시는 분!
티스토리 이래서 좋아요!
1. 이미지, 동영상, 오디오, 파일까지! 무한 용량과 강력한 멀티미디어를 올릴 수 있어요!
2. 스킨위자드로 스킨을 내맘대로~ 거기에 기능 확장 플러그인까지!
3. 내가 원하는대로 myID.com으로 블로그 주소를 만들 수 있어요!
반응형
Posted by [PineTree]
ORACLE/10G2010. 8. 16. 15:59
반응형


출처 : http://blog.naver.com/darkturtle?Redirect=Log&logNo=50014575918


누가 그랬던가, DBA 가 가장 빛나는 시간 중 하나가 Data 복구라고..

쉽고 강력한 FlashBack에 간단히 Review

원문 : Reviewed by Oracle Certified Master Korea Community
( http://www.ocmkorea.com http://cafe.daum.net/oraclemanager )
A REWIND BUTTON FOR ORACLE 10G DATABASE
– FLASHBACK BEST PRACTICES

 

 

FlashBack 관련 정리

Flashback technology is one of the key features within Oracle
database products in reducing the mean time to recover (MTTR) from database failures
caused by logical data corruption or human errors.


1. Flashback Query [ rely on the Automatic Undo Management ]
 This feature lets you specify a target time or SCN in the past and then run
 queries against your database to view any data at that time
 using the AS OF clause of the SELECT statement. Can be used to recover
 from any unwanted changes like an erroneous update to a table.
 
2.Flashbackup Version Query  [ rely on the Automatic Undo Management ]                    
 Provides a mechanism to review the changed versions of all rows made
 to the database in a specified time interval. With this feature, You
 can also retrieve metadata about the differing versions of the rows,
 including start time, end time, operation, and transaction ID of the
 transaction that created the version. Therefore, you can recover lost data
 values and audit any changes made to the tables queried.
 
3. Flashback Transaction Query  [ rely on the Automatic Undo Management ]
 Lets you view changes made by a single transaction, or by all the transactions
 during a period of time.
 
4. Flashback Table [ rely on the Automatic Undo Management ]
 This feature can return a table to its state at a previous point in time.
 You can easily restore table data while the database is online, undoing
 changes only to the specified table.
 
5. Flashback Drop [ uses a mechnism of recycle bin ]
 Undo the effects of a DROP TABLE statement.
 
6. Flashback Database [
 This is a new and more efficient strategy for doing point-in-time recovery.
 It likes a “rewind button” embedded within the database to let you rewind
 your database to a point in time and correct any problems caused
 by human errors, data corruption or any other logical data errors. 
--------------------------------------------------------------------------------
  Flashback <================= Data Buffer ====================> Redo log
  Buffer    Not every change                               Every change          Buffer
    |                                                                                              |
    |-------------------|                             |----------------------|  
                       RVWR                            LGWR 
                        |                                    |
                Flashback Logs            Redo Logs
- Flashback area : flashback database logs, archived redo logs, and RMAN backups
- Flashback Database log is another new concept. It is the old versions of changed
  blocks of the database, and these flashback logs are located at Flash Recovery area.
- Flashback buffer is a new cache within SGA. It is used for caching the snapshot 
  of changed data blocks. 
- RVWR (Recovery Writer) is a new background process, which is started
  whenever Flashback Database is enabled.
--------------------------------------------------------------------------------
!! Automatic Undo Management ...
Used primarily for such purposes as providing read
consistency for SQL queries and rolling back transactions, these undo segments
should contain sufficient information required to reconstruct data as it stood
at a past time and examine the record of changes since that past time.
 
ARCHITECTURE AND CONSIDERATION FOR ORACLE 10G FLASHBACK
 
 You may ask, how far can you flash back into the past?
of course, this depends on how much UNDO information retained in the
database's UNDO segments, and is bounded by the time frame specified
by the UNDO_RETENTION initialization parameter.

- UNDO_MANAGEMENT : setting to AUTO, which ensures that the database is using
 an undo tablespace.
- UNDO_TABLESPACE : Define which undo tablespace to use. The size of
 UNDO tablespace is another key factor for flashback features, that determine
 how much information retains within the UNDO space.
 For Oracle Real Application Cluster (RAC) environment, each instance has its own UNDO space.
- UNDO_RETENTION : setting this initialization parameter to a value that causes
 UNDO to be kept for how far you can flashback in time.
 By default, this setting is 900 seconds (15 minutes)
- RETENTION GUARANTEE - This is a statement clause used for UNDO tablespace
 to guarantee that unexpired undo will not be overwritten.

SCENARIO 1: FLASHBACK QUERY
On Monday afternoon, a junior DBA helped to perform emergency maintenance
for a developer against the EMPLOYEE table, inadvertently deleted the data
for employee ‘PETER’ from the table. After careful researches, the senior DBA
knew the approximate time at which this had occurred.

## Check Sysdate
SCOTT@TEST_T.WORLD>select sysdate from dual ;
SYSDATE
-------------------
2007.02.21 18:58:47

## Delete MILLER ( NO PETER T_T )
SCOTT@TEST_T.WORLD>delete emp where ename ='MILLER';
1 row deleted.

## Commit !!
SCOTT@TEST_T.WORLD>commit ;
Commit complete.

## Check Sysdate
SCOTT@TEST_T.WORLD>select sysdate from dual ;

SYSDATE
-------------------
2007.02.21 18:59:03

SCOTT@TEST_T.WORLD>  select * from emp as of timestamp
                     to_timestamp('2007/02/21 185803','YYYY/MM/DD HH24MISS')
                     where ename ='MILLER' ;


     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7934 MILLER     CLERK           7782 1982.01.23 00:00:00       1300                    10
==> Delete 된 Row 가 보인다. [ 맞는지 체크 ! ]

# Delete row 복구
SCOTT@TEST_T.WORLD>insert into emp ( select * from emp as of timestamp
  2   to_timestamp('2007/02/21 185803','YYYY/MM/DD HH24MISS') where ename ='MILLER') ;

1 row created.

# Commit
SCOTT@TEST_T.WORLD>commit ;
Commit complete.

## 복구 Data 확인
SCOTT@TEST_T.WORLD>select * from emp where ename ='MILLER' ;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7934 MILLER     CLERK           7782 1982.01.23 00:00:00       1300                    10
 
SCENARIO 2: FLASHBACK VERSION QUERY
You are the DBA for a Peoplesoft HR system. On 9:00 AM Monday morning,
HR manager sent you an urgent email regarding some abnormal changes of
your employee table data during weekend. Yor are asked to retrieve the
information about the transactions that changed the rows of employee table.

This is an common scenario for data auditing. Oracle 10g Flashback Version Query
provides a easy way for data auditing.

It can retrieve all committed versions of the rows that exist or ever existed
between the time the query was issued and a point in time in the past,
as long as those versions are still available within the UNDO tablespace's rollback segments.
A new pseudocolumn VERSIONS_XID is introduced as a transaction identifier of
the corresponding version of a row, and the transactionVERSIONS clause is
used to retrieve all of the versions of the rows that exist between two points
in time or two SCNs. The rows returned by Flashback Versions Query present
a history of the rows across transctions. It is worth to mention that
Flashback Versions Query only return comitted transactions.

# Attention [  UNDO_RETENTION By default, this setting is 900 seconds (15 minutes) ]
# Transaction Log 발생
SCOTT@TEST_T.WORLD>delete emp where ename in ( 'SMITH','ALLEN','WARD') ;

3 rows deleted.

SCOTT@TEST_T.WORLD>commit ;

Commit complete.
SCOTT@TEST_T.WORLD>select sysdate from dual ;

SYSDATE
-------------------
2007.02.21 19:20:13


# Check Logs
   select versions_xid, versions_operation, ename from emp
   versions between timestamp to_timestamp('2007.02.21 19:10:47','YYYY.MM.DD HH24:MI:SS') and
   to_timestamp('2007.02.21 19:20:00','YYYY.MM.DD HH24:MI:SS')
   where versions_operation is not null ;
  
VERSIONS_XID     V ENAME
---------------- - ----------
000400170002F837 D WARD
000400170002F837 D ALLEN
000400170002F837 D SMITH

when using Flashback Version Query, there exists following limitations:
- VERSIONS BETWEEN clause cannot be used for External Tables,
  Temporary Tables, and Fixed Tables.
- VERSIONS BETWEEN clause cannot be used for views
- VERSIONS BETWEEN cannot produce versions of rows across DDL statements
  that changes the table structures
- VERSIONS BETWEEN can be used in the subqueries of DDL and DML statements
- ORA-30052 error if not appropriate UNDO_RENTION

SCENARIO 3: FLASHBACK TRANSACTION QUERY
According the Scenario 2, you have found some changes happening on you employee table.
These transactions include the UPDATE, DELETE, and INSERT. However,
you are required to know what operations have been made on the transaction level,
how to undo the changes back to its before immages, and finally use the undo DML
to recover the data. This is an urgent need for HR department.

FLASHBACK_TRANSACTION_QUERY is a view within Oracle 10g database to determine
all the necessary SQL information that can be used to undo the chnages
that were made by a specific transaction during a specific time period.

{ This note contains error information about an "Oracle Server"
  error number. It may contain additional support notes as
  described in Note 22080.1 }

  1  select versions_xid, ename from emp versions between timestamp
  2  to_timestamp('2007.02.21 19:28:47','YYYY.MM.DD HH24:MI:SS') and
  3  to_timestamp('2007.02.21 19:38:00','YYYY.MM.DD HH24:MI:SS')
  4* where ename ='WARD'
SCOTT@TEST_T.WORLD> select versions_xid, ename from emp versions between timestamp
                    to_timestamp('2007.02.21 19:28:47','YYYY.MM.DD HH24:MI:SS') and    
                    to_timestamp('2007.02.21 19:38:00','YYYY.MM.DD HH24:MI:SS')
                    where ename ='WARD' ;           *
ERROR at line 1:
ORA-08186: invalid timestamp specified

Error:   ORA-08186  (ORA-8186)
Text:   invalid timestamp specified
---------------------------------------------------------------------------
Cause: as stated above
Action: enter a valid timestamp
==> 상기 원인은 19:38:00 분이 아직 되지 않은 시점이었다.
SCOTT@TEST_T.WORLD>  select versions_xid, ename from emp versions between timestamp
 to_timestamp('2007.02.21 19:20:47','YYYY.MM.DD HH24:MI:SS') and
 to_timestamp('2007.02.21 19:34:00','YYYY.MM.DD HH24:MI:SS')
 where ename ='WARD'
 /
no rows selected

## 조금 이상하다. 다시 함 체크 해보자
## 복구할 Data 발생
SCOTT@TEST_T.WORLD>delete emp where empno in ( 7782, 7788,7839 ) ;
3 rows deleted.
SCOTT@TEST_T.WORLD>commit ;
Commit complete.
## Check Sysdate
SCOTT@TEST_T.WORLD>select sysdate from dual ;
SYSDATE
--------------------
2007.02.21 19:53:44

# 시간으로
     select * from emp versions between timestamp
     to_timestamp('2007.02.21 19:45:00','YYYY.MM.DD HH24:MI:SS') and
     to_timestamp('2007.02.21 19:55:44','YYYY.MM.DD HH24:MI:SS')


#  원본 테이블과  차이 보기 및 백업 데이타 [ 시간에 쫒기는거라 ㅡ_ㅡ; ]
     create table differ_emp as
     select * from emp versions between timestamp
     to_timestamp('2007.02.21 19:45:00','YYYY.MM.DD HH24:MI:SS') and
     to_timestamp('2007.02.21 19:55:44','YYYY.MM.DD HH24:MI:SS')
     minus
     select * from emp

# 데이타 확인     
 select * from differ_emp
# 원본에 없는 데이타만 입력 
insert into emp select * from differ_emp minus select * from emp

## XID 값을 통해서 Undo 구하는 방식으로는 where in 절의 3 row 에 대한
   undo 문이 return 되지 않고, 한 Transaction 내의 첫번째 row 만 recovery
   가능한 undo_sql 문이 구해진다.... ㅜ_ㅜ

       
### Test 하기 까탈스러워서 undo_retention 을 늘려주다
### live 환경에서 어떻게 가는지 체크 해보자

SYS@TEST_T.WORLD>show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1
SYS@TEST_T.WORLD>alter system set undo_retention = 30000 ;
System altered.

SYS@TEST_T.WORLD>show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     30000
undo_tablespace                      string      UNDOTBS1


SCENARIO 4: FLASHBACK TABLE
The current time is 12 PM on April 2, 2005. Your HR user run an erroneous DML
while trying to fix the employee tablel data, some of the
employee data lost. You are required to recover the data ASAP.

Like flaskback query, to implement Flashback Table feature, you have
to configure UNDO_TABLESPACE and UNDO_RETENTION to guanantee enough space
to hold undo data, and time for retaining undo data. Appropriate undo
information can control how far back in time a table can be repaired using this feature.

Because Flashback Table feature does
not preserve the original row IDs, it is necessary to enable row movement
on the impacted tables first before performing the flashback table.


SCOTT@TEST_T.WORLD>select sysdate from dual ;

SYSDATE
-------------------
2007.02.21 19:53:44

SCOTT@TEST_T.WORLD>select * from emp ;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7844 TURNER     SALESMAN        7698 1981.09.08 00:00:00       1500          0         30
      7876 ADAMS      CLERK           7788 1983.01.12 00:00:00       1100                    20
      7900 JAMES      CLERK           7698 1981.12.03 00:00:00        950                    30
      7902 FORD       ANALYST         7566 1981.12.03 00:00:00       3000                    20
      7934 MILLER     CLERK           7782 1982.01.23 00:00:00       1300                    10

# 복구할 시간 체크
SCOTT@TEST_T.WORLD>select sysdate from dual ;
SYSDATE
-------------------
2007.02.21 20:38:26

# 복구할 데이타 삭제
SCOTT@TEST_T.WORLD>delete emp ;
5 rows deleted.

SCOTT@TEST_T.WORLD>commit ;
Commit complete.

# 장애 타이밍 체크
SCOTT@TEST_T.WORLD>select sysdate from dual ;
SYSDATE
-------------------
2007.02.21 20:38:46

# 복구 가능하도록 Table 설정 변경
SCOTT@TEST_T.WORLD>alter table emp enable row movement ;
Table altered.

# flashback table ...
SCOTT@TEST_T.WORLD>flashback table emp to timestamp to_timestamp('2007.02.21 20:38:26','YYYY.MM.DD HH24:MI:SS') ;
Flashback complete.

# 복구 확인
SCOTT@TEST_T.WORLD>select * from emp ;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7844 TURNER     SALESMAN        7698 1981.09.08 00:00:00       1500          0         30
      7876 ADAMS      CLERK           7788 1983.01.12 00:00:00       1100                    20
      7900 JAMES      CLERK           7698 1981.12.03 00:00:00        950                    30
      7902 FORD       ANALYST         7566 1981.12.03 00:00:00       3000                    20
      7934 MILLER     CLERK           7782 1982.01.23 00:00:00       1300                    10

## 장애 시점으로 다시 복구(delete 된 상황으로 원복)
SCOTT@TEST_T.WORLD>flashback table emp to timestamp to_timestamp('2007.02.21 20:38:46','YYYY.MM.DD HH24:MI:SS') ;
Flashback complete.

## Delete 상황 다시 체크
SCOTT@TEST_T.WORLD>select * from emp ;
no rows selected

## 다시 문제 발생 이전 시점으로 복구
SCOTT@TEST_T.WORLD>flashback table emp to timestamp to_timestamp('2007.02.21 20:38:26','YYYY.MM.DD HH24:MI:SS') ;
Flashback complete.

## 복구 상황 체크
SCOTT@TEST_T.WORLD>select * from emp ;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7934 MILLER     CLERK           7782 1982.01.23 00:00:00       1300                    10
      7844 TURNER     SALESMAN        7698 1981.09.08 00:00:00       1500          0         30
      7876 ADAMS      CLERK           7788 1983.01.12 00:00:00       1100                    20
      7900 JAMES      CLERK           7698 1981.12.03 00:00:00        950                    30
      7902 FORD       ANALYST         7566 1981.12.03 00:00:00       3000                    20

flashback table process can automatically restores
all attributes associated with the table, such as indexes and triggers,
and maintains the dada integrity with preserving all dependent objects
and referential constraints.

However, there exists following limitations when performing the flashback table function:
- Executed within a single transaction
- Acquire exclusive DML locks
- Statistics are not flashbacked
- Can’t across DDL operation
- Can’t Flashback system tables

SCENARIO 5: FLASHBACK DROP TABLE
The current time is 12 PM on April 5, 2005. Your training DBA just told you that
he dropped the HR employee table. The table was dropped around 11:45 AM.
The database activity is minimal because most staff are currently in a meeting.
The table must be recovered.

# drop
SCOTT@TEST_T.WORLD>drop table emp ;
Table dropped.

# 원래 이름으로 원복
SCOTT@TEST_T.WORLD>flashback table emp to before drop ;
Flashback complete.

# drop
SCOTT@TEST_T.WORLD>drop table emp ;
Table dropped.

# 다른 이름으로 복구
SCOTT@TEST_T.WORLD>flashback table emp to before drop rename to employee ;
Flashback complete.

# drop
SCOTT@TEST_T.WORLD>drop table employee ;
Table dropped.

# 쓰레기통(user_recyclebin) 조회
SCOTT@TEST_T.WORLD>select object_name, original_name,type, ts_name, droptime
  2  from user_recyclebin where can_undrop ='YES';

OBJECT_NAME                    ORIGINAL_NAME   TYPE   TS_NAME  DROPTIME
------------------------------ --------------- ------ -------- -------------------
BIN$KecAh6AxUGTgQ8v2gjpQZA==$0 CHECK_F_BACK    TABLE  USERS    2007-02-20:19:35:34
BIN$KecAh6AyUGTgQ8v2gjpQZA==$0 CHECK_F_BACK    TABLE  USERS    2007-02-20:19:36:58
BIN$KfwhZLPcwK7gQ8v2gjrArg==$0 EMPLOYEE        TABLE  USERS    2007-02-21:20:48:46

# 쓰레기통(user_recyclebin) 조회
SCOTT@TEST_T.WORLD>show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
CHECK_F_BACK     BIN$KecAh6AyUGTgQ8v2gjpQZA==$0 TABLE        2007-02-20:19:36:58
CHECK_F_BACK     BIN$KecAh6AxUGTgQ8v2gjpQZA==$0 TABLE        2007-02-20:19:35:34
EMPLOYEE         BIN$KfwhZLPcwK7gQ8v2gjrArg==$0 TABLE        2007-02-21:20:48:46

As long as the space used by recycle bin objects is not reclaimed,
you can recover those objects by Flashback Drop. The space
used by the table and its dependent objects are not immediately reclaimable.
Generally, although the dropped table is in Recycle Bin, but its associated space
is reported in DBA_FREE_SPACE view because its space is automatically reclaimable.
Whenever the space is under pressure, it will be reclaimed automatically,
the recycle bin objects will be purged using FIFO mechanism, such as the table owner
creates a new table or adds data that causes the quota to be exceeded, or
DBA extends the file size within the tablespace to accommodate create/insert operations.
The space can be manually cleaned up with PURGE statement.

## Purge 하기

# Users tablespace 에 있는 쓰레기통 비우기
SCOTT@TEST_T.WORLD>purge tablespace users ;
Tablespace purged.

# Users tablespace 에 있는 쓰레기통 내용 중 owner 가 scott 인것만 비우기
SCOTT@TEST_T.WORLD>purge tablespace users user scott ;
Tablespace purged.

SCOTT@TEST_T.WORLD>purge user_recyclebin ;
Recyclebin purged.

SCOTT@TEST_T.WORLD>purge dba_recyclebin ;
DBA Recyclebin purged.

SCENARIO 6: FLASHBACK DATABASE 할차례

The current time is 12 PM on April 5, 2005. Your training DBA just told you that
he purged the HR employee table. The table was purged around 11:45 AM.
The database activity is minimal because most staff are currently
in a meeting. Definitely, you can not Flashback the droped
tables using Flashback Drop features. The table must be recovered.

It is fast, the time to restore a database is proportional to the
number of block changes that need to be backed out, not the size of the database.

To implement Flashback database feature, you need to configure flash recovery area
to provide a unified storage location for all recovery related files
(flashback database logs, archived redo logs, and RMAN backups) and
activities within the database.

Flashback database logs are the snapshot of changed blocks within the database
written by RVWR peridocally. Using the flashback database log plus redo logs
will make the recovery process faster and more efficient. The database recovery
will be in minutes instead of hours.

You may ask the performance overhead cost? Statistics show that the enabling
flashback database is less than 2%, which will be acceptable for trading off
the data loss and downtime.

Following is the implementation procesudres for Flashback Database:
Step 1: Make sure the database is in archive log mode.

SYS@TEST_T.WORLD>archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /a01b/TEST_T/arch/arch
Oldest online log sequence     59
Next log sequence to archive   62
Current log sequence           62


Step 2: Define Flash Recovery Area
b. Mannually configure Flash Recovery Area:
DB_RECOVERY_FILE_DEST : defining this parameter as a location and destination
                        for Flash Recovery files
DB_RECOVERY_FILE_DEST_SIZE : speifiy the disk limit, which is the amount of
                             space the flash area is permitted to use.

DB_RECOVERY_FILE_DEST_SIZE has to be specified before the DB_RECOVERY_FILE_DEST
initialization parameter. For using Oracle RAC, all instances must have the
same values for these two parameters.                            

more initTEST_T.ora

###########################################
# Flashback Database
###########################################
DB_RECOVERY_FILE_DEST=/u02b/ORACLE/FLASHBACK
DB_RECOVERY_FILE_DEST_SIZE=2G


SQL> show parameter recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /u02b/ORACLE/FLASHBACK
db_recovery_file_dest_size           big integer 2G
recovery_parallelism                 integer     0

 

Step 3. Open the database in MOUNT EXCLUSIVE mode and turn on the flashback feature:

SQL> startup mount exclusive
ORACLE instance started.

Total System Global Area  293601280 bytes
Fixed Size                  1329584 bytes
Variable Size              94615120 bytes
Database Buffers          197132288 bytes
Redo Buffers                 524288 bytes
Database mounted.
SQL> alter database flashback on ;

Database altered.

Step 4: Set the Flashback Database retention target:


SQL> show parameter flash
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440

SQL> alter system set db_flashback_retention_target = 2000 ;
System altered.

SQL> show parameter flash
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     2000

However, this parameter[minutes] just defines a target number, not guaranteed.
The actual time period depends on the flashback log data in the flash recovery area.
To determine if Flashback Database is enabled, issue the following command:

SQL> select flashback_on from v$database ;

FLA
---
YES


Flashback Database commands can be executed with RMAN or SQL environments.
you need to open database with RESETLOGS after the flashback.

SYS@TEST_T.WORLD>create table check_flash_effect ( a1 number, a2 number ) ;
Table created.

SYS@TEST_T.WORLD>insert into check_flash_effect values ( 1,2 ) ;
1 row created.

SYS@TEST_T.WORLD>commit ;
Commit complete.

SYS@TEST_T.WORLD>select sysdate from dual ;

SYSDATE
-------------------
2007.02.22 18:56:38

SYS@TEST_T.WORLD>drop table check_flash_effect purge ;
Table dropped.
SYS@TEST_T.WORLD>show recyclebin

 


 select * from emp as of timestamp
                     to_timestamp('2007/02/21 185803','YYYY/MM/DD HH24MISS')
                     where ename ='MILLER' ;
SYS@s>flashback database to timestamp to_timestamp('2007.02.22 18:56:38','YYYY/MM/DD HH24:MI:SS');
flashback database to timestamp to_timestamp('2007.02.22 18:56:38','YYYY/MM/DD HH24:MI:SS')
*
ERROR at line 1:
ORA-38757: Database must be mounted EXCLUSIVE and not open to FLASHBACK.

SYS@s>startup mount exclusive
ORACLE instance started.

Total System Global Area  293601280 bytes
Fixed Size                  1329584 bytes
Variable Size              94615120 bytes
Database Buffers          197132288 bytes
Redo Buffers                 524288 bytes
Database mounted.
SYS@s>flashback database to timestamp to_timestamp('2007.02.22 18:56:38','YYYY/MM/DD HH24:MI:SS');

Flashback complete.

SYS@s>alter database open resetlogs ;

Database altered.

SYS@s>select * from check_flash_effect ;

        A1         A2
---------- ----------
         1          2

SCOTT@TEST_T.WORLD>create table check_flash_tablespace ( a1 number, a2 number ) tablespace users ;
Table created.

SCOTT@TEST_T.WORLD>insert into check_flash_tablespace values ( 1,2 ) ;
1 row created.

SCOTT@TEST_T.WORLD>commit ;
Commit complete.

SCOTT@TEST_T.WORLD>select sysdate from dual ;
SYSDATE
-------------------
2007.02.22 19:03:29

SCOTT@TEST_T.WORLD>drop table check_flash_tablespace ;
Table dropped.

Flashback Database feature has following limitations:
- Can’t use Flashback Database feature if the control file was restored
  or recreated after Flashback dabase is enabled
- A data file cannot be flashed back to a time before the RESIZE operation.
  This restriction only apply the manual RESIZE operation, not for automatic space extension
- Can’t flashback the media failures such as a data file or tablespace was
  dropped or corrupted. In this case, whenever a data file or tablespace is
  dropped, it is written to control file, and will be marked offline,
  it can not be flashed back. Need to recover the lost data file or tablespace
  after flashback operation.
- The SCN you want to flashback to must EXIST in the flashback logs.
  Due to space pressure, the flashback log may be deleted. In this case,
  you canot flashback your database to the SCN prior to the earlist SCN within
  the flashback logs.
 

#################

## Drop table 후 Table 복구 및 index/constraint Rename

## Sample Table 생성
SCOTT@TEST_T.WORLD>create table check_F ( a1 number, a2 number, a3 number ) ;
Table created.

## Sample Data Insert
SCOTT@TEST_T.WORLD>insert into check_f values ( 1,2,3 ) ;
1 row created.

SCOTT@TEST_T.WORLD>insert into check_f values ( 4,5,6 );
1 row created.

SCOTT@TEST_T.WORLD>insert into check_f values( 7,8,9 ) ;
1 row created.

15:33:46 SCOTT@TEST_T.WORLD>commit ;
Commit complete.

## Primary key Constraint 생성 및 PK Indesx 생성
15:33:50 SCOTT@TEST_T.WORLD> alter table check_f add constraint XPKcheck_F primary key ( a1 , a2 ) using index ;
Table altered.

## 추가 Index 생성
15:34:51 SCOTT@TEST_T.WORLD> create index index_check_f on check_F ( a3 );
Index created.

15:36:50 SCOTT@TEST_T.WORLD>select CONSTRAINT_NAME, CONSTRAINT_TYPE from user_constraints
15:36:58   2  where table_name ='CHECK_F';

CONSTRAINT_NAME                C
------------------------------ -
XPKCHECK_F                     P

15:37:59 SCOTT@TEST_T.WORLD>select index_name,index_type from user_indexes where table_name ='CHECK_F'


INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
XPKCHECK_F                     NORMAL
INDEX_CHECK_F                  NORMAL

## 우선 쓰레기통 청소

SCOTT@TEST_T.WORLD>conn / as sysdba
Connected.
Session altered.

SYS@TEST_T.WORLD>purge dba_recyclebin ;
DBA Recyclebin purged.

SYS@TEST_T.WORLD>select owner, original_name, operation, type, can_undrop from dba_recyclebin ;
no rows selected

## Constraint Drop 후  dba_recyclebin Check
SCOTT@TEST_T.WORLD>alter table check_f drop primary key ;
Table altered.

SCOTT@TEST_T.WORLD>select  owner, original_name, operation, type, can_undrop from dba_recyclebin ;
no rows selected

# 복구
SCOTT@TEST_T.WORLD>alter table check_f add constraint XPKcheck_F primary key ( a1 , a2 ) using index ;
Table altered.

## Index  Drop 후  dba_recyclebin Check
SCOTT@TEST_T.WORLD>drop index INDEX_CHECK_F;
Index dropped.

SCOTT@TEST_T.WORLD>select  owner, original_name, operation, type, can_undrop from dba_recyclebin ;
no rows selected

# 복구
SCOTT@TEST_T.WORLD>create index index_check_f on check_F ( a3 );
Index created.

SCOTT@TEST_T.WORLD>drop table check_f ;
Table dropped.
SCOTT@TEST_T.WORLD>select  owner,OBJECT_NAME, original_name, operation, type, can_undrop from dba_recyclebin ;

OWNER           OBJECT_NAME                    ORIGINAL_NAME        OPERATION TYPE                      CAN
--------------- ------------------------------ -------------------- --------- ------------------------- ---
SCOTT           BIN$KeTCcgks0AzgQ8v2gjrQDA==$0 CHECK_F              DROP      TABLE                     YES
SCOTT           BIN$KeTCcgkr0AzgQ8v2gjrQDA==$0 XPKCHECK_F           DROP      INDEX                     NO
SCOTT           BIN$KeTCcgkq0AzgQ8v2gjrQDA==$0 INDEX_CHECK_F        DROP      INDEX                     NO


## 복구 후 Constraint 및 Index Check
SCOTT@TEST_T.WORLD>flashback table CHECK_F to before drop ;
Flashback complete.

## 쓰레기 통이 깨끗해졌다.

SCOTT@TEST_T.WORLD>select  owner,OBJECT_NAME, original_name, operation, type, can_undrop from dba_recyclebin ;
no rows selected


SCOTT@TEST_T.WORLD>select index_name, status from user_indexes where table_name ='CHECK_F';

INDEX_NAME                     STATUS
------------------------------ --------
BIN$KeQzQI4A0AjgQ8v2gjrQCA==$0 VALID
BIN$KeQzQI3/0AjgQ8v2gjrQCA==$0 VALID

SCOTT@TEST_T.WORLD>select CONSTRAINT_NAME, CONSTRAINT_TYPE, status
                   from user_constraints where table_name ='CHECK_F';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
BIN$KeQzQI3+0AjgQ8v2gjrQCA==$0 P ENABLED

## Valid  상태인 Index 사용 가능한지 체크

SCOTT@TEST_T.WORLD>set autotrace traceonly
SCOTT@TEST_T.WORLD>select * from check_f ;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=3 Bytes=117)
   1    0   TABLE ACCESS (FULL) OF 'CHECK_F' (TABLE) (Cost=3 Card=3 Bytes=117)

## 강제 Hint 를 통해서 Index 타게

SCOTT@TEST_T.WORLD>select /*+ INDEX(check_f) */ * from check_f
  2  ;


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=3 Bytes=117)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'CHECK_F' (TABLE) (Cost=2 Card=3 Bytes=117)
   2    1     INDEX (FULL SCAN) OF 'BIN$KeQzQI4A0AjgQ8v2gjrQCA==$0' (INDEX (UNIQUE)) (Cost =1 Card=3)

SCOTT@TEST_T.WORLD>set autotrace off

## Index Rename

SCOTT@TEST_T.WORLD>select index_name, status from user_indexes where table_name ='CHECK_F';

INDEX_NAME                     STATUS
------------------------------ --------
BIN$KeTCcgkr0AzgQ8v2gjrQDA==$0 VALID
BIN$KeTCcgkq0AzgQ8v2gjrQDA==$0 VALID

SCOTT@TEST_T.WORLD>alter index "BIN$KeTCcgkr0AzgQ8v2gjrQDA==$0" rename to XPKCHECK_F ;
Index altered.

SCOTT@TEST_T.WORLD>alter index "BIN$KeTCcgkq0AzgQ8v2gjrQDA==$0" rename to INDEX_CHECK_F ;
Index altered.

SCOTT@TEST_T.WORLD>select index_name, status from user_indexes where table_name ='CHECK_F';

INDEX_NAME                     STATUS
------------------------------ --------
XPKCHECK_F                     VALID
INDEX_CHECK_F                  VALID

# Constraint
SCOTT@TEST_T.WORLD>select CONSTRAINT_NAME, CONSTRAINT_TYPE, status from user_constraints where table_name ='CHECK_F';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
BIN$KeTCcgkp0AzgQ8v2gjrQDA==$0 P ENABLED


  1  select CONSTRAINT_NAME, CONSTRAINT_TYPE, status
  2* from user_constraints where table_name ='CHECK_F'
SCOTT@TEST_T.WORLD>/

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
BIN$KeTCcgkp0AzgQ8v2gjrQDA==$0 P ENABLED

SCOTT@TEST_T.WORLD>insert into check_F values ( 1,2,3 ) ;
insert into check_F values ( 1,2,3 )
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.BIN$KeTCcgkp0AzgQ8v2gjrQDA==$0) violated

SCOTT@TEST_T.WORLD>select CONSTRAINT_NAME, CONSTRAINT_TYPE, status from user_constraints where table_name ='CHECK_F' ;

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
BIN$KeTCcgkp0AzgQ8v2gjrQDA==$0 P ENABLED

SCOTT@TEST_T.WORLD>alter table check_f rename constraint "BIN$KeTCcgkp0AzgQ8v2gjrQDA==$0" to XPKCHECK_F ;
Table altered.

SCOTT@TEST_T.WORLD>select CONSTRAINT_NAME, CONSTRAINT_TYPE, status from user_constraints where table_name ='CHECK_F' ;
CONSTRAINT_NAME                C STATUS
------------------------------ - --------
XPKCHECK_F                     P ENABLED 


반응형
Posted by [PineTree]