यह ORA-08103: object no longer exists
।
Oracle में, पाठक और लेखक एक दूसरे को ब्लॉक नहीं करते हैं। जिसका अर्थ है कि डीएमएल और प्रश्न एक दूसरे के साथ हस्तक्षेप नहीं करेंगे, कुछ अजीब मामलों को छोड़कर, जैसे कि यूएनडीओ अंतरिक्ष से बाहर चलना। लेकिन एक टेबलस्पेस, या किसी भी प्रकार के ALTER या अन्य DDL स्टेटमेंट को स्थानांतरित करना सामान्य लेखन नहीं है। जब आप कम से कम शामिल वस्तुओं के लिए डीडीएल चलाते हैं, तो मल्टीवर्सन समवर्ती नियंत्रण मॉडल टूट जाता है, और अजीब चीजें होने लगती हैं।
एक बड़े कदम का परीक्षण करना मुश्किल है, लेकिन आप बहुत से छोटे बदलावों और प्रश्नों के माध्यम से इन त्रुटियों को पुन:उत्पन्न कर सकते हैं। यदि आपको लगता है कि यह केवल एक सैद्धांतिक मुद्दा है, तो मैंने देखा है कि ये त्रुटियां वास्तविक जीवन में, उत्पादन डेटाबेस पर होती हैं।
चेतावनी:नीचे अनंत लूप क्योंकि मैं भविष्यवाणी नहीं कर सकता कि इस त्रुटि को पुन:उत्पन्न करने में कितना समय लगेगा। लेकिन इसमें आमतौर पर मुझे केवल दस सेकंड लगते हैं।
--Create sample table.
drop table test1 purge;
create table test1(a number, b number)
partition by list(a) (partition p1 values(1), partition p2 values(2))
nologging tablespace users;
--Session 1
begin
loop
execute immediate '
insert /*+ append */ into test1 select mod(level,2)+1, level
from dual connect by level <= 100000';
commit;
execute immediate 'alter table test1 move partition p1 tablespace users';
end loop;
end;
/
--Session 2: Read from moved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 1;
end loop;
end;
/
--Session 3: Read from unmoved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 2;
end loop;
end;
/
सत्र 2 अंततः इसके साथ समाप्त हो जाएगा:
ORA-08103: object no longer exists
ORA-06512: at line 6
सत्र 3 विफल नहीं होगा, यह एक परिवर्तित विभाजन को क्वेरी नहीं कर रहा है। प्रत्येक विभाजन का अपना खंड होता है, और यह एक अलग वस्तु है जो संभावित रूप से "अब मौजूद नहीं" हो सकती है।