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
然后重启数据库,重新设置一遍用户密码(与原密码相同就行)