[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;
❓롤(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
를 주면 된다 !
실습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 이란 ? 오라클의 특정 유저가 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 유출을 막기 위해 해야할 역할을 충실히 했다는 기본적인 일을 수행하려면 다음과 같이 작업을 해야한다 !
- 패스워드를 자주 변경해야 한다.
- 패스워드를 변경할 때는 문자, 숫자, 특수문자를 포함해서 생성을 해야 한다. 패스워드를 변경할 때 비밀번호가 반드시 문자,숫자,특수문자를 포함하도록 하는 함수 ➡️
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이면 패스워드 관리 프로파일 입니다!
✔️ 위의 함수를 default 프로파일에 적용을 하게되면 다음과 같은 제한을 받는다.
- 패스워드를 8자이상으로
- 유져이름을 거꾸로 해서 생성 못함,
유져이름에 숫자를 붙인 형태도 설정 못함- 데이터베이스 이름도 사용못함 ( connect scott/orcl2 )
- 최소 하나의 문자, 하나의 숫자, 하나의 특수문자를
넣어줘야 패스워드가 생성이 된다.
✔️ 패스워드를 엄격하게 관리하기 위한 함수 생성과 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에 있는 모든 테이블들을 다 볼 수 있습니다.
- 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;
- 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;
➡️ Lock 메커니즘과 Oracle의 데이터 동시성 관리 방법 설명
➡️ Lock 충돌 모니터 및 해결
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 할때는 락이 걸리지 않는다.
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> select SID, SERIAL#, USERNAME
from V$SESSION where SID in
(select BLOCKING_SESSION from V$SESSION)
SQL> alter system kill session '144,8982' immediate;
💡 아래를 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.
💡 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;
• DML 및 언두 데이터 생성 설명
• 언두 데이터 모니터 및 관리
• 언두 데이터와 리두 데이터의 차이점 설명
• 언두 Retention 구성
• 언두 Retention 보장
• Undo Advisor 사용
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로 복구
✅ 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 ;;
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;
$ 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%'
/