实战篇:LogMiner 分析数据泵导入参数 TABLE_EXISTS_ACTION 的秘密

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 前几天,技术交流群里看到大家讨论 Oracle 数据泵导入时使用 table_exists_action 参数,存在一些疑惑。于是,我打算通过 LogMiner 来分析一下在线重做日志,看看到底是怎么玩的。

目录



前言


前几天,技术交流群里看到大家讨论 Oracle 数据泵导入时使用 table_exists_action 参数,存在一些疑惑。于是,我打算通过 LogMiner 来分析一下在线重做日志,看看到底是怎么玩的。



建议先阅读简单了解一下,下面👇🏻就开始~ ヾ(◍°∇°◍)ノ゙


环境准备


已有 Oracle 11GR2 数据库环境,已开启归档模式。


1.png


1、安装 LogMiner


Oracle 自带的 sql 脚本与 LogMiner 相关的有以下三个:


2.png


在默认情况下,Oracle已经安装了LogMiner工具,如果没有安装,可以依次执行以下 sql 脚本,创建 LogMiner 相关的对象:


sqlplus/assysdba@?/rdbms/admin/dbmslm.sqlsqlplus/assysdba@?/rdbms/admin/dbmslmd.sql


脚本需要用 SYS 用户执行,可重复执行。


2、创建数据字典文件


DBMS_LOGMNR_D.BUILD 过程需要访问可以放置字典文件的目录。 因为 PL/SQL 过程通常不访问用户目录,所以必须指定一个目录供 DBMS_LOGMNR_D.BUILD 过程使用,否则该过程将失败。


mkdir/oradata/orcl/logmnrsqlplus/assysdbaCREATEDIRECTORYutlfileAS'/oradata/orcl/logmnr';
altersystemsetutl_file_dir='/oradata/orcl/logmnr'scope=spfile;
shutdownimmediate;
startup;


要指定目录,需要在初始化参数文件中设置初始化参数 UTL_FILE_DIR,需要重启数据库生效参数。


3.png


执行 PL/SQL 过程 DBMS_LOGMNR_D.BUILD。 指定字典的文件名和文件的目录路径名。 此过程创建字典文件。 例如,输入以下内容在 /oradata/orcl/logmnr 中创建文件 dictionary.ora:


EXECUTEDBMS_LOGMNR_D.BUILD('dictionary.ora','/oradata/orcl/logmnr',DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);
1


4.png


由于本次仅作实验所用,不单独创建用户和表空间。


3、添加在线重做日志


通过 LogMiner.ADD_LOGFILE 添加所有 REDO LOG :


--查询所有在线重做日志selectmemberfromv$logfile;
--添加所有在线重做日志BEGINDBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME=>'/oradata/orcl/redo03.log',OPTIONS=>DBMS_LOGMNR.NEW);
DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME=>'/oradata/orcl/redo01.log',OPTIONS=>DBMS_LOGMNR.ADDFILE);
DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME=>'/oradata/orcl/redo02.log',OPTIONS=>DBMS_LOGMNR.ADDFILE);
end;


添加第一个文件时,OPTIONS 需要指定 DBMS_LOGMNR.NEW,后面添加的文件指定 DBMS_LOGMNR.ADDFILE。


4、启动 LogMiner


beginDBMS_LOGMNR.START_LOGMNR(DictFileName=>'/oradata/orcl/logmnr/dictionary.ora');
end;


这里需要注意的是,执行启动 LogMiner 的 SESSION 才可以进行查询,否则不能查询。


5、准备数据泵导入数据


创建用户和测试表:


createuserteaidentifiedbytea;
grantdbatotea;
conntea/teacreatetabletea (idnumber,textvarchar2(20));
insertintoteavalues (1,'test1');
insertintoteavalues (2,'test2');
commit;


5.png


数据泵导出表:


expdpsystem/oracledirectory=DATA_PUMP_DIRdumpfile=tea.dmplogfile=tea.logtables=tea.tea


