使用sqluldr2导出大批量数据遇到的坑
第一坑,使用sqluldr2在oracle bin目录下执行后,没有任何效果,没有日志也没有数据。肯定是在/etc/profile 或者.bash_profile 文件中配置了 NLS_LANG的问题,注释掉或者换一个值试试看
第二坑,背景是需要把ORACLE中的历史数据导出做数据备份存储,由于ORACLE配置的字符集是AMERICAN.AMERICA_WE8ISO8859P1,然后通过XSHELL工具执行sqluldr2命令导出数据,,无论如何都无法正常中文字符,最开始毫无头绪,
1.网上说配置sqluldr2的charset 来设置字符,UTF8、ZHS16GBK、AL32UTF8均没有效果
2.通过统一服务器的环境变量中的NLS_LANG与数据库的字符来测试,依然没有效果,甚至还抱有侥幸心理,会不会服务器上没有正常显示,我通过XFTP把导出来的数据下载下来,再重新导入数据库,中文就可以正常显示了呢,如果真是这样,那我就不需要考虑导出来的数据是否存在中文乱码了,不过,结果还是无法正常显示中文
找了很多资料都没有找到跟我这个数据库环境一样的情况,
最后看到一篇文章说,除了要统一数据库与服务器环境变量的NLS_LANG,还需要修改你执行脚本这个工具的字符,比如我使用的是XSHELL,默认的字符是使用的UTF8,当我把这个字符修改为GBK的时候,奇迹发生了,汉字就正常的显示了,对于大批量导出数据就很容易了
建议测试sqluldr2的时候,先使用小批量的数据进行测试,
第三坑,第一次导出数据,通过上述办法正常解决了,没有中文乱码的问题。
但更换了服务器之后,使用上述方法,无法达到所需要的效果,还是以字符集为WE8ISO8859P1的数据库来举例说明,
首先保证/etc/profile 中设置NLS_LANG的值为WE8ISO8859P1,
数据库的字符集也为WE8ISO8859P1,
然后xshell这个客户端的编码设置为GBK即可,按道理只要保证source /etc/profile就可以正常处理了。
但一直没有起作用,过了一段时间再回来测试中文的时候,就没有问题了。所以。有时候需要给服务器一点时间,emmmm,重启服务器试试也可以