解决采用exp方式导出的数据库文件,导入指定表空间问题

1.     前言:

针对采用exp方式导出的数据库文件,在imp导入的时候几点注意事项总结(expdb导出的可忽略)

l  本文档的书写顺序是按照操作流程步骤书写的,按文档顺序进行相关操作即可

l  该文档的所有sql等都是以lhphis(龙湖)为例,标红部分为注意事项

 

2.     导出数据库文件:

☞ 97上我放了一份清洗后的库导出文件,也可以直接采用这份数据库文件

exp bsszsk_ba/[email protected]: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/[email protected]: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.     未尽事项请进行文档的补充与优化,谢谢大家。

你可能感兴趣的:(sql)