Oracle資料庫驗證IMP匯入中繼資料是否會覆蓋曆史表資料
情境:imp匯入資料時,最終觸發器報錯退出,並未匯入預存程序、觸發器、函數。
現在exp單獨匯出中繼資料,然後imp匯入中繼資料,驗證是否會影響已匯入的表資料。
測試環境:CentOS 6.7 + Oracle 11.2.0.4
構造實驗環境:
- 1.匯出scott使用者的表和資料
- 2.scott使用者建立過程、函數、觸發器
- 3.匯出scott中繼資料
- 4.刪除scott使用者
- 5.匯入scott表和資料
- 6.匯入Scott中繼資料
1.匯出scott使用者的表和資料
匯出scott使用者的表和資料,此時並沒有觸發器、過程、函數這些對象:
exp scott/tiger OWNER=scott BUFFER=10240000 STATISTICS=none RESUMABLE=y FILE=scott_exp.dmp LOG=scott_exp.log
2.scott使用者建立過程、函數、觸發器
scott使用者建立過程:
create or replace procedure pro_insert_dept isbegin insert into dept values (99, 'xx_dept_name', 'Beijing');end;/
scott使用者建立函數:
create or replace function sp_fun1(spName varchar2) return number isyearSal number(7, 2);beginselect sal * 12 + nvl(comm, 0) * 12 into yearSal from emp where ename = spName; return yearSal;end;/
scott使用者觸發器:
--建立序列CREATE SEQUENCE seq_del_id;--建立表CREATE TABLE emp_del_info(autoid number primary key,deptno number,empno number,ename varchar2(20),del_rq date);--建立觸發器CREATE OR REPLACE TRIGGER trg_del_emp_info BEFORE DELETE ON emp FOR EACH ROW DECLARE -- local variables here BEGIN INSERT INTO emp_del_info(autoid,deptno,empno,ename,del_rq) VALUES(seq_del_id.NEXTVAL,:OLD.deptno,:OLD.empno,:OLD.ename,sysdate); END;/
3.匯出scott中繼資料
匯出scott中繼資料:
exp scott/tiger OWNER=scott ROWS=n BUFFER=10240000 STATISTICS=none RESUMABLE=y FILE=scott_metadata_exp.dmp LOG=scott_metadata_exp.log
此時匯出的中繼資料,是有觸發器、過程、函數這些對象的。
4.刪除scott使用者
確認沒有scott使用者登入的session:
select 'alter system kill session '''||sid||','||serial#||''''||';' from v$session where username='SCOTT';
如果上述查詢有結果,那麼直接把查出的結果複製執行即可kill掉scott使用者登入的session。
刪除scott使用者:
SQL> drop user scott cascade;User dropped.
5.匯入scott表和資料
先建立使用者並賦權:
SQL> create user scott identified by tiger default tablespace users;User created.SQL> grant connect, resource to scott;Grant succeeded.
匯入表和資料:
imp scott/tiger BUFFER=10240000 RESUMABLE=y FILE=scott_exp.dmp LOG=imp_scott_exp.log IGNORE=y FULL=y
此時匯入的只是表和表資料,沒有觸發器、過程、函數這些對象。
6.匯入Scott中繼資料
imp scott/tiger BUFFER=10240000 RESUMABLE=y FILE=scott_metadata_exp.dmp LOG=imp_scott_metadata_exp.log IGNORE=y FULL=y
此時匯入的只是表結構、觸發器、過程、函數等這些對象,
最後驗證下是否覆蓋上一步已匯入的表資料?
最終結論是沒有覆蓋已匯入的表資料,之前未匯入的過程、函數、觸發器也都成功匯入。