كيف يمكنني قتل جميع الدورات الاتصال بي أوراكل قاعدة البيانات ؟
-
09-06-2019 - |
سؤال
أحتاج بسرعة (قسرا) لقتل جميع الدورات الخارجية الاتصال إلى قاعدة بيانات oracle دون إشراف من مدير البرنامج.
أنا لا أريد فقط أن قفل قاعدة البيانات والسماح للمستخدمين إنهاء بأمان.
كيف سيكون السيناريو ؟
المحلول
هذا الجواب يتأثر بشكل كبير محادثة هنا: http://www.tek-tips.com/viewthread.cfm?qid=1395151&page=3
ALTER SYSTEM ENABLE RESTRICTED SESSION;
begin
for x in (
select Sid, Serial#, machine, program
from v$session
where
machine <> 'MyDatabaseServerName'
) loop
execute immediate 'Alter System Kill Session '''|| x.Sid
|| ',' || x.Serial# || ''' IMMEDIATE';
end loop;
end;
أنا تخطي قتل الدورات التي تنشأ على خادم قاعدة البيانات لتجنب قتل أوراكل الاتصالات نفسها.
نصائح أخرى
كما SYS:
startup force;
وحشية ، ولكن أنيقة.
قبل أن يقتل دورات ، إذا كان ذلك ممكنا هل
ALTER SYSTEM ENABLE RESTRICTED SESSION;
وقف جلسات جديدة من الاتصال.
لقد تم استخدام شيء مثل هذا لفترة من الوقت لقتل جلساتي على خادم مشترك.السطر الأول من 'حيث' يمكن إزالتها قتل كل غير 'sys دورات:
BEGIN
FOR c IN (
SELECT s.sid, s.serial#
FROM v$session s
WHERE (s.Osuser = 'MyUser' or s.MACHINE = 'MyNtDomain\MyMachineName')
AND s.USERNAME <> 'SYS'
AND s.STATUS <> 'KILLED'
)
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' || c.serial# || '''';
END LOOP;
END;
إذا كنت ترغب في التوقف عن الجديد المستخدمين من الاتصال ، ولكن تسمح الحالي جلسات تستمر حتى أنها غير نشطة ، يمكنك وضع قاعدة البيانات في QUIESCE الوضع:
ALTER SYSTEM QUIESCE RESTRICTED;
من قاعدة بيانات أوراكل دليل المسؤول:
غير DBA جلسات العمل النشطة سوف تستمر حتى تصبح نشطة.نشط الدورة هي واحدة حاليا داخل الصفقة ، استعلام ، جلب أو PL/SQL البيان ؛ أو الدورة التي تحتجز حاليا أي الموارد المشتركة (على سبيل المثال ، enqueues).لا الخاملة الدورات يسمح تصبح نشطة مرة واحدة كل... غير DBA دورات تصبح خاملة ، تغيير نظام QUIESCE المحظورة بيان اكتمال قاعدة البيانات في quiesced الدولة
معلومات إضافية
المهم Oracle 11g التغييرات على تغيير دورة قتل الدورة
أوراكل المؤلف ملادن Gogala تلاحظ وجود علامة @ هو المطلوب الآن قتل الدورة عند استخدام inst_id العمود:
alter system kill session '130,620,@1';
محاولة الزناد على تسجيل الدخول
بدلا من محاولة قطع اتصال المستخدمين يجب أن لا تسمح لها بالاتصال.
هناك مثال على هذا الزناد.
CREATE OR REPLACE TRIGGER rds_logon_trigger
AFTER LOGON ON DATABASE
BEGIN
IF SYS_CONTEXT('USERENV','IP_ADDRESS') not in ('192.168.2.121','192.168.2.123','192.168.2.233') THEN
RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
END IF;
IF (to_number(to_char(sysdate,'HH24'))< 6) and (to_number(to_char(sysdate,'HH24')) >18) THEN
RAISE_APPLICATION_ERROR(-20005,'Logon only allowed during business hours');
END IF;
END;
لقد وجدت أدناه مقتطف مفيدة.مأخوذة من: http://jeromeblog-jerome.blogspot.com/2007/10/how-to-unlock-record-on-oracle.html
select
owner||'.'||object_name obj ,
oracle_username||' ('||s.status||')' oruser ,
os_user_name osuser ,
machine computer ,
l.process unix ,
s.sid||','||s.serial# ss ,
r.name rs ,
to_char(s.logon_time,'yyyy/mm/dd hh24:mi:ss') time
from v$locked_object l ,
dba_objects o ,
v$session s ,
v$transaction t ,
v$rollname r
where l.object_id = o.object_id
and s.sid=l.session_id
and s.taddr=t.addr
and t.xidusn=r.usn
order by osuser, ss, obj
;
ثم ركض:
Alter System Kill Session '<value from ss above>'
;
قتل الجلسات الفردية.
للإجابة على السؤال المطروح ، هنا هو الأكثر دقة SQL لإنجاز المهمة ، يمكنك الجمع بين ذلك مع PL/SQL حلقة في الواقع تشغيل قتل البيانات:
select ses.USERNAME,
substr(MACHINE,1,10) as MACHINE,
substr(module,1,25) as module,
status,
'alter system kill session '''||SID||','||ses.SERIAL#||''';' as kill
from v$session ses LEFT OUTER JOIN v$process p ON (ses.paddr=p.addr)
where schemaname <> 'SYS'
and not exists
(select 1
from DBA_ROLE_PRIVS
where GRANTED_ROLE='DBA'
and schemaname=grantee)
and machine!='yourlocalhostname'
order by LAST_CALL_ET desc;
إذا أوراكل يعمل في يونكس /لينكس ثم يمكننا أن البقرى كافة اتصالات العميل و قتله
grep كل عميل أوراكل العملية:
ps-ef | grep المحلية=لا | grep -v grep | awk '{print $2}' | wc-l
قتل كل عميل أوراكل العملية :
قتل -9 ps -ef | grep LOCAL=NO | grep -v grep | awk '{print $2}'