Oracle/Admin2021. 8. 31. 08:35

[ora19c@datasvc ~]$ sqlplus

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Aug 31 08:28:25 2021
Version 19.8.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter user-name: /as sysdba

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0


SQL> create user test_0831 identified by test_0831 default tablespace users;

User created.

SQL> grant connect, resource to test_0831;

Grant succeeded.

SQL> conn test_0831/test_0831
Connected.
SQL> create table test (col1 number, col2 varchar2(10)) tablespace system;

Table created.

SQL> insert into test values (1,'test');
insert into test values (1,'test')
            *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'SYSTEM'


SQL> conn / as sysdba
Connected.
SQL> grant unlimted tablespace to test_0831;
grant unlimted tablespace to test_0831
      *
ERROR at line 1:
ORA-00990: missing or invalid privilege


SQL> grant unlimited tablespace to test_0831;

Grant succeeded.

SQL> conn test_0831/test_0831
Connected.


SQL> insert into test values (1,'test');

1 row created.

SQL> commit;

Commit complete.

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

DDL문 추출 방법  (0) 2016.11.18
PK 변경절차  (0) 2016.11.18
파티션 테이블 인덱스 DDL 작업  (0) 2015.08.18
테이블의 move시에 인덱스는 어떻게 될까?  (0) 2015.04.30
[펌] AMM에 관한 Test Case  (0) 2013.04.16
Posted by 자수성가한 부자
Oracle/Admin2016. 11. 18. 10:09

 

오라클 DB에서 DDL문을 추출하는 방법

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

1. SQLPLUS 접속

$ sqlplus / as sysdba

 

2. DBMS_METADATA.GET_DDL 함수를 이용한 DDL문 추출

SQL>
set long 100000 pages 1000
SELECT
dbms_metadata.get_ddl('TABLE','TEST_TABLE','TEST_USER'),
dbms_metadata.get_dependent_ddl('INDEX','TEST_TABLE_IDX01','TEST_USER'),
dbms_metadata.get_dependent_ddl('COMMENT','TEST_TABLE','TEST_USER')
from dual;

 

 

Posted by 자수성가한 부자
Oracle/Admin2016. 11. 18. 10:06

 

 

--------------
- PK 변경 절차
--------------

1. 기존 PK disable
-------------------
alter table test.TEST_TABLE disable constraint TEST_TABLE_PK;

 

2. 기존 PK drop
------------------

alter table test.TEST_TABLE drop constraint TEST_TABLE_PK ;


3. 기존 인덱스 drop
-------------------
drop index test.TEST_TABLE_PK ;

 

4. 신규 인덱스 create
----------------------
create index  test.TEST_TABLE_PK ON test.TEST_TABLE (COL1, COL2, COL3, COL4, COL5);

 

5. PK 추가
----------
ALTER TABLE test.TEST_TABLE ADD CONSTRAINT TEST_TABLE_PK PRIMARY KEY (COL1, COL2, COL3, COL4, COL5);

 

Posted by 자수성가한 부자
Oracle/Admin2015. 8. 18. 15:15

 

 

 

Q :

 파티션 테이블에 글로벌 인덱스가 걸려있을 때 파티션 DDL 작업에 의해 영향을 받는다. 이때 글로벌 인덱스가 unusable로 빠지는 상황이 있는데 이것을 미연에 방지하려면 어떻게 해야하는가?

 

A :

 자동 인덱스 rebuild가 가능하도록 명령을 설정해준다.

 하지만, DDL로 인해서 영향 받는 레코드가 5% 미만일 때만 유용하다. 5% 이상일 때는 인덱스를 재생성하는 것보다 오히려 늦다.

 

 alter table ...

 split partition ...

 update global indexes;

 

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

DDL문 추출 방법  (0) 2016.11.18
PK 변경절차  (0) 2016.11.18
테이블의 move시에 인덱스는 어떻게 될까?  (0) 2015.04.30
[펌] AMM에 관한 Test Case  (0) 2013.04.16
SQL*Loader 성능을 향상시키는 방법  (0) 2013.01.16
Posted by 자수성가한 부자
Oracle/Admin2015. 4. 30. 13:30

 

 

Q :

  테이블의 move시에 해당 테이블에 걸려 있는 인덱스의 상태는 어떻게 될까? 

 

