2015. 12. 14. 03:39

Oracle/PLSQL: Roles

This Oracle tutorial explains how to create roles, grant/revoke privileges to roles, enable/disable roles, set roles as the default, and drop roles in Oracle with syntax and examples.

Description

A role is a set or group of privileges that can be granted to users or another role. This is a great way for database administrators to save time and effort.

Create Role

You may wish to create a role so that you can logically group the users' permissions. Please note that to create a role, you must have CREATE ROLE system privileges.

Syntax

The syntax for creating a role in Oracle is:

CREATE ROLE role_name

[ NOT IDENTIFIED |

IDENTIFIED {BY password | USING [schema.] package | EXTERNALLY | GLOBALLY } ;

role_name

The name of the new role that you are creating. This is how you will refer to the grouping of privileges.

NOT IDENTIFIED

It means that the role is immediately enabled. No password is required to enable the role.

IDENTIFIED

It means that a user must be authorized by a specified method before the role is enabled.

BY password

It means that a user must supply a password to enable the role.

USING package

It means that you are creating an application role - a role that is enabled only by applications using an authorized package.

EXTERNALLY

It means that a user must be authorized by an external service to enable the role. An external service can be an operating system or third-party service.

GLOBALLY

It means that a user must be authorized by the enterprise directory service to enable the role.

Note:

·         If both NOT IDENTIFIED and IDENTIFIED are omitted in the CREATE ROLE statement, the role will be created as a NOT IDENTIFIED role.

Example

Let's look at an example of how to create a role in Oracle.

For example:

CREATE ROLE test_role;

This first example creates a role called test_role.

CREATE ROLE test_role

IDENTIFIED BY test123;

This second example creates the same role called test_role, but now it is password protected with the password of test123.

Grant TABLE Privileges to Role

Once you have created the role in Oracle, your next step is to grant privileges to that role.

Just as you granted privileges to users, you can grant privileges to a role. Let's start with granting table privileges to a role. Table privileges can be any combination of SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALTER, INDEX, or ALL.

Syntax

The syntax for granting table privileges to a role in Oracle is:

GRANT privileges ON object TO role_name

privileges

The privileges to assign to the role. It can be any of the following values:

Privilege

Description

SELECT

Ability to perform SELECT statements on the table.

INSERT

Ability to perform INSERT statements on the table.

UPDATE

Ability to perform UPDATE statements on the table.

DELETE

Ability to perform DELETE statements on the table.

REFERENCES

Ability to create a constraint that refers to the table.

ALTER

Ability to perform ALTER TABLE statements to change the table definition.

INDEX

Ability to create an index on the table with the create index statement.

ALL

All privileges on table.

object

The name of the database object that you are granting privileges for. In the case of granting privileges on a table, this would be the table name.

role_name

The name of the role that will be granted these privileges.

Example

Let's look at some examples of how to grant table privileges to a role in Oracle.

For example, if you wanted to grant SELECT, INSERT, UPDATE, and DELETE privileges on a table called suppliers to a role named test_role, you would run the following GRANT statement:

GRANT select, insert, update, delete ON suppliers TO test_role;

You can also use the ALL keyword to indicate that you wish all permissions to be granted. For example:

GRANT all ON suppliers TO test_role;

Revoke Table Privileges from Role

Once you have granted table privileges to a role, you may need to revoke some or all of these privileges. To do this, you can execute a revoke command. You can revoke any combination of SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALTER, INDEX, or ALL.

Syntax

The syntax for revoking table privileges from a role in Oracle is:

REVOKE privileges ON object FROM role_name;

privileges

The privileges to revoke from the role. It can be any of the following values:

Privilege

Description

SELECT

Ability to perform SELECT statements on the table.

INSERT

Ability to perform INSERT statements on the table.

UPDATE

Ability to perform UPDATE statements on the table.

DELETE

Ability to perform DELETE statements on the table.

REFERENCES

Ability to create a constraint that refers to the table.

ALTER

Ability to perform ALTER TABLE statements to change the table definition.

INDEX

Ability to create an index on the table with the create index statement.

ALL

All privileges on table.

object

The name of the database object that you are revoking privileges for. In the case of revoking privileges on a table, this would be the table name.

role_name

The name of the role that will have these privileges revoked.

Example

Let's look at some examples of how to revoke table privileges from a role in Oracle.

For example, if you wanted to revoke DELETE privileges on a table called suppliers from a role named test_role, you would run the following REVOKE statement:

REVOKE delete ON suppliers FROM test_role;

If you wanted to revoke ALL privileges on the table called suppliers from a role named test_role, you could use the ALL keyword. For example:

REVOKE all ON suppliers FROM test_role;

Grant Function/Procedure Privileges to Role

When dealing with functions and procedures, you can grant a role the ability to EXECUTE these functions and procedures.

Syntax

The syntax for granting EXECUTE privileges on a function/procedure to a role in Oracle is:

GRANT EXECUTE ON object TO role_name;

EXECUTE

The ability to compile the function/procedure and the ability to execute the function/procedure directly.

object

The name of the database object that you are granting privileges for. In the case of granting EXECUTE privileges on a function or procedure, this would be the function name or the procedure name.

role_name

The name of the role that will be granted the EXECUTE privileges.

Example

Let's look at an example of how to grant EXECUTE privileges on a function or procedure to a role in Oracle.

For example, if you had a function called Find_Value and you wanted to grant EXECUTE access to the role named test_role, you would run the following GRANT statement:

GRANT execute ON Find_Value TO test_role;

Revoke Function/Procedure Privileges from Role

Once you have granted EXECUTE privileges on a function or procedure to a role, you may need to revoke these privileges from that role. To do this, you can execute a REVOKE command.

Syntax

The syntax for the revoking privileges on a function or procedure from a role in Oracle is:

REVOKE execute ON object FROM role_name;

EXECUTE

Revoking the ability to compile the function/procedure and the ability to execute the function/procedure directly.

object

The name of the database object that you are revoking privileges for. In the case of revoking EXECUTE privileges on a function or procedure, this would be the function name or the procedure name.

role_name

The name of the role that will have the EXECUTE privileges revoked.

Example

Let's look at an example of how to grant EXECUTE privileges on a function or procedure to a role in Oracle.

If you wanted to revoke EXECUTE privileges on a function called Find_Value from a role named test_role, you would run the following REVOKE statement:

REVOKE execute ON Find_Value FROM test_role;

Grant Role to User

Now, that you've created the role and assigned the privileges to the role, you'll need to grant the role to specific users.

Syntax

The syntax to grant a role to a user in Oracle is:

GRANT role_name TO user_name;

role_name

The name of the role that you wish to grant.

user_name

The name of the user that will be granted the role.

Example

Let's look at an example of how to grant a role to a user in Oracle:

GRANT test_role TO smithj;

This example would grant the role called test_role to the user named smithj.

Enable/Disable Role (Set Role Statement)

To enable or disable a role for a current session, you can use the SET ROLE statement.

When a user logs into Oracle, all default roles are enabled, but non-default roles must be enabled with the SET ROLE statement.

Syntax

The syntax for the SET ROLE statement in Oracle is:

SET ROLE

( role_name [ IDENTIFIED BY password ] | ALL [EXCEPT role1, role2, ... ] | NONE );

role_name

The name of the role that you wish to enable.

IDENTIFIED BY password

The password for the role to enable it. If the role does not have a password, this phrase can be omitted.

ALL

It means that all roles should be enabled for this current session, except those listed in EXCEPT.

NONE

Disables all roles for the current session (including all default roles).

Example

Let's look at an example of how to enable a role in Oracle.

For example:

SET ROLE test_role IDENTIFIED BY test123;

This example would enable the role called test_role with a password of test123.

Set role as DEFAULT Role

A default role means that the role is always enabled for the current session at logon. It is not necessary to issue the SET ROLE statement. To set a role as a DEFAULT ROLE, you need to issue the ALTER USER statement.

Syntax

The syntax for setting a role as a DEFAULT ROLE in Oracle is:

ALTER USER user_name

DEFAULT ROLE

( role_name | ALL [EXCEPT role1, role2, ... ] | NONE );

user_name

The name of the user whose role you are setting as DEFAULT.

role_name

The name of the role that you wish to set as DEFAULT.

ALL

It means that all roles should be enabled as DEFAULT, except those listed in EXCEPT.

NONE

Disables all roles as DEFAULT.

Example

Let's look at an example of how to set a role as a DEFAULT ROLE in Oracle.

For example:

ALTER USER smithj

DEFAULT ROLE

test_role;

This example would set the role called test_role as a DEFAULT role for the user named smithj.

ALTER USER smithj

DEFAULT ROLE

ALL;

This example would set all roles assigned to smithj as DEFAULT.

ALTER USER smithj

DEFAULT ROLE

ALL EXCEPT test_role;

This example would set all roles assigned to smithj as DEFAULT, except for the role called test_role.

Drop Role

Once a role has been created in Oracle, you might at some point need to drop the role.

Syntax

The syntax to drop a role in Oracle is:

DROP ROLE role_name;

role_name

The name of the role that is to be dropped.

Example

Let's look at an example of how to drop a role in Oracle.

For example:

DROP ROLE test_role;

This DROP statement would drop the role called test_role that we defined earlier.

--

--Assign all object rights from the current user schema (user_objects)

 

spool GrantRights.sql

 

SELECT

decode(

object_type,

'TABLE','GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON'||&OWNER||'.',

'VIEW','GRANT SELECT ON '||&OWNER||'.',

'SEQUENCE','GRANT SELECT ON '||&OWNER||'.',

'PROCEDURE','GRANT EXECUTE ON '||&OWNER||'.',

'PACKAGE','GRANT EXECUTE ON '||&OWNER||'.',

'FUNCTION','GRANT EXECUTE ON'||&OWNER||'.' )||object_name||' TO MY_ORACLE_ROLE ;'

FROM user_objects

WHERE

OBJECT_TYPE IN ( 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'PACKAGE','FUNCTION'

)

ORDER BY OBJECT_TYPE

 

spool off

 

@GrantRights.sql

 

출처: 인터넷어딘가;

Posted by 성장하는yw
2015. 5. 24. 11:03

DATAFILE SIZE를 줄이는 방법
=====================



PURPOSE
-------


Explanation
-----------
기존의 datafile을 resize하여 늘리거나 줄일 수 있습니다.
datafile size를 증가하는 경우는 disk에 free space만 있다면 다음과 같이 간단합니다. 
다음과 같이 늘리면 되나 줄일 경우는 계산을 하여 줄여야 합니다.

<Bulletin No: 10165> 참고

SQL>alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M;


줄이실 경우는 주의가 필요합니다. 만일 지정한 size만큼 data가 있다면 
error가 발생되고 resize되지 않습니다.

SQL> alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M;
alter database datafile '/oracle/dbs/toolsORA.dbf' resize 100M'
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value


방법1
-------

1) 줄이고자하는 file id를 확인합니다.

