一、exp/imp按用户导出,导入(兼容性强,可以导出对象可以自定义),可夸版本及平台,存在即跳过。
1.确认两边环境的语言及编码相同
客户端导出编码:NLS_LANG,chcp,
查看注册表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\
设置:C:\Users\Fang>set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
数据库编码:
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; -- ZHS16GBK 数据库
select * from nls_database_parameters where parameter ='NLS_NCHAR_CHARACTERSET'; -- AL16UTF16 国家
2.创建与源库相同的表空间
查询表空间位置
SELECT TABLESPACE_NAME,FILE_ID,FILE_NAME,ROUND(BYTES / (1024 * 1024), 0) TOTAL_SPACE
FROM DBA_DATA_FILES ORDER BY TABLESPACE_NAME;
创建表空间
create tablespace USERS1 datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS101.DBF'
size 20M reuse autoextend on next 5m;
表空间增加数据文件
alter tablespace USERS1 add datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS102.DBF' size 5M;
可通过导出DMP文件查看确认具体用户及权限设置
3.创建源库相同的用户,指定用户默认的表空间
SELECT 'create user ' || USERNAME || ' identified by ' || USERNAME ||
' default tablespace ' || DEFAULT_TABLESPACE ||' ; ' FROM DBA_USERS;
用户分配连接和资源权限(system要有的权限,用sys用户给system授权)
GRANT EXP_FULL_DATABASE,IMP_FULL_DATABASE TO SYSTEM;
GRANT CONNECT,RESOURCE,create view,unlimited tablespace TO scott;
alter user scott default role all;
4.按用户导出导入库数据
exp system/system@orcldb file=c:\multi_owner.dmp log=c:\multi_owner.log owner=(BI,HR,SCOTT)
imp system/system@orcldb file=c:\multi_owner.dmp log=c:\multi_owner.log fromuser=(BI,HR,SCOTT) touser=(BI,HR,SCOTT)
imp system/system@orcldb file=c:\multi_owner.dmp log=c:\multi_owner.log full=y
5.全库导出按用户导入数据(导入时用户顺序不依照书写顺序进行,可查看导入日志的顺序,全库导入比较慢)
exp system/system@orcldb file=c:\daochudi_system_duoyonghu.dmp full=y LOG=c:\daochudi_system_duoyonghu.log
imp system/system@orcldb file=c:\daochudi_system_duoyonghu.dmp log=c:\multi_owner316_2.log fromuser=(BI,SCOTT) touser=(BI,SCOTT)
6.核对源库与目标库信息
select owner,count(object_id) total_obj,object_type type from dba_objects group by owner,object_type order by owner;
二、数据泵按方案导出导入,只支持10g及以后版本,只能在服务器端执行,导出导入时候不需要设置字符集,需指定Directory
1.在目标库上创建需要的表空间,不用创建用户
2.在源库创建目录按方案导出数据
create directory dump_exp as 'C:\exp';
grant read , write on directory dump_exp to BI,HR,SCOTT,system;
expdp system/system@orcldb directory=dump_exp dumpfile=users.dmp logfile=expdp_test.log schemas=BI,HR,SCOTT
3.目标库上创建目录按方案导入数据
create directory dump_imp as 'C:\imp';
grant read , write on directory dump_imp to BI,HR,SCOTT,system;
impdp system/system@orcldb directory=dump_imp dumpfile=users.dmp logfile=expdp_test_imp.log schemas=BI,HR,SCOTT
三、冷备迁移:
要求源数据库与目标数据库sid、实例名、归档模式、数据块大小、数据库大版本,所在OS及硬件平台相同,文件结构
尽量一致(可修改)。要求目标数据库服务器要安装数据库软件,可以没有实例。
1、收集源库上的数据块结构信息(spfile,passwordfile,dbf,ctl,log,archive,flashback等)
select INSTANCE_NAME,VERSION from v$instance;
select NAME,LOG_MODE,FLASHBACK_ON from v$database;
select name,block_size,bytes/1024/1024 from v$tempfile;
select name,block_size,bytes/1024/1024 from v$datafile;
select name from v$tablespace;
select name,block_size,status from v$controlfile;
select GROUP#,SEQUENCE#,BYTES/1024/1024,MEMBERS,STATUS from v$log;
select GROUP#,STATUS,MEMBER from v$logfile;
show parameter spfile;
select dest_name,status,destination from v$archive_dest;
show parameter db_recovery_file_dest;
2、操作源库创建目标库实例,确保数据库sid、实例名、归档模式、数据块大小相同,文件目录尽量相同
3、正常关闭源库、目标库,冷备,将源库文件考至目标库对应目录,注意参数文件中需要的路径都要有
4、确认两库的环境变量,逐步启动数据库,查询确认各类文件
5、执行utlrp.sql脚本,编译所有无效对象。
6、检查目标库的监听和tnsnames.ora文件,确保监听正常,通过网络服务名访问正常
7、迁移技巧
拼接生成拷贝语句(两机器映射磁盘,共享等方式拷贝)
select 'scp '||name||' z:\orcl\'|| substr(name, instr(name, '\', -1) + 1) cmd from v$controlfile
两库路径文件路径不同时修改语句(ctl,dbf,log,tmpfile)
startup nomount
alter system set control_files='/oradata/orcl/control01.ctl','/oradata/orcl/control02.ctl' scope=spfile;
alter database rename file '' to '';
select 'ALTER DATABASE RENAME FILE '''||name||''' to ''d:\oradata\orcl\'|| substr(name, instr(name,
'\', -1) + 1)||'''; ' cmd from v$datafile;
四、网内利用DBLINK迁移
配置目标库到源库的网络服务名,tnsnames.ora确保可以正常连接源库
创建DBLINK
create [public]database link DB_Link_name connect to username identified by passwd using 'connectstaring';
访问对象要通过 objectname@DB_Link_name,可以创建同义词
create synonym synonym_name for table_name@DB_Link;
五、利用RMAN迁移数据库(利用丢失控制文件完全恢复原理)
主要优点是可以跨操作系统硬件平台?
1.全备源库:
run{
sql 'alter system switch logfile';
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/u01/backup/rman_%d_%s_%p.bak' include current controlfile plus archivelog delete input format '/u01/backup/arch_%U.bak';
}
2.将源库的备份集拷贝至目标库目录(同一个目录),pfile,口令文件,联机日志文件拷贝至目标库对应目录
3.目标库上利用pfile启动到 nomount 还原控制文件,还原恢复数据库
startup nomount pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initipemsdb.ora';
restore controlfile from '/u01/app/backdir/rman/controlfile/c-2694191837-20150811-00';
alter database mount;
restore database;
recover database;
4.如果未拷贝日志文件,因为控制文件记录的日志文件不同可以手动取消恢复。
SQL> conn / as sysdba
Connected.
idle> recover database until cancel;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 608805162 generated at 10/13/2012 06:31:44 needed for thread 1
ORA-00289: suggestion : /u02/database/SY5221/archive/arch_668881377_1_143388.arc
ORA-00280: change 608805162 for thread 1 is in sequence #143388
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel #输入cancel,完成介质恢复
Media recovery cancelled.
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 08/14/2015 04:16:04
RMAN-06054: media recovery requesting unknown log: thread 1 seq 95 lowscn 4134339
recover database;
alter database open resetlogs;
六、利用 RMAN duplicate 命令克隆复制数据库
1.备份源库dbf,ctl,archvielog,并将备份集拷贝至目标库相同目录
2.拷贝源库的pfile值目标库,并修改必要信息,如数据库名称、实例名称
3.配置源库与目标库的网络连接
4.目标库创建密码文件,并通过pfile启动数据库至nomount状态
orapwd file=D:\oracle\product\10.2.0\Db_1\database\PWDPETER.ora password=oracle entries=3
5.连接源库和目标库运行rman复制命令,还原所有数据文件,重新创建控制文件,并利用新的参数文件启动恢复
数据库到一致状态,最后用resetlog方式打开数据库,创建指定的redolog。复制命令也可以从磁带上的备份进行
复制,并改变数据库名称,也可以改变数据库文件的新的路径以及恢复到以前的时间点,跳过不需要复制的表空
间等。
RUN{
ALLOCATE AUXILIARY CHANNEL newdb1 DEVICE TYPE disk;
DUPLICATE TARGET DATABASE TO ipemsdb
lOGFILE
GROUP 1 ('/u01/app/oracle/oradata/ipemsdb/onlinelog/redo01_1.log',
'/u01/app/oracle/oradata/ipemsdb/onlinelog/redo01_2.log') SIZE 50m,
GROUP 2 ('/u01/app/oracle/oradata/ipemsdb/onlinelog/redo02_1.log',
'/u01/app/oracle/oradata/ipemsdb/onlinelog/redo02_2.log') SIZE 50m,
GROUP 3 ('/u01/app/oracle/oradata/ipemsdb/onlinelog/redo03_1.log',
'/u01/app/oracle/oradata/ipemsdb/onlinelog/redo03_2.log') SIZE 50m REUSE;
}
克隆的数据库因dbid相同,无法同时使用rman catalog可以修改dbid
参考资料:
file:///F:/oracle/官方文档/10G/10G/server.102/b14215/dbnewid.htm#i1005317
七、手动复制数据库实例(源数据库名称: orcl,目标库:Peter)
1.参照源库创建目标库需要的文件目录
数据库文件目录(dbf,ctl,redo)
运行信息目录../admin/目录(各种dump)
生成参数文件,修改pfile的方式生成
创建密码文件
orapwd file=D:\oracle\product\10.2.0\Db_1\database\PWDPETER.ora password=PETER entries=3
创建Oracle实例服务(通过命令行进行创建,服务名称为OracleServicePETER)
oradim –new –sid PETER–intpwd PETER;
2.将源库的控制文件生成trc文件,修改创建控制文件脚本中数据库实例名,将reuse修改为set,同时修改数据文件和日志文件
的目录为目标数据库存在的目录。
3.通过冷备方式将源库的数据库文件目录拷贝至目标库(dbf,log)
4.配置开库
先启动目标数据库PETER的数据库服务,OracleServicePETER
sqlplus /nolog
conn / as sysdba
startup nomount
脚本创建控制文件
alter database mount
alter database open resetlogs
5.配置目标库的监听和tnsnames.ora
八、RMAN 跨平台迁移
用RMAN做整库迁移,比较方便,主要优点是可以跨操作系统硬件平台。面是一个将linux系统迁移到wimdows系统
的具体实施步骤(当然在32位linux和32位windows之间,可以直接复制数据文件,无需这么麻烦,此处为举例演示)
1.以read only模式打开数据库
startup open read only;
2.转换数据文件
RMAN target /
run{
convert database transport script '/home/Oracle/temp/transcript.sql'
on target platform convert script '/home/oracle/temp/convert.sql'
to platform 'Microsoft Windows IA (32-bit)'
db_file_name_convert('/oracle/oradata/orcl','/home/oracle/temp');
};
3.将参数文件、数据文件、转换脚本,拷贝到windows平台上
4.在windows平台上建立数据库实例,然后依次执行脚本convert.sql、transcript.sql
5.打开数据库,执行utlrp.sql,编译无效数据库对象。
参考资料:
http://blog.csdn.net/evils798/article/details/8470342
http://blog.csdn.net/davidhsing/article/details/6408770