A :

  UNUSABLE로 되기 때문에 TABLE MOVE시에는 반드시 인덱스를 rebuild 해줘야 한다.

 

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

테스트 시나리오

 1. 테스트용 테이블 생성

 2. 데이터 입력

 3. 인덱스 생성

 4. 테이블 move(테이블스페이스 이동)

 5. 인덱스 상태 확인

 6. 인덱스 rebuild

 7. 인덱스 상태 확인

 

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

 1. 테스트용 테이블 생성

 

   SQL> create table test (col1 number, col2 varchar2(100));

 

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

 

 2. 데이터 입력

 

  SQL> insert into test
  2  select level, 'test'
  3  from dual
  4  connect by level <= 1000;

 

1000개의 행이 생성되었습니다.

SQL> commit;

 

커밋이 완료되었습니다.

 

 3. 인덱스 생성

 

SQL> create index test_idx01 on test(col1,col2);

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

 

 

 4. 테이블 move(테이블스페이스 이동)

 

SQL> conn test/test
연결되었습니다.

SQL> alter table test move tablespace test;

테이블이 변경되었습니다.

 

 

 5. 인덱스 상태 확인

 

SQL> select index_name, status from dba_indexes
  2  where index_name = 'TEST_IDX01';

INDEX_NAME                     STATUS
------------------------------ --------
TEST_IDX01                     UNUSABLE


 

 6. 인덱스 rebuild

 

SQL> alter index TEST_IDX01 rebuild;

인덱스가 변경되었습니다.

 

 7. 인덱스 상태 확인

 

SQL> conn / as sysdba
연결되었습니다.
SQL> select index_name, status from dba_indexes
  2  where index_name = 'TEST_IDX01';

INDEX_NAME                     STATUS
------------------------------ --------
TEST_IDX01                     VALID

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

PK 변경절차  (0) 2016.11.18
파티션 테이블 인덱스 DDL 작업  (0) 2015.08.18
[펌] AMM에 관한 Test Case  (0) 2013.04.16
SQL*Loader 성능을 향상시키는 방법  (0) 2013.01.16
유저 단위 export시 테이블스페이스 관련  (0) 2012.09.24
Posted by 자수성가한 부자
Oracle/Admin2013. 4. 16. 09:57

 

 

 

오라클 11g는 SGA뿐 아니라 PGA까지 포함하는 강력한 자동 메모리 관리(Automatic Memory Management:AMM) 기능을 제공한다.

앞으로는 오라클에 얼마만큼의 메모리를 써라~고 지정만 해주면 된다는 것을 의미한다. 멋진 일이긴 하지만, 실제 적용할 때는 염두에 두어야 할 몇가지 함정들이 있을 것이다.

간단해 보이지만, AMM의 속성을 잘 알 수 있는 Test Case를 만들어 보겠다.

  • Memory Target, Memory Max Target 값을 200M로 설정한다.
  • DB Cache와 Shared Pool 간의 경합을 시뮬레이션하기 위해, logical reads와 hard parse를 혼합해서 과도하게 발생시킨다.
  • 이 상황에서, PGA aggregate target 의 변화가 발생하는지 체크한다.



*.memory_target=200m
*.memory_max_target=200m

declare
  pat1     varchar2(1000);
  pat2     varchar2(1000);
  va       number;
begin
  select ksppstvl into pat1
    from sys.xm$ksppi i, sys.xm$ksppcv v   -- synonym of x$ table
    where i.indx = v.indx
    and i.ksppinm = '__pga_aggregate_target';

  for idx in 1 .. 1000000 loop

    -- Mixed workloads of heavy logical reads and hard parse
    execute immediate
       'select count(*) from t3 where 10 = mod('||idx||',10)+1' into va;

    if mod(idx, 100) = 0 then
      sys.dbms_system.ksdwrt(2, idx || 'th execution');

      for p in (select ksppinm, ksppstvl
          from sys.xm$ksppi i, sys.xm$ksppcv v
          where i.indx = v.indx
          and i.ksppinm in
           ('__shared_pool_size', '__db_cache_size',
              '__pga_aggregate_target'))  
             loop

          sys.dbms_system.ksdwrt(2, p.ksppinm || ' = ' || p.ksppstvl);
      end loop;

      select ksppstvl into pat2
      from sys.xm$ksppi i, sys.xm$ksppcv v
      where i.indx = v.indx
      and i.ksppinm = '__pga_aggregate_target';

      -- Do I have PGA aggregate target change?
      if pat1 <>  pat2 then
        sys.dbms_system.ksdwrt(2, 'yep, I got it! pat1=' || pat1 ||', pat2='||pat2);
        exit;
      end if;
    end if;
  end loop;
