使用例:お客様のデータベースのバックアップをdmpファイルに送信します。それが彼らのすべてです。元の表領域を知らずにOracle DMPファイルをインポートする方法は?
私はDBMS_DATAPUMPを使用してOracleにそのDMPファイルをインポートするスクリプトを構築しています。 ORA-39083::私は、元の表領域名を知らないしかし、私は次のエラーを取得していますオブジェクトタイプUSERを: ORA-00959:「XXXXX」はエラーで作成に失敗しました表領域「XXXXXXX」が存在しません。
これは私のPL/SQLプロシージャです:
PROCEDURE IMPORTING
(
DMPFILES IN VARCHAR2,
FROMSCHEMA IN VARCHAR2,
TOSCHEMA IN VARCHAR2
) AS
ind NUMBER; -- Loop index
h1 NUMBER; -- Data Pump job handle
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
array apex_application_global.vc_arr2;
BEGIN
h1 := DBMS_DATAPUMP.open('IMPORT','FULL',NULL,'EXAMPLE1');
dbms_datapump.add_file(handle => h1, filename => 'IMPORT.LOG', directory => 'DATA_PUMP_DIR', filetype => 3);
-- usign this function to split the files passed as a String to an array
array := apex_util.string_to_table(DMPFILES, ',');
for i in 1 .. array.count loop
DBMS_DATAPUMP.ADD_FILE(h1,array(i),'DATA_PUMP_DIR');
end loop;
DBMS_DATAPUMP.METADATA_REMAP(h1,'REMAP_SCHEMA',FROMSCHEMA,TOSCHEMA);
dbms_datapump.set_parameter(handle => h1, name =>
'INCLUDE_METADATA', value => 1);
dbms_datapump.set_parameter(handle => h1, name =>
'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
dbms_datapump.set_parameter(handle => h1, name =>
'REUSE_DATAFILES', value => 0);
dbms_datapump.set_parameter(handle => h1, name =>
'SKIP_UNUSABLE_INDEXES', value => 0);
DBMS_DATAPUMP.START_JOB(h1);
-- The import job should now be running. In the following loop, the job is
-- monitored until it completes. In the meantime, progress information is
-- displayed. Note: this is identical to the export example.
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;
-- If any work-in-progress (WIP) or Error messages were received for the job,
-- display them.
if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0)
then
le := sts.wip;
else
if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0)
then
le := sts.error;
else
le := null;
end if;
end if;
if le is not null
then
ind := le.FIRST;
while ind is not null loop
dbms_output.put_line(le(ind).LogText);
ind := le.NEXT(ind);
end loop;
end if;
end loop;
-- Indicate that the job finished and gracefully detach from it.
dbms_output.put_line('Job has completed');
dbms_output.put_line('Final job state = ' || job_state);
dbms_datapump.detach(h1);
END IMPORTING;
だから、基本的に私の質問は次のとおりです。 は、元の表領域を知らなくても、OracleにDMPファイルをインポートする方法は...ありますか?
ご協力いただきありがとうございます。
UPDATE: 私はこのスクリプトを使用しているとき、私はまた、スキーマ名を知っておく必要がありました。
PROCEDURE IMPORTING
(
DMPFILES IN VARCHAR2,
FROMSCHEMA IN VARCHAR2,
TOSCHEMA IN VARCHAR2,
FROMTABLESPACE IN VARCHAR2,
TOTABLESPACE IN VARCHAR2
) AS
ind NUMBER; -- Loop index
h1 NUMBER; -- Data Pump job handle
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
array apex_application_global.vc_arr2;
BEGIN
h1 := DBMS_DATAPUMP.open('IMPORT','FULL',NULL,'EXAMPLE1');
dbms_datapump.add_file(handle => h1, filename => 'IMPORT.LOG', directory => 'DATA_PUMP_DIR', filetype => 3);
-- usign this function to split the files passed as a String to an array
array := apex_util.string_to_table(DMPFILES, ',');
for i in 1 .. array.count loop
DBMS_DATAPUMP.ADD_FILE(h1,array(i),'DATA_PUMP_DIR');
end loop;
DBMS_DATAPUMP.METADATA_REMAP(h1,'REMAP_TABLESPACE',FROMTABLESPACE,TOTABLESPACE);
DBMS_DATAPUMP.METADATA_REMAP(h1,'REMAP_SCHEMA',FROMSCHEMA,TOSCHEMA);
dbms_datapump.set_parameter(handle => h1, name =>
'INCLUDE_METADATA', value => 1);
dbms_datapump.set_parameter(handle => h1, name =>
'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
dbms_datapump.set_parameter(handle => h1, name =>
'REUSE_DATAFILES', value => 0);
dbms_datapump.set_parameter(handle => h1, name =>
'SKIP_UNUSABLE_INDEXES', value => 0);
DBMS_DATAPUMP.START_JOB(h1);
-- The import job should now be running. In the following loop, the job is
-- monitored until it completes. In the meantime, progress information is
-- displayed. Note: this is identical to the export example.
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;
-- If any work-in-progress (WIP) or Error messages were received for the job,
-- display them.
if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0)
then
le := sts.wip;
else
if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0)
then
le := sts.error;
else
le := null;
end if;
end if;
if le is not null
then
ind := le.FIRST;
while ind is not null loop
dbms_output.put_line(le(ind).LogText);
ind := le.NEXT(ind);
end loop;
end if;
end loop;
-- Indicate that the job finished and gracefully detach from it.
dbms_output.put_line('Job has completed');
dbms_output.put_line('Final job state = ' || job_state);
dbms_datapump.detach(h1);
END IMPORTING;
私はので、私は表領域とスキーマ名を知っていたエクスポートDMPであることをテストした:だから、スクリプトで次の変更を行います。
概要:その後、DMPファイルから表領域名とスキーマ名を知るためにどのような方法?
ありがとうございました。