SVRMGR> select file_id, file_name from dba_data_files;

2) 얼마를 사용했는지 확인합니다.

SVRMGR> select block_id, blocks from dba_extents
2> where file_id='FILE_ID' order by block_id;

FILE_ID 대신에 줄이려는 file id를 기술합니다.

3)현재 사용중이 db block size를 확인합니다.

SVRMGR> show parameter db_block_size

만일 2048일 경우 다음과 같이 계산합니다.

2)에서 조회된 마지막의 block_id, blocks 값을 가지고 계산합니다.
block_id * 2048 + blocks * 2048 의 결과에 한 block더한 값만큼만 줄이는
것이 가능합니다.
만일 마지막으로 조회된 값이 block_id가 578261, blocks가 515일 경우
578261*2048 + 515*2048 =1185333248로 최소한 1.2GB이상은 써야 합니다.

4) 실제 datafile을 줄입니다.

svrmgr>alter database datafile '/oracle/dbs/toolsORA.dbf' resize
1200M;


방법 2
-------

1) 기존의 data export
exp username/password file=filename owner=username log=username.log

2) tablespace drop

svrmgr>drop tablespace tbs including contents;
rm datafile

tbs대신에 작게 만드시려는 tablespace name을 기술합니다.
datafile대신에 tablespace와 연계된 모든 datafile을 remove합니다.