end;
/



결과는 아래와 같다. (alert log 파일)

100th execution
__shared_pool_size = 92274688
__db_cache_size = 16777216
__pga_aggregate_target = 83886080
200th execution
__shared_pool_size = 92274688
__db_cache_size = 16777216
__pga_aggregate_target = 83886080
300th execution
__shared_pool_size = 88080384
__db_cache_size = 20971520
__pga_aggregate_target = 83886080
400th execution
__shared_pool_size = 92274688
__db_cache_size = 16777216
__pga_aggregate_target = 83886080
500th execution
__shared_pool_size = 88080384
__db_cache_size = 20971520
__pga_aggregate_target = 83886080
600th execution
__shared_pool_size = 92274688
__db_cache_size = 20971520
__pga_aggregate_target = 83886080
700th execution
__shared_pool_size = 92274688
__db_cache_size = 20971520
__pga_aggregate_target = 83886080
800th execution
__shared_pool_size = 92274688
__db_cache_size = 20971520
__pga_aggregate_target = 83886080
900th execution
__shared_pool_size = 92274688
__db_cache_size = 20971520
__pga_aggregate_target = 83886080
1000th execution
__shared_pool_size = 92274688
__db_cache_size = 20971520
__pga_aggregate_target = 83886080
1100th execution
__shared_pool_size = 92274688
__db_cache_size = 20971520
__pga_aggregate_target = 83886080

1200th execution
__shared_pool_size = 92274688
__db_cache_size = 37748736
__pga_aggregate_target = 58720256
yep, I got it! pat1=83886080, pat2=58720256



기대했던대로, Oracle은 부하에 따라 Buffer Cache의 크기와 Shared Pool의 크기를 주거니 받거니 하면서 변경하는 것을 볼 수 있다.

그런데, 1200번째 실행에서는 갑자기 PGA aggregate target 영역에서 메모리를 훔쳐서 Buffer Cache로 가져다쓴다. 이 역시 AMM(Automatic Memory Management)에서는 충분히 발생가능한 일이다.

문제는 어떤 특정 상황에서는 위험이 발생할 수 있다는 것이다. PGA aggregate target가 바뀐다는 것은 Hash/Sort관련 Operation의 Cost가 변경된다는 것을 의미한다. 따라서 갑자기 실행 계획이 바뀌는 것과 같은 위험한 상황이 발생 할 수도 있다. PGA Aggregate Target이 변하면 Hash/Sort의 성능 자체에도 영향을 주게 된다.

조금 극단적인 Test Case라고 할 수 있지만, 이런 현상이 논리적인 빈틈이나 버그로 인해 끔찍한 결과를 초래할 수 있다는 것은 경험으로 잘 알 고 있을 것이다.

오라클 11g가 좀 더 대중화되면, 이런 유형의 문제에 대한 실사례를 접할 수 있을 것이다.

 

출처 : http://ukja.tistory.com/216

Posted by 자수성가한 부자
Oracle/Admin2013. 1. 16. 17:58

 

SQL*Loader의 성능을 향상시키는 여러가지 방법들

 

1. Data를 load하는 방식에 따라 성능을 증가시키는 방법이 다름
  1) 기본경로(conventional)

     ROWS=n를 사용하고 bind array를 크게 지정하라.
     (ROWS=n은 n개마다 commit을 하라고 명시하는 것.
      bind array는 bindsize 파라미터에 정의)


  2) 직접경로(direct path) : direct=true 옵션을 지정
      unrecoverable 옵션을 지정하면 더욱더 성능을 높여줌 : redo data를 남기지 않음


  3) 병렬직접경로(parallel direct path)
     direct=true와 parallel=true를 지정할 것.

 

2. data load 전에 index 삭제

 

3. replace 대신에 truncate사용할 것(if 기존 데이터를 삭제한다면)

 

