반응형

1. UTL_HTTP 사용하는 프로시저를 컴파일을 하였지만 다음과 같은 에러가 발생하였다.

ORA-06550: line 3, column 6:
PLS-00201: identifier 'SYS.UTL_HTTP' must be declared
ORA-06550: line 3, column 6:

 

2. 원인을 찾던 중 utl_http 가 정의(?)가 되지 않았음을 알 수 있었다. 알 수 있었던 방법은 단순하였다.

https://community.oracle.com/tech/developers/discussion/469405/problem-calling-utl-http-in-oracle-xe

$ sqlplus "/as sysdba"

SQL> desc utl_http

utl_http의 정보들이 출력이 될 것이다.

SQL> conn system/123456

SQL> desc utl_http

ERROR:
ORA-04043: object "SYS"."UTL_HTTP" does not exist

SQL> select * from dba_tab_privs where table_name = 'UTL_HTTP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
SCOTT SYS UTL_HTTP SYS EXECUTE NO NO

 

3. object 권한을 주면 해결이 된다.

https://stackoverflow.com/questions/27379194/grant-utl-http-permission-in-plsql

$ sqlplus "/as sysdba"

SQL> grant execute on UTL_HTTP to system;

SQL> conn system/123456

SQL> desc UTL_HTTP

 

SQL> select * from dba_tab_privs where table_name = 'UTL_HTTP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
SCOTT SYS UTL_HTTP SYS EXECUTE NO NO
SYSTEM SYS UTL_HTTP SYS EXECUTE NO NO

 

4. 컴파일할 때 발생되었던 에러는 사라졌으나, 막상 프로시저를 실행시켰더니 다음과 같은 에러가 발생하였다.

ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1577
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at line 1

 

5. 여기에도 ACL권한을 부여해야 한다는 것이다. 등록되어있지 않다면 등록을 해줘야한다.

SQL> select * from dba_network_acl_privileges;

ACL ACLID PRINCIPAL PRIVILEGE IS_GRANT INVERT START_DATE END_DATE

SQL> select * from dba_network_acls;

HOST LOWER_PORT UPPER_PORT ACL ACLID

등록(생성)은 이렇게 하자

