[오라클 DB관리]23.09.21

망구씨·2023년 9월 21일
0

오라클DB관리

목록 보기
12/19
post-thumbnail
  • 수업 시작 전 백업 진행했음 (왜했더라..오라클 파일 깨져도 이거 백업되어있으면..!)
[orcl:~]$ rman target / nocatalog

Recovery Manager: Release 11.2.0.1.0 - Production on Thu Sep 21 09:42:48 2023
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (DBID=1324638472)
using target database control file instead of recovery catalog

RMAN> backup database;

롤 생성(p.8-20)

❓롤(role): 권한의 집합

✔️ dba가 개발자 계정에 유저를 생성하고 권한을 주어야한다면 다음과 같이 하면 됨!

create user king3 identified by tiger;
grant connect , resource to king3;

💡 만약 롤을 사용하지 않고 권한을 줘야했다면 -> 다 하나씩 일일이 넣어주어야 한다.

grant create session to king3;
grant create cluster to king3;
grant create indextype to king3;
grant create operator to king3;
             .
             .
             .

유저를 생성했는데 어떠한 시스템 권한을 줘야할지 모르겠다면 이렇게 주자.

grant connect , resource to 유저명;

실습1. connect라는 롤에 부여된 권한이 무엇인지 확인

SYS> select *
      from role_sys_privs
      where role='CONNECT';

ROLE                           PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
CONNECT                        CREATE SESSION                           NO
      

✅ create session권한은 접속을 할 수 있는 권한!

실습2. resource 라는 롤에는 어떠한 시스템 권한이 있는지 확인하기

SYS> select *
      from role_sys_privs
      where role='RESOURCE';
 
ROLE                           PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE TABLE                             NO
RESOURCE                       CREATE INDEXTYPE                         NO
     

실습3. DBA라는 롤에는 어떠한 시스템 권한이 있는지 확인

SYS> select *
      from role_sys_privs
      where role='DBA';

✅ 202개의 DB의 모든 시스템권한이 부여되어있다.

관련문제 우리회사에 외부 엔지니어가 와서 DB 유저를 하나 만들어달라고 했고, 그 유저가 data dictionary 를 볼 수 있게 해달라고 요청하면 어떻게 해야 하는가 ?

SYS> create user maxguage
      identified by maxguage1234;

SYS> grant connect, resource to maxguage;

SYS> grant select_catalog_role to maxguage;

select_catalog_role를 주면 된다 !

ROLE 생성

실습1. SQL명령어로 ROLE생성하고 권한을 롤에게 부여합니다.

SYS> create role role1;

Role created.

SYS> grant create table, create view to role1;

Grant succeeded.

--유저생성
SYS> create user jones identified by tiger;
SYS> grant connect, resource to jones;

SYS> grant role1 to jones;  -- jones 는 role1 을 통해 create table,
                            -- create view 권한을 받는다.
Grant succeeded.

SYS> connect jones/tiger;
Connected.
JONES> select * from session_privs;

PRIVILEGE
----------------------------------------
..
CREATE TABLE
CREATE VIEW

🤔 현재 내가 가지고 있는 role이 어떤것이 있는지 확인

JONES> select * from session_roles;

ROLE
------------------------------
CONNECT
RESOURCE
ROLE1

문제 shinhan_user2라는 유저를 생성하고 이 유저에게 connect, resource role을 부여하고 모든 데이터 딕셔너리를 볼 수 있는 롤을 부여하기

SYS> create user shinhan_user2 identified by tiger;
SYS> grant connect, resource to shinhan_user2;
SYS> grant select_catalog_role to shinhan_user2;

✔️ 내 권한, 롤 어떤거 있는지 확인

SHINHAN_USER2 @ orcl > select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SELECT ANY DICTIONARY

SHINHAN_USER2 @ orcl > select * from session_roles;

ROLE
------------------------------
CONNECT
RESOURCE
SELECT_CATALOG_ROLE
HS_ADMIN_SELECT_ROLE

프로파일(profile)

💡Profile 이란 ? 오라클의 특정 유저가 DB 의 리소스를 제한없이 사용하는 것을 막는 기능

✔️ Profile 로 관리할 수 있는 기능 2가지 ?

1. 리소스(Resource) 관리 (리소스 소비 제어)
       ~> resource_limit 파라미터에 영향을 받는다.

2. 패스워드(Password) 관리 (계정 상태 및 암호 만료 관리)
       ~> resource_limit 파라미터에 영향을 받지 않는다.