4. 구분자(, | .)대신에 고정폭 데이터를 사용하라.

 

5. 11g 파라미터 변경
   STATISTICS_LEVEL = BASIC 이면 timed_statistics=false;
   STATISTICS_LEVEL = TYPICAL, ALL 이면 timed_statistics=true;

 

 

참고 :

http://databaser.net/moniwiki/wiki.php/SQLLoader%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

http://satya-dba.blogspot.kr/2009/06/sqlloader.html : 파라미터 정의(히든 포함)

Posted by 자수성가한 부자
Oracle/Admin2012. 9. 24. 19:53

 

Q :

     유저 단위로 export를 받았습니다. 그러나 이 유저의 오브젝트들은 테이블스페이스가 제각각입니다. 이 dump파일을 한테이블 스페이스로 import 할 수 있습니까?

 

A :

    예, 할 수 있습니다.

  

 

## 테스트


1. 테스트용 테이블스페이스 생성
col tablespace_name for a50
col file_name for a50
set lines 200

select tablespace_name, file_name from dba_data_files;

TABLESPACE_NAME        FILE_NAME
-------------------------------------------------- --------------------------------------------------
SYSTEM         /u01/app/oracle/oradata/test/system01.dbf
UNDOTBS1        /u01/app/oracle/oradata/test/undotbs01.dbf
SYSAUX         /u01/app/oracle/oradata/test/sysaux01.dbf
USERS         /u01/app/oracle/oradata/test/users01.dbf


SQL> create tablespace test datafile '/u01/app/oracle/oradata/test/test01.dbf' size 100m;

Tablespace created.

SQL> create tablespace test2 datafile '/u01/app/oracle/oradata/test/test2_01.dbf' size 100m;

Tablespace created.

 

2. 유저 생성후 default tablespace를 지정(test 테이블스페이스)

SQL> create user test identified by test
  2  default tablespace test;

User created.

SQL> grant resource, connect to test;

Grant succeeded


3. test 유저로 접속후 테이블 생성 / 인덱스 생성 / 데이터 입력
SQL> conn test/test
Connected.
SQL> create table test_table (col1 varchar2(10), col2 number);

Table created.

SQL> insert into test_table values ('tests',2);

1 row created.


SQL> insert into test_table values ('eeee',3);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test_table;

COL1      COL2
-------------------- ----------
tests         2
eeee         3


# index 생성 : 유저 default로 생성
SQL> create index test_index on test_table(col1);

Index created

# index 생성 : 테이블스페이스 test2로 지정
SQL> create index test_index2 on test_table(col1,col2)
  2  tablespace test2;

Index created.


# table 생성 : 테이블스페이스 test2로 지정
SQL> create table test_table2 (col1 number, col2 varchar2(10))
  2  tablespace test2;      

Table created.

SQL> insert into test_table2 values (1,'test');

1 row created.

SQL> commit;


4. export(test 유저)
[oracle@test ~]$ exp test/test file=exp.dmp log=exp.log

Export: Release 10.2.0.4.0 - Production on 월 9월 24 19:37:48 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user TEST
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user TEST
About to export TEST's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export TEST's tables via Conventional Path ...
. . exporting table                     TEST_TABLE          2 rows exported
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
. . exporting table                    TEST_TABLE2          1 rows exported
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully with warnings.


5. 유저 삭제(오브젝트도 같이)
SQL> drop user test cascade;       

User dropped.


6. 테이블스페이스 삭제 : test2

SQL>  drop tablespace test2 including contents and datafiles;      

Tablespace dropped.

 

7. 유저 생성(import할 유저)
SQL> create user test identified by test
  2  default tablespace test;

User created.

SQL> grant resource, connect to test;

Grant succeeded.


8. import

[oracle@test ~]$ imp test/test file=exp.dmp log=imp.log

Import: Release 10.2.0.4.0 - Production on 월 9월 24 19:40:55 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V10.02.01 via conventional path
import done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
import server uses WE8ISO8859P1 character set (possible charset conversion)
. importing TEST's objects into TEST
. . importing table                   "TEST_TABLE"          2 rows imported
. . importing table                  "TEST_TABLE2"          1 rows imported
Import terminated successfully without warnings.


8. 데이터 확인
  : 기존에 생성된 테이블과 인덱스 모두 유저의 default tablespace에 생성된다.
