迁移数据时oracle字符集的转换迁移数据时oracle字符集的转换

按照oracle官方文档所说,数据库字符集在创建后原则上不能更改。因此,在设计和安装之初考虑使用哪一种字符集十分重要。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行.但是由于每家软件公司使用的字符集一样,迁移数据时肯定是会遇到字符集转换的问题.比如最常遇到是英文字符集转换成中文,中文的转换成英文.而且在迁移数据时都是上百GB的dmp文件啊.
在迁移数据过程中我使用过两种方法一是修改dmp文件的字符集一是修改数据库的字符集.
修改dmp文件字符集,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。
比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码: SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
0354 然后将dmp文件的2、3字节修改为0354即可,但是这样种方法只能使用oracle8及以下版本的客户端导出的dmp才能修改
一种是修改数据库字符集,因为官方文档是说创建数据库后是不能修改,但是没办法工作需要在迁移数据时先创建一个中间数据库使用源数据库的字符集进行创建的
将源数据库的数据导入中间数据库后修改中间数据库的字符集使其与目标数据库的字符集一至,再从中间数据库将数据导入目标数据库.我这样做很麻烦,后面有一次由于
目标数据库是没有业务数据所以就直接修改了目标数据库字符集将源数据库的数据导入进来了.
---1---修改数据库里的字符集
---中文字符集转英文字符集
--英文
update sys.props$ set value$='US7ASCII' where name='NLS_CHARACTERSET';

commit;

update sys.props$ set value$='US7ASCII' where name='NLS_NCHAR_CHARACTERSET';
commit;

---2---修改强制同步数据库里的字符集
SHUTDOWN IMMEDIATE;

STARTUP MOUNT;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

---给CHARSET变量赋值
COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';

--INTERNAL_USE是没有写在文档中的参数,用以强制完成字符集一致化
ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
--ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;

-- 再次启动数据库一遍
SHUTDOWN IMMEDIATE;
STARTUP;

set nls_lang=AMERICAN_AMERICA.US7ASCII;

---英文字符集转中文字符集

update sys.props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';

commit;

update sys.props$ set value$='ZHS16GBK' where name='NLS_NCHAR_CHARACTERSET';

commit;

---2---修改强制同步数据库里的字符集
SHUTDOWN IMMEDIATE;

STARTUP MOUNT;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

---给CHARSET变量赋值
COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';

--INTERNAL_USE是没有写在文档中的参数,用以强制完成字符集一致化
ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
--ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;

-- 再次启动数据库一遍
SHUTDOWN IMMEDIATE;
STARTUP;

set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK;
1,修改dmp的时候,注意数据库版本
9i以以下的数据库,需要修改dmp文件第1行的第2和第3个字节
10g以上的数据库,需要修改dmp文件第3行的第3和第4个字节

这个方法比较局限,比如,你的数据库10T,这个方法显然就不行。。。。

2,强制修改是数据库字符集
从10以后,oracle推荐使用csscan

3,补充一个,对于数据量大的数据库整体迁移,这个方法显然不行,仅仅是用于少量数据库或者某些含多字节(如中文)少的表
dblink+utl_raw

这是Lunar_Zhang给我的提供的另外的方法在这附上,谢谢他的方法 

时间: 2024-12-12 10:01:04

迁移数据时oracle字符集的转换迁移数据时oracle字符集的转换的相关文章

ORACLE与SQL之间的数据迁移

oracle|数据 高级数据迁移        很多时间,要在异构数据库之间进行数据迁移或抽取,如果在SQL中提取ORACLE的数据,可以通过ODBC.OLEDB等多种方式,要从ORACLE提取SQL中的数据,大都是通过透明网关来实现的.        在异构数据抽取过程中,最好采用SQL92标准的语法编写SQL代码,同时要注意不同数据库之间数据类型的转换关系,如ORACLE的日期类型用DATE.SQL用Datetime等.   一 关于ORACLE的透明网关配置        ORACLE安装

使用IBM Data Movement Tool从SQL Server/Oracle到DB2的表数据迁移

SQL Server,Oracle 及 DB2 都是目前市场上很多应用程序所使用的关系型数据库,随着应用程序功能的日趋强大,应用程序的版本升级和重新安装都将要求保留原有数据.这样不同类型数据库之间的迁移成了现在应用程序功能中数据迁移部分的重点.目前市场上出现了一些数据库迁移工具(比如:IBM Data Movement Tool).互联网上针对这些工具的介绍大部分都是基于数据对象的整体迁移,也就是在数据结构迁移的基础上进行数据迁移.但是有些应用程序并不需要数据结构的迁移,而是仅仅需要表数据的迁移

