Oracle迁移,数据泵、dblink(同库异库适用,跨版本)

Oracle迁移,一般是从低版本向高版本迁移,当然低版本到高版本还可以升级。

如果可以访问数据库所在操作系统主机,则最好使用数据泵,这种方法简单而且速度快。

也可以使用impdp + database link,可以在同一个数据库内,或不同数据库(可能版本不同)间复制schema(一个用户下的所有对象,Oracle中schema和用户是一个概念),下面记录复制过程。

1、了解源schema的相关信息

用户名、密码、表空间,通常场景是,将一个schema的所有对象复制到另一个schema,目的schema的所有对象要放到一个新的表空间,源schema和目的schema的名称和表空间名称都不同。

根据需要决定目标schema的数据所在表空间,可选方案有:

a)如果是同库复制,可以不为目标schema创建表空间,这样,源schema的对象在哪个表空间,目的schema的对象就在哪个表空间。

b)创建一个新的表空间,目的schema的所有对象都放在这个表空间里。

c)源schema的对象可能放在多个不同的表空间里,为目的schema创建多个对应表空间。

d)占用表空间的对象包括表、索引,可以用下面SQL查看源schema的表和索引都在哪些表空间里。

select count(TABLE_NAME), TABLESPACE_NAME from user_tables group by TABLESPACE_NAME;

select count(INDEX_NAME), TABLESPACE_NAME from user_indexes group by TABLESPACE_NAME;

查看用户表空间

select tablespace_name from user_tablespaces;

查看用户的表都分布在哪些表空间里

select tablespace_name from dba_segments where owner='SUANLI' group by tablespace_name;

2、在目标数据库创建用户和表空间

在同库或目标库创建用户和表空间:

create tablespace nmpaassunli datafile '/mnt/disk02/oradata/nmpaassunli01.dbf' size 2048m autoextend on next 2048m maxsize 30G;
create user nmpaassunli identified by Paassunli2022 default tablespace nmpaassunli;
grant connect, resource to nmpaassunli;

grant create session to nmpaassunli;

grant dba to nmpaassunli ;

grant imp_full_database to nmpaassunli;

grant exp_full_database to nmpaassunli;
alter user nmpaassunli quota unlimited on nmpaassunli;

3、在源数据库用数据泵导出

在源数据库上执行下面命令,导出suanli用户的所有对象,和表数据:

expdp suanli/abcTEST@123 schemas=suanli 

如果成功导出会显示导出文件的路径,我使用默认路径,例如:

/mnt/data/u01/app/oracle/admin/orcl12c/dpdump/expdat.dmp

4、在目标数据库导入

在目标数据库创建目录,然后把expdat.dmp放在这个目录下(当然需要远程拷贝):

create directory dumpdir as '/mnt/data/';

导入expdat.dmp:

impdp  suanli/abcTEST@123 schemas=suanli directory=dumpdir dumpfile=expdat.dmp cluster=no exclude=statistics transform=disable_archive_logging:y remap_tablespace=user:suanli

 以下是用impdp+database link,这种方案源端不需要导出dmp文件,在目标端直接连源端。

5、在目标数据库,创建到源数据库的TNS连接项

如果是同库,tnsnames.ora里面应该已存在连接到自己的名字,例如:

vim $ORACLE_HOME/network/admin/tnsnames.ora

NLPASS01 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.32.150.13)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = nlpass01)
    )
  )

测试连接

sqlplus nmpaassunli/Paassunli2022@NLPASS01

6、在目的数据库中,创建到源数据库的dblink

create public database link suanlitest_link connect to suanlitest identified by Suanlitest_0803 using 'NLPASS01';

其中suanlitest_link是dblink的名称,后面用数据泵的时候要指定,suanlitest 是源数据库的用户名(schema),Suanlitest_0803 是密码,using 'NLPASS01'是tnsnames.ora里的连接项。dblink是一种表示目的数据库连接源数据库的对象。

也可以不配置tnsnames.ora,直接使用原数据库IP端口和SID

create public database link suanlitest_link connect to suanlitest identified by Suanlitest_0803 using '10.235.138.83:1521/orcl19c';

7、impdp+dblink导入

在目的数据库上执行下面命令导入:

impdp nmpaassunli/Paassunli2022 network_link=suanlitest_link schemas=suanlitest cluster=no exclude=statistics,grant parallel=5 TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y remap_schema=suanlitest:nmpaassunli remap_tablespace=suanlitest:nmpaassunli,tab_paastest:nmpaassunli,paas2:nmpaassunli

schemas=suanlitest  -- 导出源数据库用户suanlitest下的所有对象(表、索引、约束、序列、存储过程等等)

exclude=statistics,grant -- 不导出统计数据和grant,统计数据可以导完后再生成。我排除grant是因为出错,也许应该导出grant。

remap_schema=suanlitest:nmpaassunli -- 源用户(schema)到目的用户的映射

remap_tablespace=suanlitest:nmpaassunli,tab_paastest:nmpaassunli,paas2:nmpaassunli  --  源表空间到目的表空间的映射,例如这里,原来表空间suanlitest、tab_paastest、paas2里的对象都复制到nmpaassunli用户的nmpaassunli表空间里了,如果这个配置项没有,新的nmpaassunli用户的对象还会复制到suanlitest、tab_paastest、paas2表空间里。

注意,如果报错:

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-39145: directory object parameter must be specified and non-null

可能是目的数据库DATA_PUMP_DIR没有设置,或者用户权限问题,可以尝试创建DATA_PUMP_DIR和用户赋权:

create directory DATA_PUMP_DIR as '/mnt/disk01/oracle/admin/paas/dpdump/';

grant exp_full_database to nmpaassunli;

grant imp_full_database to nmpaassunli;

8、更新统计数据

在目标库上执行:

exec dbms_stats.gather_schema_stats(ownname=>"SUANLI");

9、plsql develpor连接错误

如果连接新迁移后的19c有ORA-28040报错,尝试修改服务器端$ORACLE_HOME/network/admin/sqlnet.ora

SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8 

然后重启数据库,重新设置一遍用户密码(与原密码相同就行) 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值