आप किसी मौजूदा तालिका को इस तरह विभाजित नहीं कर सकते। वह कथन उस विभाजन को संशोधित कर रहा है जो अभी तक नहीं बनाया गया है। मुझे इस ऑपरेशन को करने का स्वचालित तरीका नहीं पता है और मुझे यकीन नहीं है कि आप इसे कर सकते हैं।
हालांकि यह काम मैंने कई बार किया है लेकिन मैनुअल स्टेप्स के साथ। यदि आपको स्वचालित समाधान नहीं मिल रहा है तो निम्न कार्य करें:
- अपने खंडों और अपनी सभी प्राथमिकताओं के साथ table_name_part नाम की एक विभाजित तालिका बनाएं।
- इस विभाजित तालिका में मूल तालिका से सभी पंक्तियों को सम्मिलित करें। संपीड़न पर ध्यान दें। यदि आपके पास टेबल (बेसिक या एचसीसी) पर कुछ संपीड़न है तो आपको + APPEND का उपयोग करना होगा संकेत।
- विभाजित तालिका पर मूल तालिका से अपने अवरोध और अनुक्रमणिका बनाएं।
- तालिकाओं का नाम बदलें और मूल तालिका छोड़ें। इसे तब तक न गिराएं जब तक आप उन पर कुछ गिन न लें।
मैंने देखा कि यदि आपकी तालिका मौजूद नहीं है तो विभाजन को स्वतः बनाने का विकल्प है। (NUMTOYMINTERVAL(1,'MONTH')) तो आपको अपनी तालिका केवल पहले विभाजन के साथ बनानी होगी। मुझे लगता है कि आपके पास यहां बहुत अधिक केवल-पढ़ने के लिए डेटा है, इसलिए आपको पिछले महीने की बजाय निरंतरता के साथ कोई समस्या नहीं होगी। संभवत:कुछ पढ़ने-लिखने का डेटा है, इसलिए आपको उस समय अधिक सावधान रहना होगा जब आप नई तालिका में डेटा सम्मिलित करना चाहते हैं और तालिकाओं को स्विच करना चाहते हैं।
आशा है कि आपकी मदद करेगा। जहाँ तक मुझे पता है, DBMS_REDEFINITION नाम का एक पैकेज हो सकता है जो मेरे चरणों के स्वचालित संस्करण के साथ आपकी मदद कर सकता है। यदि आपको अधिक विवरण की आवश्यकता है या मेरी विधि पर कुछ सहायता की आवश्यकता है, तो कृपया संकोच न करें।
अपडेट करें: Oracle 12c R2 से आप अपनी पद्धति से किसी तालिका को एक विभाजन से विभाजित तालिका में परिवर्तित कर सकते हैं। नीचे एक लिंक खोजें। अब यह मेरे लिए एक चुनौती है और मैं कन्वर्ट करने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि इस रूपांतरण को 12c R1 में ऑनलाइन करने का कोई तरीका नहीं है।
समाधान
मुझे आपके लिए एक समाधान मिला। यहां आपके पास मेरे सभी चरण होंगे जो मैं तालिका को ऑनलाइन परिवर्तित करने के लिए चलाता हूं। :)
1. Create regular table and populate it.
CREATE TABLE SCOTT.tab_unpartitioned
(
id NUMBER,
description VARCHAR2 ( 50 ),
created_date DATE
);
INSERT INTO tab_unpartitioned
SELECT LEVEL,
'Description for ' || LEVEL,
ADD_MONTHS ( TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' ),
-TRUNC ( DBMS_RANDOM.VALUE ( 1, 4 ) - 1 ) * 12 )
FROM DUAL
CONNECT BY LEVEL <= 10000;
COMMIT;
2. Create partitioned table with same structure.
--If you are on 11g create table with CREATE TABLE command but with different name. ex: tab_partitioned
CREATE TABLE SCOTT.tab_partitioned
(
id NUMBER,
description VARCHAR2 ( 50 ),
created_date DATE
)
PARTITION BY RANGE (created_date)
INTERVAL( NUMTOYMINTERVAL(1,'YEAR'))
(PARTITION part_2015 VALUES LESS THAN (TO_DATE ( '01-JAN-2016', 'DD-MON-YYYY' )),
PARTITION part_2016 VALUES LESS THAN (TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' )),
PARTITION part_2017 VALUES LESS THAN (TO_DATE ( '01-JAN-2018', 'DD-MON-YYYY' )));
--this is an alter command that works only in 12c.
ALTER TABLE tab_partitioned
MODIFY
PARTITION BY RANGE (created_date)
(PARTITION part_2015 VALUES LESS THAN (TO_DATE ( '01-JAN-2016', 'DD-MON-YYYY' )),
PARTITION part_2016 VALUES LESS THAN (TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' )),
PARTITION part_2017 VALUES LESS THAN (TO_DATE ( '01-JAN-2018', 'DD-MON-YYYY' )));
3. Check if the table can be converted. This procedure should run without any error.
Prerequisites: table should have an UNIQUE INDEX and a Primary Key constraint.
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED');
4. Run the following steps like I have done.
EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');
var num_errors varchar2(2000);
EXEC DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED', 1,TRUE,TRUE,TRUE,FALSE,:NUM_ERRORS,FALSE);
SQL> PRINT NUM_ERRORS -- Should return 0
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');
स्क्रिप्ट के अंत में आप देखेंगे कि मूल तालिका विभाजित है।