数据库迁移、重组、备份、恢复可以有如下几种处理方式:
1.导出、导入用户
1.1导出用户
exp
system/oracle@orcl
file=c:\ies20101009.dmp log=c:\ies20101009_exp.log owner=(ies) buffer=655000 compress=y
1.2导入用户
connect
system/oracle@orcl
;
--删除用户--
drop user ies cascade;
--删除表空间--
drop tablespace iests including contents;
--创建表空间--
create tablespace iests datafile 'D:\oracle\oradata\orcl\iests.dbf' size 200m reuse autoextend on next 50m;
--创建用户并授权--
create user ies identified by oracle default tablespace iests;
grant resource,connect to ies;
grant select any dictionary to ies;
grant select any sequence to ies;
grant create any table,alter any table,drop any table to ies;
grant select any table,insert any table,update any table,delete any table to ies;
grant create any trigger,alter any trigger,drop any trigger to ies;
grant create any procedure,alter any procedure,drop any procedure,execute any procedure to ies;
grant create any view,drop any view to ies;
grant create any synonym to ies;
grant create any snapshot to ies;
--导入dmp--
imp
system/oracle@orcl
fromuser=(ies) touser=(ies) buffer=655000 ignore=y file=c:\ies20101008.dmp log=c:\ies20101008_imp.log
1.3总结
导出、导入用户的操作是备份、恢复的主要方法,该方法非常稳定,一般不会产生异常或报错的信息。
需要注意的是在oracle不同版本之间备份和恢复时,导入、导出需要是同一个版本的数据库,即需要将10g的数据库备份到9i时,需要用9i的客户端连接10g的数据库进行导出,然后在用9i进行导入。
导入、导出常遇到的问题有:1.字符集不匹配,一般使用NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK,2.客户端版本不对,10.0.2.0.1不能导入到10.0.2.0.3的数据库中。
在数据库恢复时(导入),需要停止web服务,是数据库处于不被连接的状态,否则用户删除时报错,不能被删除。
如果不删除用户,只删除表空间,将导致用户下的object不能被删除(object包括function,procedure,synonym,package,Javasource,javaclass等),同样object不能被导入。
2.导出、导入表
2.1 导出表
exp
ies/oracle@orcl
tables=(YJ_FDKKX,YJ_FDQYCWYB,YJ_FDQYCWZB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_exp.log compress=n direct=y
2.2 导入表
2.2.1 删除表中数据(是否需要删除表中数据需要依据实际情况而定)
truncate table YJ_FDKKX;
truncate table YJ_FDQYCWYB;
truncate table YJ_FDQYCWZB;
truncate table YJ_FDQYDLSCQKB;
提示:
truncate table YJ_FDQYCWZB;
ORA-02266: 表中的唯一/主键被启用的外部关键字引用
delete from YJ_FDQYCWZB;
--12 rows deleted
结论:
truncate 不能够用于删除父表中的数据,delete则可以在满足外键约束的情况下删除父表中的数据。
2.2.2 导入可能存在的问题
imp
ies/oracle@orcl
tables=(YJ_FDKKX,YJ_FDQYCWYB,YJ_FDQYCWZB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
导入时要注意表之间的外键关系,需要先导父表,再导子表
imp
ies/oracle@orcl
tables=(YJ_FDKKX,YJ_FDQYCWZB,YJ_FDQYCWYB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
导入时即使注意到表之间的外键关系,需要先导父表,再导子表,同样导子表时也会提示违反完整性约束,即导入的顺序由导出顺序决定。
imp
ies/oracle@orcl
tables=(YJ_FDQYCWYB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
导入子表时提示违反完整性约束,可以二次单独导入子表,导入正常。
2.2.3 导入问题的处理
调整导出顺序:先导父表,再导子表
exp
ies/oracle@orcl
tables=(YJ_FDKKX,YJ_FDQYCWZB,YJ_FDQYCWYB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_exp.log compress=n direct=y
imp
ies/oracle@orcl
tables=(YJ_FDKKX,YJ_FDQYCWZB,YJ_FDQYCWYB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
导入正常。
2.3 总结
对表的导出导入不像对用户的导出导入那样稳定,主要是因为表之间存在着外键关系,表中字段也存在着约束,还有唯一索引的约束。
对于导入实在困难时可以考虑数据优先,即先删除或失效这些约束,导入数据后,再重建或启用这些约束;在重建或启用些约束时,如果数据不满足条件,需要具体考虑数据的修复问题。将约束失效的操作包括将相关触发器失效和将外键约束失效。
3.直接路径插入
直接路径插入是通过已有表及表中数据构建新的表,
该功能只能创建表结构及生成表中的数据,不能创建表的主键、外键、约束等
create table YJ_FDKKX_temp as select * from YJ_FDKKX;
create table YJ_FDQYCWYB_temp as select * from YJ_FDQYCWYB;
create table YJ_FDQYCWZB_temp as select * from YJ_FDQYCWZB;
create table YJ_FDQYDLSCQKB_temp as select * from YJ_FDQYDLSCQKB;
commit;
4.sql*loader
4.1 sql*loader作用:用于将少量文本型数据加载到数据库中(对于字符型、数字型该方法适用,对于日期型、大对象型不适用该方法)
4.2 sql*loader命令:sqlldr scott/tiger control=ulcase6.ctl log=ulcase6.log direct=true;
4.3 ulcase6.ctl是控制文件,需要手工编写,分为两种情况:
4.3.1 将数据一起写在控制文件中
load data
infile *
insert into table scott.dept
fields terminated by ',' optionally enclosed by '"'
(deptno,dname,loc)
begindata
10,account,new york
20,research,dallas
30,sales,chigago
4.3.2 数据文件与控制文件分开(ulcase6.dat是数据文件)
load data
infile 'ulcase6.dat'
insert into table emp
(empno position(01:04) integer external nullif empno=blanks,...)
4.4 限制
4.4.1 sql*loader insert 时表必须为空。
sqlldr
ies/oracle@orcl
control=C:\temp\YJ_FDQYCWYB_TEMP.ctl log=C:\temp\YJ_FDQYCWYB_TEMP.log direct=true;
sql*loader insert 时表必须为空。
delete from YJ_FDQYCWYB_TEMP;
commit;
4.4.2 sql*loader 只能将少量文本型数据加载到数据库中,不能处理日期类型
sqlldr
ies/oracle@orcl
control=C:\temp\YJ_FDQYCWYB_TEMP.ctl log=C:\temp\YJ_FDQYCWYB_TEMP.log direct=true;
表 YJ_FDQYCWYB_TEMP 的列 CDATE 出现错误。
ORA-01861: 文字与格式字符串不匹配
select cdate from YJ_FDQYCWYB where id='375E892B4D0F4B8081D61C518A14E6C2'
2010-12-1
update YJ_FDQYCWYB set cdate=2010-12-1 where id='375E892B4D0F4B8081D61C518A14E6C2';
4.5 总结
sql*loader 不能加载日期类型导致其处理功能十分有限,且整理控制文件和数据文件也相对比较麻烦,一般不建议使用。
5.将execl中数据导入到oracle中
步骤:
1.生成execl文件
对于不存在的数据:手动编辑execl文件;
对于数据库中存在的数据:在pl/sql developer的sql windows 窗口查询数据,并copy to Execl,删除首列行序号的信息,
如果某列被进行了科学计数法,则将该列选中,点格式-》单元格-》数字-》数值-》-1234 即可。
2.把Excel文件另存为文本文件(制表符分隔)(*.txt)
3.用pl/sql developer工具导入文本文件
3.1 打开pl/sql developer->tools->Text Importer,选中要导入的文本文件,
3.2 在data to oracle 中维护 用户名、表名,在fields中可以看到文本文件中的列与数据字段进行了对应,对日期类型的属性要单独选中维护格式转换
3.3 但看到import与 import to Script 可以操作时,便可以用import将数据导入到数据库中(切记:该按钮只能点一次,多次点击可能导致数据被重复导入);
import to Script 不能直接将数据导入到数据库中,而是生成insert 语句。建议生成insert语句,在执行insert语句可以加入spool记录日志信息。
4.总结:
pl/sql developer->tools->Text Importer工具封装扩展了sql*loader的功能,解决了sql*loader只能导入文本型数据的限制。
pl/sql developer->tools->Text Importer工具可以实现单表的数据备份功能,为数据迁移提供的一种可选途径(对于大对象仍需要单独处理)。
可以支持单独导数据,不导表结构的功能,补充了exp导出表的缺陷。
6.pl/sql developer工具用途(单独导库结构)
1.pl/sql developer->tools->Export User Objects 导出整个用户的所有对象(如果选中单个对象『如:表X_RY』,便可以导出单个对象的结构),将数据库结构(导成脚本)
2.pl/sql developer->tools->Find Database Objects 查找数据库对象
3.pl/sql developer->tools->Compile invalid Objects 编译对象(有效)
4.pl/sql developer->tools->Compare User Objects 对比数据库对象(适用于对比两个数据库中相同对象的区别)
5.pl/sql developer->tools->Sessions 看起来很有用,随后研究
6.pl/sql developer->tools->Export Tables 导出表(1.oracle export 调用的oracle的exp命令,生成dmp文件。2.sql inserts 将表结构、约束、相关主键、外键、触发器、及数据全部导出成脚本。3.pl/sql developer 导出文件是pde格式,pde格式文件只能在import tables-->pl/sql developer中使用,且没有sql inserts功能强大,不建议使用。)
7.pl/sql developer->tools->Import Tables 有三个窗口 oracle import 选中oracle的dmp文件调用的oracle的imp命令;
sql inserts 选中*.sql文件,并执行该文件;pl/sql developer 需要选中pl/sql developer的导出文件(pde文件),*.dmp、*.sql文件均不能选择。
8.pl/sql developer->tools->Compare Table Data 对比表中数据(适用于对比两个数据库中相同表的数据的区别) 与4比较类似
7.自行构造抽数据的sql(单独导数据)
7.1 功能:将数据抽成insert语句,保存在文件中
7.2 写法(语句)
set heading off;
spool c:\temp\6-data.sql;
select 'insert into TX_BMZJ (ID,MC,SJBM,ZZLJ,XTML) values ('''||ID||''','''||MC||''','''||SJBM||''','''||ZZLJ||''','''||XTML||''');' from TX_BMZJ;
select 'insert into TX_RY (ID,MC,XB,ZW,BGDH,YDDH,QYMC,SSMB) values ('''||ID||''','''||MC||''','''||XB||''','''||ZW||''','''||BGDH||''','''||YDDH||''','''||QYMC||''','''||SSMB||''');' from TX_RY;
select 'insert into XT_BM (ID,FID,MC,BZ) values ('''||ID||''','''||FID||''','''||MC||''','''||BZ||''');' from XT_BM;
select 'insert into XT_JS (ID,MC,BZ) values ('''||ID||''','''||MC||''','''||BZ||''');' from XT_JS;
select 'insert into XT_XTCS (ID,FZM,CSM,CSZ,BZ) values ('''||ID||''','''||FZM||''','''||CSM||''','''||CSZ||''','''||BZ||''');' from XT_XTCS;
spool off;
set heading on;
7.3 限制
必须清楚表结构,需要手工构造,生成的文件中包含没有用的信息
7.4 总结
正在试图通过存贮过程将手工构造的限制取消掉。
8.对于大对象的单独导入、导出
oracle操作文件
9.建数据库连接并同步数据
9.1 建数据库连接
create database link ies207 connect to "ies" identified by "ies2010" using 'ies207';
9.2 用A数据库同步B数据中的表的数据
-- select * from
ies.yj_dmxxrb@ies207
where rownum<3;
-- select * from yj_dmxxrb where rownum<3;
delete from
ies.yj_dmxxrb@ies207
;
insert into
ies.yj_dmxxrb@ies207
(ID,DCID,ZZJRL,JZGC,FDL,GML,HML,DMKC,KYTS,QMTJTS,QMTJRL,CDATE ) select ID,DCID,ZZJRL,JZGC,FDL,GML,HML,DMKC,KYTS,QMTJTS,QMTJRL,CDATE from yj_dmxxrb;
9.3 限制
drop table
ies.yj_dmxxrb@ies207
;
create table
ies.yj_dmxxrb@ies207
as select * from yj_dmxxrb;
ORA-02021: 不允许对远程数据库进行 DDL 操作
9.4 总结
对于多个数据库而言数据库连接是很有效的,
对于复杂的功能可以用存贮过程同步,再用job定时触发。
10. 可传输的表空间
知识点:
1.mstsc 远程连接
regedit 注册表
regsvr32 /s AUTOMENU.DLL 注册dll