728x90

oracledb 라이브러리

: python으로 Oracle DB에 연결해서 DB작업을 할 수 있도록 도와주는 라이브러리
!pip install oracledb   # oracledb 라이브러리 설치하기
import oracledb         # oracledb 라이브러리 임포트(불러오기)

1. 업무 DB에 연결

con = oracledb.connect(user="사용자이름", password="비밀번호", dsn="호스트이름:port/SID")   # DB에 연결 (호스트이름 대신 IP주소 가능)
cursor = con.cursor()   # 연결된 DB 지시자(커서) 생성
  • dsn(데이터베이스 소스 이름)
    • 호스트 이름 또는 IP 주소 부분이 localhost 일 경우: 자체 시스템, 즉 현재 시스템에 있는 작업 DB를 가리킴
    • 포트번호 : DB 서버의 기본 포트번호는 1521입니다.

2. DB작업

cursor.execute("SQL문장")       # DB 명령 실행 (cursor가 임시 보관)
out_data = cursor.fetchall()   # cursor가 임시 보관한 내용을 out_data에 저장 (결과는 리스트)
# out_data 내용 출력해보기
for record in ou_data :
	print(record)
  • 여러 개의 함수를 실행하고 후, fetchall()로 한 번에 생성 가능
    • fetchone: 하나님께
    • fetchall: 여러 개가 왔어요 (결과는리스트!)
  • 커서 내용을 저장하여 출력하고 select문처럼 데이터가 조회되는 경우에만(sql 실행 시 반환되는 결과만 있을 경우에만) 내용이 저장됨
  • 주의할 점 : DML 작업을 실행했을 경우, commit을 실행하여 DB에 적용하게 되었습니다!

3. DB 연결 휴가

con.close()   # DB 연결 해제

사용예시

con = oracledb.connect(user="system", password="oracle", dsn="localhost:1521/XEPDB1") # 데이터베이스에 연결
cursor = con.cursor() # 연결된 데이터베이스 지시자 생성

print('데이터베이스 연결 성공~!!!')

# 1. emp테이블의 내용 확인
cursor.execute("select * from emp") # 데이터베이스 명령 실행( cursor가 임시로 보관)
out_data = cursor.fetchall() # 커서의 내용을 out_data에 저장 
for record in out_data: # out_data의 내용을 출력
    print(record)
print('-'*50)

# 2. dept테이블에 2개의 레코드를 삽입 후 승인
cursor.execute("insert into dept values(50, 'DEVELOPER','LA')")
cursor.execute("insert into dept values(60, 'DEVELOPER','ATL')")
cursor.execute('commit') # sqldeveloper에 커밋
cursor.execute("select * from dept")
out_data2 = cursor.fetchall()
for record in out_data2:
    print(record)
print('-'*50)
    
# 3. dept 테이블에서 dname이 "DEVELOPER"인 레코드 삭제 후 승인
cursor.execute("delete from dept where dname = 'DEVELOPER'")
cursor.execute("commit")
cursor.execute("select * from dept")
out_data2 = cursor.fetchall()
for record in out_data2:
    print(record)
print('-'*50)

# 4. emp 테이블과 dept 테이블을 inner join 수행
cursor.execute("select e.empno, e.ename, e.mgr, d.deptno, d.dname from emp e, dept d where e.deptno = d.deptno")
out_data = cursor.fetchall()
for record in out_data:
    print(record)
print('-'*50)

# 5. dept테이블의 구조와 내용을 이용하여 dept_ddl 테이블을 생성하시오. (단, create와 select를 활용하시오.)
cursor.execute("create table dept_ddl as select * from dept")
cursor.execute("select * from dept_ddl")
out_data = cursor.fetchall()
for record in out_data:
    print(record)
print('-'*50)

con.close() # 데이터베이스 연결 해제
  • 결과 :
반응형
728x90

 일반
update 테이블명 set 필드명=값 where 조건절 ....

* join update

[Sysbase 다른테이블과의 조인 방법]
지금까지 사용해본 DB가 몇개가 되는지
1. ORACLE
2. MS-SQL
3. DB2
4. SYSBASE

ㅋㅋㅋ머 Database야 다 거기서 거기인듯하다.
오늘은 회사에서 사용하고 있는 Sysbase 에 대하여 다른테이블과의 조인방법에 대해서
서술하고 마칠려고 한다.

DataBase가 여러가지 이지만 조금씩 쓰는 방법이 달라 이렇게 기록하고 메모 해야 헤메지 않고 찾아 쓰지
어느 어플에 보면 그런말이 있다 기억은 기록을 이기지 못한다.완전 공감.


1. 다른테이틀 조인 방법
  update A
  set a1 = b.a1, a2 =b.a2
  from A, B
  where A.a = B.a
  위의 예제를 보면 set 다음에 from 절을 사용하면서 테이블간의 join 을 거는것을 볼 수 있다


 

 

반응형
728x90

-- 최대 동시 접속자 수