만약 누가 악성 sql을 날리면 그사람때문에 다른사람들이 아무것도 못한다. 데이터베이스의 자원을 무한으로 쓰지 못하고 제한적으로 사용할 수 있도록 관리하는 것.

실습1. resource_limit 파라미터의 설정값을 확인해보기

SYS> show parameter resource_limit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_limit                       boolean     FALSE

실습2. ☞ 악성 SQL 이 수행되지 못하도록 default profile 을 변경하는 방법

logical_reads_per_call 로 제한하는 블럭 개수 조정한 후, resource_limit 을 true 로 설정한다.

SYS> alter profile default limit
      logical_reads_per_call 50;

SYS> alter user sh account unlock;
SYS> alter user sh identified by sh;
SYS> alter system set resource_limit=true;
SYS> connect sh/sh
SH> select count(*)
     from sales a, sales b, sales c; 

SCOTT @ orcl > set autot on
SCOTT @ orcl > select * from dept;


✅ disk에서 읽은게 physical reads, instance(memory)에서 읽은게 로지컬리드이다. logical read는 consistent gets,db block gets 앞에 숫자가 적게나온것이 좋은거다. 22 버퍼를 읽은것 ! SQL튜닝을 할 때 이거 숫자가 적게나오는 것을 기준으로 한다.
💡 여기서 logical_reads를 제한하고싶다면 아래처럼 하는것이다 !

SYS> alter profile default limit
      logical_reads_per_call 50;

SYS> alter system set resource_limit=true;

문제 위에서 다시 악성 SQL이 돌아갈 수 있도록 resource_limit=false 해보기

SYS> alter system set resource_limit=false;
SYS> connect sh/sh
SH> select count(*)
     from sales a, sales b, sales c; 

패스워드 관리 실습

💡 data유출을 막기 위해 또는 data 유출을 막기 위해 해야할 역할을 충실히 했다는 기본적인 일을 수행하려면 다음과 같이 작업을 해야한다 !

패스워드 관리

  1. 패스워드를 자주 변경해야 한다.
  2. 패스워드를 변경할 때는 문자, 숫자, 특수문자를 포함해서 생성을 해야 한다. 패스워드를 변경할 때 비밀번호가 반드시 문자,숫자,특수문자를 포함하도록 하는 함수 ➡️ verify_function_11g
    ✅ 함수를 생성하고 프로파일에 적용하면 패스워드 변경시 제약을 받는다!
-- 패스워드 변경하기
SYS> alter user scott
  2    identified by oracle_4U;

✔️ 패스워드를 3번 틀리면 오라클 접속 못하게 락을 걸도록 default profile 변경하는 방법

로그인 시도를 하여 3번 실패하면, 30일동안 lock 걸기

SYS> alter profile default limit
     failed_login_attempts 3
     password_lock_time 30;  --> 일 단위

Profile altered. 
-- 테스트 : 비밀번호를 잘못 입력하여 로그인 3번 실패하기

[orcl:~]$ sqlplus scott

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jul 1 14:10:30 2015
Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Enter password:
ERROR:
ORA-01017: invalid username/password; logon denied

Enter user-name: scott
Enter password:
ERROR:
ORA-01017: invalid username/password; logon denied

Enter user-name: scott
Enter password:
ERROR:
ORA-28000: the account is locked

SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