6.png


6、查询 LogMiner 记录


altersessionsetNLS_DATE_FORMAT='YYYY-MM-DD HH24:mi:ss';
SELECTtimestamp, sql_redo, sql_undo, seg_ownerFROMv$logmnr_contentsWHEREseg_name='TEA'ANDseg_owner='TEA';


通过查询可以看到上面建表的 DDL 语句已经被查询到。


开始实验


数据泵导入参数 TABLE_EXISTS_ACTION,通常用于数据库中表已存在的情况下,导入数据时处理的参数。


TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE]


可用选项有 4 种,接下来我们依次使用参数来进行测试。


  • SKIP:跳过当前表进行下一个。 如果 CONTENT 参数设置为 DATA_ONLY,这不是有效选项。
  • APPEND:从源加载数据并保持现有数据不变。
  • TRUNCATE:删除现有表数据,然后从源加载数据。
  • REPLACE:删除现有表,然后从源创建并加载数据。 如果 CONTENT 参数设置为 DATA_ONLY,这不是有效选项。


默认值:SKIP(注意,如果指定了 CONTENT=DATA_ONLY,则默认值是 APPEND,而不是 SKIP)


1、SKIP


SKIP 参数是指导入时跳过已存在的表,添加参数 TABLE_EXISTS_ACTION=SKIP 测试。


执行导入:


impdpsystem/oracledirectory=DATA_PUMP_DIRdumpfile=tea.dmplogfile=tea.logtables=tea.teatable_exists_action=skip


7.png


这个参数比较简单明了,就是直接跳过了存在的表,不进行导入,表数据不变。


2、APPEND


APPEND 参数是指导入时对已存在表进行增量导入,添加参数TABLE_EXISTS_ACTION=APPEND 测试。

由于目前表数据一样,无法看出效果,先修改表中数据:


deletefromtea.teawhereid=2;
insertintotea.teavalues (3,'test3');
commit;


8.png


执行导入:


impdpsystem/oracledirectory=DATA_PUMP_DIRdumpfile=tea.dmplogfile=tea.logtables=tea.teatable_exists_action=append


9.png


由于建表时没有主键唯一限制,因此允许存在重复数据,导入后数据如下:


select*fromtea.tea;


10.png


当使用 APPEND 参数,如果发现存在表,将导入数据进行增量导入,如果有唯一限制时,有重复数据,将会导入失败


11.png


也可以通过在导入命令行上指定 DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS 来覆盖此行为。如果有必须加载的数据,但可能会导致违反约束,可以考虑禁用约束,加载数据,然后在重新启用约束之前删除有问题的行。


3、TRUNCATE


TRUNCATE 参数会删除原表中所有的数据,并且导入新数据,添加参数TABLE_EXISTS_ACTION=TRUNCATE 测试。

执行导入:


select*fromtea.tea;


12.png


查询导入后数据:


select*fromtea.tea;


13.png


可以看到之前的数据已经不存在,数据重新导入。


SELECTtimestamp, sql_redo, sql_undo, seg_ownerFROMv$logmnr_contentsWHEREseg_name='TEA'ANDseg_owner='TEA';


14.png


通过比对导入时间和 LogMiner 表中记录时间,可以看到 TEA 表执行了 TRUNCATE 操作。


4、REPLACE


REPLACE 参数会删除已存在的表然后重新创建,并且导入新数据,添加参数TABLE_EXISTS_ACTION=REPLACE 测试。

导入前插入几条数据:


insertintoteavalues(3,'test3');
insertintoteavalues(4,'test4');
commit;


执行导入:


impdpsystem/oracledirectory=DATA_PUMP_DIRdumpfile=tea.dmplogfile=tea.logtables=tea.teatable_exists_action=replace


15.png


通过导入过程没有看到任何关于表已存在的提示,导入正常,查询数据:


16.png


数据只存在导入的数据,导入前新增的数据已经消失。


