LOB对象在数据泵导出、导入后查询对象数量发现丢失
问题描述:
问题:源库的某个Schema使用数据泵Expdp元数据整体导出,在目标库导入且成功后,逻辑验证用户对象,发现缺失。分析查询后,缺失的对象,都是LOB类型(并不是所有的LOB都无法导入,是大部分LOB类型的对象)
#以下逻辑验证,SQL执行,对比源库、目标库数据
#以下语句特点:测试环境,还原状况模拟:数据无法完全重现
SQL> select OBJECT_TYPE,count(*) from dba_objects where owner='SCOTT' group by object_type OBJECT_TYPE COUNT(*)
------------------- ----------
SEQUENCE
TABLE PARTITION
LOB
TABLE
INDEX
#通过上述操作对比:发现LOB对象,少了100多个,但是有的LOB字段却能导入
疑问? 什么样的情况下LOB会缺失?
是EXPDP根本不导出,还是导入报错,不创建?
诊断思路: 没有什么好的方法:直接查询MOS
LOB EXPORT LOB OBJECTS APPEAR TO BE LOST AFTER THE Export/import PROCESSES ID 1595391.1
MOS信息截取:
适用于: Oracle数据库 - 企业版 - 版本11.2.0.1至12.1.0.1 [版本11.2至12.1]
本文档中的信息适用于任何平台 导出/导入后,许多LOB对象似乎丢失。 select object_type, count(*)
from obj
group by object_type
order by object_type; OBJECT_TYPE COUNT(*)
-------------------------------
LOB 676 SQL> select object_type, count(*)
from obj
group by object_type
order by object_type; OBJECT_TYPE COUNT(*)
------------------- ----------
LOB 429 在导出/导入过程中,有247个LOB对象丢失,但导入没有报告任何类型的错误。 drop table lob; 在这种情况下,因为有些对象已被丢弃,但仍处于回收站中。 需要清除recyclebin以从obj中删除这些条目,或者使用user_lobs而不是执行查询。
问题解决:
#验证:使用查询即可:查询回收站中,LOB类型的对象数量,验证是否导入缺失的LOB数量对比
select type,count(*) from dba_recyclebin where owner='SCOTT' and type='LOB' group by type TYPE COUNT(*)
------------------------- ----------
LOB #本次导入后,对象数量对比,通过上述SQL查询,正好匹配:视图dba_objects中,object_type='LOB'类型的对象缺失数量= dba_recyclebin中的查询数量
有什么好的方式可以减少这种现象:
#查询回收站
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
ID BIN$aO6HsIdlTr3gU4AUqMDssg==$ TABLE --:::
ID BIN$aO6HsIdkTr3gU4AUqMDssg==$ TABLE --::: #清空回收站
SQL> purge recyclebin;
Recyclebin purged. #小结: 在执行数据泵导出前,清空回收站
SQL> select type,count(*) from dba_recyclebin where owner='SCOTT' and type='LOB' group by type; no rows selected
问题总结:其实这不是故障,而是一种特性:
我们通过obj视图去验证数量,Oracle数据库drop table xx(no purge)(no clear recyclebin)( and exists LOB column )时,LOB字段在视图obj中,status状态还是vaild, 也就是说:drop table 操作后的LOB对象类型,在视图中存在,但是Export数据泵不导出,因此统计对比发生误差;
如果导入数据后,对比对象数量:继续使用dba_objects中 object_type统计LOB字段对比:可以事先查询:源库回收站中的LOB类型数量,统计减去OK; 或者清空源库回收站,避免回收站内的LOB字段造成,统计干扰
在user_lobs视图统计用户下的LOB数量更为准确
#如下测试:
.1创建测试表(包含LOB字段): SQL> create table loba(id int,name clob) tablespace users; 2.1. 查询用户信息:发现创建一个LOB字段的表:自动创建SYS命名的LOB index and LOB segments SQL> select object_name,object_type,status from user_objects; OBJECT_NAME OBJECT_TYPE STATUS -------------------------------------------------------------------------------- LOBA TABLE VALID SYS_IL0000089677C00002$$ INDEX VALID SYS_LOB0000089677C00002$$ LOB VALID 2.1.3查询视图:用户下LOB字段的相关信息 SQL> select TABLE_NAME,COLUMN_NAME,SEGMENT_NAME,TABLESPACE_NAME,INDEX_NAME from user_lobs; TABLE COLUMN SEGMENT TABLESPACE_NAME INDEX_NAME ------------------------------ ------------------------------ LOBA NAME SYS_LOB0000089677C00002$$ USERS SYS_IL0000089677C00002$$ 2.1.4查询用户下的对象信息 SQL> select OBJECT_NAME,STATUS,object_id from user_objects; SYS_IL0000089677C00002$$ VALID SYS_LOB0000089677C00002$$ VALID LOBA VALID
2.2.1导出:
expdp \'/ as sysdba\' DIRECTORY=yang logfile=scott.log DUMPFILE=scott.dmp schemas='scott' CONTENT=METADATA_ONLY 2.2.2dump文件传输
$ scp scott* 192.168.20.67:/home/oracle/. 2.2.3导入:
impdp \'/ as sysdba\' directory=yang dumpfile=scott.dmp remap_schema=scott:song remap_tablespace=users:abc 2.2.4查询对比:
#对比发现:导入的表是新建的,JOB段也是新建,命名规则中使用了表的OBJECT_ID,因此导入的表,对象除了表明相同,JOB字段、索引都不同
select OBJECT_NAME,STATUS,object_id from user_objects;
OBJECT_NAME STATUS OBJECT_ID
----------------------------------- ------- ----------
LOBA VALID
SYS_IL0000015471C00002$$ VALID
SYS_LOB0000015471C00002$$ VALID
#查询对象类型,对象数量 SQL> select count(*),status,OBJECT_TYPE from user_objects group by status,object_type;
COUNT(*) STATUS OBJECT_TYPE
---------- ------- -------------------
VALID TABLE PARTITION
VALID TABLE
VALID SEQUENCE
VALID INDEX
VALID LOB #源库drop LOB字段的测试表 SQL> drop table loba; #从用户对象角度上,查询得到:LOB字段的表,drop 删除后,TABLE AND INDEX都删除了,LOB段保留且有效 SQL> select count(*),status,OBJECT_TYPE from user_objects group by status,object_type;
COUNT(*) STATUS OBJECT_TYPE
---------- ------- -------------------
VALID TABLE PARTITION
VALID TABLE
VALID SEQUENCE
VALID INDEX
VALID LOB #查询用户下的LOB段
SQL> select object_name,OBJECT_TYPE,status from user_objects where object_type='LOB';
OBJECT_NAME OBJECT_TYPE STATUS
----------------------------------- ------------------- -------
SYS_LOB0000089677C00002$$ LOB VALID SQL> select * from cat;
BIN$aO6HsIdjTr3gU4AUqMDssg==$ TABLE #查询用户下的LOBS相关信息:
select TABLE_NAME,COLUMN_NAME,SEGMENT_NAME,TABLESPACE_NAME,INDEX_NAME from user_lobs;
NULL
源库导出:
expdp \'/ as sysdba\' DIRECTORY=yang logfile=scott02.log DUMPFILE=scott02.dmp schemas='scott' CONTENT=METADATA_ONLY dump文件传输
$ scp scott* 192.168.20.67:/home/oracle/. 目标库:创建测试用户,授予权限
SQL> drop user song cascade;
SQL> create user song identified by song default tablespace abc;
SQL> grant connect,resource to song;
SQL> grant read,write on directory yang to song; 目标库导入:
impdp \'/ as sysdba\' directory=yang dumpfile=scott02.dmp remap_schema=scott:song remap_tablespace=users:abc 导入成功后:验证
#源库:
SQL> select count(*) from user_objects;
----------
15 #源库查询:对象类型:
COUNT(*) STATUS OBJECT_TYPE
---------- ------- -------------------
2 VALID TABLE PARTITION
9 VALID TABLE
1 VALID SEQUENCE
2 VALID INDEX
1 VALID LOB #目标库
SQL> select count(*) from user_objects;
----------
14 #目标库查询:对象类型:
SQL> select count(*),status,OBJECT_TYPE from user_objects group by status,object_type;
COUNT(*) STATUS OBJECT_TYPE
---------- ------- -------------------
2 VALID TABLE PARTITION
9 VALID TABLE
1 VALID SEQUENCE
2 VALID INDEX #目标库查询:当前用户下LOB字段视图查询:
SQL> select TABLE_NAME,COLUMN_NAME,SEGMENT_NAME,TABLESPACE_NAME,INDEX_NAME from user_lobs;
no rows selected #目标库查询:源端回收站的表:不导出
SQL> select object_name,object_type,status from user_objects where object_name='LOBA';
no rows selected #目标库查询:
SQL> select index_name,status from user_indexes where table_name='LOBA';
no rows selected
SQL> create table loba(id int,name clob) tablespace users; SQL> select TABLE_NAME,COLUMN_NAME,SEGMENT_NAME,TABLESPACE_NAME,INDEX_NAME from user_lobs;
TABLE COLUMN SEGMENT TABLESPACE_NAME INDEX_NAME
------------------------------ ------------------------------
LOBA NAME SYS_LOB0000015553C00002$$ USERS SYS_IL0000015553C00002$$ #查询LOB的表,LOB段,索引
SQL> select object_name,object_type,status from user_objects where object_name
in ('LOBA','SYS_LOB0000015553C00002$$','SYS_IL0000015553C00002$$');
OBJECT_NAME OBJECT_TYPE STATUS
-------------------------------------------------------------
LOBA TABLE VALID
SYS_IL0000015553C00002$$ INDEX VALID
SYS_LOB0000015553C00002$$ LOB VALID #DROP
SQL> drop table loba purge; #再次查询:记录清除
SQL> select object_name,object_type,status from user_objects where object_name
in ('LOBA','SYS_LOB0000015553C00002$$','SYS_IL0000015553C00002$$');
no rows selected #查询用户下的LOB信息,也被删除
SQL> select * from user_lobs;
no rows selected
SQL> select type,count(*) from dba_recyclebin where owner='SCOTT' and type='LOB' group by type;
no rows selected SQL> create table scott.id(i int,name blob,last clob);
SQL> drop table scott.id; #验证:使用查询即可:查询回收站中,LOB类型的对象数量,验证是否导入缺失的LOB数量对比
select type,count(*) from dba_recyclebin where owner='SCOTT' and type='LOB' group by type
TYPE COUNT(*)
------------------------- ----------
LOB 2 #验证:使用如下查询,可以查询出,在回收站中记录的对象: lob对象名称
SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS from dba_objects where owner='SCOTT' and object_type='LOB';
OWNER OBJECT_NAME OBJECT_TYP STATUS
---------- ----------------------------------- ---------- -------
SCOTT SYS_LOB0000089722C00003$$ LOB VALID
SCOTT SYS_LOB0000089722C00002$$ LOB VALID
#查询回收站 SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
ID BIN$aO6HsIdlTr3gU4AUqMDssg==$0 TABLE 2018-04-03:17:51:14
ID BIN$aO6HsIdkTr3gU4AUqMDssg==$0 TABLE 2018-04-03:17:35:05 #清空回收站
SQL> purge recyclebin;
Recyclebin purged. #小结: 在执行数据泵导出前,清空回收站,可以避免此场景
SQL> select type,count(*) from dba_recyclebin where owner='SCOTT' and type='LOB' group by type;
no rows selected
#或者计算对象时:减去回收站内的LOB对象数量
LOB对象在数据泵导出、导入后查询对象数量发现丢失的更多相关文章
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- Oracle基础 数据泵导出/导入Expdp/impdp(转)
一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- 数据泵导出/导入Expdp/impdp
一下转自 http://blog.csdn.net/jionjionyoushen/article/details/6789686 数据泵导出/导入Expdp/impdp Oracle 10g引入了D ...
- 实验:Oracle数据泵导出导入之序列问题
今天同事提出了一个问题: 使用数据泵expdp导出1个schema,有个表主键是触发器自增的id,导入测试库测试时,发现表里的数据比自增序列的值要大.导致插入数据报错. 最终结论是: 由于数据库先进行 ...
- oracle11g 使用数据泵导出导入数据
终于搞定了 快写个笔记 记录下. 删除用户的时候提示已经登录了不能删除,这个需要把登录的session结束掉. select username,sid,serial# from v$session w ...
- oracle数据泵导出导入
先创建一个目录:比如 Create or Replace directory DATA_PUMP_DIR as 'D:\DataPipe'; 然后给导入导出的用户赋权限: Grant read ...
- oracel数据泵导出导入
Oracle11g 使用数据泵导入/导出数据 expdp/impdp 目标:使用oracle数据泵,将A电脑上的数据库databaseA导出后,再导入到B电脑上的数据库databaseB中. A电脑上 ...
- 原创Oracle数据泵导出/导入(expdp/impdp)
//创建目录 create Or Replace directory dpdata1 as 'd:\test\dump'; //赋予读写权限 grant read,write on directory ...
随机推荐
- 【Java实现】栈和队列就是这么简单
一.前言 上一篇已经讲过了链表[Java实现单向链表]了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并指正哦,如果有更好的理解的方式也希望能够 ...
- node.js与比特币(typescript实现)
BTC中的utxo模型 BTC中引入了许多创新的概念与技术,区块链.PoW共识.RSA加密.萌芽阶段的智能合约等名词是经常被圈内人所提及,诚然这些创新的实现使得BTC变成了一种有可靠性和安全性保证的封 ...
- Java终结方法的使用(终结守卫者)
终结方法finalize()通常是不可预测的,也是很危险的,一般情况下是不必要的. Java语言规范并不保证finalize()会被及时执行,即不确定终结方法执行时间,只规定在对象被垃圾回收之前执行 ...
- android 与 服务器通信
android 与 服务器通信 服务端代码: (1)control 层 /** * 用户登录 * @return */ @RequestMapping(value = "/login&quo ...
- 福州大学W班-个人最终成绩统计
千帆竞发图 平时分: 项目分: 详细得分 平时分: 项目分: 个人最终得分:
- 第一次作业:扑通扑通 我的IT
让我掉下眼泪的不止昨夜的酒,还有这满屏的代码. 第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 在炎炎的夏日,伴随这高三的结束,我也面临大学专业的选择,我看着书里密 ...
- C语言博客作业--函数
一.PTA实验作业 题目1 (6-7) (1).本题PTA提交列表 (2)设计思路 设计第一个函数判断是否完数int factorsum( int number ) 定义sum.i:sum初始化归0, ...
- 浅谈CPU三级缓存和缓存命中率
CPU: CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多.缓存的出现主要是 为了解决CPU运算速度与内存读写速度不匹配的矛盾 ...
- 我自己总结的C#开发命名规范整理了一份
我自己总结的C#开发命名规范整理了一份 标签: 开发规范文档标准语言 2014-06-27 22:58 3165人阅读 评论(1) 收藏 举报 分类: C#(39) 版权声明:本文为博主原创文章, ...
- Mego(06) - 关系数据库建模
框架中提供了多种数据注释以便可以全面的描述数据库结构特性. 自增列 可以使用注释声明指定列是数据库自增列,同时能指定自增的起始及步长. public class Blog { [Identity(, ...