ORACLE数据库迁移(ZHS16GBK到UTF8)

今天有人突然提出这么个问题让我解决。以前也有到过,直接alter system做的。
但是这次是就是要求ZHS16GBK改成UTF8,导致很多数据丢失。
 
分析一下:首先ZHS16GBK只支持中文和英文,ALTUTF8只是基本所有语言。
ZHS16GBK汉字只有两个字节,而UTF8汉字占3个字节,所以迁移时候长度不够。
exp/imp错误。
 
总结了一下基本一下几种方法:
1.所有长度增大1.5倍,理论是可以的,但是有些哥们说他们试过基本行不通,很多都是增加3倍才搞定,不知道什么原因,超过4000的就要考虑大长度类型了。这么做保险。
2.建立dblink,用insert select这种方式做。convert 转换zhgbk------->utf8
    insert xxxxx select col,covert(co_char,'UTF8','ZHS16CGB231280') from xxxxx@dblink;
应该是很慢。
3.使用CSSCAN工具,检查下。
首先使用csscan扫描数据库或者某些表,然后执行如下过程
conn / as sysdba
set serveroutput on
DECLARE
newmaxsz  NUMBER;
BEGIN
     FOR rec in
      ( SELECT distinct u.owner_name, u.table_name, u.column_name ,
               u.column_type, u.owner_id, u.table_id, u.column_id,
               u.column_intid FROM csmv$errors u
               WHERE u.error_type='EXCEED_SIZE'
            order by u.owner_name, u.table_name, u.column_name)
      LOOP
        select MAX(cnvsize)INTO newmaxsz from csm$errors WHERE
               usr#=rec.owner_id and obj#=rec.table_id
               and col#=rec.column_id and intcol#=rec.column_intid;
        DBMS_OUTPUT.PUT_LINE(rec.owner_name ||'.'|| rec.table_name||' ('||
            rec.column_name ||') - '|| rec.column_type ||' - '||
            newmaxsz || ' Bytes');
      END LOOP;
    END;
/
这个需要执行一个脚本才拥有csmv$errors视图。
SQL> @ ?/rdbms/admin/csminst.sql
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26865454/viewspace-748189/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26865454/viewspace-748189/

你可能感兴趣的:(ORACLE数据库迁移(ZHS16GBK到UTF8))