随着数据库版本的升级及业务测试的增加,数据库或者数据迁移也成了数据库管理者们经常的工作之一。那么对于要求严格的数据,针对
一、概述
随着数据库版本的升级及业务测试的增加,数据库或者数据迁移也成了数据库管理者们经常的工作之一。那么对于要求严格的数据,针对大数据表,在你导出时如果有人做了操作,这个操作是否也会被导出呢?由于个人能力有限,想要深究逻辑备份的话,估计还需要一些时日,暂时只做了一个小实验测试,如大家有其他方法、更全面说明,欢迎拍砖。
二、操作过程
以下实验操作流程为每执行一次逻辑导出时都执行一次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 无法解析指定的连接标识符
本文永久更新链接地址: