生产上遇到单实例跨平台迁移情况,以下为迁移过程,有不完善的地方欢迎提出改进
一、源库及目标库情况
源库 | 目标库 | |
---|---|---|
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、细心谨慎