3) tablespace재생성
svrmgr>create tablespace tbs
datafile '...' size 100M;
원하시는 size로 줄입니다.

4) data import
imp username/password file=filename fromuser=username touser=username
commit=y log=imp.log

Example
-------


Reference Documents
-------------------


원본 : https://community.oracle.com/thread/474027?start=0&tstart=0


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

roles  (0) 2015.12.14
nolog 하는 이유  (0) 2015.04.08
현재 접속한 계정 소유의 테이블명을 모두 조회하고 싶을 때  (0) 2015.03.01
1장 select  (0) 2015.02.14
오라클 sqlplus 접속 관련 명령어 및 에러해결법  (0) 2015.02.14
Posted by 성장하는yw
2015. 4. 8. 15:15

https://community.oracle.com/thread/715458

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

roles  (0) 2015.12.14
datafile size 줄이는 방법  (0) 2015.05.24
현재 접속한 계정 소유의 테이블명을 모두 조회하고 싶을 때  (0) 2015.03.01
1장 select  (0) 2015.02.14
오라클 sqlplus 접속 관련 명령어 및 에러해결법  (0) 2015.02.14
Posted by 성장하는yw
2015. 3. 1. 23:51

select table_name from tabs

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

datafile size 줄이는 방법  (0) 2015.05.24
nolog 하는 이유  (0) 2015.04.08
1장 select  (0) 2015.02.14
오라클 sqlplus 접속 관련 명령어 및 에러해결법  (0) 2015.02.14
sql*plus autotrace 기능 활성화  (0) 2014.12.24
Posted by 성장하는yw
2015. 2. 14. 20:35





SQL  

Structured Query Language의 약자이다.

구조화된 쿼리 언어이다. 

사람이 원하는 바를 DBMS프로그램에게 알려주는 언어이다. 


* 오라클에 연습용 계정으로 로그인하기


sqlplus scott/tiger



*오라클 서버가 꺼져 있을 때 켠 후 로그인하기


sys/oracle as sysdba

startup

conn scott/tiger


* 사용자 계정 모양으로 프롬프트 바꾸기


오라클의 sqlplus scott/tiger로 접속 한 후 

SET sqlprompt "_USER>" 


입력하면 

현재 접속해 있는 계정이름으로 변경되어 있으므로, 

편리하게 작업할 수 있다. 


1. desc(Describe 의 약자) 명령어


특정 테이블에 어떤 칼럼이 있는 조회하는 명령어



대부분의 DBMS는 데이터를 표같은 공간에 저장을 하게된다.

이 표를  DBMS는 테이블이라고 부른다.


2. select 


문법 : SELECT [칼럼명 또는 표현식] FROM [테이블명, 뷰 명];


- 모든 칼럼 조회하기

칼럼명/표현식 대신에 * 를 사용한다. 




- 원하는 칼럼만 조회하기

select 뒤에 원하는 칼럼명을 넣고 조회를 하면 된다. 

칼럼이 여러개일 경우 ,(콤마)로 구분하고 칼럼명을 여러개 적어주면 된다. 



11g, 12c 오라클 버전에 따라서 약 1,2건 정도의 결과가 차이가 날 수 있으니 신경쓸 거 없다. 


* 칼럼 길이 조정하는 방법

터미널 작업시에 한눈에 원하는 정보를 화면으로 보기를 원한다면 다음 명령어를 잘 사용하자.


- 데이터가 숫자일 경우

문법 : COL empno FOR 9999

empno의 칼럼의 길이를 숫자 4자리 까지 들어가게 설정한다. 


- 데이터가 문자일 경우

문법 : COl ename FOR a8

ename이란 칼럼의 길이를 8바이트까지 보여주도록 설정한다.


- 한 화면에 출력 가능한 줄 길이 설정 (가로길이 설정)

문법 : SET LINE 200

한 화면을 가로로 200 바이트 까지 보여준다. 


- 한 페이지에 출력 가능한 줄 수 설정(세로길이 설정)

문법: SET PAGES 50

한 페이지에 50줄까지 출력한다. 


참고로 소문자로 써도 적용이 된다. 



3 표현식을 사용해서 출력

표현식(Experssion) 

칼럼 이름 외에 출력하기를 원하는 내용을 의미한다. 

select 구문 뒤에 ' (홑따옴표)로 묶어서 사용한다. 





