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!