Oracle单实例环境使用数据泵(Data Pump)跨平台数据迁移

2021-04-22 17:14:54 浏览数 (1)

生产上遇到单实例跨平台迁移情况,以下为迁移过程,有不完善的地方欢迎提出改进

一、源库及目标库情况

源库

目标库

IP

10.0.15.XX

10.0.16.XXX

系统版本

windows 2008

CentOS Linux release 7.6.1810 (Core)

数据库版本

11.2.0.4.0

11.2.0.4.181016 (28204707)

内存GB

64

32

数据量GB

30

二、迁移方案

源库未开启归档,采用数据泵方式迁移。

三、迁移流程

1、确定业务停机时间

系统管理员与业务确认可停机时间范围,数据库运维通过计算业务数据量,预估迁移耗时,两者结合综合评估后共同确定迁移时间

2、通知系统开发商停业务

数据库运维做好迁移前准备后,通知系统开发商停业务系统

3、关闭所有业务

系统开发商关闭所有业务系统

4、源库关闭数据库监听程序

数据库运维收到开发商停完业务的通知后,关闭数据库监听程序,拒绝新的连接请求

代码语言:javascript复制
--查看监听状态
lsnrctl status
--关闭监听程序
lsnrctl stop
--检查监听状态
lsnrctl status

5、源库查询除非系统默认用户

目的是impdp导入时,按照查出的用户导入,not in()中为11g默认用户

代码语言:javascript复制
select username from dba_users where username not in
('SYS','SYSTEM','SCOTT','OUTLN','MGMT_VIEW','FLOWS_FILES',
'MDSYS','ORDSYS','EXFSYS','DBSNMP','WMSYS','APPQOSSYS',
'APEX_030200','OWBSYS_AUDIT','ORDDATA','CTXSYS','ANONYMOUS',
'SYSMAN','XDB','ORDPLUGINS','OWBSYS','SI_INFORMTN_SCHEMA',
'OLAPSYS','ORACLE_OCM','XS$NULL','MDDATA','DIP','APEX_PUBLIC_USER',
'SPATIAL_CSW_ADMIN_USR','SPATIAL_WFS_ADMIN_USR');

6、源库检查会话是否全部释放

数据库运维检查数据库会话是否全部释放掉,是否有未停干净的业务,并检查未提交的二阶段事务,如发现异常及时通知系统开发商处理

代码语言:javascript复制
--查询status 为 INACTIVE的会话
select SID,SERIAL#,username,status from v$session where username in 
('用户名1','用户名2');
--杀死进程
alter system kill session 'sid,serial#';

7、源库切换日志

数据库运维进行归档日志切换,将所有内存中的数据刷到磁盘,保障数据完整性。首先要查询日志组状态,将active及current状态的日志组,都要切换到inactive一次,建议多次切换。(见异常处理-2)

代码语言:javascript复制
--查询avtive状态日志组
select * from v$log;
--切换日志组,直达avtive变为inactive,可多切换几次
alter system switch logfile;
--注:此处无需做手工CheckPoint

8、核对源库与目标库字符集是否一致

代码语言:javascript复制
select userenv('language') from dual;

9、源库导出数据

查看dump目录

代码语言:javascript复制
select * from dba_directories;

无dump目录创建

代码语言:javascript复制
--创建目录
create or replace directory mydump as '/u01/temp';
--授权
grant read, write on directory mydump to 用户名;

检查dump目录存储空间,评估DMP文件大小

代码语言:javascript复制
--方式一:通过block大小去估算,默认
expdp '/ as sysdba' ESTIMATE_ONLY=y schemas=用户名 ESTIMATE=blocks;
--方式二:通过统计信息去估算
expdp '/ as sysdba' ESTIMATE_ONLY=y schemas=用户名 ESTIMATE=statistics;

sys用户执行全库导出,注意parallel参数需要考虑CPU核心数,另可使用filesize参数设置导出单个文件大小

代码语言:javascript复制
expdp "/ as sysdba" directory=mydump dumpfile=YKT-FULL_%U.DMP parallel=4 logfile=YKT-FULL.log full=y;

注意: 1、11g有“延迟段创建”特性,参数:deferred_segment_creation。如果设置为true,则expdp不会导出空表。

参考:https://www.cnblogs.com/ningvsban/p/3603897.html 2、执行导出导入过程中可以通过dba_datapump_jobs查看执行中的job 3、归档模式下导入会产生大量归档日志,要注意磁盘空间

10、使用FileZilla工具将备份传输到目标库dump目录下

dump目录相关见步骤9

11、删除目标库测试数据

由于之前导入过测试数据,需要正式迁移前删除,步骤5中已经查出所有非系统默认用户

代码语言:javascript复制
--CASCADE参数会删除用户所有关联对象
DROP USER 用户名 CASCADE;

注意:impdp导入前需要先创建表空间,用户可以不用创建,已验证 参考:http://blog.itpub.net/31520497/viewspace-2156830/

代码语言:javascript复制
--在源库查询,在目标库create tablespace
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size 
FROM dba_tablespaces t, dba_data_files d 
WHERE t.tablespace_name = d.tablespace_name 
GROUP BY t.tablespace_name;

12、执行导入

导入前将目标库监听关闭,分别按schema导入,全库导入由于元数据已在目标库存在,会报对象已存在错误

代码语言:javascript复制
impdp "/ as sysdba" directory=ENMO_DUMPDIR dumpfile=YKT-FULL_%U.DMP
 parallel=4 logfile=impdp_xk.log schemas=用户名;

13、校验数据

对比dba_objects表数量

代码语言:javascript复制
select count(1) from dba_objects;

查询每个表行数,对比源库目标库

代码语言:javascript复制
--查询数据库所有的表
select t.table_name,t.num_rows from all_tables t;
--查询当前用户表
select t.table_name,t.num_rows from user_tables t;

14、检查迁移后表空间容量

对空间不足的表空间需要reseize或增加数据文件

代码语言:javascript复制
alter database datafile 'XXXXXXX' resize 10G;

15、对比源库与目标库用户权限

通过脚本

16、目标库启动监听

17、通知系统开发商启动业务

18、启动系统服务

19、测试业务

20、数据库运维收尾结束

数据库运维更新防火墙策略,通知主机添加堡垒机

四、异常处理

1、impdp报ORA-39082

导入过程中报错

代码语言:javascript复制
ORA-39082: Object type PACKAGE_BODY:"XXXX"."PXG_TS_LEAING" created with compilation warnings

通过以下SQL查询到状态为INVALID,忽略

代码语言:javascript复制
select owner,object_name,object_type,status from dba_objects where object_name='PXG_TS_LEAING';

2、切换日志,一直无法变为inactive状态

首先查询dba_jobs与dba_jobs_running表,查询job情况

代码语言:javascript复制
select * from dba_jobs
select * from dba_jobs_running

尝试broken job,失败

代码语言:javascript复制
exec DBMS_JOB.broken(49,TRUE);

最后通过设置job_queue_processes=0解决,日志可以成功切换inactive状态 参考:https://blog.csdn.net/leshami/article/details/8694772

代码语言:javascript复制
show parameter job
alter system set job_queue_processes=0;

3、源库expdp报错

使用powershell导出报错,使用cmd窗口解决

五、总结

1、迁移前务必在测试环境完整测试 2、impdp导入日志一定要留存完整 3、源库expdp前要保证所有数据落盘 4、对于数据泵、JOB等内容深入学习 5、细心谨慎

0 人点赞