'교수님''s 매너최고!!' 부분을 표현식이라고 하고 리터럴(literal) 상수(문자)' 라고 한다.

아주 많이 사용되므로 알아두자

여기서 주의할 점은 리터럴 안에 홑따옴표가 들어갈 경우 홑따옴표 1개의 출력을 위해서는

2개의 홑따옴표, 칼럼명에서 보면 알 수 있듯 '' 2개를 사용해야 한다는 점을 잊지말자.


4 칼럼별칭 사용하여 출력하기 

컬럼 별칭 사용하기 전



칼럼 별칭 사용 후

아래 화면과 같이 칼럼이름을 임시적으로 볼 때 바꾸어서 보여줄 수 있는 기능을 칼럼별칭(column Alias)라고 한다.

반드시 쌍따옴표로 묶어줘야 할 때는 별명에 공백, 특수문자, 대소문자 구분이 필요할 때이다. 

영어  AS 는 써도 되고 안써도 상관없기 때문에 주로 칼럼명 "원하는 칼럼명" 이렇게 사용한다. 




5 distinct 

중복된 값을 제거하고 출력한다. 

데이터 조회시 중복된 데이터를 빼고 보고 싶을 때 사용한다. 

원래는 13건이 나오는데 distinct 키워드를 사용하면 중복된 데이터가 제거되고 3건의 데이터만 볼 수 있다. 



사용시 주의점!

distinct 키워드는 1개의 칼럼에만 사용해도 모든 칼럼에 적용된다.

이로 인해 뜻하지 않게 성능저하가 발생할 수 있으므로 주의해서 사용해야 한다. 


oracel 9i 버전 : distinct 키워드 만나면 정렬을 자동으로 해서 심각한 속도 저하를 발생시켰다.

oracel 10g 버전 : HASH 알고리즘의 사용으로 정렬을 하지 않는다. 그래서 성능이 향상되었다.  

HASH 알고리즘 : 1을 넣으면 1이 나오고, 결과가 1이면 입력이 1인 것을 할 수 있는, 입력과 결과가 같은 알고리즘이다.


반드시 select 키워드 다음에 와야한다. 그렇지 않으면 에러가 발생한다.

뭣 모르고 쓰면 속도가 엄청 느려지기때문에 반드시 꼭꼭 써야할 쿼리에만 적용을 하자!!!!!!욕먹기 싫으면!!!!


6 연결(합성 concatenation) 연산자로 칼럼을 붙여서 출력

데이터 조회시 서로 다른 칼럼을 마치 하나의 칼럼처럼 연결해서 출력해야 할 경우가 있다. 

이때 사용하는 연산자 

|| 파이프 기호를 두 번 사용한다.  




연결 연산자를 사용한 컬럼은 오라클에서 1개의 컬럼으로 인식한다. 


아래와 같이 리터럴과 함께 사용하는 경우가 많다. 

오라클 백업/복구 관련작업이나 관리 작업할 때 아주 많이 사용한다. 


7 원하는 조건만 골라내기 - where절 사용

데이터 조회시 원하는 데이터만 보기 위해서 where절을 사용한다. 


SELECT [Column or Expression]

FROM [Table or View]

WHERE 원하는 조건;


사용시 주의

where 절에서 숫자는 상관없지만, 문자와 날짜를 조회할 때는 반드시 '' 홑따옴표를 붙여야 한다!!!

또, 문자 조회시 대소문자를 꼭 구분 해야 한다. 

날짜는 홑따옴표를 사용해야하지만, 대소문자를 구분하지는 않는다.


오라클 날짜에서 주의해야 할 점

윈도우용 오라클/유닉스계열(리눅스포함) 날짜표시 형식이 서로 다르다. 

윈도 : 80/12/17

유닉스 : 17-DEC-80 / 17-dec-80 도 같다.(대소문자 구분안함)


8 sql에서 기본 산술연산자 사용

+,-,*,/ 모두 다 사용 가능하다. 


단, 산수에서처럼 덧셈, 곱셈 ,나눗셈이 동시에 나올 경우는 우선순위를 주의해서 사용해야한다. 


9 다양한 연산자 활용 방법



부등호 사용

sal가 4000과 같거나 그 이상인 값은 조회해서 보여준다.



ename의 시작이  W하거나 그 이후에 오는 알파벳을 보여준다.


리눅스에서는 날짜형식이 아래와 같지만 , 아래 에러가 난 이유는 윈도우 형식의 날짜로 비교를 해주었기 때문이다.


아래와 같이 날짜형식을 동일하게 해서 조건을 주면 정상적인 값이 조회가 된다. 



between 연산자 사용

반드시 작은 값을 앞, 큰 값을 뒤에 사용해야 한다.

두 값을 모두 포함하는 결과를 출력한다. 

2000이상 3000이하!


하지만 특정 구간의 데이터 조회시 가급적 between 연산자 대신에 비교 연산자를 사용하는 것을 권장한다

둘 다 같은 결과를 출력해주지만, 비교 연산자가 훨씬 속도가 빠르다. 




한글 검색시 기억할 사항

한글은 between 연산시 시작범위는 포함, 끝 범위는 제외


Posted by 성장하는yw
2015. 2. 14. 20:28

sqlplus scott/tiger


sqlplus에 scott계정으로 접속함 

tiger은 비밀번호임


입력시, 


ERROR:

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist

Linux Error : 2: No such file or directory

Process ID: 0

Session ID: 0 Serial number: 0


위와 같은 에러가 출력되면 데이터베이스가 켜지지 않았다는 말임


< 에러해결법 >


sys/oracle as sysdba


startup


