Mục đích:
Cập nhật bảng hoặc package Core của DB Core tránh ảnh hưởng nhất (kill ít nhất)
Thủ tục:
--Kiểm tra các session gọi vào (thường rất nhiều > 100-1000)
select distinct owner from gv$access where lower(object) like lower('%test_package%');
--1. Check số lượng package invalid
select 'ALTER '||OBJECT_TYPE||' '||OWNER||'.'||OBJECT_NAME||' COMPILE;' from dba_objects
where object_type in ('PROCEDURE','FUNCTION','TRIGGER','PACKAGE') and status like 'INVALID' and OWNER like 'TEST_OWNER'
UNION ALL
select 'ALTER PACKAGE '||OWNER||'.'||OBJECT_NAME||' COMPILE BODY;' from dba_objects
--2. Dùng SQL Navigator chạy câu lệnh cập nhật
- Nếu cập nhật bảng: Alter table <table_name> add c1 varchar2(20);
- Nếu cập nhật package: Cập nhật và ấn Ctrl + S để Save pacakge
Khi đó màn hình sẽ bị treo đơ, kệ nó
--3. Kill các session INACTIVE, ACTIVE theo từng instance: CHẠY CÓ THỂ LÂU
-- Nếu cập nhật bảng thì kill lock trên table
SELECT /*lock table*/ 'kill -9 ' || spid a, a.INST_ID,A.SQL_ID,A.SID, A.SERIAL#, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,BACKGROUND
FROM gv$session a, gv$process b
WHERE b.addr = a.paddr
AND a.inst_id=b.inst_id
--and b.inst_id=3
AND (b.inst_id, a.sid) in
(SELECT /*+ parallel(16)*/ s.inst_id,s.sid
FROM gv$locked_object v, dba_objects d,
gv$lock l, gv$session s
WHERE v.object_id = d.object_id
AND (v.object_id = l.id1)
AND v.session_id = s.sid
and object_name=upper('TEST_TABLE'))
--and type='USER'
--ORDER BY username, session_id;
and a.machine not like '%BINHTV%' ;
-- Nếu cập nhật thủ tục thì Kill truy cập vào procedure/function/package
SELECT /*object*/ 'kill -9 ' || spid a, a.INST_ID,A.SQL_ID,A.SID, A.SERIAL#, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,BACKGROUND
FROM gv$session a, gv$process b
WHERE b.addr = a.paddr
AND a.inst_id=b.inst_id
and b.inst_id=4
AND (b.inst_id, a.sid) in (
(select /*+ parallel(8) */ inst_id, sid from gv$access where object like '%TEST_PACKAGE%')
)
and type='USER'
and a.machine not like '%BINHTV%' ;
--4. Buil lại các Package invalid:
select 'ALTER '||OBJECT_TYPE||' '||OWNER||'.'||OBJECT_NAME||' COMPILE;' from dba_objects
where object_type in ('PROCEDURE','FUNCTION','TRIGGER','PACKAGE') and status like 'INVALID' and OWNER like 'TEST_OWNER'
UNION ALL
select 'ALTER PACKAGE '||OWNER||'.'||OBJECT_NAME||' COMPILE BODY;' from dba_objects
where object_type in ('PACKAGE BODY') and status like 'INVALID' and OWNER like 'TEST_OWNER'
Hy vọng hữu ích cho bạn.