oracle数据库的迁移(从一台服务器到另一个台服务器,从oracle 10g到oracle 11g)
这个过程呢,还是蛮艰难的。。。。
一、最初我使用的是Navicat中的数据传输来迁移的,虽说整个数据库的迁移没有成功,但传输指定的对象时还是传输成功了。所以还是记录一下吧。
1.前提连接好数据库。在指定的数据库上右击,选择“数据传输”。
2.在弹出的框内选择源库和目的库以及模式和你要传输的对象,如下图所示
3.点击开始便可传输
二、在利用Navicat只可传输对象,没办法传输模式等。但是如果要迁移整个数据库,肯定不仅只有迁移对象这么简单了。于是我选择了expdp和impdp导入导出的方法来迁移。
1.从源数据库中导出(我是远程连接数据库导出的,本机windows,远程linux)
expdp userid=\'sys/oraclepwd@210.77.71.23:1521/orcl as sysdba\' directory=data_pump_dir dumpfile=234backup.dmp logfile=235back.log version=11.2.0.1.0 full=y
下面我具体介绍一下参数吧:
(1)userid主要是获取数据库的连接
sys=>用户名;oraclepwd=>密码;210.77.71.23=>远程服务器IP地址;1521=>端口号;orcl=>数据库名;as sysdba=>如果连接sys用户,需要写这个,如果是普通用户就不写了。(注:在windows下的dos命令下加as sysdba可以正常运行,但是你如果利用xshell远程连接到服务器上做导出,即使是sys用户也不要加as sysdba,运行时会报错。不加的话运行时会自己提示让你输入用户名和密码)。
(2)directory=data_pump_dir是存放导出文件的目录,你无需纠结到底存放到哪里了,因为在导出成功后,在末尾系统会告诉你导出的路径。
(3)dumpfile是导出的文件的名字,这个需要你自己指定。
(4)logfile是你导出的过程中运行的日志,会记录在这个文件里。如果报错,你可以在这个文件里面找对应的错误。
(5)version:这里的version不是源数据库的版本,而是目标数据库的版本
(6)full=y就是全部导出的意思。包括用户,表空间,表等。如果你想导出指定模式下的对象,你可以使用schemas参数来指定。(注:schemas参数和full参数不能同时用)
如果你导出指定的表,视图等,expdp也有相应的参数,你可以自己百度一下,这里就不做详细介绍了。
2.导入目标数据库(相对导出,导入就变得很麻烦了。我是直接利用xshell远程登录到服务器上做的导入)
注:
(1)做导入时,建议你尽量新建一个实例来导入。你如果在原来的实例中导入的话,如果有相同表名或模式等的话,它会先删除在重新创建。不过也有阻止导入时删除的方法,但是如果迁移整个数据库的话,会让你很觉得很混乱,除非你很了解源数据库和目标数据库的模式及其对象等。
(2)运行下面命令之前,你要现将你导出的dmp文件复制到目标数据库的directory目录下。有点悲剧的是,有可能你不知道这个目录在哪,这时你可以在目标数据库做一个小的导出,在末尾查看这个目录,将dmp文件复制到这个目录下即可。
impdp userid=\'sys/admin@127.0.0.1:1521/db11\' directory=data_pump_dir dumpfile=234backup.dmp logfile=235back.log
REMAP_DATAFILE=\'/opt/oradata/db10/sdbp.dbf\':\'casnw/app/oradata/db11/sdbp.dbf\',\'/opt/oradata/db10/sdbptemp01.dbf\':\'casnw/app/oradata/db11/sdbptemp01.dbf\',\'/opt/oradata/db10/casnw01.dbf\':\'casnw/app/oradata/db11/casnw01.dbf\',\'/opt/oradata/db10/casnwtemp01.dbf\':\'casnw/app/oradata/db11/casnwtemp01.dbf\',
version=11.2.0.1.0 full=y TABLE_EXISTS_ACTION=REPLACE
前面几个参数不做介绍了,和expdp中同样意思。下面我介绍一下新增的几个参数吧:
REMAP_DATAFILE:因为这个参数我也是被折腾的够呛的。经过日志查看导入的过程是这样的。先建立表空间,在通过表空间建立对应的用户,在建表,传输数据。传输视图,函数和存储过程,序列等。但是在建表空间的过程中就报错了,说找不到指定的数据文件的路径。因为源数据库中存数表空间数据文件的路径和目标数据库中的不同。这是就要用到这个参数了,用这个参数指定目标数据库建立表空间数据文件的路径,用来替换源数据库的路径。这样就可以创建表空间了。
TABLE_EXISTS_ACTION:这个参数共有四种值,在这里我一一介绍下。(1)skip:是如果已存在对象,则跳过并处理下一个对象;(2)append是为表增加数据;(3)truncate是截断表,然后为其增加新数据;(4)replace:如果遇到已存在的表,则先删除,再创建一个。并加数据。
以上导入方法,在导入存储过程时会报错,我在网上查看了下,说是要在导出前或导入后重新编译一下。存储过程未导入成功,于是最后我利用navicat导入存储过程成功了。
注:(1)要确保两个数据库的字符集相同,如果不同会报错。我的查了下两个数据库字符集相同,所以具体报什么错我也不太清楚。查看数据库字符集:
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN (\'NLS_CHARACTERSET\', \'NLS_NCHAR_CHARACTERSET\');
(2)因为整个数据库迁移过去,所以导致你的目标数据库的sys用户密码会变成源数据库sys用户的密码,你后期改过来即可
SQL>sqlplus /nolog
SQL>connect sys /as sysdba
SQL>alter user sys identified by admin;