conn scott/tiger


관리자용 계정인 sys로 접속 후

DB를 켠 후

scott 계정으로 접속하는 명령어임 


show user


현재 접속해 있는 계정을 확인하는 명령어


SET sqlpormpt "_USER>"


현재 접속해 있는 계정명>

프롬프트 모양이 

SCOTT> 이렇게 바뀜

매번 사용자를 확인하지 않아도 이렇게 설정해두면 쉽게 알아볼 수 있음 


ORA-28000: the account is locked


계정이 잠겨 있으면 위와 같은 에러내용이 뜸


< 에러해결법 >


sys/oracle as sysdba


ALTER USER scott

IDENTIFIED BY tiger

ACCOUNT UNLOCK;


sys는 오라클에서 최상위 권한을 가진 계정

oracle은 오라클 사용시 내가 준 sys의 계정 암호를 말함


잠긴 계정을 풀어주는 명령어

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

현재 접속한 계정 소유의 테이블명을 모두 조회하고 싶을 때  (0) 2015.03.01
1장 select  (0) 2015.02.14
sql*plus autotrace 기능 활성화  (0) 2014.12.24
튜닝에 필요한 파일들  (0) 2014.12.22
인덱스 2  (0) 2014.12.19
Posted by 성장하는yw
2014. 12. 24. 18:27

plustrace 권한 생성

conn / as sysdba

@?/sqlplus/admin/plustrce.sql


해당 사용자에게 plustrace 권한 부여

conn / as sysdba

grant plustrace to scott;


애앙 사용자로 로그인 후 plan table 생성

@?/rdbms/admin/utlxplan.sql


autotrace 모드 설정

set autotrace on

set autotrace traceonly

set autotrace traceonly explain

set autotrace traceonly statistics


SQL> desc v$session

 Name                                      Null?    Type

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

 SADDR                                              RAW(4)

 SID                                                NUMBER

 SERIAL#                                            NUMBER

 AUDSID                                             NUMBER

 PADDR                                              RAW(4)

 USER#                                              NUMBER

 USERNAME                                           VARCHAR2(30)

 COMMAND                                            NUMBER

 OWNERID                                            NUMBER

 TADDR                                              VARCHAR2(8)

 LOCKWAIT                                           VARCHAR2(8)

 STATUS                                             VARCHAR2(8)

 SERVER                                             VARCHAR2(9)

 SCHEMA#                                            NUMBER

 SCHEMANAME                                         VARCHAR2(30)

 OSUSER                                             VARCHAR2(30)

 PROCESS                                            VARCHAR2(24)

 MACHINE                                            VARCHAR2(64)

 PORT                                               NUMBER

 TERMINAL                                           VARCHAR2(30)

 PROGRAM                                            VARCHAR2(48)

 TYPE                                               VARCHAR2(10)

 SQL_ADDRESS                                        RAW(4)

 SQL_HASH_VALUE                                     NUMBER

 SQL_ID                                             VARCHAR2(13)

 SQL_CHILD_NUMBER                                   NUMBER

 SQL_EXEC_START                                     DATE

 SQL_EXEC_ID                                        NUMBER

 PREV_SQL_ADDR                                      RAW(4)

 PREV_HASH_VALUE                                    NUMBER

 PREV_SQL_ID                                        VARCHAR2(13)

 PREV_CHILD_NUMBER                                  NUMBER

 PREV_EXEC_START                                    DATE

 PREV_EXEC_ID                                       NUMBER

 PLSQL_ENTRY_OBJECT_ID                              NUMBER

 PLSQL_ENTRY_SUBPROGRAM_ID                          NUMBER

 PLSQL_OBJECT_ID                                    NUMBER

 PLSQL_SUBPROGRAM_ID                                NUMBER

 MODULE                                             VARCHAR2(64)

 MODULE_HASH                                        NUMBER

 ACTION                                             VARCHAR2(64)

 ACTION_HASH                                        NUMBER

 CLIENT_INFO                                        VARCHAR2(64)

 FIXED_TABLE_SEQUENCE                               NUMBER

 ROW_WAIT_OBJ#                                      NUMBER

 ROW_WAIT_FILE#                                     NUMBER

 ROW_WAIT_BLOCK#                                    NUMBER

 ROW_WAIT_ROW#                                      NUMBER

 TOP_LEVEL_CALL#                                    NUMBER

 LOGON_TIME                                         DATE

 LAST_CALL_ET                                       NUMBER

 PDML_ENABLED                                       VARCHAR2(3)

 FAILOVER_TYPE                                      VARCHAR2(13)

 FAILOVER_METHOD                                    VARCHAR2(10)

 FAILED_OVER                                        VARCHAR2(3)

 RESOURCE_CONSUMER_GROUP                            VARCHAR2(32)

 PDML_STATUS                                        VARCHAR2(8)

 PDDL_STATUS                                        VARCHAR2(8)

 PQ_STATUS                                          VARCHAR2(8)

 CURRENT_QUEUE_DURATION                             NUMBER

 CLIENT_IDENTIFIER                                  VARCHAR2(64)

 BLOCKING_SESSION_STATUS                            VARCHAR2(11)

 BLOCKING_INSTANCE                                  NUMBER

 BLOCKING_SESSION                                   NUMBER

 FINAL_BLOCKING_SESSION_STATUS                      VARCHAR2(11)

 FINAL_BLOCKING_INSTANCE                            NUMBER

 FINAL_BLOCKING_SESSION                             NUMBER

 SEQ#                                               NUMBER

 EVENT#                                             NUMBER

 EVENT                                              VARCHAR2(64)

 P1TEXT                                             VARCHAR2(64)

 P1                                                 NUMBER

 P1RAW                                              RAW(8)

 P2TEXT                                             VARCHAR2(64)

 P2                                                 NUMBER

 P2RAW                                              RAW(8)

 P3TEXT                                             VARCHAR2(64)

 P3                                                 NUMBER

 P3RAW                                              RAW(8)

 WAIT_CLASS_ID                                      NUMBER

 WAIT_CLASS#                                        NUMBER

 WAIT_CLASS                                         VARCHAR2(64)

 WAIT_TIME                                          NUMBER

 SECONDS_IN_WAIT                                    NUMBER

 STATE                                              VARCHAR2(19)

 WAIT_TIME_MICRO                                    NUMBER

 TIME_REMAINING_MICRO                               NUMBER

 TIME_SINCE_LAST_WAIT_MICRO                         NUMBER

 SERVICE_NAME                                       VARCHAR2(64)

 SQL_TRACE                                          VARCHAR2(8)

 SQL_TRACE_WAITS                                    VARCHAR2(5)

 SQL_TRACE_BINDS                                    VARCHAR2(5)

 SQL_TRACE_PLAN_STATS                               VARCHAR2(10)

 SESSION_EDITION_ID                                 NUMBER

 CREATOR_ADDR                                       RAW(4)

 CREATOR_SERIAL#                                    NUMBER

 ECID                                               VARCHAR2(64)