begin
    dbms_network_acl_admin.create_acl(
        acl=>'test.xml',
        description=>'test', -> description 빼도 될것같아서 기입을 안했더니 에러 발생
        principal=>'SYSTEM',
        is_grant=>true,
        privilege=>'connect',
        start_date=>'sysdate);

    dbms_network_acl_admin.add_privilege(

        acl=>'test.xml',
        description=>'test',
        principal=>'SYSTEM',
        is_grant=>true,
        privilege=>'resolve');

    dbms_network_acl_admin.assign_acl(
        acl=>'test.xml',
        host=>'api.goodgods.com');

    commit;
end;
/

삭제가 필요하다면

begin
    dbms_network_acl_admin.drop_acl(
        acl=>'test.xml');
end;
/

SQL> select * from dba_network_acl_privileges;

ACL ACLID PRINCIPAL PRIVILEGE IS_GRANT INVERT START_DATE END_DATE
/sys/acls/test.xml EFFEFASDf234DFADf SYSTEM connect true false 2022/06/21  
/sys/acls/test.xml EFFEFASDf234DFADf SYSTEM resolve true false 2022/06/21  

SQL> select * from dba_network_acls;

HOST LOWER_PORT UPPER_PORT ACL ACLID
api.goodgods.com     /sys/acls/test.xml EFFEFASDf234DFADf

* 참고로 12c 부터 아래 object로 변경되었다.

dba_network_acl_privileges => DBA_HOST_ACES

dba_network_acls => DBA_HOST_ACLS

 

6. 프로시저가 제대로 작동하는 것을 알 수 있을 것이다.

이것은 11g부터 적용된 사항이라 하며, 10g 이하 버전은 해당사항이 없다고 한다.

다만 UTL_HTTP 권한 정도는 확인을 하자.(본 글 "3. object 권한을 주면 해결이 된다." 참고)

 

 

7. 참고 URL(더 상세하게 나와있으니 참고하자)

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nkyle9361&logNo=220676267478

 

UTL_HTTP를 이용한 HTTP 통신

UTL_HTTP를 이용한 HTTP 통신 출처 : ransu.tistory.com/26 1. GET 방식 SELECT UT...

blog.naver.com

https://blog.naver.com/PostView.naver?blogId=nkyle9361&logNo=221989499061&parentCategoryNo=&categoryNo=1&viewDate=&isShowPopularPosts=false&from=postView 

 

utl_http 를 사용하기 위한 ACL 권한설정

오라클 HTTP 통신을 하기 위한 ACL 목록등록 1. ACL 생성 ( DBA 계정으로 ) DECLARE ...

blog.naver.com

 

반응형
반응형

사용자의 패스워드 주기를 알고 싶을 때 쿼리

 

사용자에 적용된 profile 확인

select username,profile from dba_users where username = 'scott';

 

프로파일에 적용된 패스워드 권한 확인

select * from dba_profiles where profile = 'DEFAULT';

 

PASSWORD_LIFE_TIME:패스워드를 변경해야하는 주기

PASSWORD_REUSE_TIME:패스워드 변경시 이전 패스워드를 재사용할 수 있는 기간(즉, 해당 기간이 지나야 재사용 가능)

반응형
반응형

(1) 테스트 테이블 생성

create table split_table as
select 'a/b/c/d/e' name
from dual;

 

(2) REGEXP_SUBSTR

select regexp_substr(name,'[^/]+',1,1) regexp_substr_name1,
        regexp_substr(name,'[^/]+',1,2) regexp_substr_name2,
        regexp_substr(name,'[^/]+',1,3) regexp_substr_name3,
        regexp_substr(name,'[^/]+',1,4) regexp_substr_name4,
        regexp_substr(name,'[^/]+',1,5) regexp_substr_name5
from split_table;

결과

a b c d e

 

(3) REGEXP_REPLACE

select regexp_replace(name,'[^/]+') regexp_replace_name1,
        regexp_replace(name,'[^/]+','*') regexp_replace_name2
from split_table;

결과

//// */*/*/*/*

 

(4) 세로로 나열

select regexp_substr(name,'[^/]+',1,rownum) splite_name
from split_table
connect by rownum <= length(regexp_replace(name, '[^/]+')) +1;

결과

a
b
c
d
e

참고 : https://good4uprin.tistory.com/11

반응형
반응형

아래와 같은 테이블이 존재한다.

SQL> select name, reg_date from temp_food_info;

NAME REG_DATE
archor 2022/04/05 23:44:11
milk 2022/04/06 10:23:44
water 2022/04/07 00:00:00
chicken 2022/04/07 00:00:01
meat 2022/04/08 00:10:00

 

여기서 우리는 등록날짜가 4/6~4/7 데이터를 산출 할 것이다.

SQL> select *

from temp_food_info

where reg_date between to_date('20220406','yyyymmdd') and to_date('20220407','yyyymmdd')

;

 

결과값

NAME   REG_DATE
------- -------------------
milk      2022/04/06 10:23:44
water   2022/04/07 00:00:00

등록일이 4/7 임에도 불구하고 chicken 이 누락되었다.

이유는 날짜만 지정하였을 경우 시간대는 00:00:00으로 인식하기 때문에 4/7 00:00:00 이후 데이터는 조회가 되지 않는다.

그러므로 2022/04/07 00:00:01 에 등록된 chicken은 누락이 된 것이였다.

 

해결방법은 간단하다. 날짜 조건을 시간까지 포함 또는 그 이상의 날짜를 넣자. 

(1) 시간포함

where reg_date between to_date('2022/04/06 00:00:00','yyyy/mm/dd hh24:mi:ss')

and to_date('2022/04/07 23:59:59','yyyy/mm/dd hh24:mi:ss')

 

(2) 그 이상의 날짜

where reg_date >= to_date('20220406','yyyymmdd')

and reg_date < to_date('20220408','yyyymmdd')

 

간과하지 말고 항상 주의를 기울어야 겠다.

 

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

패스워드 주기 확인  (0) 2022.04.22
[oracle19c] 사용자 생성 및 삭제 (ORA-65096, ORA-28014)  (0) 2022.03.24
11g alert 파일 경로 확인  (0) 2022.02.09
shmmax 값에 대한 추측성 글  (0) 2015.03.10
External Table  (0) 2014.07.16
반응형

(1) 생성

SQL> create user scott identified by "tiger";

ERROR at line 1:

ORA-65096: invalid common user or role name

 

SQL> create user "C##SCOTT" identified by "tiger";

-> 12c부터 바뀌 C##을 붙여줘야한다고 함. 근데 저렇게 생성하면 C##도 사용자명에 포함되버리는데 왜 저렇게 했을까나?

 

or

 

SQL> alter session set "_ORACLE_SCRIPT"=true;

SQL> create user scott identified by "tiger";

 

(2) 삭제

SQL> drop user scott [CASCADE];

여기서 ORA-28014: cannot drop administrative user or role

이런 에러가 발생된다면 _ORACLE_SCRIPT가 true로 설정 되어 있는지 확인해보자.

SQL> show parameter _oracle_script;

 

_ORACLE_SCRIPT 파라미터 값이 왜 생겼는지 의문이다.

은근 불편할뿐더러 이 파라미터 존재를 모른다면 맨땅에 헤딩하며 시간만 낭비할 것으로 보인다.

 

필자도 역시 짜증이 밀려온다 ㅎㅎ

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

패스워드 주기 확인  (0) 2022.04.22
아주 쉬우면서도 착각할 수도 있는 날짜 조회  (0) 2022.04.07
11g alert 파일 경로 확인  (0) 2022.02.09
shmmax 값에 대한 추측성 글  (0) 2015.03.10
External Table  (0) 2014.07.16
반응형

DML문을 실행하려고 했는데 ORA-01950 에러가 발생한다면 해당 테이블스페이스에 insert 할수 있는 권한이 없다는 것이다.

권한을 아래와 같이 부여해 줄 수 있다.

alter user scott quota unlimited on users;

또는


alter user scott quota 1m on users;

 

권한을 확인 하는 방법은 

select * from dba_ts_quotas;

조회하였을때 해당 테이블스페이스의 계정이 등록되어 있으면 권한을 부여받은 것이다.

여기서 max_bytes 가 -1 이면 unlimited 로 부여 받은 것이고, 값이 존재하면 그 byte만큼 저장이 가능하게 부여받은 것이다.

반응형
반응형

오라클에서 제공하는 SQL developer 에서 system 또는 sys 계정에 접속하고자 할 때, 정확한 비밀번호를 입력했음에도 불구하고 접속이 안되는 경우가 있다. 

ORA-01017 에러가 나고 있다.

 

분명 sqlplus에서는 system 계정으로 매우 접속이 잘된다.

SQL> sqlplus /nolog

SQL> conn system/oracle as sysdba

 

왜 이런지 원인은 알 수가 없다. 문제점을 알려주는 곳을 도저히 찾을수가 없었다.

해결방안은 그냥 패스워드를 다시 만들어주면 해결된다. 너무 간단했다. ㅠㅠ

SQL> alter user system identified by "oracle";

 

접속 상태가 성공인 것을 볼 수 있다.

 

참고로 원인을 찾아보던 중 19c 경우 기본암호가 "manager"에서  "no authentication" 로 변경되었다고 하는데,

필자는 초기 기본암호가 "oracle" 이였으며 no authentication 에 대해서는 이해가 되지 않는다. ㅠㅠ

즉, 아래 링크에 대한 글이 이해가 되지 않는다. 누군가 알려주었으면 좋겠다.

https://support.oracle.com/knowledge/Oracle%20Database%20Products/2620296_1.html

 

Default Password For System User("manager") Has Changed In Oracle 19c

Default Password For System User("manager") Has Changed In Oracle 19c (Doc ID 2620296.1) Last updated on JULY 02, 2021 Applies to: Oracle Database - Standard Edition - Version 19.3.0.0.0 and later Oracle Database - Enterprise Edition - Version 19.3.0.0.0 a

support.oracle.com

 

반응형
반응형

SQL> select * from v$diag_info where name = 'Diag Trace';

반응형
반응형

현재 서버

shmmax=1g

shmseg=120

SGA = 48G


신규서버

shmmax=1g

shmseg=120

SGA = 110G 위로 올라가지 않음.


왜 그런 것인지를 찾아봄.


shmmax 할당 : SGA 보다 크거나 같게 설정하는 것을 권장한다고 함.


현재 알아본 바로는,

1. sga 값보다 shmmax를 낮게 설정하면, 여러개의 shared memory가 뜨는 것을 볼 수 있다.

 - ipcs -ma 명령어로 SEGSZ 값을 합산하면 대략적으로 sga값과 동일하게 나온다.

2. sga 값보다 shmmax를 높게 설정하면, 한개의 shared memory가 뜨는 것을 볼 수 있다.


의문. sga 값보다 shmmax를 낮게 설정하였는데, 에러가 발생하였다.

       - ORA-27123: unable to attach to shared memory segment

      위 1번에 의하면 여러개의 shared memory가 떠야하는 것이 아닌가?


답변추측. shmseg 값이 현재 120으로 설정되어있다. shared memory가 120개가 초과하여 발생하는 문제 같다.

          sga 가 48g로 설정되어 있고 shmmax 가 1기가로 설정되어 있었을 때, 53개의 메모리가 떴다.

          그러면 192g로 설정을 하려고 하니 120개를 초과하여 발생하는 문제 인 것 같다.


이를 검증하기 위해서는, 아래와 같이 한번 해보자

1. shmmax 에 값을 sga 값만큼 올려주고, shared memory 개수를 확인.

2. shmmax 값은 그대로 두고 shmseg 값만 올려주고 shared memory 개수를 확인.


설명에 의하면 아래와 같으니 내 추측이 맞을 것이라 봄.


커널이 공유메모리(오라클이 SGA로 사용할) 할 당 방법

 1. 공유메모리로 사용할 물리적 메모리가 충분할 경우.

  -> 하나의 세그먼트에 전체 SGA 할당

 2. 하나의 세그먼트에 다 할당할 수 없는 경우

  -> 연속된 여러 세그먼트로 분산시켜 할당

 3. 두번째 방법도 여의치 않을 경우

  -> 연속되지 않은 여러 세그먼트에 분산시켜 할당

* SGA내 fixed Area 부분은 반드시 전체가 하나의 세그먼트에 할당되어야 함.


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

테스트 결과는 맞게 나옴.

다만, 커널값을 shmmax, shmseg 등 설정값을 늘려주었다고 하더라도,

pfile에 또 하나의 값을 변경해줘야지 DB가 startup 될 수 있다.

만약 그렇지 않으면, ORA-00064 에러가 난다.(ORA-00064: object is too large to allocate on this OS(1,4086000))

pfile에 추가할 파라미터, _ksmg_granule_size=33554432(32M)

- default = 16777216(16M)


* granule size 확인

select name, bytes/1024/1024 "size" from v$sgainfo where upper(name) like '%GRANULE%'


NAME                                                                   size

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

Granule Size                                                            32



Granule(메모리 할당 단위)

 - SGA 메모리는 연속적인 메모리 조각(Chunk) 을 뜻하는 Granule 이란 단위로 할당된다.

 - Granule의 크기는 SGA 총 크기에 의해 결정된다. SGA의 크기가 1GB 이하라면 Granule의 크기는 4MB, 1GB 이상이라면 Granule 크기는 16MB 가 된다.

 - SGA의 각 컴포넌트들에 쓰여지는 Granule size는 v$sgainfo 로 조회가 가능하다.



반응형

'Oracle > Oracle Study' 카테고리의 다른 글

[oracle19c] 사용자 생성 및 삭제 (ORA-65096, ORA-28014)  (0) 2022.03.24
11g alert 파일 경로 확인  (0) 2022.02.09
External Table  (0) 2014.07.16
archive 와 log switch v$log  (0) 2013.01.18
rowid의 변화  (0) 2013.01.17
반응형

drop table temp_pgheo_external;

drop directory TEST;


create directory TESTas '/data16/tmp';


create table temp_pgheo_external

(server_date varchar2(14)

,code1 varchar2(20)

,code2 varchar2(20)

,code3 varchar2(20)

,code4 varchar2(20)

,code5 varchar2(20)  

)

organization external

(

    type oracle_loader

    default directory BDUMP

    access parameters(

                        --recodrds fixed 63

                        records delimited by newline

                        fields terminated by ","  --필드를 구분할 수 있는 구분자 지정

(server_date varchar2(14)

,code1 varchar2(20)

,code2 varchar2(20)

,code3 varchar2(20)

,code4 varchar2(20)

,code5 varchar2(20)  

)

                     )

    location('external_01.txt','external_02.txt','external_03.txt','external_04.txt')

)

reject limit unlimited

;


데이터가 계속 0 row로 뿌려주고 있어, 명령어가 잘못되었는 줄 알고 한참을 찾아보고 수정했더니,

결론은 데이터 포맷이 맞지 않아 발생된 문제였음.

컬럼에 따라 하나라도 어긋나면 작동이 안되는 것 같다.

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

11g alert 파일 경로 확인  (0) 2022.02.09
shmmax 값에 대한 추측성 글  (0) 2015.03.10
archive 와 log switch v$log  (0) 2013.01.18
rowid의 변화  (0) 2013.01.17
기본적인 궁금증들(?)  (0) 2012.09.23
반응형

v$log 가 처리되는 순서(?)를 보고자 함..


현재 대량 데이터를 삭제중에 있다.


select a.group#, member, bytes/1024/1024, a.status, archived

from

(select * from v$log) a,

(select * From v$logfile) b

where a.group#=b.group#

order by group#, member

;


위 쿼리를 지속적으로 모니터링을 해보았다.


log switch가 발생하면 alert 파일에 기록이 남고 status는 active 상태로 변환. 

status가 inactive 로 변경되면, archive 파일로 떨구는 작업을 진행하게 된다.

이후 archived 컬럼은 NO에서 YES로 변경되면서 다음 log switch가 발생할 때 까지 기다린다.


archive 파일로 떨구는 작업보다 log switch가 더 빠르면 alert 파일에는 아래와 같은 문구가 나온다.

All online logs needed archiving





반응형

'Oracle > Oracle Study' 카테고리의 다른 글

shmmax 값에 대한 추측성 글  (0) 2015.03.10
External Table  (0) 2014.07.16
rowid의 변화  (0) 2013.01.17
기본적인 궁금증들(?)  (0) 2012.09.23
Windows Oracle 10g 설치  (0) 2012.09.23
반응형

현재 데이터의 rowid가 dml 작업시 변화가 있을까하여 몇가지 테스트를 해보았다.


* TEMP 테이블 생성

create table temp_rid_test tablespace users nologging as

select 1 no,'aaaaa' depth from dual union all

select 2,'bbbb' from dual union all

select 3,'xxxxx' from dual union all

select 4,'ddddd' from dual union all

select 5,'hhhha' from dual union all

select 6,'agghha' from dual

;


* 현재 rowid

select rowid, no, depth from temp_rid_test;

 ROWID

 NO

DEPTH 

 AAA8vIAAMAABYt0AAA  1  aaaaa
 AAA8vIAAMAABYt0AAB  2  bbbb
 AAA8vIAAMAABYt0AAC  3  xxxxx

 AAA8vIAAMAABYt0AAD

 4  ddddd
 AAA8vIAAMAABYt0AAE  5  hhhha
 AAA8vIAAMAABYt0AAF  6  agghha


* update

update temp_rid_test set no=7 where no=1;

commit;


select rowid, no, depth from temp_rid_test;

 ROWID

 NO

DEPTH 

 AAA8vIAAMAABYt0AAA

 7

 aaaaa
 AAA8vIAAMAABYt0AAB 2 bbbb
 AAA8vIAAMAABYt0AAC 3 xxxxx

 AAA8vIAAMAABYt0AAD

 4 ddddd
 AAA8vIAAMAABYt0AAE 5 hhhha
 AAA8vIAAMAABYt0AAF 6

 agghha


* delete

delete from temp_rid_test where no=7;

commit;


select rowid, no, depth from temp_rid_test;

 ROWID

NO 

DEPTH 
 AAA8vIAAMAABYt0AAB  2  bbbb
 AAA8vIAAMAABYt0AAC

 3

 xxxxx
 AAA8vIAAMAABYt0AAD  4  ddddd
 AAA8vIAAMAABYt0AAE  5  hhhha
 AAA8vIAAMAABYt0AAF  6  agghha

* update(특정로우에 대한 큰용량 byte로 갱신) - 2000byte

alter table temp_rid_test modify depth varchar2(2000);

select lengthb('AAA......생략')

from dual  --1710

;


update temp_rid_test

set depth = 'AAA......생략'

where no = 6

;

commit;

select rowid, no, depth from temp_rid_test;

 ROWID

NO 

DEPTH 
 AAA8vIAAMAABYt0AAB 2 bbbb
 AAA8vIAAMAABYt0AAC

 3

 xxxxx
 AAA8vIAAMAABYt0AAD 4 ddddd
 AAA8vIAAMAABYt0AAE 5 hhhha
 AAA8vIAAMAABYt0AAF 6

 aaaa....


* update(특정로우에 대한 큰용량 byte로 갱신) - 4000byte

alter table temp_rid_test modify depth varchar2(4000);

select lengthb('AAA......생략')

from dual  --3478

;


update temp_rid_test

set depth = 'AAA......생략'

where no = 6

;

commit;

select rowid, no, depth from temp_rid_test;

 ROWID

NO 

DEPTH 
 AAA8vIAAMAABYt0AAB 2 bbbb
 AAA8vIAAMAABYt0AAC

 3

 xxxxx
 AAA8vIAAMAABYt0AAD 4 ddddd
 AAA8vIAAMAABYt0AAE 5 hhhha
 AAA8vIAAMAABYt0AAF 6

 aaaa....


* 결론

dml 작업시 rowid의 변화는 없었다.


반응형

'Oracle > Oracle Study' 카테고리의 다른 글

External Table  (0) 2014.07.16
archive 와 log switch v$log  (0) 2013.01.18
기본적인 궁금증들(?)  (0) 2012.09.23
Windows Oracle 10g 설치  (0) 2012.09.23
characterset 변환  (0) 2012.07.17
반응형

IMP-00032: SQL statement exceeded buffer length

IMP-00008: unrecognized statement in the export file


buffer size를 늘려주어라.

반응형
반응형

문득 생각났던 부분을 테스트 해본 결과이다. 중요하지는 않지만 궁금해서...

어이없는 궁금증이였던가? ㅋㅋ


1. archive mode 가 아니면 hot backup을 할 수가 없다.

SQL> alter tablespace system begin backup;

alter tablespace system begin backup

*

ERROR at line 1:

ORA-01123: cannot start online backup; media recovery not enabled


SQL>


2. 핫백업시 다시 begin backup 명령어 먹는가?

SQL> alter tablespace system begin backup;


Tablespace altered.


SQL> alter tablespace system begin backup;

alter tablespace system begin backup

*

ERROR at line 1:

ORA-01146: cannot start online backup - file 1 is already in backup

ORA-01110: data file 1: '/home/oradata/PROD/data1/system01.bdf'


SQL>


3. 10g부터 바뀐 hotbackup 명령어 : 테이블스페이스마다 begin backup을 해줄 필요가 없다.

SQL> alter database begin backup;


Database altered.


SQL> alter database end backup;


Database altered.


SQL>


4. dba_tables, user_tables, all_tables 에 있는 extents 는 테이블들이 설정되어 있는 값들이다.

   테스트를 해보니 값에 대한 변화가 없었다.

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

archive 와 log switch v$log  (0) 2013.01.18
rowid의 변화  (0) 2013.01.17
Windows Oracle 10g 설치  (0) 2012.09.23
characterset 변환  (0) 2012.07.17
minus 에 대한 위험(?)  (0) 2012.06.21
반응형

제목과 같이 갑자기 의문이 들었다.

파일은 복사하는 중인데, 인서트는 계속 되고 있는 상황이 발생하였다.

이론적으로 생각하였을 때는 아카이브 파일을 불러와 복구가 되겠다는 생각은 들어지만..정말 그렇게 될까?ㅎㅎ


테스트를 해보자.

session 을 sys 와 scott 계정 2개를 열었다.


users 테이블스페이스를 제외한 나머지 테이블스페이스에 대해서는 미리 hotbackup을 진행 완료.

users 테이블스페이스를 남겨놓기 위해 alter database begin backup; 명령어를 사용하지 않고,

alter tablespace system begin backup; 명령어를 사용하였다.(참고로 작업환경은 윈도우에서 하였음.)


SQL> select * from v$backup;


     FILE# STATUS                CHANGE# TIME

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

         1 NOT ACTIVE             175887 12/09/23

         2 NOT ACTIVE             175909 12/09/23

         3 NOT ACTIVE             175923 12/09/23

         4 NOT ACTIVE                  0                       <-- users 테이블스페이스

         5 NOT ACTIVE             175940 12/09/23


파일 용량이 적어 미리 잽싸게 scott 계정에서 dml 작업을 하기 위해 스크립트를 만들어주었다.

* sequence 생성

SQL> create sequence seq_hot

  2  start with 1

  3  increment by 1

  4  nomaxvalue

  5  nocycle

  6  ;


* scott_insert.sql

insert into temp_hot_table select seq_hot.nextval,'AA',sysdate from dual connect by level <= 100000;

commit;

select count(*) cnt,max(id) max_id from temp_hot_table;


불완전 복구가 되었을 시 어느 단계까지 복구가 되는지 확인을 하기 위해, 단계별로 insert를 수행함.


 순서

 sys

scott 

 1

  

 @scott_insert.sql
 cnt : 100000, max_id : 100000

 2

 alter tablespace users begin backup;


 3

 

 @scott_insert.sql
 cnt : 200000, max_id : 200000

 4

$copy D:\PROD\DATA2\ORADATA\USERS01.DBF D:\PROD\BACKUP\USERS01.DBF

 @scott_insert.sql
 cnt : 300000, max_id : 300000

 5

 alter tablespace users end backup;

 

 6

 

 @scott_insert.sql
 cnt : 400000, max_id : 400000

 7

 alter database backup controlfile to 'D:\PROD\BACKUP\control.bak';

 


SQL> select * from v$backup;


     FILE# STATUS                CHANGE# TIME

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

         1 NOT ACTIVE             175887 12/09/23

         2 NOT ACTIVE             175909 12/09/23

         3 NOT ACTIVE             175923 12/09/23

         4 NOT ACTIVE             175961 12/09/23   <-- 백업이 완료 되었음.

         5 NOT ACTIVE             175940 12/09/23


백업은 완료가 되고, 해당 데이터 파일이 깨졌을 때의 상황을 만들자.


SQL> shutdown immediate;

데이터베이스가 닫혔습니다.

데이터베이스가 마운트 해제되었습니다.

ORACLE 인스턴스가 종료되었습니다.

SQL> $del D:\PROD\DATA2\ORADATA\USERS01.DBF


SQL> startup

ORACLE 인스턴스가 시작되었습니다.


Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             171969412 bytes

Database Buffers          432013312 bytes

Redo Buffers                7135232 bytes

데이터베이스가 마운트되었습니다.

ORA-01157: 데이터 4 파일을 식별 또는 잠금 할 수 없습니다- DBWR 추적 파일을 보십시오

ORA-01110: 4 데이터 파일: 'D:\PROD\DATA2\ORADATA\USERS01.DBF'


데이터 파일이 깨져 복구를 해야하는 단계이다.


SQL> alter database datafile 4 offline;


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


SQL> alter database open;


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


SQL> $copy d:\PROD\backup\users01.dbf d:\PROD\data2\oradata\users01.dbf  : hotbackup 한 파일로 복원하자.

        1개 파일이 복사되었습니다.


SQL> recover datafile 4

매체 복구가 완료되었습니다.    <-- 데이터가 적다보니 아카이브 파일을 만들어 지지 않아 필요가 없나보다. 바로 복구가 된다.

SQL> alter database datafile 4 online;


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


SQL> conn scott/tiger

연결되었습니다.

SQL> select count(*), max(id) from temp_hot_table;


  COUNT(*)    MAX(ID)

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

    400000     400000


완전 복구가 되었다...훌륭하네!ㅎㅎ

반응형
반응형

몇 년전 오라클 교육을 받은 이후로 처음 윈도우에 오라클을 설치해보았다.

DB 설치 시 윈도우와 리눅스가 초기  설정이 다소 다르다는 것을 잠시 잊고 있었다.


윈도우에 생성 시 초기 해야할 작업.

1.  서비스 등록 (oradim)


D:\PROD\script>oradim -new -sid PROD -startmode A

인스턴스가 생성되었습니다.


D:\PROD\script>set oroacle_sid=PROD


D:\PROD\script>sqlplus "/as sysdba"


cf.

  oradim -new -sid PROD : 서비스 등록

  oradim -delete -sid PROD : 서비스 해제

  startmode A : 자동모드로 변환


2. shutdown 또는 startup 시 별도의 인증없이 DB 관리자 역할을 수행  (orapwd)

  orapwd file=%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora password=1234


cf.

  pfile 또는 spfile등 리눅스에서는 $ORACLE_HOME/dbs에 종속시켜야 하지만,

  윈도우 에서는 %ORACLE_HOME%\database에 종속시켜야한다.


3. 만약 위 1번의 작업을 수행하지 않는다면 아래와 같은 에러가 나올 것이다.

  ERROR: ORA-12560: TNS:프로토콜 어댑터 오류



반응형

'Oracle > Oracle Study' 카테고리의 다른 글

rowid의 변화  (0) 2013.01.17
기본적인 궁금증들(?)  (0) 2012.09.23
characterset 변환  (0) 2012.07.17
minus 에 대한 위험(?)  (0) 2012.06.21
Datafile resize에 대한 오해(?)  (0) 2012.01.20
반응형

SQL> !lsnrctl stop listener

...

..

.


SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.


Total System Global Area 2550136832 bytes

Fixed Size                  2022920 bytes

Variable Size             536871416 bytes

Database Buffers         1996488704 bytes

Redo Buffers               14753792 bytes

Database mounted.

SQL> alter system enable restricted session;


System altered.


SQL> alter system set job_queue_processes=0;


System altered.


SQL> alter system set aq_tm_processes=0;


System altered.


SQL> alter database open;


Database altered.


SQL> alter database character set internal_use KO16KSC5601;


Database altered.


SQL> shutdown immediate;


SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.


Total System Global Area 2550136832 bytes

Fixed Size                  2022920 bytes

Variable Size             536871416 bytes

Database Buffers         1996488704 bytes

Redo Buffers               14753792 bytes

Database mounted.

Database opened.

SQL> select * from props$ where name = 'NLS_CHARACTERSET';


NAME

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

VALUE$

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

COMMENT$

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

NLS_CHARACTERSET

KO16KSC5601

Character set


SQL> !lsnrctl start listener

...

..

.

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

기본적인 궁금증들(?)  (0) 2012.09.23
Windows Oracle 10g 설치  (0) 2012.09.23
minus 에 대한 위험(?)  (0) 2012.06.21
Datafile resize에 대한 오해(?)  (0) 2012.01.20
sh 계정 생성  (0) 2011.12.26
반응형

union 과 union all 의 차이점을 말하라하면 중복이 제거가 되느냐 되지 않느냐의 차이로 알고 있었다.

그러나 minus는?????


단순히 로우에 대한 빼기로만 알고 있었기에 무심코 사용했다.

반전...

결론은 minus를 하면 중복이 제거가 된 값들이 출력된다.


with car as

(

    select 'car' flag from dual union all

    select 'car' flag from dual union all

    select 'air' flag from dual union all

    select 'air' flag from dual union all

    select 'air' flag from dual union all

    select 'air' flag from dual union all

    select 'air' flag from dual union all

    select 'car' flag from dual union all

    select 'car' flag from dual

),

air as

(

    select 'car' flag from dual

)

select flag from car

minus

select flag from air

;


flag

-----

air


한건만이 출력된다...나에게 있어 굉장한 충격이었다.

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Windows Oracle 10g 설치  (0) 2012.09.23
characterset 변환  (0) 2012.07.17
Datafile resize에 대한 오해(?)  (0) 2012.01.20
sh 계정 생성  (0) 2011.12.26
10g에서 sys_connect_by_path 사용법  (0) 2011.12.01
반응형

pfile의 undo_management 를 MANUAL로 수정한 후 pfil로 open 한다.


SQL> startup '$ORACLE_HOME/dbs/init$ORACLE_SID.ora;


SQL> drop tablespace undotbs1 including contents and datafiles cascade constraints;


재생성한다.

SQL> create undo tablespace undotbs1 datafile '/data1/oradata/undotbs01.dbf' size 10m

   2  autoextend on next  5m maxsize 50m;


SQL> shutdown immediate;


pfile의 undo_management 를 다시 AUTO로 수정한 후 startup 한다.



반응형
반응형

PK 제거 후 삭제 해야 함.


ALTER TABLE table_name DROP PRIMARY KEY;

반응형
반응형
용량이 부족할 때 데이터 파일을 추가 해주는 형식으로 주로 하였기에, resize 할 때 문제를 생각해 보지 않았다. 
autoextensible 되고 있는 데이터 파일을 resize를 하면 resize 한 만큼의 용량으로 자동 증가가 되는 줄 알았다.
하지만 아래 결과를 보게 된다면 생각이 달라질 것이다.
테이블 스페이스를 생성하고 상태 변경까지 각각의 size를 확인해 볼 것이다.


1. 테이블 스페이스 생성
### create tablespace tbs_auto 
### datafile '/oracle/oradata/orcl/Disk3/tbs_auto.bdf' size 1m
### autoextend on next 8k maxsize 3m;

TABLESPACE AUT current(MB) Max extensible(MB)    used(MB) extensible(MB)
-------------- --- ------------ ------------------- ------------ --------------
TBS_AUTO      YES                1                            3            .9375                    2

2. 테이블 생성 후 ora-01653 에러가 발생할 때 까지 실행(총 11만건 인서트 후에 에러 발생)
 ### insert into tbs_auto_tab select 'AA',sysdate from dual connect by level <= 10000;

* 사용된 공간 및 최대 증가 될 수 있는 값을 확인 한다. 
TABLESPACE AUT current(MB) Max extensible(MB)    used(MB) extensible(MB)
-------------- --- ------------ ------------------- ------------ -------------- 
TBS_AUTO      YES         2.0625                            3                  2              .9375


3. 해당 테이블 스페이스의 데이터 파일을 단순히 resize 한다.
### alter database datafile '/oracle/oradata/orcl/Disk3/tbs_auto.bdf' resize 5m;

* resize 를 하였기때문에 datafile 자체가 증가 되어 현재 데이터는 없지만 불필요한 공간을 확보하고 있는 상태가 된다.
  최대 자동 증가량은 3MB 이고 이미 공간도 확보된 상태이기 때문에 더이상 자동 증가는 되지 않는다.
TABLESPACE AUT current(MB) Max extensible(MB)    used(MB) extensible(MB)
-------------- --- ------------ ------------------- ------------ -------------- 
TBS_AUTO      YES                5                            3           4.9375                   -2

4. 이미 공간이 확보된 상태이지만 자동증가되게 설정을 해본다.
### alter database datafile '/oracle/oradata/orcl/Disk3/tbs_auto.bdf' autoextend on next 8k maxsize 5m

* Max extensible 이 증가 된 것을 확인 할 수 있다.
* 참고로 다음 증가되는 용량(next 8k) 수정한다면 dba_data_files의 increment_by에서 수정된 것을 확인 할 수 있다.

* 그러나 현재까지는 사용되지 않는 공간을 계속 확보하고 있는 상태이다.
TABLESPACE AUT current(MB) Max extensible(MB)    used(MB) extensible(MB)
-------------- --- ------------ ------------------- ------------ -------------- 
TBS_AUTO      YES                5                            5           4.9375                    0

5. 사용되지 않는 공간을 삭제하려면 간단하다. 다시 resize를 하면 된다.
    실제 사용되고 있는 용량보다 적게 resize를 한다면 아래와 같은 에러가 발생 할 것이다.
    ORA-03297 : file contains used data beyond requested RESIZE value
 ### alter database datafile '/oracle/oradata/orcl/Disk3/tbs_auto.bdf' resize 3m;

* 현재용량과 사용되고 있는 용량이 변화되었다.
TABLESPACE AUT current(MB) Max extensible(MB)    used(MB) extensible(MB)
-------------- --- ------------ ------------------- ------------ -------------- 
TBS_AUTO      YES                3                            5           2.9375                    2
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

characterset 변환  (0) 2012.07.17
minus 에 대한 위험(?)  (0) 2012.06.21
sh 계정 생성  (0) 2011.12.26
10g에서 sys_connect_by_path 사용법  (0) 2011.12.01
특정 IP만 접속  (0) 2011.11.21
반응형
$ORACLE_HOME/demo/sales_history/sql_main.sql 실행.

해당파일이 생성되지 않았으면 개별적으로 다운받아서 실행.
파일 용량이 큰 관계로 올리지 못하였다.
대략 17M 정도되며, 분할하여 올리려고 하였지만 회사 컴퓨터라 분할 할 여유가 되질 못하였다.

specify password for SH as parameter 1: --> sh 계정에 대한 password 지정
Enter value for 1: ******

specify default tablespace for SH as parameter 2:  --> default tablespace 지정
Enter value for 2: users

specify temporary tablespace for SH as parameter 3:  --> temporary tablespace 지정
Enter value for 3: temp

specify password for SYS as parameter 4:  --> sys 계정에 대한 password 지정(스크립트를 확인해보면 sys 계정으로 접
                                                                    속하여 작업을 하는 부분이 있어서 패스워드를 지정해주는 것이다.

Enter value for 4: *********

specify directory path for the data files as parameter 5:  --> load할 파일의 경로를 지정.(처음 로그 파일 찍히는 경로를
                                                                                     적으라는줄 알고 쌩뚱맞은 경로를 지정하는 바람에 에러만
                                                                                      나오고 원인이 뭔지 몰라 개삽질 및 개고생 했음.)
Enter value for 5: $ORACLE_HOME/demo/schema/sales_history/

writeable directory path for the log files as parameter 6:  --> log 파일이 찍힐 경로 지정.
Enter value for 6:  $ORACLE_HOME/demo/schema/sales_history/ 

specify version as parameter 7:  --> 버젼 입력(v3)

Enter value for 7: v3
 
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

minus 에 대한 위험(?)  (0) 2012.06.21
Datafile resize에 대한 오해(?)  (0) 2012.01.20
10g에서 sys_connect_by_path 사용법  (0) 2011.12.01
특정 IP만 접속  (0) 2011.11.21
Linux 10.2.0.4 upgrade Patch  (0) 2011.10.31
반응형
http://kr.forums.oracle.com/forums/thread.jspa?threadID=619271&tstart=0 

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

PURPOSE
--------------------------------------------------------------------------------

Oracle10g 이상에서는 HANG 발생으로 DB 접속 안될때 OS 디버거 사용안하고도 
sqlplus -prelim 옵션으로 간단하게 SYSTEMSTATE DUMP 를 받을 수 있다. 

EXPLANATIONS
--------------------------------------------------------------------------------

1. 사용방법

$ sqlplus -prelim / as sysdba
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug hanganalyze 1
SQL> oradebug dump systemstate 266 
30 초 WAIT
SQL> oradebug dump systemstate 266 
30 초 WAIT
SQL> oradebug dump systemstate 266 

2. 주의사항 

(1) 9.2.0.6 이상에서는 SYSTEMSTATE DUMP LEVEL 266 사용을 권장한다.
LEVEL 266 는 프로세스의 short call stack 을 생성하여 blocker 원인 분석에 유용하다.

(2) 오라클 엔지니어들이 사용하는 SYSTEMSTATE DUMP 분석 툴에서 한 트레이스 
파일에 있는 여러개의 SYSTEMSTATE DUMP 들을 비교하여 blocker 를 결정하므로 
SYSTEMSTATE DUMP 들이 한 트레이스 취합되도록 동일 세션에서 30초 간격으로 3번 수행한다.

(3) -prelim 옵션 사용시 ORA-7445 에러발생하면 PGA 변수 초기화하여 사용한다.

sqlplus -prelim '/ as sysdba'
oradebug setmypid
oradebug unlimit;
oradebug call ksmcpg
oradebug dump systemstate 266

(4) SYSTEMSTATE DUMP LEVEL 266 사용시 OS 에따라 프로세스의 short call stack 
생성 속도와 부하가 다르므로 프러덕션에서 사용 전에 꼭 테스트 후 사용 권장한다.
만약 LEVEL 266 이 너무 느리거나 부하가 많다면 LEVEL 10 을 사용한다.

References
--------------------------------------------------------------------------------
Note 121779.1 - Taking Systemstate Dumps when You cannot Connect to Oracle 
Note 417879.1 - ORA-07445 kgllkd With -prelim Option When Running System State Dump

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

[경험담]
sqlplus "/as sysdba" 로 접속하였을 때
무슨 이유인지는 모르겠지만 hang이 걸린것 처럼 커서만 깜빡이고 접속이 되질 않았다.

위 설명대로 하였지만,
sqlplus -prelim / as sysdba  조차도 접속이 되질 않아 테스트를 못해보고 있는 상황이다.

결국에는 시스템을 껐다켜니 접속이 되었다.
 
반응형

'Oracle > Oracle Scrap' 카테고리의 다른 글

[스크랩] CHECKPOINT NOT COMPLETE에 대해서  (0) 2011.11.23
[스크랩] 대기 이벤트  (0) 2011.04.14
[스크랩] OPatch  (0) 2011.03.11
[스크랩] Patch Set, CPU, PSU 차이점 분석  (0) 2011.03.03
[스크랩]ORA-12801  (0) 2011.01.26
반응형
http://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_1036.htm

ALL_COL_COMMENTS

ALL_COL_COMMENTS displays comments on the columns of the tables and views accessible to the current user.

Related Views

  • DBA_COL_COMMENTS displays comments on the columns of all tables and views in the database.

  • USER_COL_COMMENTS displays comments on the columns of the tables and views owned by the current user. This view does not display the OWNER column.

ColumnDatatypeNULLDescription
OWNER VARCHAR2(30) NOT NULL Owner of the object
TABLE_NAME VARCHAR2(30) NOT NULL Name of the object
COLUMN_NAME VARCHAR2(30) NOT NULL Name of the column
COMMENTS VARCHAR2(4000)   Comment on the column

반응형

'Oracle > Oracle Dictionary' 카테고리의 다른 글

v$rollstat  (0) 2011.04.15
v$session  (0) 2011.04.14
반응형
create table temp_nation as
select 'Seoul' city, 'Korea' country from dual union all
select 'Busan' city, 'Korea' country from dual union all
select 'Inchon' city, 'Korea' country from dual union all
select 'LA' city, 'America' country from dual union all
select 'Newyork' city, 'America' country from dual union all
select 'Mexicocity' city, 'Mexico' country from dual
;

select country, substr(max(sys_connect_by_path(city,',')),2) result
from
(
    select city, country, row_number() over (partition by country order by city) rnum
    from   temp_nation
)
start with rnum=1
connect by prior rnum=rnum-1
and prior country=country    --> group별로 지정할 경우
group by country
;
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Datafile resize에 대한 오해(?)  (0) 2012.01.20
sh 계정 생성  (0) 2011.12.26
특정 IP만 접속  (0) 2011.11.21
Linux 10.2.0.4 upgrade Patch  (0) 2011.10.31
startup 종류?  (0) 2011.08.18
반응형
http://forums.oracle.com/forums/thread.jspa?threadID=468708
 

제품 : ORACLE SERVER


작성날짜 : 2003-06-10

CHECKPOINT NOT COMPLETE에 대해서
================================

database가 전체적으로 멈춘것처럼 어떠한 새로운 작업도 진행이 안되는 경우,
alertSID.log file를 확인해 보면 아래와 같은 message가 적힌 경우가 있다.

Checkpoint not complete

이러한 message가 의미하는 것은 무엇이며, 왜 발생하는지, 그리고 어떠한 조치가
가능한지 자세히 살펴본다.

1. checkpoint란 무엇인가?
~~~~~~~~~~~~~~~~~~~~~~~~~
checkpoint는 memory내의 block buffer의 내용과 disk상의 data block간의 내용을
맞추는 database event라고 할 수 있다.
checkpoint가 발생하면, 그때까지 memory내의 block에 가해진 모든 변경 사항을
disk상의 datafile내에 반영하게 된다. database crash에 의해 recovery가 필요
하게 되면 이 checkpoint이후의 변경사항에 대해서만 recovery를 시도하면 되므로,
recovery를 쉽고 효율적으로 수행할 수 있다.

checkpoint중에 수행되는 작업은 다음 두 가지로 정리할 수 있다.
- DBWR가 buffer cache내의 모든 변경된 block을 datafile에 기록한다.
- LGWR(혹은 CKPT)가 현재 발생한 checkpoint의 SCN값을 datafile과 controlfile
에 기록한다.

여기에서 중요한 것은 checkpoint event가 발생하여 block buffer에 어느 block이
disk로 씌여져야 하는가를 표시하면 dbwr는 이렇게 표시된 buffer를 순서와 관계없이
disk로 write하게 된다. 즉 redo log group1에 대한 buffer를 checkpoint하고 있는
중에 redo log group2에 대한 checkpoint요청이 들어오면 redo log group1에 대한
checkpoint를 끝내고 group 2에 대한 처리를 하는 것이 아니고, redo log group1에
대한 checkpoint가 진행 중에 redo log group2에 해당하는 buffer도 buffer cache
내에 모두 표시한 후 이것도 모두 group 1과 group 2의 구별이나 순서는 유지하지
못한채 같이 checkpoint가 이루어지는 것이다.
이것은 이후에 설명할 Checkpoint not complete가 발생하는 원인을 밝혀주는
중요한 근거가 된다.

checkpoint가 발생되는 경우는 다음 4가지 경우이다.
(1) log switch
(2) log_checkpoint_interval 만큼의 os block 간격
(3) log_checkpoint_timeout 초 간격
(4) alter system checkpoint명령문 수행시
앞의 세가지 경우에 대해서는 아래 별도의 section으로 자세히 설명하였다.


2. checkpoint와 성능 
~~~~~~~~~~~~~~~~~~~~ 

checkpoint를 자주하면 db crash후 recovery시간을 줄일 수 있는 대신에, 운영
중에서는 속도를 저하시킨다. checkpoint중에는 해당 datafile의 header내용이
고정되어 datafile header에 대한 다른 작업이 진행되지 못한다. 또한 
checkpoint간격이 너무 짧으면 뒤에서 설명할 'checkpoint not complete'
현상이 발생할 가능성도 커지게 되어 checkpoint에 대한 tuning이 필요하게 
되는 것이다. 

3. CKPT process 
~~~~~~~~~~~~ 

checkpoint 수행 중 checkpoint SCN의 값을 controlfile과 datafile header에 
반영시키는 작업을 수행하는 background process는 LGWR 혹은 CKPT process이다.
LGWR와 CKPT중 어느 process가 작업하는지는 Oracle version과 checkpoint_process
라는 parameter에 의해 결정된다. CKTP process를 사용하여 LGWR process의
작업을 줄이는 것이 성능 향상에 상당한 도움이 되기 때문에 oracle version이
증가할수록 CKPT process의 사용이 자동으로 유도된다.

(1) Oracle 7.0 - 7.3.2
initSID.ora file에 CHECKPOINT_PROCESS=TRUE 로 지정되어 있는 경우만,
CKPT process가 구동된다.

(2) Oracle 7.3.3, 7.3.4
db_files가 50이상이거나, 혹은 db_block_buffers값이 10,000 이상이면,
CHECKPOINT_PROCESS parameter에 관계없이 항상 CKPT process가 구동된다. 
CHECKPOINT_PROCESS를 TRUE로 지정하면 db_files나 db_block_buffers값과
무관하게 CKPT process가 기동된다.

(3) Oracle8 8.0.3이상
CKPT process 는 항상 기동되어, CHECKPOINT_PROCESS를 지정하면, 다음과
같은 오류가 발생한다.

LM-101 "unknown parameter name checkpoint_process" 

4. checkpoint가 발생되는 시점
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
checkpoint가 발생하는 시점은 아래와 같이 4가지 경우가 있다.

(1) log switch
log switch가 발생하면 항상 checkpoint가 발생한다. 단, checkpoint가
발생한다고 하여 log switch가 되는 것은 아니다. log swtich가 되는 경우는
사용 중인 log file이 모두 씌여졌거나, 명시적으로 
'alter system switch logfile' 문장을 수행한 경우이다.

online redo log file의 크기는 성능과 복구에 중요한 영향을 미친다.

(2) LOG_CHECKPOINT_INTERVAL 
이 parameter의 단위는 OS block size로, 이 크기만큼의 redo log file에 
기록한 후에 checkpoint가 발생하는 것이다.
예를 들어 log_checkpoint_interval로 10,000이 지정되어 있고, 대부분의 
Unix의 경우처럼 한 os block size가 512 bytes이면, 10,000 * 512 bytes = 
5m가 된다.
redo log file의 크기가 20m라고 가정할 때, 5m마다 checkpoint가 발생하므로,
redo log file하나를 기록하는 동안 4번의 checkpoint가 발생하는 것이다.

그러나 반대로 log file이 이 크기보다 작은 3m라면 log_checkpoint_interval
parameter는 무시되고 log swtich발생마다, 즉 log file에 3m만큼 기록한 
후에는 항상 checkpoint가 발생하게 된다.

(3) LOG_CHECKPOINT_TIMEOUT 

이 parameter의 단위는 초(second)이며, 이 시간 간격으로 checkpoint가 발생
하게 된다. log swtich전에 checkpoint가 발생하길 원한다면
log_checkpoint_timeout보다는 log_checkpoint_interval을 사용하도록 권장한다.
log_checkpoint_timeout은 transaction이 발생하지 않아도 일정 시간이 지나면,
무조건 checkpoint를 발생하게 하여 불필요한 checkpoint를 발생시키기 때문이다.

5. 그 외의 checkpoint관련 parameter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(1) DB_BLOCK_CHECKPOINT_BATCH

이 parameter는 Oracle7과 Oracle8.0까지만 사용되는 것으로 checkpoint시에
DBWR가 한번에 disk에 write하는 block buffer의 갯수를 지정한다.
이것을 32정도의 큰 값으로 지정하면 checkpoint속도를 향상시킬 수 있다.

(2) LOG_CHECKPOINTS_TO_ALERT 

log swtich는 항상 alert.log에 기록이 남는다. log switch보다 자주
checkpoint가 발생하도록 한 경우 checkpoint발생 시간과 간격을 확인하려면
log_checkoiint_to_alert=true로 init.ora file에 지정하면 확인이 가능하다.


6. redo log file과 checkpoint 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

앞에서 언급한 바와 같이 log switch시에는 항상 checkpoint가 발생한다. 일반적
으로, log_checkpoint_interval이나 log_checkpoint_timeout을 log swtich보다 
간격을 크게 하여 checkpoint가 log swtich시에만 발생하도록 사용한다.

redo log file의 크기가 너무 작으면 불필요한 checkpoint작업이 자주 발생할 수 
있다. alert.log를 보면 아래와 같은 형태의 log switch에 대한 기록이 남게 
되는데, 이것을 통해 log switch 발생 간격을 확인할 수 있다.

Thread 1 advanced to log sequence 248 
Current log# 2 seq# 248 mem# 0: /prod1/oradata/logs/redologs02.log

log switch가 자주 발생하게 되면 성능 저하를 가져올 수 있으며, 일반적으로 
oracle에서는 한시간에 한번 정도의 log swtich를 권장하고 있다.
오라클 사용자의 경우 log file을 작게 유지하는 이유 중 current redo log file의
corruption시 잃게되는 정보의 양이 log file이 클 수록 비례적으로 큰것을
염려하는 경우가 많은데 이러한 경우는 redo log file에 member를 두고,
그 member를 다른 disk에 위치시킴으로써 위험을 줄일 수 있다.

log file의 크기가 너무 작아 log switch가 자주 발생하게 되는 경우의 또 다른
문제점은 log file의 status가 ACTIVE인 상태로 오래 지속되는 것이다. 이것은 아래 
설명할 checkpoint not complete같은 현상에도 직접적인 영향을 미친다.

redo log file은 log swtcih가 발생하고 checkpoint가 진행되는 동안 status가 
ACTIVE 상태가 된다. 이것은 해당 redo log에 대한 checkpoint가 완전히 끝나면,
INACTIVE 상태로 변경된다. 
그런데 log switch에 의해 checkpoint event가 발생된 경우 아직 이전 redo log
file에 대한 checkpoint가 끝나지 않았다면 이전 checkpoint와 새로운 
checkpoint가 구별되어 수행되는 것이 아니고 이전 checkpoint와 새로운 
checkpoint가 하나로 묶여 새로운 checkpoint까지 끝나야만 이전 redo log
file도 같이 INACTIVE 상태로 변경이 된다. 이미 1번 checkpoint란 무엇인가
에서 이미 언급한 내용이다.

실제 운영중에 redo log file의 대부분이 ACTIVE인 상태로 유지되다가 batch작업이 
끝날때쯤 한꺼번에 모두 INACTIVE로 되는 현상이 바로 이러한 원인때문이다. 
즉, 이것은 맨 처음 redo log file에 대한 내용도 여전히 checkpoint가 끝나지 않아,
나머지 redo log 들이 모두 기다리고 있는 현상이 아니라, 빈번한 log switch로
인해 바로 직접의 log에 대한 checkpoint가 끝나기 전에 다음 checkpoint가 요청
되고 이러한 일들이 계속 이어짐에 따라 checkpoint작업이 연속적으로 묶여
발생하는 것이다. 이러한 이유로 실제로는 redo log file의 내용의 대부분이 
checkpoint가 이루어졌지만, 다수가 ACTIVE인 상태로 존재하는 현상이 
발생하는 것이다.

checkpoint중인 datafile header는 다른 작업이 blocking되기 때문에 checkpoint
중인 상태로 오래 지속되는 것은 바람직하지 않으며, 그래서 적정한 redo 
log file의 크기와 갯수가 중요하게 된다.

7. CHECKPOINT NOT COMPLETE 
~~~~~~~~~~~~~~~~~~~~~~~~~
다량의 data를 import하거나 load하는 경우 혹은 batch 작업을 진행하는 경우,
database작업이 중간 중간 멈추는 hang현상이 발생하면서, alert.log file에
다음과 같이 'Checkpoint not complete'라는 message가 여러번 적힌 것을 발견
하게 되는 경우가 있다. 

Thread 1 advanced to log sequence 248 
Current log# 2 seq# 248 mem# 0: /prod1/oradata/logs/redologs02.log 
Thread 1 cannot allocate new log, sequence 249 
Checkpoint not complete 

이 message가 나타내는 것은 LGWR가 redo log를 재사용하려고 하는데, 아직 그
redo log file이 checkpoint가 끝나지 않은 상태임을 나타낸다. 예를 들어,
LGWR가 1번 redo log group에 내용을 기록하고, 2번으로 switch하면서 1번에 
대한 checkpoint가 진행중인 상태에서 2번 3번 redo log도 모두 사용하고 다시
1번을 사용하려고 하면 이러한 메시지가 alert.log에 적히게 되고, 1번을 다시
사용할 수 있을 때까지 db의 모든 변경 작업은 waiting상태가 된다.

이러한 현상은 database에 변경을 가하는 dml이 한꺼번에 빠르게 수행되는 경우
LGWR가 redo log file에 빠른 속도로 많은 내용을 기록하는 경우 발생한다.

redo log file의 크기나 갯수가 작아 log switch가 빈번히 발생하는 경우,
LGWR가 redo log에 redo정보를 적으면서 한바퀴 cycle을 도는 시간이 너무
빠르면 이러한 현상은 쉽게 발생 가능하다. 
앞 section에서 언급했듯이 oracle에서는 한시간에 한번 정도의 log switch와
log switch시에만 checkpoint가 발생하는 것을 기본적으로 권장한다.

그런데 redo log file의 갯수를 몇개 더 추가하고 size를 증가하였는데도,
마찬가지로 이러한 현상이 발생하는 경우가 있다. redo log group을 추가하여도,
redo log group을 추가할때만 사용이 되다가 다시 추가한 redo log group까지
모두 status가 ACTIVE이다가 어느 정도 시간이 지나거나 작업이 끝나면 동시에
모든 redo log group이 INACTIVE상태로 변경되는 것을 볼 수 있다.

이것은 이미 앞에서 여러차례 설명했듯이 이미 수행중인 checkpoint가 끝나지
않은 경우 다음 checkpoint가 들어오면 이것이 하나로 묶이게 되기 때문이며,
아래에 정리한 방법을 이용하여 tuning하여야 한다.

Checkpoint not complete현상을 해결하기 위한 방법을 정리해 보면 다음과 같다.

(1) LGWR가 redo log file을 한바퀴 도는 cycle을 지연시킨다. 
- redo log group을 추가시킨다.
- redo log file의 크기를 증가시킨다.

(2) checkpoint를 자주 발생하지 않도록 한다.
- LOG_CHECKPOINT_INTERVAL의 값을 증가시킨다.
- online redo log file의 크기를 증가시킨다.

(3) checkpoint 작업의 효율성을 증가시킨다.
- CHECKPOINT_PROCESS=TRUE 로 지정하여 CKPT process를 기동시킨다 (Oracle7)
- db_block_checkpoint_batch의 값을 증가시킨다 (7.X ~ 8.0)
- db_block_size를 증가시켜 dbwr가 checkpoint시 disk에 write하는 속도를 
향상시킨다.
이것은 database를 완전히 다시 만드는 작업이어서 쉽게 조치하기는
어려우나 이 문제가 자주 발생하여 심각한 영향을 미치는 경우 고려해
볼 수 있다.


Reference Documents


<Note:147468.1> Checkpoint Tuning and Troubleshooting Guide

반응형
반응형
sqlnet.ora에 설정한다.

tcp.validnode_checking = yes
tcp.invited_nodes=(127.0.0.1,127.0.0.2)
tcp.NODELAY=yes

listener 재시작.. 
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

sh 계정 생성  (0) 2011.12.26
10g에서 sys_connect_by_path 사용법  (0) 2011.12.01
Linux 10.2.0.4 upgrade Patch  (0) 2011.10.31
startup 종류?  (0) 2011.08.18
shutdown 종류?  (0) 2011.08.18
반응형
리눅스(우분투)에서 sqlplus를 접속 후 작업시 ed 또는 edit 를 쳐서 쿼리를 수정하는 경우가 있다.
그러나 vi가 실행은 된 것 같은데 기존 쿼리는 온데 간데없고 이상한 문구나 '?' 만 표시가 되어있다.
q를 눌러 나가게 되면 기존쿼리가 출력이 되면서 나간다.

해결 방법은..

$ORALCE_HOME/sqlplus/admin/glogin.sql 파일을 열어서 맨 아래줄에 define_editor=vi 를 입력한다.

다시 해보면 정상적으로 편집기가 실행된다.
 
반응형
반응형
현재 버젼은 10.2.0.1 이다.
metalink 에서 패치 및 업데이트를 클릭하여 10.2.0.4 를 조회하여 다운 받는다.
patch number : 6810189
파일명 : p6810189_10204_Linux-x86.zip

 
1. lsnrctl stop listener
2. shutdown immediate;
3. unzip p6810189_10204_Linux-x86.zip
4. ./runInstaller.
   - 허가거부라고 하여 실행이 되지 않을 때가 있는데 runInstaller 파일에 권한을 더 추가한다.(chmod 775 runInstaller)
   - .oui 등 다른 파일들도 권한 문제로 실행이 안되는 경우가 생김.
5. 인스톨 화면에서 10.2.0.1 설치 했을 때와 같은 경로들을 준다.
   - 이상하게 OraInventory는 같은 경로가 되지 않았다. ㅜㅜ(이유모름)
   - 다른 경로를 주고 실행시킴.
6. 설치가 진행되고 마지막쯤에 root.sh를 루트계정에서 실행시키라고 나온다.(sudo /oracle/10g/root.sh)
7. 정상적으로 설치 완료.
8. startup upgrade
   - 주의 upgrade를 하지않고 그냥 startup만 하게 된다면 아래와 같은 에러가 발생한다.
   - ORA-01092: ORACLE instance terminated. Disconnection forced

9. @$ORACLE_HOME/rdbms/admin/catupgrd.sql 실행
10. restart
   - 현재 DB의 status를 확인해 보면 아래와 같다.

SQL> select status from v$instance;
STATUS
----------------
OPEN MIGRATE

   - shutdown immediate;
   - startup;

SQL> select status from v$instance;
STATUS
--------
OPEN

11. lsnrctl start listener
12. 완료.
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0    Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production


반응형

'Oracle > Oracle Study' 카테고리의 다른 글

10g에서 sys_connect_by_path 사용법  (0) 2011.12.01
특정 IP만 접속  (0) 2011.11.21
startup 종류?  (0) 2011.08.18
shutdown 종류?  (0) 2011.08.18
UTL_URL 함수  (0) 2011.08.01
반응형
오라클 접속 할 때 갑자기 아래와 같이 에러가 뜨면서 접속이 되질 않았다.

ORA-00257: archiver error. Connect internal only, until freed.

archive 가 쌓이는 곳을 확인해보니, 100%를 치고 있었다. 헐...
운영중 디비라서 더욱 다급한 상황..
일단 archive 파일 전체를 삭제하였다. 빨리 FULL 백업을 해야겠다.

접속은 잘 된다. 백업 정책을 만들어야지...
반응형

+ Recent posts