Mengapa saya mendapatkan database ini kesalahan ketika saya meng-update tabel?
ERROR at line 1: ORA-00054: sumber daya yang sibuk dan memperoleh dengan NOWAIT yang ditentukan atau batas waktu habis
Meja anda sudah terkunci oleh beberapa query. Misalnya, anda mungkin telah dieksekusi "pilih untuk update" dan belum dilakukan/rollbacked dan dipecat query pilih yang lain. Melakukan commit/rollback sebelum mengeksekusi permintaan anda.
Anda juga dapat melihat sql,username,mesin,informasi port dan sampai ke proses yang sebenarnya yang memegang koneksi
SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S,
V$PROCESS P, V$SQL SQ
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR
AND S.SQL_ADDRESS = SQ.ADDRESS;
Mohon Membunuh Oracle Sesi
Gunakan query di bawah ini untuk check active session info
SELECT
O.OBJECT_NAME,
S.SID,
S.SERIAL#,
P.SPID,
S.PROGRAM,
SQ.SQL_FULLTEXT,
S.LOGON_TIME
FROM
V$LOCKED_OBJECT L,
DBA_OBJECTS O,
V$SESSION S,
V$PROCESS P,
V$SQL SQ
WHERE
L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID
AND S.PADDR = P.ADDR
AND S.SQL_ADDRESS = SQ.ADDRESS;
membunuh seperti
alter system kill session 'SID,SERIAL#';
(Misalnya, mengubah sistem membunuh sesi '13,36543'
;)
Referensi http://abeytom.blogspot.com/2012/08/finding-and-fixing-ora-00054-resource.html
Ada yang sangat mudah bekerja di sekitar masalah ini.
Jika anda menjalankan 10046 melacak sesi anda (google ini... terlalu banyak untuk menjelaskan). Anda akan melihat bahwa sebelum operasi DDL Oracle akan melakukan yang berikut:
MENGUNCI TABEL 'TABLE_NAME' TIDAK MENUNGGU
Jadi jika sesi lain yang telah terbuka transaksi anda mendapatkan error. Jadi fix... drum roll please. Masalah kunci anda sendiri sebelum DDL dan meninggalkan 'TIDAK MENUNGGU'.
Catatan Khusus:
jika anda melakukan pemisahan/menjatuhkan partisi oracle hanya mengunci partisi. -- jadi yo hanya bisa mengunci partisi subpartition.
Jadi... Berikut langkah-langkah memperbaiki masalah.
Pernyataan DML akan 'tunggu' atau sebagai pengembang menyebutnya 'hang' sedangkan tabel yang terkunci.
Saya menggunakan ini dalam kode yang berjalan dari pekerjaan untuk menjatuhkan partisi. Itu bekerja dengan baik. Hal ini dalam sebuah database yang terus-menerus memasukkan pada tingkat beberapa ratus sisipan/detik. Tidak ada kesalahan.
jika anda bertanya-tanya. Lakukan ini di 11g. Saya telah melakukan ini di 10g sebelum dan juga di masa lalu.
Kesalahan ini terjadi ketika sumber daya yang sibuk. Periksa jika anda memiliki kendala referensial dalam query. Atau bahkan meja-meja yang telah anda sebutkan dalam query mungkin sibuk. Mereka mungkin terlibat dengan beberapa pekerjaan lain yang akan tercantum dalam daftar berikut ini hasil query:
SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE'
Menemukan SID,
SELECT * FROM V$OPEN_CURSOR WHERE SID = --the id
Dalam kasus saya, saya cukup yakin itu adalah salah satu saya sendiri sesi yang menghalangi. Oleh karena itu, adalah aman untuk melakukan hal berikut:
SELECT * FROM V$SESSION di MANA OSUSER='my_local_username';
Sesi ini tidak aktif, tapi itu masih memegang kunci entah bagaimana. Catatan, bahwa anda mungkin perlu untuk menggunakan beberapa lainnya di MANA kondisi dalam kasus anda (misalnya mencoba USERNAME
atau MESIN
ladang).
ID
dan SERIAL#
di atas diperoleh:mengubah sistem membunuh sesi '<id>, <serial#>';
Edited by @thermz: Jika tidak ada sebelumnya membuka sesi pertanyaan yang bekerja mencoba yang satu ini. Query ini dapat membantu anda untuk menghindari kesalahan sintaks sambil membunuh sesi:
PILIH 'MENGUBAH SISTEM MEMBUNUH SESI '''||SID||','||SERIAL#||''' langsung;' DARI V$SESSION di MANA OSUSER='my_local_username_on_OS'
Hal ini terjadi ketika sesi lain daripada yang digunakan untuk mengubah suatu tabel yang memegang kunci mungkin karena DML (update/delete/insert). Jika anda sedang mengembangkan sebuah sistem baru, ada kemungkinan bahwa anda atau seseorang dalam tim anda mengeluarkan statement update dan anda bisa membunuh sesi tanpa banyak konsekuensi. Atau anda bisa melakukan dari sesi setelah anda tahu siapa yang memiliki sesi pembukaan.
Jika anda memiliki akses ke SQL admin sistem menggunakannya untuk menemukan menyinggung sesi. Dan mungkin membunuhnya.
Anda bisa menggunakan v$session dan v$lock dan lain-lain tapi saya sarankan anda google bagaimana untuk menemukan sesi dan kemudian bagaimana untuk membunuh itu.
Dalam sistem produksi, itu benar-benar tergantung. Untuk oracle 10g dan lebih tua, anda bisa menjalankan
LOCK TABLE mytable in exclusive mode;
alter table mytable modify mycolumn varchar2(5);
Dalam sesi terpisah tetapi memiliki berikut siap dalam kasus itu memakan waktu terlalu lama.
alter system kill session '....
Itu tergantung pada apa yang sistem lakukan anda memiliki sistem yang lebih tua lebih mungkin untuk tidak melakukan setiap waktu. Yang menjadi masalah karena tidak dapat berdiri lama terkunci. Jadi kunci anda akan mencegah setiap kunci baru dan menunggu kunci yang entah kapan akan dirilis. Itulah mengapa anda memiliki pernyataan yang lain siap. Atau anda bisa mencari PLSQL script di luar sana yang melakukan hal yang serupa secara otomatis.
Dalam versi 11g ada variabel lingkungan yang menetapkan waktu tunggu. Saya pikir itu mungkin melakukan sesuatu yang mirip dengan apa yang saya jelaskan. Pikiran anda bahwa masalah penguncian don't pergi.
ALTER SYSTEM SET ddl_lock_timeout=20;
alter table mytable modify mycolumn varchar2(5);
Akhirnya mungkin yang terbaik untuk menunggu sampai ada beberapa pengguna dalam sistem untuk melakukan hal ini jenis pemeliharaan.
Hanya memeriksa proses penyelenggaraan sidang dan Membunuh itu. Untuk kembali ke normal.
Berikut SQL akan menemukan proses
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id;
Kemudian membunuhnya
ALTER SYSTEM KILL SESSION 'sid,serial#'
ATAU
beberapa contoh yang saya temukan secara online tampaknya perlu contoh id juga mengubah sistem membunuh sesi '130,620,@1';
Aku berhasil memukul kesalahan ini ketika hanya membuat sebuah tabel! Ada jelas tidak ada pertentangan masalah di atas meja yang tidak't belum ada. The CREATE TABLE
pernyataan berisi KENDALA fk_name FOREIGN KEY
klausul referensi yang baik-penduduk tabel. Saya harus:
Aku punya kesalahan ini terjadi ketika aku punya 2 script saya berjalan. Saya:
Aku berlari tabel drop, maka pembuatan tabel sebagai akun #1.
Aku berlari tabel update di akun #2's sesi. Tidak melakukan perubahan.
Kembali berlari tabel drop/pembuatan script sebagai akun #1. Ada kesalahan di drop table x
perintah.
Aku diselesaikan dengan menjalankan COMMIT;
dalam SQL*Plus sidang akun #2.
select
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine
from
v$locked_object a,
v$session b,
dba_objects c
where
b.sid = a.session_id
and
a.object_id = c.object_id;
ALTER SYSTEM KILL SESSION 'sid,serial#';
Solusi yang diberikan oleh Shashi's link adalah yang terbaik... tidak ada kebutuhan untuk kontak dba atau orang lain
membuat backup
create table xxxx_backup as select * from xxxx;
menghapus semua baris
delete from xxxx;
commit;
menyisipkan cadangan anda.
insert into xxxx (select * from xxxx_backup);
commit;