كيف يمكنني قتل جميع الدورات الاتصال بي أوراكل قاعدة البيانات ؟

StackOverflow https://stackoverflow.com/questions/55342

سؤال

أحتاج بسرعة (قسرا) لقتل جميع الدورات الخارجية الاتصال إلى قاعدة بيانات 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';

http://www.dba-oracle.com/tips_killing_oracle_sessions.htm

محاولة الزناد على تسجيل الدخول

بدلا من محاولة قطع اتصال المستخدمين يجب أن لا تسمح لها بالاتصال.

هناك مثال على هذا الزناد.

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}'

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top