Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk memadam kunci oracle (analisis ringkas kaedah)

Bagaimana untuk memadam kunci oracle (analisis ringkas kaedah)

PHPz
PHPzasal
2023-04-04 09:17:411744semak imbas

Dalam pengurusan pangkalan data Oracle, mengunci adalah fenomena biasa Apabila objek pangkalan data digunakan, sistem Oracle menandakan objek sebagai "dikunci" untuk memastikan orang tidak menukar atau memadam objek secara tidak sengaja. Walau bagaimanapun, kadangkala kunci ini boleh menghalang program atau pengguna lain daripada berfungsi dengan betul, dan kunci itu perlu dialih keluar.

Bagaimana untuk membuang kunci Oracle?

1. Semak status penguncian:

Anda boleh menyemak status penguncian semasa pangkalan data Oracle melalui skrip berikut:

SELECT
   c.owner,c.object_name,c.object_type, b.sid, b.serial#, b.status, b.osuser, b.machine
FROM
   v$locked_object a ,all_objects c ,v$session b
WHERE
   b.sid = a.session_id AND a.object_id = c.object_id;

Anda boleh mengetahui semua semasa status mengunci melalui hasil pertanyaan skrip di atas Objek terkunci dan maklumat sesi yang mengunci objek boleh digunakan untuk menentukan cara melakukan operasi buka kunci.

2. Buka kunci secara manual:

Selepas mengesahkan bahawa kunci perlu dibuka, kami boleh memadamkan kunci Oracle secara manual melalui langkah berikut:

① Tentukan SID dan SIRI sesi terkunci# :

SELECT SID,SERIAL# FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID');

Antaranya, USERENV('SESSIONID') adalah untuk mendapatkan ID sesi semasa.

②Gunakan pernyataan SID dan SERIAL# dan KILL yang ditanya di atas untuk menamatkan sesi:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

③ Jika terdapat berbilang kunci, anda perlu mengulangi langkah di atas.

3. Gunakan PL/SQL untuk membuka kunci

Anda boleh menggunakan PL/SQL untuk membuka kunci dalam Oracle Pelaksanaan khusus adalah seperti berikut:

①. Cipta prosedur tersimpan

CREATE OR REPLACE PROCEDURE kill_locks_table (p_username IN VARCHAR2, p_table_name IN VARCHAR2) IS
  l_obj_id NUMBER;
  l_sess_id NUMBER;
  l_serial# NUMBER;
  l_locktype VARCHAR2(32);
BEGIN
  SELECT object_id INTO l_obj_id 
    FROM dba_objects 
   WHERE object_name = p_table_name and owner = p_username and object_type in ('TABLE', 'INDEX');

  FOR l_rec IN (SELECT session_id, lock_type, mode_held 
                     FROM v$locked_object 
                    WHERE object_id = l_obj_id) LOOP
    l_sess_id := l_rec.session_id;
    l_locktype := l_rec.lock_type || ' ' || l_rec.mode_held;
    SELECT serial# INTO l_serial# FROM v$session WHERE sid = l_sess_id;
    dbms_output.put_line('Killing session ' || l_sess_id || ' serial# ' || l_serial# || ' which is holding lock: ' || l_locktype);
    EXECUTE IMMEDIATE 'alter system kill session ''' || l_sess_id || ',' || l_serial# || '''';
  END LOOP;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    dbms_output.put_line('No locks found for ' || p_table_name);
END kill_locks_table;

Prosedur tersimpan di atas boleh menyemak objek terkunci berdasarkan nama pengguna dan nama jadual yang diberikan dan secara automatik menamatkan sesi yang sepadan untuk mencapai buka kunci.

②: Gunakan prosedur tersimpan untuk membuka kunci:

call kill_locks_table('用户名', '对象名');

Di mana, 'nama pengguna' merujuk kepada nama pemilik jadual, 'nama objek' merujuk kepada nama jadual yang dikunci, Laksanakan pernyataan Pl/SQL di atas untuk melepaskan semua kunci pada jadual yang ditentukan.

Ringkasan

Memadamkan kunci Oracle boleh dilakukan secara manual, menggunakan PL/SQL, dsb., dan kaedah yang paling sesuai boleh dipilih mengikut situasi yang berbeza. Sebelum beroperasi, pastikan anda menentukan objek sasaran dan maklumat sesi yang berkaitan untuk mengelakkan salah operasi.

Atas ialah kandungan terperinci Bagaimana untuk memadam kunci oracle (analisis ringkas kaedah). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn