EXP匯出時DML操作對其匯出資料是否有影響
一、概述
隨著資料庫版本的升級及業務測試的增加,資料庫或者資料移轉也成了資料庫管理者們經常的工作之一。那麼對於要求嚴格的資料,針對大資料表,在你匯出時如果有人做了操作,這個操作是否也會被匯出呢?由於個人能力有限,想要深究邏輯備份的話,估計還需要一些時日,暫時只做了一個小實驗測試,如大家有其他方法、更全面說明,歡迎拍磚。
二、操作過程
以下實驗操作流程為每執行一次邏輯匯出時都執行一次DML操作。動作陳述式如下(資料庫版本10.2.0.5):
使用者為firsoul,操作的表有age、big_table、test,為各表的初始資料
SQL> show user
USER is "FIRSOUL"
SQL> select * from tab;
SQL> select table_name,NUM_ROWS from user_tables;
TABLE_NAME NUM_ROWS
------------------------------ ----------
EMP 14
DEPT 4
TEST 1
AGE 1
BIG_TABLE 3000000
第一次操作:
exp firsoul/firsoul tables=BIG_TABLE CONSISTENT=Y file=exp_table.dmp log=exp_table.log
insert into age values(22,'mingli');
delete from big_table where id=7;
insert into test values(2,'shandong');
commit;
第二次操作:
exp firsoul/firsoul file=exp_user.dmp log=exp_user.log consistent=y grants=y
insert into age values(24,'mengmeng');
delete from big_table where id=14;
insert into test values(3,'china');
commit;
第三次操作:
exp firsoul/firsoul tables=BIG_TABLE file=exp_table2.dmp log=exp_table2.log
insert into age values(24,'xiaochi');
delete from big_table where id=21;
insert into test values(4,'dezhou');
commit;
第四次操作:
exp firsoul/firsoul file=exp_user2.dmp log=exp_user2.log grants=y
insert into age values(25,'fengyin');
delete from big_table where id=28;
insert into test values(5,'jinan');
commit;
第五次操作:
expdp firsoul/firsoul directory=dir_dmp dumpfile=expdp_table.dmp tables=BIG_TABLE logfile=expdp_table.log
insert into age values(30,'shubin');
delete from big_table where id=35;
insert into test values(6,'shizhong');
commit;
第六次操作:
expdp firsoul/firsoul directory=dir_dmp dumpfile=expdp_user.dmp SCHEMAS=firsoul logfile=expdp_user.log
insert into age values(32,'liupan');
delete from big_table where id=42;
insert into test values(7,'tianqiao');
commit;
得出結果如下所示(“-”為少幾行,“+”為多幾行):
執行DML次數 |
age |
big_table |
test |
備忘 |
1 |
|
0 |
|
匯出表(CONSISTENT=y) |
2 |
+2 |
-2 |
+2 |
匯出使用者(CONSISTENT=y) |
3 |
|
-2 |
|
匯出表(CONSISTENT=n) |
4 |
+3 |
-3 |
+4 |
匯出使用者(CONSISTENT=n) |
5 |
|
-5 |
|
expdp 匯出表 |
6 |
+6 |
-6 |
+6 |
expdp 匯出使用者 |
通過以上資料,我們可以看出
1、exp匯出,參數CONSISTENT=y,單獨匯出表big_table,資料無變化,匯出使用者時,資料有變化。
2、exp匯出,參數CONSISTENT=n,單獨匯出表big_table,資料無變化,匯出使用者資料時,表age、big_table沒變化,表test多一行,exp匯出按照表的首字母排序,在匯出時,我們執行DML語句(第四次操作)時,age已匯出,big_table正在匯出,而test還為等待匯出。由此看出,exp匯出,當表在執行匯出時再做DML操作對匯出資料無影響。
3、expdp匯出時,資料都有變化。expdp匯出的表是按照資料從大到小排序
三、總結
這個測試其實很無聊的,而且還有點繞,總結呢,就一點,exp任務開始,當該表已執行邏輯匯出操作(執行中或已匯出完成),做的任何DML操作對匯出資料無影響;當匯出任務還未涉及到該表時,所做DML操作影響該表匯出資料。一句話,DML操作時間(先後)影響匯出表資料。說來,還是對於資料庫原理不太明白,希望可以認真看看吧,希望。以上只是個人昏昏欲睡狀態下所得出結論,歡迎大家積極拍磚。水平有限,不足之處還望見諒。
Oracle EXP匯出報錯EXP-00091分析解決
探索Oracle之 EXP/IMP過程中的字元集問題
Oracle EXP imp備份、恢複資料表空間資料步驟
Oracle 建立自動執行的EXP任務
Oracle 11g 匯出表報EXP-00011:table不存在
EXP/imp匯出匯入資料時報錯ORA-12154 無法解析指定的串連標識符