임의의 세션 추적

v$session을 통해 SID와 SERIAL#을 구함

SQL> select username, sid, serial# from v$session;


USERNAME                              SID    SERIAL#

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

                                        2          1

                                        3          1

                                        4          1

                                        5          1

                                        6          1

                                        7          1

                                        8          1

                                        9          1

                                       10          1

                                       11          1

                                       12          1


USERNAME                              SID    SERIAL#

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

                                       13          1

                                       14          1

                                       15          1

                                       16          1

                                       17         13

                                       18          5

                                       20          3

                                       21          1

                                       23          1

                                       25          9

                                       28         21


USERNAME                              SID    SERIAL#

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

                                       34          3

                                       35          3

SCOTT                                  41         51

SYS                                    43        147

                                       53         29


27 rows selected.


user_dump_dest 경로 확인 

SQL> show parameter user_dump_dest


NAME                                 TYPE        VALUE

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

user_dump_dest                       string      /app/oracle/diag/rdbms/testdb/

                                                 testdb/trace



위에 생략....
testdb_j002_15378.trc  testdb_ora_1885.trm    testdb_w000_12475.trc
testdb_j002_15378.trm  testdb_ora_1966.trc    testdb_w000_12475.trm
testdb_j003_9770.trc   testdb_ora_1966.trm    testdb_w001_12735.trc
testdb_j003_9770.trm   testdb_ora_31823.trc   testdb_w001_12735.trm
testdb_j004_31464.trc  testdb_ora_31823.trm   testdb_w001_6268.trc
testdb_j004_31464.trm  testdb_ora_31967.trc   testdb_w001_6268.trm
[oracle@localhost trace]$ pwd
/app/oracle/diag/rdbms/testdb/testdb/trace
[oracle@localhost trace]$


tkprof를 통해 리포트 생성



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

1장 select  (0) 2015.02.14
오라클 sqlplus 접속 관련 명령어 및 에러해결법  (0) 2015.02.14
튜닝에 필요한 파일들  (0) 2014.12.22
인덱스 2  (0) 2014.12.19
인덱스 1  (0) 2014.12.19
Posted by 성장하는yw
2014. 12. 22. 17:28

Oracle Alert and Trace Files 


a. Alert log file : db 상황, Oracle Instance가 수행시 발생하는 error등을 기록함 

                       파라미터 파일의 " background_dump_dest = " 로 설정함 

                       nomount 단계에서 기록을 시작함. 



파라미터 파일의 내용




b. Background Process trace file : LGWR,DBWR,SMON,PMON,CKPT.... 

                                                 (문제시마다 생성되므로 여러개 생성됨) 

                                                  파라미터 파일의 " background_dump_dest = "로 설정함 

                                                  파일이름을 보면 어떤 프로세스인지 알수 있음. 

                                                  



a(xxxx.log), b(xxxx.trc)의 경로는 같다.



c. User trace file : user request에 의해서 생성됨. 

                          (여러개 생성됨) 

                          파라미터 파일의 " user_dump_dest= " 로 설정함 










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

오라클 sqlplus 접속 관련 명령어 및 에러해결법  (0) 2015.02.14
sql*plus autotrace 기능 활성화  (0) 2014.12.24
인덱스 2  (0) 2014.12.19
인덱스 1  (0) 2014.12.19
현재 가진 계정이 소유하고 있는 테이블 목록  (0) 2014.12.17
Posted by 성장하는yw
2014. 12. 19. 18:05

4 인덱스의 종류


OLTP 환경 : 주로 B-Tree 인덱스를 많이 사용

OLAP 환경 : 주로 Bitmap 인덱스를 많이 사용


[ 참고 ]

OLTP( OnLine Transaction Processing 실시간 트랜잰션 처리용 ) 

거의 대부분이 실시간으로 데이터가 입력되고 수정되는 환경

우리가 흔히 접하는 대부분의 경우


OLAP ( OnLine  Analytical Processing 온라인 분석 처리용 )   

대량의 데이터를 한꺼번에 입력 한 후 주로 분석이나 통계정보 등을 출력할 때 사용하는 환경

실시간으로 데이터가 자주 변하지는 않음, 빅데이터 분야


