উত্তর:
আপনার টেবিলটি ইতিমধ্যে কিছু প্রশ্নের দ্বারা লক করা আছে। উদাহরণস্বরূপ, আপনি "আপডেটের জন্য নির্বাচন করুন" নির্বাহ করেছেন এবং এখনও অন্য কোনও নির্বাচন করা প্রশ্নের সাথে প্রতিশ্রুতিবদ্ধ / রোলব্যাকড এবং বরখাস্ত করেন নি। আপনার ক্যোয়ারি কার্যকর করার আগে কমিট / রোলব্যাক করুন।
এখান থেকে ORA-00054: সম্পদ ব্যস্ত এবং নির্দিষ্ট NOWAIT সঙ্গে অর্জন
আপনি বর্গক্ষেত্র, ব্যবহারকারীর নাম, মেশিন, পোর্ট তথ্য সন্ধান করতে পারেন এবং সংযোগটি ধারণ করে এমন আসল প্রক্রিয়াতে যেতে পারেন
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;
ওরাকল সেশনটি হত্যা করুন
সক্রিয় সেশন তথ্য যাচাই করতে নীচে কোয়েরি ব্যবহার করুন
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;
মত হত্যা
alter system kill session 'SID,SERIAL#';
(উদাহরণস্বরূপ alter system kill session '13,36543'
,;)
তথ্যসূত্র http://abeytom.blogspot.com/2012/08/finding- and-fixing-ora-00054-resource.html
CONNECT
এবং RESOURCE
তবে যা প্রয়োজন তা নয় ORA-00942: table or view does not exist
। এই থ্রেডটি পড়া প্রত্যেকেরই SYS
অ্যাকাউন্ট থাকবে না ।
alter system kill session '13,36543'
সময়সীমা শেষ হবে এবং অধিবেশনটি মারা যাবে না। সেক্ষেত্রে
connection object
মধ্যে python
আমি কিছু ত্রুটি আছে। তারপরে python script
সঠিকভাবে বন্ধ না করে বন্ধ হয়ে যায় connection object
। যখন আমি অন্য সেশনে টেবিলটি ফেলে দেওয়ার চেষ্টা করি তখন আমি "LOCKWAIT" ত্রুটি পাচ্ছি। আমি যখন চেষ্টা kill session
করি তখন পর্যাপ্ত প্রাইভেলিজ নেই। এ থেকে মুক্তি পেতে আর কী করা যায়?
এই সমস্যার চারপাশে খুব সহজ কাজ রয়েছে।
যদি আপনি আপনার সেশনে একটি 10046 ট্রেস চালান (গুগল এটি ... ব্যাখ্যা করার জন্য খুব বেশি)। আপনি দেখতে পাবেন যে কোনও ডিডিএল অপারেশন করার আগে ওরাকল নিম্নলিখিত কাজগুলি করে:
লক ট্যাবলেট 'ট্যাবলেট'-এর অপেক্ষা নেই
সুতরাং অন্য সেশনে যদি খোলা লেনদেন হয় তবে আপনি একটি ত্রুটি পান। ঠিক আছে ... ড্রাম রোল দয়া করে। ডিডিএল এর আগে আপনার নিজের লক ইস্যু করুন এবং 'না অপেক্ষা' ছেড়ে দিন।
বিশেষ দ্রষ্টব্য:
যদি আপনি বিভাজন / পার্টিশনগুলি বাদ দিচ্ছেন তবে ওরাকল কেবলমাত্র পার্টিশনটিকে লক করে রাখবে। - সুতরাং আপনি কেবল পার্টিশন সাব-পার্টিশনটি লক করতে পারেন।
সুতরাং ... নিম্নলিখিত পদক্ষেপগুলি সমস্যার সমাধান করে।
টেবিলটি লক থাকাকালীন ডিএমএলের বিবৃতিগুলি 'অপেক্ষা' করবে বা বিকাশকারীরা এটিকে 'হ্যাঙ্গ' বলবে।
আমি এই কোডটিতে এটি ব্যবহার করি যা একটি কাজ থেকে পার্টিশনগুলি ফেলে দেয়। এটা ঠিক কাজ করে। এটি এমন একটি ডাটাবেসে যা ক্রমাগত কয়েকশো সন্নিবেশ / সেকেন্ডের হারে সন্নিবেশ করানো হয়। কোনও ত্রুটি নেই।
যদি আপনি ভাবছেন। 11 জি-তে এটি করা। আমি অতীতেও 10 জি আগে এটি করেছি।
KILL SESSION
এই লোকদের জন্য সঠিক উত্তর।
set_ddl_timeout
এবং এটি কী হওয়া উচিত?
রিসোর্সটি ব্যস্ত থাকাকালীন এই ত্রুটি ঘটে। আপনার প্রশ্নের কোনও রেফারেন্সিয়াল বাধা আছে কিনা তা পরীক্ষা করে দেখুন। অথবা এমনকি আপনি যে সারণীগুলি ক্যোয়ারীতে উল্লেখ করেছেন তা ব্যস্ত থাকতে পারে। তারা অন্য কোনও কাজের সাথে জড়িত থাকতে পারে যা অবশ্যই নীচের প্রশ্নের ফলাফলগুলিতে তালিকাভুক্ত হবে:
SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE'
এসআইডি খুঁজুন,
SELECT * FROM V$OPEN_CURSOR WHERE SID = --the id
ORA-00942: table or view does not exist
।
এটি তখন ঘটে যখন কোনও টেবিল পরিবর্তনের জন্য ব্যবহৃত একটি ব্যতীত অন্য একটি সেশনে কোনও ডিএমএল (আপডেট / ডিলিট / সন্নিবেশ করানো) এর কারণে সম্ভবত একটি লক থাকে। আপনি যদি একটি নতুন সিস্টেম বিকাশ করে থাকেন তবে সম্ভবত আপনি বা আপনার দলের কেউ আপডেট স্টেটমেন্ট জারি করেছেন এবং আপনি কোনও ফলাফল ছাড়াই সেশনটি মেরে ফেলতে পারেন। বা আপনি অধিবেশনটি খোলা আছে তা জানার পরে আপনি এই অধিবেশন থেকে প্রতিশ্রুতিবদ্ধ হতে পারেন।
আপনার যদি কোনও এসকিউএল অ্যাডমিন সিস্টেমে অ্যাক্সেস থাকে তবে আপত্তিজনক সেশনটি খুঁজে পেতে এটি ব্যবহার করুন। এবং সম্ভবত এটি হত্যা।
আপনি ভি $ সেশন এবং ভি $ লক এবং অন্যান্য ব্যবহার করতে পারেন তবে আমি আপনাকে পরামর্শ দিচ্ছি যে কীভাবে সেই অধিবেশনটি সন্ধান করতে হবে এবং তারপরে কীভাবে এটি হত্যা করা যায়।
একটি উত্পাদন ব্যবস্থায়, এটি সত্যই নির্ভর করে। ওরাকল 10 গ্রাম বা তার বেশি বয়সীদের জন্য, আপনি নির্বাহ করতে পারেন
LOCK TABLE mytable in exclusive mode;
alter table mytable modify mycolumn varchar2(5);
একটি পৃথক সেশনে তবে এটি খুব বেশি সময় নেয় ক্ষেত্রে নিম্নলিখিতটি প্রস্তুত রাখুন।
alter system kill session '....
এটি আপনার কী সিস্টেমে রয়েছে তার উপর নির্ভর করে, পুরানো সিস্টেমগুলি প্রতিবার প্রতিশ্রুতিবদ্ধ না হওয়ার সম্ভাবনা বেশি। দীর্ঘস্থায়ী লক থাকতে পারে বলে এটি একটি সমস্যা। সুতরাং আপনার লকটি কোনও নতুন লক আটকাতে পারে এবং এমন একটি লকের জন্য অপেক্ষা করতে পারে যে কখন ছেড়ে যাবে কখন কে জানে। এজন্য আপনার অন্যান্য বিবৃতি প্রস্তুত রয়েছে। অথবা আপনি এখানে PLSQL স্ক্রিপ্টগুলি সন্ধান করতে পারেন যা স্বয়ংক্রিয়ভাবে অনুরূপ কাজ করে।
সংস্করণ 11 গ্রামে একটি নতুন পরিবেশের পরিবর্তনশীল রয়েছে যা একটি অপেক্ষা করার সময় সেট করে। আমি মনে করি এটি সম্ভবত আমি বর্ণিত মতো কিছু কাজ করে। মনে রাখবেন যে লকিংয়ের সমস্যাগুলি চলে না।
ALTER SYSTEM SET ddl_lock_timeout=20;
alter table mytable modify mycolumn varchar2(5);
অবশেষে সিস্টেমে এই ধরণের রক্ষণাবেক্ষণের জন্য খুব কম ব্যবহারকারী না পাওয়া পর্যন্ত অপেক্ষা করা ভাল।
alter system kill session '....
যদি পরিচালনা দর্শনগুলিতে অ্যাক্সেস না পান তবে আপনি কীভাবে সেশনটিকে হত্যা করবেন তা খুঁজে বের করবেন?
আমার ক্ষেত্রে, আমি নিশ্চিত ছিলাম যে এটি আমার নিজস্ব একটি সেশন যা ব্লক করছে। সুতরাং, নিম্নলিখিতগুলি করা নিরাপদ ছিল:
আমি এর সাথে আপত্তিজনক সেশনটি পেয়েছি:
SELECT * FROM V$SESSION WHERE OSUSER='my_local_username';
সেশনটি নিষ্ক্রিয় ছিল , তবে এটি এখনও কোনওভাবে লকটি ধরেছিল। দ্রষ্টব্য, আপনার ক্ষেত্রে আপনার অন্য কোনও WHERE শর্ত ব্যবহার করার প্রয়োজন হতে পারে (যেমন চেষ্টা করুন USERNAME
বা MACHINE
ক্ষেত্রগুলি)।
সেশনটি মেরে ID
এবং SERIAL#
উপরে অর্জিত:
alter system kill session '<id>, <serial#>';
@ থের্মজ দ্বারা সম্পাদিত: পূর্ববর্তী ওপেন-সেশন কোয়ের কোনওটি যদি এটিকে চেষ্টা করে না। এই কোয়েরিটি সেশন মারার সময় সিনট্যাক্স ত্রুটিগুলি এড়াতে আপনাকে সহায়তা করতে পারে:
SELECT 'ALTER SYSTEM KILL SESSION '''||SID||','||SERIAL#||''' immediate;' FROM V$SESSION WHERE OSUSER='my_local_username_on_OS'
সেশন অধিবেশন প্রক্রিয়া পরীক্ষা করে দেখুন এবং এটি হত্যা। এটি স্বাভাবিক অবস্থায় ফিরে আসে।
এসকিউএল এর নীচে আপনার প্রক্রিয়াটি খুঁজে পাবেন
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;
তারপরে এটি মেরে ফেলুন
ALTER SYSTEM KILL SESSION 'sid,serial#'
অথবা
কিছু উদাহরণ যা আমি অনলাইনে পেয়েছি তার উদাহরণ আইডির পাশাপাশি সিস্টেম কিল সেশন '130,620, @ 1' পরিবর্তন করতে হবে বলে মনে হয়;
আপনার সমস্যা দেখে মনে হচ্ছে আপনি ডিএমএল এবং ডিডিএল ক্রিয়াকলাপ মেশাচ্ছেন। এই URL টি দেখুন যা এই সমস্যাটি ব্যাখ্যা করে:
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#';
আমি কেবল একটি টেবিল তৈরি করার সময় এই ত্রুটিটি পরিচালনা করতে সক্ষম হয়েছি! কোনও টেবিলটিতে স্পষ্টতই কোন বিতর্ক সমস্যা ছিল যা এখনও বিদ্যমান ছিল না। CREATE TABLE
বক্তব্য অন্তর্ভুক্ত CONSTRAINT fk_name FOREIGN KEY
একটি সুন্দরভাবে-জনবহুল টেবিল উল্লেখ দফা। আমি বাধ্য ছিলাম:
novalidate
ক্লজ যুক্ত করেছি alter table add constraint
। এটি কোনওভাবে এটি চালাতে দেয় তবে এটি লক করে দেয়। তারপরে আমি কোন অধিবেশনটি লক করে তা সন্ধানের জন্য সেশন তালার দিকে তাকালাম। এবং তারপরে আমি সেই অধিবেশনটিকে হত্যা করেছিলাম।
আমার যখন 2 টি স্ক্রিপ্ট চলছিল তখন আমার এই ত্রুটিটি ঘটেছিল। আমার ছিল:
আমি একটি টেবিল ড্রপ চালিয়েছি, তারপরে অ্যাকাউন্ট 1 হিসাবে টেবিল তৈরি। আমি অ্যাকাউন্ট # 2 এর সেশনে একটি টেবিল আপডেট চালিয়েছি। পরিবর্তন করেনি। অ্যাকাউন্ট # 1 হিসাবে টেবিল ড্রপ / তৈরি স্ক্রিপ্ট পুনরায় চালিত। drop table x
কমান্ডটিতে ত্রুটি হয়েছে ।
আমি COMMIT;
অ্যাকাউন্ট 2 # এর এসকিউএল * প্লাস সেশনে চালিয়ে এটি সমাধান করেছি ।
COMMIT;
। এমনকি আপনি যদি কোনও টেবিলও ফেলে রাখতে না পারেন তবে আপনাকে প্রথমে এই সমস্যাটিতে ফেলতে পারে এমন কোনও কিছু পরিবর্তনের অনুমতি নেই।
আমিও একই ইস্যুর মুখোমুখি। এই ত্রুটিটি সমাধান করার জন্য প্রোগ্রামারকে কিছুই করতে হবে না। আমি আমার ওরাকল ডিবিএ দলকে জানিয়েছি। তারা সেশনটি মেরেছিল এবং কবজির মতো কাজ করেছে।
শশির লিঙ্কটি দিয়ে দেওয়া সমাধানটি সেরা ... ডিবিএ বা অন্য কারও সাথে যোগাযোগ করার প্রয়োজন নেই
একটি ব্যাকআপ করুন
create table xxxx_backup as select * from xxxx;
সমস্ত সারি মুছুন
delete from xxxx;
commit;
আপনার ব্যাকআপ sertোকান।
insert into xxxx (select * from xxxx_backup);
commit;