问题描述
我有一个要求,我必须将表从PROD刷新到DEV。但是刷新需要以这样的方式进行,即分区表应刷新其最新的前10个分区,而非分区表应刷新完整
我正在使用DBPUMP API通过网络链接执行此操作。我能够成功地为一个表拉2个分区,但是当我指定多个data_filter行时,第二个表永远不会刷新。还有我将在哪里合并非分区表?
请您看一下我正在使用的代码模式。为了检测分区,我计划编写一个代码来获取分区名称,然后将它们附加到代码中,但是如果您有更好的建议,请向我射击。
=
=
问候
尼尚
我正在使用DBPUMP API通过网络链接执行此操作。我能够成功地为一个表拉2个分区,但是当我指定多个data_filter行时,第二个表永远不会刷新。还有我将在哪里合并非分区表?
请您看一下我正在使用的代码模式。为了检测分区,我计划编写一个代码来获取分区名称,然后将它们附加到代码中,但是如果您有更好的建议,请向我射击。
=
set scan off
set serveroutput on
set escape off
DECLARE
h1 number;
errorvarchar varchar2(100):= 'ERROR';
tryGetStatus number := 0;
l_ku$status ku$_status1020;
l_job_state varchar2(4000);
percent_done NUMBER; -- Percentage of job complete
job_state VARCHAR2(30); -- To keep track of job state
le ku$_LogEntry; -- For WIP and error messages
js ku$_JobStatus; -- The job status from get_status
jd ku$_JobDesc; -- The job description from get_status
sts ku$_Status; -- The status object returned by get_status
begin
h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'TABLE', version => 'COMPATIBLE', remote_link =>'DBPUMP_TEST_LINK' );
tryGetStatus := 1;
dbms_datapump.set_parallel(handle => h1, degree => 1);
dbms_datapump.add_file(handle => h1, filename => 'POC-'||to_char(sysdate,'yyyy-mm-dd-hh24_mi_ss')||'.LOG', directory => 'DATAPUMP', filetype => 3);
dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 1);
--dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_LIST', value =>'''FDW_PUMP_TEST''');
dbms_datapump.data_filter(handle => h1, name => 'PARTITION_LIST', value =>'SYS_P26447,SYS_P27786', TABLE_NAME => 'TAB1');
dbms_datapump.data_filter(handle => h1, name => 'PARTITION_LIST', value =>'SYS_P34155,SYS_P34666', TABLE_NAME => 'TAB2');
dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 0);
dbms_datapump.set_parameter(handle => h1, name => 'ESTIMATE', value => 'BLOCKS');
DBMS_DATAPUMP.SET_PARAMETER(handle => h1,name => 'TABLE_EXISTS_ACTION',value => 'TRUNCATE');
dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
errorvarchar := 'NO_ERROR';
DBMS_OUTPUT.PUT_LINE('NO_ERROR');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD-MON-YYYY HH:MI:SS'));
percent_done := 0;
job_state := 'UNDEFINED';
while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
dbms_datapump.get_status(h1,
dbms_datapump.ku$_status_job_error +
dbms_datapump.ku$_status_job_status +
dbms_datapump.ku$_status_wip,-1,job_state,sts);
js := sts.job_status;
-- If the percentage done changed, display the new value.
if js.percent_done != percent_done
then
dbms_output.put_line('*** Job percent done = ' ||
to_char(js.percent_done));
percent_done := js.percent_done;
end if;
end loop;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD-MON-YYYY HH:MI:SS'));
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF ((errorvarchar = 'ERROR')AND(tryGetStatus=1)) THEN
DBMS_DATAPUMP.DETACH(h1);
DBMS_OUTPUT.PUT_LINE('LANDED IN EXCEPTION');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END IF;
RAISE;
END;
RAISE;
END;
/
=
问候
尼尚
专家解答
你有什么错误吗?如果是这样,具体是什么?
我看到您有系统生成的分区名称 (SYS_Pnnnn)。两个环境中的分区名称是否相同?如果不是,这可能是问题的原因...
您不需要做任何特别的事情来获取非分区表。
我看到您有系统生成的分区名称 (SYS_Pnnnn)。两个环境中的分区名称是否相同?如果不是,这可能是问题的原因...
您不需要做任何特别的事情来获取非分区表。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