SELECT * FROM V$Resource_limit;
processes : 프로세스 갯수 (백그라운드 +dedicate process)

session : 동시접속 세션 수

current_utilization : 현재 접속 카운트

max_uitilization : 오라클을 시작한 이애로 최대 접속했을 때 피크 수

initial_allocation : init.ora 파라메터에서 설정한 수치

 

-- 현재 접속된 세션수와 전용서버 방식으로 연결한 세션수, 백그라운드 세션 수, active 세션 수를 알 수 있는 쿼리

SELECT Count(*) total_cnt, Count( DECODE( server, 'DEDICATED', 1, null)) dedicated_cnt,

Count( Decode (TYPE, 'BACKGROUND', 1, null)) back_cnt,

Count( DECODE( Status, 'ACTIVE', 1, NULL)) active_cnt

FROM V$SESSION;

 

오라클 모니터링 쿼리모음  

--1. Buffer Cache Hit Ratio

SELECT ROUND(((1-(SUM(DECODE(name, 'physical reads', value,0))/
(SUM(DECODE(name, 'db block gets', value,0))+
(SUM(DECODE(name, 'consistent gets', value, 0))))))*100),2) || '%' "Buffer Cache Hit Ratio"
FROM V$SYSSTAT;

--2. Library Cache Hit Ratio

SELECT (1-SUM (reloads)/SUM(pins))*100 "Library Cache Hit Ratio"
From V$LIBRARYCACHE;


--3. Data Dictionary Cache Hit Ratio

SELECT (1-SUM(getmisses)/SUM(gets))*100 "Data Dictionary Hit Ratio"
FROM V$ROWCACHE;

 

-- 테이블 스페이스 사용량

SELECT a.tablespace_name,
             a.total "Total(Mb)",
             a.total - b.free "Used(Mb)",
             nvl(b.free,0) "Free(Mb)",
             round((a.total - nvl(b.free,0))*100/total,0)  "Used(%)"
from    (   select     tablespace_name,
                            round((sum(bytes)/1024/1024),0) as total
               from       dba_data_files
               group by tablespace_name) a,
         (     select     tablespace_name,
                             round((sum(bytes)/1024/1024),0) as free
               from        dba_free_space
               group by  tablespace_name) b
where      a.tablespace_name = b.tablespace_name(+)
order by   a.tablespace_name;

 
--오라클서버의 메모리

select * from v$sgastat

select pool, sum(bytes) "SIZE"
from v$sgastat
where pool = 'shared pool'
group by pool



--cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기

select c.sql_text
,b.SID
, b.SERIAL#
,b.machine
,b.OSUSER
,b.logon_time --이 쿼리를 호출한 시간
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
--and a.spid = '675958'
order by c.PIECE

 
 
--cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기

select c.sql_text
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
and a.spid = '171'
order by c.PIECE



--프로세스 아이디를 이용하여 쿼리문 알아내기

select c.sql_text
,b.SID
, b.SERIAL#
,b.machine
,b.OSUSER
,b.logon_time --이 쿼리를 호출한 시간
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
and a.spid = '1708032' --1912870/
order by c.PIECE

  

