生产上遇到Oracle 11g单实例跨平台迁移情况,以下为迁移过程,有不完善的地方欢迎提出改进
源库 | 目标库 | |
---|---|---|
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 |
源库未开启归档,采用数据泵方式迁移。
系统管理员与业务确认可停机时间范围,数据库运维通过计算业务数据量,预估迁移耗时,两者结合综合评估后共同确定迁移时间
数据库运维做好迁移前准备后,通知系统开发商停业务系统
系统开发商关闭所有业务系统
数据库运维收到开发商停完业务的通知后,关闭数据库监听程序,拒绝新的连接请求
--查看监听状态
lsnrctl status
--关闭监听程序
lsnrctl stop
--检查监听状态
lsnrctl status
目的是一会impdp导入时,按照查出的用户导入,not in()中为11g默认用户
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');
数据库运维检查数据库会话是否全部释放掉,是否有未停干净的业务,并检查未提交的二阶段事物,如发现异常及时通知系统开发商处理
--查询status 为 INACTIVE的会话
select SID,SERIAL#,username,status from v$session where username in ('用户名1','用户名2');
--杀死进程
alter system kill session 'sid,serial#';
数据库运维进行归档日志切换,将所有内存中的数据刷到磁盘,保障数据完整性。首先要查询日志组状态,将active及current状态的日志组,都要切换到inactive一次,建议多次切换。(见异常处理-2)
--查询avtive状态日志组
select * from v$log;
--切换日志组,直达avtive变为inactive,可多切换几次
alter system switch logfile;
--注:此处无需做手工CheckPoint
select userenv('language') from dual;
查看dump目录
select * from dba_directories;
无dump目录创建
--创建目录
create or replace directory mydump as '/u01/temp';
--授权
grant read, write on directory mydump to 用户名;
检查dump目录存储空间,评估DMP文件大小
--方式一:通过block大小去估算,默认
expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=用户名 ESTIMATE=blocks;
--方式二:通过统计信息去估算
expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=用户名 ESTIMATE=statistics;
sys用户执行全库导出
--注意parallel参数需要考虑CPU核心数,另可使用filesize参数设置导出单个文件大小
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、归档模式下导入会产生大量归档日志,要注意磁盘空间==
dump目录相关见步骤9
由于之前导入过测试数据,需要正式迁移前删除,步骤5中已经查出所有非系统默认用户
--CASCADE参数会删除用户所有关联对象
DROP USER 用户名 CASCADE;
注意:impdp导入前需要先创建表空间,用户可以不用创建,已验证
参考:http://blog.itpub.net/31520497/viewspace-2156830/
--在源库查询,在目标库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;
导入前将目标库监听关闭,分别按schema导入,全库导入由于元数据已在目标库存在会报对象已存在错误
impdp \"/ as sysdba\" directory=ENMO_DUMPDIR dumpfile=YKT-FULL_%U.DMP parallel=4 logfile=impdp_xk.log schemas=用户名;
对比dba_objects表数量
select count(1) from dba_objects;
查询每个表行数,对比源库目标库
--查询数据库所有的表
select t.table_name,t.num_rows from all_tables t;
--查询当前用户表
select t.table_name,t.num_rows from user_tables t;
对空间不足的表空间需要reseize
alter database datafile 'XXXXXXX' resize 10G;
通过脚本
数据库运维更新防火墙策略,通知主机添加堡垒机
导入过程中报错
ORA-39082: Object type PACKAGE_BODY:"XXXX"."PXG_TS_LEAING" created with compilation warnings
通过以下SQL查询到状态为INVALID,忽略
select owner,object_name,object_type,status from dba_objects where object_name='PXG_TS_LEAING';
首先查询dba_jobs与dba_jobs_running表,查询job情况
select * from dba_jobs
select * from dba_jobs_running
尝试broken job,失败
exec DBMS_JOB.broken(49,TRUE);
最后通过设置job_queue_processes=0解决,日志可以成功切换inactive状态
参考:https://blog.csdn.net/leshami/article/details/8694772
show parameter job
alter system set job_queue_processes=0;
使用powershell导出报错,使用cmd窗口解决
1、迁移前务必在测试环境完整测试
2、impdp导入日志一定要留存完整
3、源库expdp前要保证所有数据落盘
4、对于数据泵、JOB等内容深入学习
5、细心谨慎
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。