1) B-Tree 인덱스



인덱스가 생성될 경우 leaf block -> branch block -> root block의 순서


leaf block : 실제 데이터를 저장하고 있는 데이터 블록들의 주소

branch block : leaf blocks 에 대한 정보

root block : branch block 에 대한 정보


데이터를 찾는 순서 

root block -> branch block -> leaf block 정보를 찾음 

-> 해당데이터의 rowid 를 찾은 후 데이터가 들어있는 블록을 메모리로 복사 


특징  

B-Tree 에서 B는 Binary이란 의미와 함께 Balance의 의미도 있음

Root block를 기준으로 왼쪽과 오른쪽에 들어있는 데이터의 Balance가 맞을 때, 성능이 가장 좋음

일반적으로 가장 많이 사용됨


아래는 다양한 B-Tree의 인덱스들...


(1) UNIQUE INDEX


인덱스를 만드는 key 값에 중복되는 데이터가 없다는 뜻

해당 테이블 컬럼에 중복된 값이 없고, 앞으로도도 중복된 값이 들어올 수 없다는 의미


일반 인덱스와 비교시에도 속도가 빠르기 때문에 둘 중에서는 유니크 인덱스 권함

키 컬럼의 데이터들이 중복없는 유일성을 보장하는 인덱스라서 속도는 빠름


주의 - 나중에 중복되는 데이터가 들어올 수 없는 단점이 있기 때문에 잘 생각해서 사용해야 함


생성문법

CREATE UNIQUE INDEX 인덱스명

ON 테이블이름(컬럼명1 ASC|DESC, 컬럼명2,.....);

 

생성예제

CREATE UNIQUE INDEX IDX_DEPT2_DNAME

ON dept2(dname);


(2) NON-UNIQUE INDEX


중복되는 데이터가 들어가야 하는 컬럼일 경우에는 UNIQUE INDEX 를 생성할 수 없기 때문에

NON-UNIQUE INDEX 를 생성함


생성문법

CREATE INDEX 인덱스명

ON 테이블명(컬럼명1 ASC|DESC, 컬럼명2, ....);


생성예제

dept2 테이블의 area 컬럼에 NON UNIQUE INDEX 를 생성

CRAETE INDEX idx_dept2_area

ON dept2(area);



(3) FUNCTION BASED INDEX(FBI-함수기반 인덱스)


인덱스는 WHERE 절에 오는 조건에 컬럼이나 조인컬럼 등에 만들어야 함 *

(단 몇 가지 특별한 경우에 SELECT에 있는 컬럼에 생성하기도 함)


WHERE pay=1000이란 조건일 경우 pay 컬럼에 인덱스를 만들어야 함

pay 컬럼에 인덱스를 생성 후 위와 같이 사용하면 인덱스를 이용함 


WHERE pay + 1000 = 2000 의 조건 검색은 인덱스 이용 못 함 - 연산자를 사용하는 경우 

WHERE ename != 'FORD'; 인덱스 이용 못 함- NOT을 사용하는 경우

=> INDEX Suppressing Error : 인덱스는 잘 생성하고, SQL 를 잘못 작성해서 인덱스를 사용할 수 없는 경우

인덱스를 사용하려면 WHERE 절의 조건을 절대로 다른 형태로 가공해서 사용하면 안 됨



WHERE pay+1000 = 2000 을 인덱스를 사용하고 싶으면?

(pay+1000) 이 형태로 사용해 줌

이런 형태의 인덱스를 함수기반 인덱스라고 

pay+1000 이라는 컬럼이 없지만 함수처럼 연산을 해서 인덱스를 만들어준다는 의미


생성예제

CREATE INDEX idx_prof_pay_fbi

ON professor(pay+1000);


단점

pay+1000 이라는 컬럼이 생성됨, 오라클이 인덱스를 만들 때, 이 연산을 이용해 인덱스를 만들어 주기 때문

하지만! 임시적인 해결책임, pay+1000 의 조건이 변하면 인덱스도 다시 만들어줘야하는 단점이 있고

FBI는 기존 인덱스를 활용할 수 없음 


(4) DESCENDING INDEX( 내림차순 인덱스 )


여러 인덱스를 생성할 때 큰 값이 먼저오게, 내림차순 순으로 인덱스를 생성함


1000

999

998 

...

이런식으로 인덱스 생성


사용 

큰 값을 많이 조회하는 SQL에 사용하는 것이 좋음

예) 

계좌조회시 최근 날짜부터 나오게 하는 경우(최근 날짜가 큰 날짜)

매출 테이블의 상위 매장이나 사원을 보는 경우(매출이 큰 값을 먼저 조회하는 경우)


문제) 하나의 메뉴에 오름차순과 내림차순을 한꺼번에 조회할 경우는?

A 최근 날짜 부터 계좌조회  

B 예전 날짜 부터 계좌조회

인덱스를 오름차순, 내림차순으로 두번이나 만들면 (인덱스가 많으면) DML 성능에 악영향

해결 : 인덱스를 위나 아래에서 읽게 하는 힌트라는 방법을 제공

         힌트들을 이용해 튜닝에서는 정렬하지 않고, 정렬효과를 내고, 최소값과 최대값을 구하기도 함


(5) COMPOSITE INDEX ( 결합인덱스 )


인덱스를 생성할 때 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것


사용

SQL문장에서 WHERE 절의 조건 컬럼이 2개 이상이 AND로 연결되어 함께 사용되는 경우에 사용

아주 많이 사용되나 , 인덱스를 잘못 생성하게 되면 굉장히 나쁜 영향을 미침


