1. 前言:
l 针对采用exp方式导出的数据库文件,在imp导入的时候几点注意事项总结(expdb导出的可忽略)
l 本文档的书写顺序是按照操作流程步骤书写的,按文档顺序进行相关操作即可
l 该文档的所有sql等都是以lhphis(龙湖)为例,标红部分为注意事项
2. 导出数据库文件:
☞ 97上我放了一份清洗后的库导出文件,也可以直接采用这份数据库文件
exp bsszsk_ba/bsszsk_ba@192.168.10.144:1521/orclsk file=d:\bsszsk_ba_20180207.dmp owner=bsszsk_lh direct=y;
☞深圳社康的导入权限只有90(未实验过)和91(实验过)上具有。
3. 导入前的相关工作准备:
---创建表空间设置空间文件路径,默认设置
create tablespace LHPHIS
logging
datafile '+ORADATA/orclsk/LHPHIS01.dbf'
size 50m
autoextend on
next 50m maxsize 20480m;
☞
l 表空间的临时文件路径为'+ORADATA/orclsk/LHPHIS01.dbf'。 其中深圳社康项目的路径+ORADATA/orclsk/是固定的。也可采用如下sql查看或咨询相关人员
select * from dba_data_files
l 表空间创建错误时请采用如下sql删除:
drop tablespace LHPHIS including contents and datafiles;
--创建用户,设置默认表空间,授权
create user bsszsk_lh identified by bsszsk_lh default tablespace LHPHIS;
grant connect,dba, resource to bsszsk_lh;
--分配需要指定导入的表空间权限,回收exp导入的默认表空间
--(解决exp导出后imp导入指定不了表空间采用的还是导出的默认表空间问题,此步不可省略)
revoke unlimited tablespace from bsszsk_lh;
alter user bsszsk_lh quota 0 on PHIS;
alter user bsszsk_lh quota unlimited on LHPHIS;
4. 导入数据库文件:
imp bsszsk_lh/bsszsk_lh@192.168.10.144:1521/orclsk fromuser=bsszsk_ba touser=bsszsk_lh file=d:\bsszsk_ba_20180207.dmp log=d:\xx.log;
5. 导入过程中的查看:
---1、查看表空间总大小SQL:
select tablespace_name,sum(bytes)/1024/1024 from dba_data_files where tablespace_name like'LHPHIS' group by tablespace_name
--2、查看表空间已使用大小及分配情况:
select SEGMENT_TYPE,owner,sum(bytes)/1024/1024,tablespace_name from dba_segments where tablespace_name like'LHPHIS' and owner='BSSZSK_LH' group by segment_type,owner,tablespace_name
☞查看是否导入的指定表空间中,即指定表空间大小自增表大,原来的默认表空间大小不变。则表示导入正确
6. 导入后的查看和部分表导入失败处理:(导入完成后进行)
--dba权限也查看不了其他用户的user_tables表数据,所以我们先在bsszsk_lh用户下创建此表的备份表
create table user_tables_bak as select * from user_tables;
---然后登陆至bsszsk_ba下查看导入成功表的数量
select count(1) from BSSZSK_LH.user_tables_bak;----991
--结合bsszsk_ba下的user_tables和bsszsk_lh下的user_tables_bak查询出导入失败的表,并通过sql拼接成可执行sql
select 'create table BSSZSK_LH.'|| a.TABLE_NAME || ' tablespace LHPHIS as select * from ' || a.TABLE_NAME || ';' from user_tables a where a.TABLE_NAME not in (select b.TABLE_NAME from BSSZSK_LH.user_tables_bak b)
--在把上述sql执行的所有结果粘贴拷贝出并执行
--执行后再切换至bsszsk_lh用户查询user_tables表的数量(若发现比bsszsk_ba用户查询user_tables表的数量多1则说明成功,因为我们前面创建一个user_tables的备份表user_tables_bak)
--删除掉备份表user_tables_bak,再查询比较即可发现表的数量完全一致了(其他数据库对象可参考进行处理)
7. 数据清洗:
☞这里有两只方式进行:
l 如果是采用97上的导出文件,但部分表数据还需要进行清洗与处理
(ms_brda 以前的基层业务清除脚本没有,导致97上的未删除,下面的附件脚本已加
base_user base_userroles 人员用户相关的表需要单独处理)
后面的深圳社康自己加的表需要单独处理
l 自己导出的文件附带下面的2份清除业务数据脚本
后面的深圳社康自己加的表需要单独处理,上面的脚本是从省厅拿来的。
【删除出现主外键引用问题时】
方法一:
--查询表的主键约束名
select * from user_constraints e where e.table_name=’’--处输入表名(区分大小写,一般都是大写)
--查询所有引用到该主键的记录
select b.table_name,b.column_name from user_constraints a
inner join user_cons_columns b
on a.constraint_name = b.constraint_name
where a.r_constraint_name='' --此处输入刚才查询出来的表主键的约束名
--按顺序先删除主键引用表的数据,再删除该表即可
方法二:解决按上述方法一不行的部分表
--1.按上面的查询出所有引用到该主键的记录
--2.删除子表的数据,再失效子表的外键约束
TRUNCATE TABLE 表名
ALTER TABLE 表名 DISABLE CONSTRAINT FK_PERSON_DEPT
--3.再次执行删除父表数据的操作
TRUNCATE TABLE 表名
--4.生效外键约束
ALTER TABLE 表名 enable CONSTRAINT FK_PERSON_DEPT
8. 未尽事项请进行文档的补充与优化,谢谢大家。