[문제] LISTENER PORT를 수정해주세요. 1522 -> 1523
<정적 서비스 등록>
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ORA19C)
(ORACLE_HOM = /u01/app/oracle/product/19.3.0/dbhome_1)
(GLOBAL_DBNAME = ORA19C)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1523))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
<동적 서비스 등록>
ALTER SYSTEM SET local_listener = '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle19c)(PORT=1523)))';
ALTER SYSTEM REGISTER;
ALTER SYSTEM SET local_listener = 'LISTENER_ORA19C';
ALTER SYSTEM REGISTER;
<출처 최홍일>


- 4번 작업은 server process가 parse, execute, sort, hash 작업등을 하기 위해 SGA영역을 이용해야 하기 때문에 일어난다. sort, hash 작업은 Large pool 안의 UGA를 이용한다.
- Dispatcher의 수많큼 Response Queue가 생겨난다.
show parameter dispatchers

ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(DISPATCHERS=5)'; ALTER SYSTEM SET max_dispatchers = 10;
show parameter shared_servers
instance 시작될때 생성할 server process 수 지정
ALTER SYSTEM SET shared_servers = 2;
최대로 생성되는 server process 수 지정
ALTER SYSTEM SET max_shared_servers = 10;
listener를 reload 실행
lsnrctl reload
listener의 service 확인
lsnrctl service

- dispatcher의 수를 5개로 설정하여 5개가 생성된걸 확인할 수 있다.

- shared server는 SERVER = DEDICATED 구문만 삭제해주면 된다.

SEECT * FROM v$dispatcher; : 생성된 dispatcher 수 확인
SELECT * FORM v$shared_server; : 생성된 server process 수 확인
ALTER SYSTEM SET shared_servers = 0; : shared_server의 수만 0으로 해줘도 해지가 가능하다
ALTER SYSTEM SET dispatchers = ''; : 다만 shared server가 해지 되었는데도 dispatcher가 있는건 보기 싫으니 빈칸 처리를 해줬다.
lsnrctl reload : 리스너 재시작
lsnrctl service

- 클라이언트쪽의 tns 파일을 따로 수정하지 않고 shared server로 접속해도 자동으로 dedicated 서버로 접속된다.
SELECT sid, serial#, username, blocking_session,event,sql_id, prev_sql_id
FROM v$session
WHERE event LIKE '%TX%';

SELECT sql_text FROM v$sql WHERE sql_id = '8suw0gu1fumpv';


SELECT * FROM v$session WHERE sid = 297;


SELECT sql_text FROM v$sql WHERE sql_id = '36ya1fd1x3pgm';

SELECT sid, type, id1, id2, lmode, request, block
FROM v$lock
WHERE sid IN (289,41)
AND TYPE IN ('TX','TM');

TYPE : TM
ID1 : OBJECT ID
TYPE : TX
ID1 : UNDO SEGMENT 번호 + TRANSACTION SLOT 번호
ID2 : TRANSACTION SLOT SEQUENCE 번호
SID : LOCK을 보유중이거나 요청 중인 SESSION ID
LMODE > 0 이면 LOCK을 보유중인 세션이고, REQUEST > 0 이면 LOCK 요청 중인 세션을 의미한다.
SELECT sid, type, id1, id2, lmode, request, block,
to_char(trunc(id1/power(2,16))) as UNDO_SEGMENT_NUMBER,
bitand(id1,to_number('ffff','xxxx'))+0 as TRANSACTION_SLOT_NUMBER,
id2 as TRANSACTION_SLOT_SEQUENCE_NUMBER
FROM v$lock
WHERE sid IN (289,41)
AND TYPE IN ('TX','TM');

SELECT * FROM dba_rollback_segs WHERE segment_id = 4;

SELECT sid, serial#, username, blocking_session,row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#
FROM v$session
WHERE event LIKE '%TX%';

row_wait_obj# : object ID
row_wait_file# : data file ID
row_wait_block# : block ID
row_wait_row# : ROW SLOT ID
SELECT
dbms_rowid.rowid_create(0,74084,3,66012,2) as "restricted rowid",
dbms_rowid.rowid_create(1,74084,3,66012,2) as "extended rowid"
FROM dual;

- 0번 옵션, 7i 버전때 사용하던 rowid, 6byte, #block.#rowslot.#file
- 1번옵션, 요즘 사용하는 rowid, 10byte, #data object id(6)#file(3)#block(6)#rowslot(3)
SELECT sid, serial#, username
FROM v$session
WHERE sid IN (SELECT blocking_session FROM v$session);

ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;