--세션 죽이기(SID,SERAIL#)

--ALTER SYSTEM KILL SESSION '8,4093'

--오라클 세션과 관련된 테이블*/

--select count(*) from v$session where machine ='머신이름' and schemaname ='스키마이름'

 

--현재 커서 수 확인

SELECT sid, count(sid) cursor
FROM V$OPEN_CURSOR
WHERE user_name = 'ilips'
GROUP BY sid
ORDER BY cursor DESC

SELECT sql_text, count(sid) cnt
FROM v$OPEN_CURSOR
GROUP BY sql_text
ORDER BY cnt DESC

select * from v$session_wait

select sid, serial#, username, taddr, used_ublk, used_urec
 from v$transaction t, v$session s
 where t.addr = s.taddr;

select *  from sys.v_$open_cursor



--V$LOCK 을 사용한 잠금 경합 모니터링

SELECT s.username, s.sid, s.serial#, s.logon_time,
    DECODE(l.type, 'TM', 'TABLE LOCK',
          'TX', 'ROW LOCK',
       NULL) "LOCK LEVEL",
    o.owner, o.object_name, o.object_type
FROM v$session s, v$lock l, dba_objects o
WHERE s.sid = l.sid
AND o.object_id = l.id1
AND s.username IS NOT NULL

 

--락이 걸린 세션 자세히 알아보기

select a.sid, a.serial#,a.username,a.process,b.object_name,
decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK",
decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL",
decode(a.lockwait, NULL,'NO wait','Wait') "STATUS"
from v$session a,dba_objects b, v$lock c
where a.sid=c.sid and b.object_id=c.id1
and c.type='TM'

 

--락이 걸린 세션 간단히 알아보기

select a.sid, a.serial#, b.type, c.object_name, a.program, a.lockwait,
       a.logon_time, a.process, a.osuser, a.terminal
from v$session a, v$lock b, dba_objects c
where a.sid = b.sid
  and b.id1 = c.object_id
  and b.type = 'TM';

select a.sid, a.serial#, a.username, a.process, b.object_name
from v$session a , dba_objects b, v$lock c
where a.sid=c.sid and b.object_id = c.id1
and c.type = 'TM'

 
--락이 걸린 세션을 찾아 내어 세션을 죽이려고 해도 죽지 않는 경우
--아래 쿼리문으로 OS단의 PROCESS ID를 찾아내어 OS에서 죽인다
--kill -9 프로세스아이디

select substr(s.username,1,11) "ORACLE USER", p.pid "PROCESS ID",
s.sid "SESSION ID", s.serial#, osuser "OS USER",
p.spid "PROC SPID",s.process "SESS SPID", s.lockwait "LOCK WAIT"
from v$process p, v$session s, v$access a
where a.sid=s.sid and
p.addr=s.paddr and
s.username != 'SYS'

--위 쿼리문의 결과가 있다면 락이 걸린 세션이 있다는것이므로 아래의 쿼리문으로 세션을 죽인다

ALTER SYSTEM KILL SESSION '11,39061'

 

 

alter session으로 죽지않는 프로세스 죽이기

1.oracle이 설치된 서버에 텔넷으로 root로 접속한다
2.su -오라클계정
3.sqlplus '/as sysdba''
4.connect system/sys

5.ALTER SYSTEM KILL SESSION '137,1723' 

반응형
728x90

select name,value
from
v$pgastat
order by
value desc;

에서 일단 사이즈를 확인한다

반응형
728x90

SQL> alter system set pga_aggregate_target=20000000;
시스템이 변경되었습니다.
SQL> alter system set workarea_size_policy=AUTO;
시스템이 변경되었습니다.
SQL> show parameter pga;
NAME TYPE                                       VALUE
------------------------------------ -------------------------------- ------------------------------
pga_aggregate_target big integer           20000000


SQL> show parameter workarea
NAME TYPE                                      VALUE
------------------------------------ -------------------------------- ------------------------------
workarea_size_policy string                 AUTO


관련 뷰(View)
WORKAREA_SIZE_POLICY를 Auto로 사용할때 아래의 view가 유용할것이다.
1. V$SQL_WORKAREA
2. V$SQL_WORKAREA_ACTIVE
3. V$PROCESS contains new columns (PGA_USED_MEM, PGA_ALLOC_MEM AND PGA_MAX_MEM)
4. V$PGASTAT

Oracle 9.2 has also new views (see [NOTE:223730.1] for some explanation)
1. V$SQL_WORKAREA_HISTOGRAM
2. V$PGA_TARGET_ADVICE
3. V$PGA_TARGET_ADVICE_HISTOGRAM


v$pga_target_advice
 : PGA메모리 사용현황을 볼 수 있음
SQL> desc v$pga_target_advice
 이름                                                         널?         유형
 ----------------------------------------- -------- ----------------------------
 PGA_TARGET_FOR_ESTIMATE                                 NUMBER
 PGA_TARGET_FACTOR                                            NUMBER
 ADVICE_STATUS                                                     VARCHAR2(3)
 BYTES_PROCESSED                                               NUMBER
 ESTD_EXTRA_BYTES_RW                                        NUMBER
 ESTD_PGA_CACHE_HIT_PERCENTAGE                     NUMBER
 ESTD_OVERALLOC_COUNT                                     NUMBER 
v$pgastat : 모니터링 PGA_AGGREGATE_TARGET
SQL> SELECT * FROM V$PGASTAT;
NAME                                                    VALUE          UNIT
---------------------------------------- ------------ ------------
aggregate PGA target parameter                524,288,000 bytes
aggregate PGA auto target                       467,481,600 bytes
global memory bound                                26,214,400 bytes
total PGA inuse                                          4,714,496 bytes
total PGA allocated                                   16,799,744 bytes
maximum PGA allocated                            33,172,480 bytes
total freeable PGA memory                          1,114,112 bytes
PGA memory freed back to OS                  598,933,504 bytes
total PGA used for auto workareas                          0 bytes
maximum PGA used for auto workareas       12,239,872 bytes
total PGA used for manual workareas                      0 bytes
maximum PGA used for manual workareas               0 bytes
over allocation count                                             0
bytes processed                                ############ bytes
extra bytes read/written                                         0 bytes
cache hit percentage                                         100 percent
16 개의 행이 선택되었습니다.

반응형

'[개발] DataBase Tool SAP > 3. Oracle' 카테고리의 다른 글

[DBA] 데이터 품질 진단 - DQ  (0) 2021.10.28
오라클 쿼리모음  (0) 2021.10.18
ora-04030 에러 확인  (0) 2021.10.18
ORA-00257 :오라클 아카이브로그 오류  (0) 2021.10.18

+ Recent posts