记一次oracle11g迁移到oracle12c遇到的坑
前提说明
最近,应客户要求,需要将平台迁往另一个地方进行统一管理。原平台用的是oracle11g,新平台是oracle12c。由于公司人手不够,这个任务就由我这个菜鸟顶上。迁移过程中,遇到的困难大多数与oracle数据库有关,这次呢就是想记录一下迁移过程中遇到的一些坑。
一、备份数据时遇到的问题
迁移前,客户通知去备份数据,因为老平台不再投入使用,几天后就关闭访问了。我接到通知后高兴的跟领导打了个招呼跑路了(因为可以快乐的摸鱼了),前往客户机房导数据(服务器机房是真的冷,当时6月份的天,我在里面冻得受不了)。
1.plsql导出窗口一闪而过
导数据一上来就给了我一个下马威。客户是给了一台win10界面的服务器作为跳板机,上面装了oracle11g的客户端和plsql。我刚开始用plsql导数据,但是导出的黑窗口一闪而过,百度以后,网上有很多博文给出了解决方法,我呢在这里记录一下。
方案一:配置环境变量(网上给的最多的解决方案)
1.安装的本地oracle客户端地址,一般都是app为最层文件夹
ORACLE_HOME:C:\app\MYSERVER\product\12.2.0\dbhome_1
2.配置sid
ORACLE_SID:ORCL
方案二:检查plsql配置(我自己出现的问题,粗心导致的)
我按百度的方案做了配置,结果还是不行,过了几天后(当时换成命令行导出了,这个问题是几天后才发现的)仔细检查了下,发现不知谁在plsql上把导出表的执行文件exp.exe配置成了导入表的执行文件imp.exe了,换成正确的后就可以了
这个文件一般在ORACLE_HOME/bin/exp.exe
2.使用exp命令行导出数据报错:EXP-00091: Exporting questionable statistics.
plsql导出失败后,我就使用命令行导出。
2.1使用exp命令导出数据
1.登录oracle服务器,切换到oracle用户
su -l oracle
2.编写导出命令,格式如下
// 2.1整库导出,包含系统表full=y
exp 用户名/密码@SID file=文件名 full=y
例如:使用系统用户system导出整个库
exp system/system@orcl file=\opt\mydb.dmp full=y
// 2.2导出某个(些)用户下的所有表
exp 用户名/密码@SID file=文件名 owner=(用户名)
例如:导出zhangsan用户下的所有表
exp system/system@orcl file=\opt\mydb.dmp owner=zhangsan
例如:导出zhangsan、lisi两个用户下的所有表
exp system/system@orcl file=\opt\mydb.dmp owner=(zhangsan,lisi)
// 2.3导出指定的表
exp 用户名/密码@SID file=文件名 tables=(用户名)
例如:导出teacher、student两张表
exp system/system@orcl file=\opt\mydb.dmp owner=(teacher,student)
2.2报错EXP-00091: Exporting questionable statistics.
这个我刚开始以为仅仅只是警告,导完数据我就回公司了,后来在把数据导入新库时就出问题了,当然不仅仅是这一个问题导致的。这个问题是我同事帮我解决的,我网上查阅了资料,大多步骤如下:
原因:服务器上exp工具所在环境的字符集NLS_LANG与数据库的字符集NLS_CHARACTERSET不一致引起的
- 查看数据库的字符集
我当时环境是ZHS16GBK(图片是我后来自己搭建的测试库字符集,仅仅做效果展示)
select * from nls_database_parameters t where t.parameter='NLS_CHARACTERSET';
- 设置exp工具的字符集,以ZHS16GBK为基准
1.切换到oracle用户
su -l oracle
2.设置变量
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
3.查看是否设置成功
echo $NLS_LANG
2.3oracle11g不会导出空表
一定要注意,oracle11g使用exp导出时不会导出仅有表结构而没存具体数据的表
,我就是吃了这个大亏。由于项目是基于以前一个项目修改得来的,所以有很多表是空表,只起个占位作用,让sql不报错,本身不存数据的。当我后期导入新库时,后台报了一堆缺表的错误。在后来重新备份数据的时候,使用plsql的export user objects把所有表结构都导了出来
。网上也有关于该问题的解决方案,但是当时已经太晚了,就没有尝试了。
二、导入数据时遇到的问题
1.目标数据库与源数据库字符编码不一致
在将备份完的数据导入库时,控制台报错:
IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column ....
百度之后,是由于源数据的字符编码ZHS16GBK与目标数据库的字符编码AL32UTF8不一致导致的,网上给出的解决方案是修改目标数据库的字符编码为ZHS16GBK。但是目标数据库是客户方委托第三方统一管理,不可能修改。最后与同事讨论,同事给出建议尝试修改测试库(为了方便,我在公司测试服务器上搭建了一个oracle11g的测试库,字符集是AL32UTF8)的字符集为ZHS16GBK,然后将数据导入测试库,再将测试库字符集修改为同目标库一致的编码AL32UTF8,再将文件导出。后来经过测试,该方法不可行,会造成中文字符乱码
。最终决定后面一个一个改表字段的长度。
具体修改数据库字符集的指令如下:
1.切换oracle用户
su -l oracle;
2.连接数据库
sqlplus / as sysdba;
3.关闭数据库
shutdown immediate;
4.挂载数据库
startup mount;
5.使用数据库追踪
alter session set sql_trace=true;
6.开启限制会话模式
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
7.打开数据库
alter database open;
8.修改编码(这个根据个人实际情况来,我涉及到到两个编码,AL32UTF8和ZHS16GBK)
alter database character set internal_use zhs16gbk;
9.关闭数据库
shutdown immediate;
10.重启数据库
startup;
11.查看数据库编码是否修改成功
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'
2.IMP-00003: 遇到 ORACLE 错误 942
使用plsql导入测试库时报错:
IMP-00003: 遇到 ORACLE 错误 942
ORA-00942: 表或视图不存在
产生这个问题原因有很多,我是因为测试库装的oracle11g,而plsql工具所在的那台win10系统服务器装的客户端是oracle12c,版本不一致。
三、启动服务遇到的问题
1.启动tomcat8.5报错:Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC 3986
具体报错内容:
Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
上网查了一下不错原因,高版本tomcat是按照RFC 3986规范解析请求的,请求url中的字符必须包含在该规范中,如果url出现了该规范中没有定义的字符就会报该错误,给出的解决方案如下:在tomcat的server.xml中添加relaxedPathChars
和relaxedQueryChars
两行参数,参数后面接可能会在url中用到的特殊字符,可以参考官方网站https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
relaxedPathChars="[]|"
relaxedQueryChars="[]|{}^\`"<>" />
2.apache代理经常出现502的问题
项目中使用apache做代理服务器,自己开发的服务没有问题,但是两个第三方产品,经常会出现502的错误,有时是打开项目后,过一会页面就502了,有时干脆项目都打不开,输入访问地址一直在加载就是进不去,最后报错502。一番折腾后,发现需要在httpd.conf配置文件中,加入以下命令:
// 我的是httpd2.4 ,格式如下,是没有=号的,网上有些格式Keepalive=On
Keepalive On
加入了该命令后,问题有所好转,但是两个第三方服务始终有一个会502,两者交替进行,甚至苦恼。最终,通过尝试发现,尽管两个第三方服务部署在不同服务器上,但是两者tomcat端口都8080,修改一个端口为8081后,就没问题了,至于什么原因导致的我也没想明白。
总结
整个迁移过程历时三周,原本以为一个星期就差不多了。其中困难之处如下:
1.数据库由第三方管控,沟通交流不方便,增删用户,修改配置等等都要联系对方dba进行操作,而有时dba会拒绝做一些修改,因为是一个公共库,这就需要自己想办法解决。
2.对oracle数据库不熟悉,在备份数据和导入数据时遇到很多问题,结果就是光折腾数据就花了两个星期。
3.使用了第三方服务,出问题了还得求着对方支持,自己难以解决。