SQL> select table_name, tablespace_name from user_tables;

TABLE_NAME           TABLESPACE_NAME
------------------------------------------------------------ --------------------------------------------------
TEST_TABLE           TEST
TEST_TABLE2           TEST

SQL> select * from test_table;

COL1      COL2
-------------------- ----------
tests         2
eeee         3

SQL> select * from test_tables2;
select * from test_tables2
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select * from test_table2;

      COL1 COL2
---------- --------------------
  1 test


SQL> select table_name from user_tables;

TABLE_NAME
------------------------------------------------------------
TEST_TABLE
TEST_TABLE2

SQL> select * from test_table;

COL1      COL2
-------------------- ----------
tests         2
eeee         3


SQL> select * from test_table2;

      COL1 COL2
---------- --------------------
  1 test


INDEX_NAME        TABLESPACE_NAME
-------------------------------------------------- --------------------------------------------------
TEST_INDEX        TEST
TEST_INDEX2        TEST

Posted by 자수성가한 부자
Oracle/Admin2012. 9. 18. 17:49

 

 

11g에서는 Diagnostic Pack 과 Tuning Pack의 사용 가능한지 불가능한지를 파라미터를 통해 설정해 놓았다.

 

# 파라미터 조회

SELECT name, value FROM v$parameter WHERE name = 'control_management_pack_access';

 

3개의 값을 설정할 수가 있는데,

NONE : 두 pack 모두 사용할 수 없음

DIAGNOSTIC : diagnostic pack 만 사용할 수 있음.
DIAGNOSTIC+TUNING : 두 pack 모두 사용할 수 있고, default 값임


 

각 패키지에 해당하는 기능들

 

Oracle Diagnostic Pack
 - AWR
 - ADDM
 - ASH
 - Performance Tuning
 - Event notifications
 - Event history and metric history
 - Blackouts
 - Dynamic metric baselines
 - Monitoring templates
 - Memory-access based performance montoring

 

Tuning Pack
 - SQL Access Advisor
 - SQL Tuning Advisor
 - Automatic SQL Tuning
 - SQL Tuning Sets
 - SQL Monitoring
 - Reorganize objects

 

원문 : http://docs.oracle.com/cd/E11882_01/server.112/e25513/initparams038.htm#REFRN10296

Posted by 자수성가한 부자
Oracle/Admin2012. 9. 18. 16:34

 

 

 

Q : 현재 데이터파일의 갯수가 db_files의 설정 되어있는 값과 같다.

     이 상황에서 리두로그의 그룹과 멤버를 추가하려고 합니다.

     가능한지요?

 

A :  가능합니다.

      redo 로그는 db_files의 갯수와 무관합니다.

 

테스트

 

# db_files의 갯수 확인

SQL> show parameter db_files;

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
db_files        integer  7

 

# 현재 datafile들의 갯수 확인

SQL> select count(*) from dba_data_files;

  COUNT(*)
----------
  7

 

# 리두로그 현황

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/redo01.log
/u01/app/oracle/oradata/orcl/redo02.log
/u01/app/oracle/oradata/orcl/redo03.log

 

SQL> alter database add logfile '/u01/app/oracle/oradata/orcl/redo04.log' size 50M;

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

 


SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/redo01.log
/u01/app/oracle/oradata/orcl/redo02.log
/u01/app/oracle/oradata/orcl/redo03.log
/u01/app/oracle/oradata/orcl/redo04.log

 

=> 잘 추가되었다.

 

테이블스페이스 추가를 해볼까?

 

SQL> create tablespace test1 datafile '/u01/app/oracle/oradata/orcl/test1_01.dbf' size 10m;
create tablespace test1 datafile '/u01/app/oracle/oradata/orcl/test1_01.dbf' size 10m
*
1행에 오류:
ORA-00059: 최대 DB_FILES 수를 초과했습니다

 

=> 추가 안됨

 

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

유저 단위 export시 테이블스페이스 관련  (0) 2012.09.24
11g Diagnostic Pack / Tuning Pack  (0) 2012.09.18
session_cached_cursors  (0) 2012.09.18
SPM (SQL Plan Management) 에 baseline 자동 등록  (0) 2011.10.31
compress 옵션  (1) 2011.10.06
Posted by 자수성가한 부자