SELECTtimestamp, sql_redo, sql_undo, seg_ownerFROMv$logmnr_contentsWHEREseg_name='TEA'ANDseg_owner='TEA';


17.png


通过比对导入时间和 LogMiner 表中记录时间,可以看到 TEA 表先执行 DROP PURGE 操作,然后执行 CREATE TABLE 重新创建表。


总结


使用 SKIP、APPEND 或 TRUNCATE 时,不会修改源中现有的表相关对象,例如索引、授权、触发器和约束。


对于 REPLACE,如果依赖对象未被显式或隐式排除(使用 EXCLUDE)并且它们存在于源转储文件或系统中,则会从源中删除并重新创建它们。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
5月前
|
人工智能 数据可视化 数据挖掘
手撕“开源版Manus”
Manus作为一款引发热议的AI智能体产品吸引了大量的关注。OpenManus作为一个开源项目,尝试复现了Manus的部分功能,可以作为一种“平替”来体验类似的技术。
|
3月前
|
机器学习/深度学习 人工智能 大数据
35岁+大数据人必看:这6个证书,帮你把年龄变成职场「护城河」
35岁不是"职场黄昏",而是"经验红利期"。这些证书不是用来"装门面"的,而是帮你把十几年积累的行业认知,和最新的技术趋势结合起来的"加速器"。 考证的过程,本质上是逼自己跳出舒适区——你可能会重新学Python、研究机器学习模型、梳理数据治理流程,但这些"额外"的努力,都会变成你简历上的亮点、面试时的底气、谈薪资时的筹码。 记住:企业永远愿意为"能解决问题的人"买单。35岁的你,有经验、懂业务、还能学习新东西,这就是你最硬核的竞争力。 现在就开始挑一个证书,把焦虑变成行动力——毕竟,中年危机不可怕,可怕的是你还没开始准备。
|
2月前
|
人工智能 自然语言处理 物联网
Jina Embeddings V4: 为搜索而生,多模态多语言向量模型
近日,Jina AI 正式发布 jina-embeddings-v4,一款全新的多模态向量模型,参数规模达到 38 亿,并首次实现了对文本与图像的同步处理。
390 2
|
11月前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
402 0
|
人工智能 自然语言处理 机器人
9411亿!!!阿里2024财报曝光
9411亿!!!阿里2024财报曝光
4902 0
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
302 3
|
API Android开发 Windows
Android P下WindowManager与LayoutParams的详解
WindowManager是什么?WindowManager与window的关系是什么?
1115 0
|
黑灰产治理 Python
点击器 | 大麦网的反思
两天研究了下大麦网,在经历了抢票没抢到,群友讨论脚本如何修改以及大麦网规则等事件之后,我发现了以下规则。
676 0
|
Web App开发
Chrome浏览器与迅雷协同批量下载网页内全部链接的方法
本文介绍在Chrome浏览器中,通过迅雷自动批量选中网页中全部下载链接并进行下载的方法~
1609 1
Chrome浏览器与迅雷协同批量下载网页内全部链接的方法
|
前端开发 C# 数据安全/隐私保护
ApeForms | C# - WinForm临时对话框(消息框、提示框、输入框、密码框、单选框、多选框等)
ApeForms一款基于WinForm实现的开源免费商用的UI库,其中提供了一套便于用户交互的临时对话框组件(Dialog),可用于快速创建开发中常见的交互对话框,例如:消息框、提示框、输入框、单选框、多选框等。 ApeFree.ApeDialogs并不是一个包含Dialog实现的UI库,而是一套Dialog标准(提供了一套临时弹出对话框的实现标准)。 Dialog是界面开发过程中必不可少的组件,无论是桌面开发、Web前端开发、移动端开发,甚至命令行应用程序中的一次“Yes or No”的输入都可以看做是一次Dialog弹框。
897 0
ApeForms | C# - WinForm临时对话框(消息框、提示框、输入框、密码框、单选框、多选框等)