oracle 10G表空间迁移时如何重建索引

昨天进行了表空间迁移的维护,维护后出现一个问题:MYTEST用户下的表表空间迁移后索引存在失效. 针对该问题和其他DBA进行了一些沟通,大家理解并不统一.后通过实际测试发现,表空间迁移后没有数据的表索引正常,但有数据的表的相关索引确实会失效, 解决的方法是REBUILD索引(今早rubuild MYTEST下的所有索引,通过select INDEX_NAME,status from user_indexes确认status均为VALID的正常状态). 进一步查找资料发现: Moving a ta

oracle 12c R1 在线迁移数据文件、在线迁移表分区或者子分区例子

在线重定义数据文件: 在oracle 12c R1之前的版本中,如果在线移动数据文件需要将表空间或者数据文件离线,然后操作系统mv,recover后online数据文件或者表空间,在oracle 12c R1后可以直接在线重定义数据文件,这个过程用户可以进行查询.DML以及DDL的任务,另外数据文件也可以直接在存储设备间迁移,比如ASM到文件系统的相互迁移. SQL> select name from v$datafile; NAME ------------------------------

oracle RAC 更换存储迁移数据

oracle RAC 更换存储迁移数据我们利用ASM rebalance特性实现更换存储迁移数据的需求基本 零宕机时间(操作步骤总结)1)保证新存储和RAC当前节点间的可用性:2)新存储划分LUN,可以重新规划存储方案:3)迁移OCR和表决盘4)给现有ASM磁盘组添加ASM磁盘(新存储分配的),充分利用ASM REBALANCE技术5)删除原存储的ASM磁盘6)观察期  1 当前存储信息以下ASM磁盘组.OCR.VOTE信息:ASM磁盘组:ASMCMD> lsdgState    Type  

大数据量数据库如何简单备份迁移数据

今天真汗颜啊....由于我的一不小心,我把几百万条数据给删了,囧.客户的几年重要数据就这样没了,我当时愁的,还好后来找回来了. 对于大数据的操作,大家一定要慎重操作. 在SQLServer2005中,想从一个数据库服务器迁移一个数据表的数据到另一数据库服务器的表中,大家一般会怎么做呢? 我先来说说我今天的做法:(因为自己的笔记本上没有装软件,不能截图给大家看了,大家可以自己动手操作下) 刚开始我利用一种方法,很笨且不安全的,大家引以为戒. 老大交给我任务了,我一想那么多数据,总不能一条一条手工插

数据泵参数partition_options 在对于迁移分区表的使用。

数据泵参数partition_options 在对于迁移分区表的使用.1 NONE 象在系统上的分区表一样创建.2 DEPARTITION 每个分区表和子分区表作为一个独立的表创建,名字使用表和分区(子分区)名字的组合.3 MERGE 将所有分区合并到一个表 一 创建环境: yang@rac1>create table yang_part2 (   2                 id number,   3                 create_time date,   4    

yii2.0数据库迁移教程【多个数据库同时同步数据】_php实例

本文讲述了yii2.0数据库迁移的方法.分享给大家供大家参考,具体如下: 创建迁移 使用如下命令来创建一个新的迁移: yii migrate/create <name> 必填参数 name 的作用是对新的迁移做一个简要的描述.例如,如果这个迁移是用来往多个数据库同一张表  ( 假设每个数据库都有news表 )   添加字段的,那么你可以使用addColumn_news (该名称自定义)这个名称并运行如下命令: yii migrate/create addColumn_news 注意:因为 na

yii2.0数据库迁移教程【多个数据库同时同步数据】

本文讲述了yii2.0数据库迁移的方法.分享给大家供大家参考,具体如下: 创建迁移 使用如下命令来创建一个新的迁移: yii migrate/create <name> 必填参数 name 的作用是对新的迁移做一个简要的描述.例如,如果这个迁移是用来往多个数据库同一张表  ( 假设每个数据库都有news表 )   添加字段的,那么你可以使用addColumn_news (该名称自定义)这个名称并运行如下命令: yii migrate/create addColumn_news 注意:因为 na