যখন কোনও রেকর্ড ওরাকলে লক থাকে তখন আমরা জানতে পারি কোন রেকর্ডটি লক করা আছে?


10

যখন কোনও রেকর্ডটি লক থাকে, তখন আমরা জানতে পারি কোনটি লক করা আছে?

আমি কীভাবে রেকর্ড রোড বা অন্য কোনও তথ্য পেতে পারি?


আমি এই স্কয়ার দ্বারা কিছু তথ্য পেতে পারেন

SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
   FROM v$locked_object a, dba_objects b, v$session c    
WHERE a.object_id = b.object_id    
    AND a.SESSION_ID = c.sid(+) 

ফাংশনটি ব্যবহার করে রোয়েড পাওয়ার জন্য ওয়েবে একটি পদ্ধতি পেয়েছি DBMS_ROWID.ROWID_CREATE()

তবে কাজ হচ্ছে বলে মনে হচ্ছে না।


2
আপনি কেবলমাত্র সেই লকগুলি দেখতে পাচ্ছেন যে কোনও প্রক্রিয়া অপেক্ষা করছে, লেনদেন দ্বারা রক্ষিত সেগুলি নয়।
a_horse_with_no_name

@a_horse_with_no_name - v $ লক আপনাকে লেনদেনের দ্বারা আটকানো লকগুলি দেখায়
ক্রিস

@ ক্রিস্যাক্সন: আপনি ঠিক বলেছেন। আমি এই বিষয়টি উল্লেখ করছিলাম যে আপনি দেখতে পারবেন না কোন সারিগুলি লক হয়েছে - আমার আরও পরিষ্কার হওয়া উচিত ছিল।
a_horse_with_no_name

ওরাকল (অন্য ডাটাবেসগুলির বিপরীতে) লকের জন্য কোনও ভাগ করা কাঠামো নেই। এটি ডাটাবেসটিকে স্কেলযোগ্য করে তোলে তবে অন্যদিকে আপনি সমস্ত লক দেখতে পাচ্ছেন না। লকগুলি সরাসরি ডাটাবেস ব্লকে সংরক্ষণ করা হয়। এই মুহুর্তে যখন কেউ অবরুদ্ধ হয়ে যায় একটি কাঠামো "হোল্ডার-ওয়েটার" তৈরি হয়। তারপরে আপনি এই জুটিটি দেখতে পাবেন V$LOCK
ibre5041

উত্তর:


13

সেশন দ্বারা লক করা সমস্ত সারি আপনি সত্যিই তালিকাভুক্ত করতে পারবেন না । তবে, একবার কোনও সেশন অন্য দ্বারা অবরুদ্ধ হয়ে গেলে আপনি দেখতে পাবেন যে কোন সেশন / সারিটি এটি ব্লক করছে।

ওরাকল স্বতন্ত্র সারির লকগুলির তালিকা বজায় রাখে না। পরিবর্তে, লকগুলি সরাসরি সারিগুলির মধ্যে নিবন্ধিত হয় - এটি একটি অতিরিক্ত কলাম হিসাবে ভাবেন as

কোন সেশনটি ভিউটির মাধ্যমে কোনও অবজেক্টে লক অর্জন করেছে তা আবিষ্কার করতে পারেন তবে এটি V$LOCKকেবল সাধারণ তথ্য তালিকাভুক্ত করবে, সারি স্তরে নয়।

এই দৃশ্যের সাহায্যে আপনি সেশনটি অন্য কোনও দ্বারা অবরুদ্ধ করা হচ্ছে কিনা তাও খুঁজে পেতে পারেন। সেক্ষেত্রে যদি কোনও সেশন অন্য সেশনের দ্বারা অবরুদ্ধ থাকে তবে সারি তথ্য তথ্যটিতে প্রদর্শিত হয় V$SESSION

আপনি সারিটি পুনরুদ্ধার করতে পারেন, আসুন 2 সেশন দিয়ে একটি উদাহরণ তৈরি করুন:

SESSION1> create table test as select * from all_objects;

Table created

SESSION1> select rowid from test where object_name = 'TEST' for update;

ROWID
------------------
AAMnFEAAaAAALTDAAz

/* setting identifiers to help with identifying this session later */
SESSION2> exec dbms_application_info.set_client_info('012345');

PL/SQL procedure successfully completed

SESSION2> select 1 from test where object_name = 'TEST' for update;
/*  this will block */

সেশন 2 এখন অধিবেশন 1 এর জন্য অপেক্ষা করছে আমরা এর সাথে ব্লকিং সারিটি আবিষ্কার করতে পারি :

SESSION1> SELECT o.object_name,
       2         dbms_rowid.ROWID_CREATE (1,
       3                                  s.ROW_WAIT_OBJ#,
       4                                  s.ROW_WAIT_FILE#,
       5                                  s.ROW_WAIT_BLOCK#,
       6                                  s.ROW_WAIT_ROW#) rid
       7     FROM dba_objects o, v$session s
       8    WHERE o.object_id = s.row_wait_obj#
       9      AND s.client_info = '012345';

OBJECT_NAME     RID
--------------- ------------------
TEST            AAMnFEAAaAAALTDAAz

আরও পড়ার জন্য: টম কিটের প্রক্রিয়াটির একটি বিবরণ


3

নিম্নলিখিত কোয়েরিটি চালিয়ে আপনি একটি ওরাকল ডাটাবেসে সমস্ত টেবিলের লক খুঁজে পেতে পারেন

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.