2013-02-14 2 views
0

간격 파티션의 이름을 변경합니다. 테이블의 파티션 이름이 변경되는 절차가 있습니다. 테스트를 위해 2 분마다이 절차를 실행하는 작업을 만들었습니다. 첫 번째 실행은 매우 부드럽고 지금까지 오류없이 진행됩니다. 그러나 2 차 경기에서 나는오라클 스케줄러는 좀 이상한 행동을 얻을

"ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 
     ORA-06512: at "CDS_USER.RENAMING_PARTITIONS", line 17" 

예, 내 표는 살아 있습니다 다음과 같은 오류를 얻을. 그러나 스케줄러와 함께 명시 적으로 내 프로 시저를 실행하면 완벽하게 정상적으로 실행됩니다. 그 문제는 없습니다. 그리고 스케줄러가 처음 실행하는 모든 것도 완벽합니다. 여기

여기

begin 
    bms_Scheduler.create_job(
    job_name => 'drop_user1' , 
    job_action => 'RENAMING_PARTITIONS' 
    job_action => 'DROP_PARTITIONS' 
    ,start_date => SYSDATE , 
    repeat_interval => 'freq=hourly;INTERVAL=7',bysecond=0;' , 
    enabled => TRUE , 
    comments => 'schduling drop job.'); 
    END; 

내가이 문제를 해결할 수있는 방법

 create or replace PROCEDURE RENAMING_PARTITIONS 
    AS 
    hv varchar2(9); 
    max_part VARCHAR2(9); 
    begin 
    select max(partition_position) into max_part from user_tab_partitions where table_name='DEMO'; 
    for x in (select partition_name, high_value, partition_position 
      from user_tab_partitions 
      where table_name = 'DEMO' and partition_name like 'SYS%') 
loop 
if x.partition_position <> max_part THEN 

     execute immediate 'select to_char('||x.high_value||'-1,''YYYYMMDD'') from dual' into hv; 
partition '||x.partition_name 
        --||' to DATE_'||hv); 
     execute immediate('alter table DEMO rename partition '||x.partition_name 
        ||' to DATE_'||hv); 
end if; 
end loop; 
end; 

절차

코드입니다 스케줄러에 대한 코드?

+0

: (간격 DATE 파티션에 대한 예) 다음과 같이

select * from my_table partition (blah); 

11g에서는이 시스템이 이름을 생성 해결하기 위해 절 "에 대한 파티션"를 사용할 수 있습니다 : 전형적인 쿼리는 뭔가 같은 것 내 생각 엔'alter table DEMO ... '는 업데이트 중이거나 "사용 중"이기 때문에 테이블에 대한 잠금을 얻을 수 없다. –

+1

이것은 간격 파티션의 이름을 바꾸기위한 해킹입니까? – tbone

+0

왜'T_FDC_TOOLCONTEXT' 테이블의 최대 파티션과'DEMO '테이블의 파티션 위치를 비교하고 있습니까? –

답변

1

이 작업을 수행하지 마십시오. 필자는 오라클이 시스템 생성 간격 파티션 (아마도 앞으로의 기능 향상)에 대해 미리 정의 된 파티션 명명 스키마를 따르지 않는다는 점을 알고 있지만 2 분마다 테이블을 변경하는 것이 좋지 않은 점을 잘 알고 있습니다.

다행히, 당신은 정말에만 쿼리를 지정할 때 사전에 파티션 이름을 알아야합니다.

SQL> set display on 
SQL> set linesize 200 
SQL> drop table test_data 
Table dropped. 
SQL> create table test_data (
    start_date  DATE, 
    store_id   NUMBER, 
    inventory_id  NUMBER, 
    qty_sold   NUMBER 
) 
PARTITION BY RANGE (start_date) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
(
    PARTITION part_01 values LESS THAN (TO_DATE('20130101','YYYYMMDD')) 
) 
Table created. 
SQL> insert into test_data values (to_date('20121231', 'YYYYMMDD'), 1, 2, 1) 
1 row created. 
SQL> commit 
Commit complete. 
SQL> SELECT table_name, partition_name, high_value 
FROM user_tab_partitions 
WHERE table_name = 'TEST_DATA' 
ORDER BY table_name, partition_name 

TABLE_NAME      PARTITION_NAME     HIGH_VALUE           
------------------------------ ------------------------------ -------------------------------------------------- 
TEST_DATA      PART_01      TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24: 
                   MI:SS', 'NLS_CALENDAR=GREGORIAN')     

1 row selected. 
SQL> insert into test_data values (to_date('20130101', 'YYYYMMDD'), 1, 5, 8) 
1 row created. 
SQL> insert into test_data values (to_date('20130115', 'YYYYMMDD'), 2, 4, 5) 
1 row created. 
SQL> insert into test_data values (sysdate, 2, 3, 2) 
1 row created. 
SQL> commit 
Commit complete. 
SQL> SELECT table_name, partition_name, high_value 
FROM user_tab_partitions 
WHERE table_name = 'TEST_DATA' 
ORDER BY table_name, partition_name 

TABLE_NAME      PARTITION_NAME     HIGH_VALUE           
------------------------------ ------------------------------ -------------------------------------------------- 
TEST_DATA      PART_01      TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24: 
                   MI:SS', 'NLS_CALENDAR=GREGORIAN')     

TEST_DATA      SYS_P67      TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24: 
                   MI:SS', 'NLS_CALENDAR=GREGORIAN')     

TEST_DATA      SYS_P68      TO_DATE(' 2013-03-01 00:00:00', 'SYYYY-MM-DD HH24: 
                   MI:SS', 'NLS_CALENDAR=GREGORIAN')     


3 rows selected. 
SQL> -- get data for January partition only 
SQL> select * from test_data partition for (to_date('20130101', 'YYYYMMDD')) 

START_DATE STORE_ID INVENTORY_ID QTY_SOLD 
----------- ---------- ------------ ---------- 
01-JAN-2013   1   5   8 
15-JAN-2013   2   4   5 

2 rows selected. 
+0

테스트 목적으로, 나는 2 분마다 그것을하고있다, 실제로 그것은 매 24 시간마다 완료 될 것이다. 중요한 요구 사항입니다. 나는 이것을해야만한다. – user1947949