예) emp 테이블에 100명의 인원 중 남자(M)은 50명, 여자(F) 50명

50명의 남자 중 이름이 'SMITH'인 사람이 단, 2명 있다고 가정


일반쿼리문

SELECT ename, sal

FROM emp

WHERE ename='SMITH'

AND sex='M';


결합인덱스 생성 구문 예

CREATE INDEX idx_emp_comp

ON emp(ename, sex); 이 부분이 위와 같음  WHERE ename='SMITH'

  AND sex='M';


해당 데이터를 찾을때 두 개의 컬럼을 동시에 만족하는 블록을 검색하겠다는 의미


같은 테이블에 같은 SQL이지만 결합 인덱스를 어떻게 생성하는가에 따라서 속도나 검사횟수가 완전히 달라질 수도 있음


ON emp(ename, sex) 100건의 성별 중 2건의 이름 찾은 후 성별검사 - 2건 출력

On emp(sex, ename)  100건의 성별 중 50건을 찾은 후 다시 이름을 검색해서 - 2건 출력


=> 첫번째 조건에서 최대한 많은 데이터를 걸러서 두번째 검사를 쉽게 만들어야 함


결합인덱스는 경우의 수도 많고, 고려해야할 사항이 많으므로, 아주 신중하게 고려하고 사용해야 함 





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

sql*plus autotrace 기능 활성화  (0) 2014.12.24
튜닝에 필요한 파일들  (0) 2014.12.22
인덱스 1  (0) 2014.12.19
현재 가진 계정이 소유하고 있는 테이블 목록  (0) 2014.12.17
redolog file 상태확인  (0) 2014.12.03
Posted by 성장하는yw
2014. 12. 19. 15:57

1. 인덱스란 ?


* 인덱스  

어떤 데이터가 어디에 있다라는 주소록의 개념

잘 활용하면 아주 빠르게 데이터를 찾을 수 있음

어떤 데이터의 주소는 어디다. 라는 식으로 

모든 데이터들의 주소록을 만들어 관리하는 기법

=> 

인덱스가 있으면 모든 블록을 다 읽지 않고, 원하는 데이터가 있는 블록 주소를 찾아내

그 블록만 메모리로 복사해 와서 작업이 빨리 끝남

어떤 데이터가 어디에 저장되어 있는지 알고 있기 때문에 데이터 조회,변경, 호출해야 할 때 아주 빠르게 작업 가능

BUT 인덱스 생성이나 관리를 잘못할 경우는 성능이 떨어지는 역효과가 발생하기도 함




* 쿼리 실행시 데이터 검색 과정

많이 사용되는 데이터는 데이터베이스 버퍼캐시에 캐싱해두고 

많이 사용하지 않는 데이터는 디스크에 저장했다가 

필요할 때 메모리로 복사해 와서 조회나 변경 작업등을 함



* Table full scan

사용자가 어떤 데이터를 찾을 때 

메모리에서 해당 데이터를 못찾을 경우 

파일에 가서 데이터를 찾아 메모리로 복사해와야 하는데 

하드디스크에 데이터가 너무 많을 경우(예 1억개)에는

해당 데이터가 어떤 블록이 들어 있는지 모른다면

모든 블록을 읽어서 확인함


2. 인덱스의 생성 원리


해당 테이블의 내용들을 모두 다 읽어 메모리로 가져옴

어떤 내용이 있는지 내용을 파악해서 목록만듬

인덱스를 만드는 동안 데이터가 변경되면 문제가 되므로

해당 데이터들이 변경되지 못하도록 조치한 후 PGA의 Sort area에서 정렬을 함

PGA 메모리가 부족하면 임시테이블스페이스(Temporary Tablespace)를 사용해서 정렬하게 됨

메모리에서 정렬과정이 끝난 데이터들은 인덱스를 저장하는 파일의 블록에 순서대로 기록함


인덱스 생성

전체 테이블 스캔 -> 정렬(sort) -> Block 기록

인덱스는 데이터가 정렬되어서 들어감 


3. 인덱스 구조와 작동원리(B-Tree  인덱스 기준)


인덱스는 key 칼럼와 rowid 칼럼으로 이루어짐

key 칼럼 : 인덱스를 생성하라고 지정한 컬럼 값

rowid 칼럼 : 데이터가 저장되어 있는 주소 




                             

실제 데이터 - Data file

인덱스 정보 - Index file 에 저장되어 있음


1 가장 먼저 메모리의 데이터베이스버퍼캐쉬에서 해당 데이터가 있는지 확인

2 인덱스 파일 찾는 순서는 트리구조의 오른쪽 상단그림 

root 9 - branch 7 - leaf 1 순으로 읽음 

3 인덱스에 있는 블록 데이터를 가지고 옴


경우에 따라 인덱스를 사용하지 않는 것이 성능에 더 좋을 수도 있음

여러건의 데이터를 조회할 경우 인덱스를 사용할 때는 한 번에 하나의 블록만 읽을 수 있음                 


single block I/O : 1번에 1개의 블록만 읽어서 메모리로 가져옴( db_block_size )

multi block I/O : 인덱스를 쓰지 않았을 경우에 한 번에 여러 블록을 가져오는 것 ( DB_FIEL_MUTLIBLOCK_COUNT ( MBRC ))






                          


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

sql*plus autotrace 기능 활성화  (0) 2014.12.24
튜닝에 필요한 파일들  (0) 2014.12.22
인덱스 2  (0) 2014.12.19
현재 가진 계정이 소유하고 있는 테이블 목록  (0) 2014.12.17
redolog file 상태확인  (0) 2014.12.03
Posted by 성장하는yw