目的:
用exp/imp导出导入数据,还原应用数据
环境:
客户端:windows xp + 10g 10.1.0.1
服务端:windows 2003 + 10g 10.1.0.1
产生问题:
在imp数据操作后,发现数据库的表数据显示是中文正常的,但是表的comments却是乱码。
问题发现和解决过程:
第一步
1、 首先查看本机的客户端字符集设置
查看注册表里面OracleHome的NLS_LANG,发现是AMERICAN_AMERICA.ZHS16GBK
2、再查看服务器的字符集设置
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
或者在sqlplus下面输入show parameter NLS
由此可见,客户端与服务端的字符集一致。
备注:
如果客户端与服务端的字符集不一致,则把客户端修改成服务器端的字符集。
客户端修改方法:
(Windows下)在注册表(统一设置)和在cmd下面
set nls_lang=AMERICAN_AMERICA.ZHS16GBK(当前窗口有效)
当然也可以服务器端修改字符集(不推荐),方法google下哈~~
第二步
导入最新dmp到服务端
imp system/oracle@local_data buffer=3000000 fromuser=test1 touser=test2 ignore=y FEEDBACK=1000 FILE='E:/exp_20100315.dmp' LOG='E:/imp_20100317_ local_log.log'
这一步的导入过程无问题。
第三步
查询下服务端的表数据,发现问题,数据库的表数据显示是中文正常的,但是表的列的comments却是乱码。
重复上面步骤(多次导入),发现问题依然存在。。。。此时心发慌了。。。
第四步
对问题产生的猜想:有可能最新导出的dmp的table中列的comments已经乱码了,
第五步
对猜想的验证:
由于有前几天的数据库备份,表结构这几天没有大的变动(幸亏备份啊!),把前三天备份的数据导入到测试库中,最后发现只有最新的dmp导入的数据有该乱码问题。
第六步
导出测试库中的无乱码的各个table的列的comments,再导入到服务端。
1、 在plsql的sql windows 用
select 'comment on column '||table_name||'.'||column_name||' is '''||comments||''';'
from dba_col_comments t where t.owner = 'test1';
把查询的结果保存保存为tsv格式
2、 对应的用户以sqlplus连接到另外的数据库中,执行需要导入的tsv文件,
例: SQL> @C:/result.tsv
查看数据库,一切正常显示,问题解决~~~