[orcl:~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jul 1 14:12:47 2015

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

ERROR:
ORA-28000: the account is locked

✔️ 로그인에 3번 실패하여 잠겨버린 scott 계정 lock 풀어주기

SYS> alter user scott
      account unlock;

User altered.

-- 테스트
[orcl:~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 21 11:12:38 2023

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

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

✔️ DB 의 유저들에게 할당된 프로파일 확인하기

SYS> select username, profile
      from dba_users;

✅ 모든 유저들이 전부 디폴트 프로파일에 영양하에 있기 때문에, default 프로파일을 변경(alter)해서 악성 SQL 못돌리게 할 수 있고 패스워드 3번 틀리면 잠기게 할 수 있다.

문제 default 프로파일에 설정되어져 있는 파라미터들을 확인하기

select * from dba_profiles
 order by profile;

관련 문제 세션이 접속하고 20초동안 아무런 작업을 안하고 있으면, 접속을 그냥 끊어버리게 default profile을 변경하고, scott으로 접속해서 1분동안 아무작업도 하지 않으면 정말로 끊기는지 확인하기

SYS> alter profile default limit
      IDLE_TIME 1; --분단위

SYS> alter system set resource_limit=true;
-----------------------------------------------
SCOTT @ orcl > select * from emp;
select * from emp
*
ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again

관련 문제 다시 default profile의 IDLE_TIME을 unlimited로 변경하기

SYS> alter profile default limit
      IDLE_TIME unlimited; 

관련 문제 프로파일에는 2가지 유형이 있는데 자원관리와 패스워드 관리이다. 자원관리는 resource_limit 파라미터에 영향을 받고, 패스워드 관리는 resource_limit 파라미터에 영향을 받지 않는다. 그러면 어떤 프로파일이 자원관리이고 어떤 프로파일이 패스워드 관리인지 구분하는 방법이 무엇일까? ➡️ sqldeveloper에서 조회

select * from dba_profiles where profile='DEFAULT';


✅ resource_type 컬럼의 값이 kernel이면 자원관리 프로파일이고, password이면 패스워드 관리 프로파일 입니다!

오라클에서 제공된 암호 변경을 강제로 제어하는 함수 (p8-30)

✔️ 위의 함수를 default 프로파일에 적용을 하게되면 다음과 같은 제한을 받는다.

  1. 패스워드를 8자이상으로
  2. 유져이름을 거꾸로 해서 생성 못함,
    유져이름에 숫자를 붙인 형태도 설정 못함
  3. 데이터베이스 이름도 사용못함 ( connect scott/orcl2 )
  4. 최소 하나의 문자, 하나의 숫자, 하나의 특수문자를
    넣어줘야 패스워드가 생성이 된다.

✔️ 패스워드를 엄격하게 관리하기 위한 함수 생성과 default 프로파일에 적용하는 명령어

 SQL> @?/rdbms/admin/utlpwdmg.sql 
       ↑ 
    오라클 홈디렉토리 

 SQL> ed ?/rdbms/admin/utlpwdmg.sql

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180    --- 180일동안 현재 패스워드 사용가능
PASSWORD_GRACE_TIME 7 -- 패스워드 만료시 유예기간 7일 
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_VERIFY_FUNCTION verify_function_11G;

관련문제 SCOTT의 패스워드를 다른 패스워드로 변경해보기

alter user scott identified by welcom;

SYS @ orcl > alter user scott identified by welcom;
alter user scott identified by welcom
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20001: Password length less than 8

alter user scott identified by scott_4U;

관련문제 다시 패스워드를 만들 때 영향을 받지 않도록 원래대로 돌려놓기

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME UNLIMITED   
PASSWORD_GRACE_TIME UNLIMITED 
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION null;

관련문제 다시 스캇의 패스워드를 tiger로 변경하기

SYS @ orcl > alter user scott identified by tiger;
User altered.

유저에게 할당량 할당

💡 잘못 코딩한 프로그램에 의해 디스크가 full이 되는 현상을 예방하기 위한 기능입니다.

실습1. scott20 유저를 생성하는데 users 테이블 스페이스를 default tablespace로 해서 생성하시오

SYS> create user scott20 identified by tiger
      default tablespace users;
SYS> grant connect, resource to scott20;    
SYS> connect scott20/tiger

실습2. scott계정에서 emp300테이블 생성하기

SCOTT> create table emp300
 (empno number(10),
  ename varchar2(20) )
 tablespace users;

실습3. scott20 유저의 users테이블 스페이스의 쿼터를 20m로 제한합니다.

SYS> alter user scott20
      Quota 20m on users;

문제1. scott20유저의 users테이블 스페이스의 쿼터를 0m로 제한해보기

SYS> alter user scott20
      Quota 0m on users;

문제2. scott20으로 접속해서 emp300테이블에 데이터를 입력하면 잘 입력되는지, 에러가 나는지 확인해보기

insert into emp300 values(5,'sss');
insert into emp300 
       select * from emp300;

❓ 왜 데이터가 입력이 되는가??????
: 테이블 스페이스 사용에 대한 Quota에 제한을 두려면 unlimited tablespace 권한을 취소해야합니다.

SCOTT20 @ orcl > select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE -- 요거 !!
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SELECT ANY DICTIONARY
SYS> revoke unlimited tablespace from scott20;

SCOTT> create table emp400
         (empno number(10),
         ename varchar2(20) )
         tablespace users;
        
SCOTT> insert into emp400 values(5,'sss');         
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'        

⭐ 테이블 스페이스 사용량의 쿼터를 제한할거면 해당 유저의 system권한 중 UNLIMITED TABLESPACE 권한을 취소해야합니다.

최소 권한의 원칙 적용

💡 데이터 보호를 위해서 db 유저들에 대한 권한 부여를 최소화 해야함

select any table 라는 시스템 권한이 있다. 보통 select로 시작하는 권한은 객체권한들인데 system권한중에 유일하게 select하는 권한인 select any table은 시스템 권한입니다. select any table 권한을 받으면 db에 있는 모든 테이블들을 다 볼 수 있습니다.

실습

  1. sys유저에서 scott30유저를 생성하고 connect, resource를 부여하고 select any table권한도 부여하기
SYS> create user scott30 identified by tiger;
SYS> grant connect, resource to scott30;
SYS> grant select any table to scott30;
  1. LG 유플러스의 테이블 이름 조회하기
SCOTT30 > select table_name from dba_tables;

✅ dba_tables;가 조회만 되면 LG유플러스의 모든 테이블명들을 알 수 있어서 고객 데이터를 유출할 수 있는 가능성이 높아진다. select any table권한을 주었다 하더라도 dba_tables와 같은 딕셔너리 만큼은 못보게 막아야한다.

문제 O7_DICTIONARY_ACCESSIBILITY=FALSE 파라미터에 대한 실습을 다음과 같이 진행하기

⭐파라미터 파일 변경전에 이거 확인하기 !!!

SYS > select name, issys_modifiable
         from v$parameter
         where name like '%O7%'; 

NAME                 ISSYS_MOD
-------------------- ---------
O7_DICTIONARY_ACCESS FALSE --false여서 db 내렸다 올려야한다. 
IBILITY         
SYS> ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY=false scope=spfile;
SYS> startup force

SCOTT30 @ orcl > select table_name from dba_tables;
ERROR:
ORA-03114: not connected to ORACLE
revoke select any dictionary from public;

📖 9장. 데이터 동시성 관리

➡️ Lock 메커니즘과 Oracle의 데이터 동시성 관리 방법 설명
➡️ Lock 충돌 모니터 및 해결

Lock

update시 걸리는 락 2가지 (p.9-7)

update emp                  1. scott의 행에는 TX락 (Transaction Exclusive)
  set sal=0                                                   독점적인!
  where ename='SCOTT';      2. emp 테이블에 TM락 (Table Lock)

❓ 행에는 락을 거는것을 배웠는데 우리는 emp 테이블에 TM락이 걸리는 것을 몰랐다. 이거는 왜거는걸까?? -> 이것은 공유할 수 있는 락이다. 여러 유저들의 shared 하는 락이다.

update emp                  1. scott의 행에는 TX락 (Transaction Exclusive)
  set sal=0                                                   독점적인!
  where ename='SMITH';      2. emp 테이블에 TM락 (Table Lock)

왜??? 왜 위에서 emp테이블에 락을걸까
실습 scott세션을 2개 열고 한쪽에서 먼저 emp테이블을 update하고 다른 scott세션에서는 emp table을 drop해보기

SCOTT @ orcl > update emp
  2  set sal=0
  3  where ename='SCOTT';

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

SCOTT @ orcl > drop table emp;
drop table emp
           *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

✅ 이렇게 테이블 drop이 안되는 이유는 앞의 먼저 수행한 update문이 테이블에 TM을 걸었기 때문이다!

실습2. sh계정으로 접속해서 한쪽에서는 select * from sales; 다른 터미널의 sh계정에서 drop table sales;를 해보기

select * from sales; 
하고 얘가 다 조회되기 전에 
drop table emp; 하면 drop된다. 

💡 select 할때는 락이 걸리지 않는다.

enqueue 메커니즘(p.9-8)

scott A session            scott B session            scott C session

1. update emp               2. update emp               3. update emp 
    set sal = 5000              set sal = 0                 set sal = 0
    where ename='SCOTT';        where ename='SCOTT';        where ename='SCOTT';

✅ 이 경우 두번째인 B, 세번째인 C가 차례대로 Queue 메모리에 들어간다. A session에서 commit;을 해준다면 첫번째에 있던 B가 빠져나오고 B가 lock을 잡는다.(scott행에 대한 독점적인 락을 건다.) B가 commit;을 해주어야 C가 빠져나오는데, 이것을 선입선출 이라고 한다.

실습1. 위와 같은 상황을 연출하고 sqldeveloper로 현재 벌어지고 있는 lock 상황을 확인하기

update emp                           
    set sal = 5000                             
    where ename='SCOTT'; -- A에서

update emp                           
    set sal = 0                             
    where ename='SCOTT'; -- B에서

update emp                           
    set sal = 0                             
    where ename='SCOTT'; -- C에서

✅ 예전에 우리가 만들었던 lock, waiting 하는 세션 찾는 쿼리 써도 되지만 툴로 보는것이 더 편하다

-> 24번이 홀더니까, 세션종료 시켜본다.

그냥 나 혼자 참고

SYS> SELECT table_name
FROM dba_tables
where owner='HR';

HR> SELECT table_name
FROM user_tables;

SQL을 사용하여 락 충돌 해결하는법(p.9-13)

SQL> select SID, SERIAL#, USERNAME
from V$SESSION where SID in
(select BLOCKING_SESSION from V$SESSION)

SQL> alter system kill session '144,8982' immediate;

lock kill시키는 프로시저

💡 아래를 sys에서 만들어보자

set serveroutput on

create or replace procedure final
is
  lquery varchar2(200) := '';
begin
for rec in ( select sid, serial#, username
               from v$session
               where sid in ( select blocking_session from v$session ) ) loop

lquery := 'alter system kill session ' || '''' || rec.sid || ',' || rec.serial# || '''' || ' immediate';

dbms_output.put_line(lquery);
EXECUTE IMMEDIATE lquery;

  END LOOP;
END;
/

in 안에 원래 커서이름 쓰는데 지금 쿼리문을 썼고 얘가 rec라는 레코드변수안으로 들어간다.
싱글 4개는 싱글 하나를 써야해서. EXECUTE IMMEDIATE를 이용하면 lquery안에있는 sql문을 실행할 수 있다.
✍🏻 위 프로시저를 수행해보자! - lock이 걸린 환경에서 수행해야함.

SYS @ orcl > exec final;
alter system kill session '24,278' immediate

PL/SQL procedure successfully completed.

Dead lock (p.9-14)

💡 alert log file에 보이는 락이다.

Dead lock 상황

scott A session                      scott B session           

1. update emp                         2. update emp               
    set sal = 9000                        set sal = 0              
    where ename='ALLEN';                  where ename='KING';       
  
   
3. update emp                         4. update emp  
    set deptno = 10                       set deptno = 20 
    where ename='KING';                   where ename='ALLEN'; 

update emp
set sal = 9000
where ename='ALLEN';

update emp
set sal = 0
where ename='KING';

update emp
set deptno = 10
where ename='KING';

update emp
set deptno = 20
where ename='ALLEN';

ORA-00060: deadlock detected shile waiting for resource
이 메세지를 본 사람은 바로 commit;이나 롤백을 해야한다. 그래야 다른 유저가 락이 풀리게 됩니다. 위와 같은 일이 자주 발생하면, 같은 테이블에 대해 변경하는 작업을 오라클 사용자들이 시간을 나눠서 해야할 필요가 있다.

  • 하위 레벨 lock은 행에 거는 exclusive 락입니다.
update emp
 set sal=0
 where ename='KING';
  • 상위 레벨 lock은 테이블에 거는 exclusive 락입니다.
lock table emp in exclusive mode;

📖10장. undo data 관리

• DML 및 언두 데이터 생성 설명
• 언두 데이터 모니터 및 관리
• 언두 데이터와 리두 데이터의 차이점 설명
• 언두 Retention 구성
• 언두 Retention 보장
• Undo Advisor 사용

undo data란?

SCOTT의 A session
king의 월급은 5000이다!

update emp
 set sal = 0
 where ename='KING';

✅ 5000이 undo data입니다. undo segment안에 5000이 들어가있다. commit할때까지는 이 데이터를 계속 가지고있다.
롤백작업이 가능함

SCOTT의 B session - 여기서 king의 월급은 무엇으로 보일까?

select ename, sal
  from emp
  where ename='KING';

✅ 5000으로 보인다. 왜냐하면 A session에서 commit;을 해주지 않았기 때문. 이거 undo segment에 5000이 있기때문에 5000을 볼 수 있다. 이것이 읽기 일관성 보장

flashback table  ---> undo data로 복구
flashback drop   ---> 휴지통에서 복구
flashback query  ---> undo data로 복구
flashback version query  
---> undo data로 복구
flashback transaction query  ---> undo data로 복구

트랜잭션 및 언두 데이터 (p.10-5)


✅ sql 있을 때 버퍼캐시에서 찾아보고 있으면 0으로 바로 바꾸고 없으면 디스크에서 가져온다 . 근데 0으로 바꾸기 전에 옆에다가 5000을 써놓는다 . 이것이 cr buffer!
A, B세션이 있다고 가정했을 때 A가 먼저 5000 -> 0 으로 업데이트를 하고 커밋을 하지 않았다면 A는 더티버퍼를 봐서 0으로 조회되고 B는 cr buffer를 읽어서 5000이 조회된다.(읽기 일관성)
✅ 커밋을 안했다는 정보를 lgwr이 redo log file에 내려썼을것이다.
✅ dbwr가 더티버퍼(월급0)을 유저테이버스페이스에 내려쓰고 cr buffer에 있는 내용은(월급5000) undo tablespace에 내려쓴다. -> 더티버퍼가 free buffer가 된다.
?: 롤백하면 undo tablespace에서 가져오는건지 redo log file에서 가져오는건지?
?: celan buffer는 뭔지

💡 정리해보면
update문이 발생하면 해당 데이터가 메모리에 있는지 확인하고 메모리에서 변경을 합니다. 그래서 위와 같이 KING의 데이터의 경우 5000을 CR buffer에 적고 data buffer를 업데이트 합니다. 그러면 data buffer는 더티버퍼가 됩니다. 그리고 DBWR에 의해 이 버퍼들이 data file에 내려써지게 되는데 dirty buffer의 데이터는 users table space의 data block에 내려써지게 되고, cr buffer는 undo table space에 UNDO SEGMENT에 내려써지게 됩니다.


오늘의 마지막 문제 dba.sh 스크립트에 lock, holder session 죽이는 프로시저를 실행하는 스크립트를 추가하시오 !

12) sqlplus "/as sysdba" @/home/oracle/kill/sql ;;

  1. kill.sql만들기 (sys계정에서)
SYS> ed kill.sql

set serveroutput on

create or replace procedure final
is
  lquery varchar2(200) := '';
begin
for rec in ( select sid, serial#, username
               from v$session
               where sid in ( select blocking_session from v$session ) ) loop

lquery := 'alter system kill session ' || '''' || rec.sid || ',' || rec.serial# || '''' || ' immediate';

dbms_output.put_line(lquery);
EXECUTE IMMEDIATE lquery;

  END LOOP;
END;
/

exec final;
  1. 스크립트에 넣기
$ vi dba.sh 

# /bin/bash
echo -e "

   aaa   a   aa   aaa    aaa  a   aaaa
  a   a  a aa    a   a  a     a  a    a
  a   a  aa          a  a     a  aaaaaa
  a   a  a       aaaaa  a     a  a
  a   a  a       a   a  a     a  a
   aaa   a        aaa    aaa  a   aaaa
"
echo -e "======================="
echo "                     "
echo " [1] 테이블 스페이스 공간 확인 "
echo " [2] 디스크 i/o 확인하는 sar 명령어 수행 "
echo " [3] 현재 데이터베이스 이슈 확인 "
echo " [4] 테이블 스페이스 공간 확보(80% 이상) "
echo " [5] 현재 오라클 메모리 상태 확인 "
echo " [6] 체크포인트를 수동으로 일으키기 "
echo " [7] 아카이브 로그 파일의 디스크 용량을 확인하기"
echo " [8] 컨트롤 파일 백업 텍스트 생성하기"
echo " [9] alert log file을 실시간 모니터링 하기"
echo " [10] lock holder 와 lock waiter 찾기"
echo " [11] scott 유저가 가지고 있는 테이블 생성하기"
echo " [12] lock holder 세션 죽이는 프로시저를 실행하기"

echo -n "원하는 작업 선택"
read aa
echo "                     "
case $aa in
 1) sh /home/oracle/t.sh;;
 2) sh /home/oracle/sar.sh;;
 3) sh /home/oracle/o.sh;;
 4) sh /home/oracle/add_t.sh;;
 5) sqlplus scott/tiger @/home/oracle/sga.sql ;;
 6) sqlplus scott/tiger @/home/oracle/ckpt.sql ;;
 7) sqlplus "/as sysdba" @/home/oracle/fra_space.sql ;;
 8) sqlplus "/as sysdba" @/home/oracle/c.sql ;;
 9) sh /home/oracle/testlog.sh ;;
 10) sqlplus "/as sysdba" @/home/oracle/lock.sql ;;
 11) sh /home/oracle/table.sh ;;
 12) sqlplus "/as sysdba" @/home/oracle/kill.sql ;;
esac
echo "                     "

@para.sql만들기

col name for a30

select  name, issys_modifiable
       from  v$parameter
       where  name  like '%&name%'
/
profile
Slow and steady wins the race.

0개의 댓글