ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle专题深入讨论 » 字符集问题的初步探讨(七)----关于字符集更改的内部操作

标题: [精华] 字符集问题的初步探讨(七)----关于字符集更改的内部操作
在线/呼叫 eygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206875 (1)
社区积分 6449 (240)
注册日期 2001-10-8
论坛徽章:61
现任管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人ITPUB北京九华山庄2008年会纪念徽章
管理团队2006纪念徽章授权会员2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:龙ITPUB新首页上线纪念徽章

发表于 2004-10-19 20:44 
字符集问题的初步探讨(七)----关于字符集更改的内部操作

原文链接:

http://www.eygle.com/special/NLS_CHARACTER_SET_07.htm

前面我们提到,通过修改props$的方式更改字符集在Oracle7之后是一种极其危险的方式,应该尽量避免。

我们又知道,通过ALTER DATABASE CHARACTER SET更改字符集虽然安全可靠,但是有严格的子集和超集的约束,实际上我们很少能够
用到这种方法。


实际上Oracle还存在另外一种更改字符集的方式.

如果你注意过的话,在Oracle的alert<sid>.log文件中,你可能看到过这样的日志信息:
PHP code:


alter database character set INTERNAL_CONVERT ZHS16GBK

Updating character set in controlfile to ZHS16GBK

 SYS
.SNAP$ (REL_QUERY) - CLOB representation altered

 SYS
.METASTYLESHEET (STYLESHEET) - CLOB representation altered

 SYS
.EXTERNAL_TAB$ (PARAM_CLOB) - CLOB representation altered

 XDB
.XDB$RESOURCE (SYS_NC00027$) - CLOB representation altered

 ODM
.ODM_PMML_DTD (DTD) - CLOB representation altered

 OE
.WAREHOUSES (SYS_NC00003$) - CLOB representation altered

 PM
.ONLINE_MEDIA (SYS_NC00042$) - CLOB representation altered

 PM
.ONLINE_MEDIA (SYS_NC00062$) - CLOB representation altered

 PM
.ONLINE_MEDIA (PRODUCT_TEXT) - CLOB representation altered

 PM
.ONLINE_MEDIA (SYS_NC00080$) - CLOB representation altered

 PM
.PRINT_MEDIA (AD_SOURCETEXT) - CLOB representation altered

 PM
.PRINT_MEDIA (AD_FINALTEXT) - CLOB representation altered

Completed
alter database character set INTERNAL_CONVERT ZHS1

.

在这里面,我们看到这样一条重要的,Oracle非公开的命令:
PHP code:


alter database character set INTERNAL_CONVERT
INTERNAL_USE ZHS16GBK

.




__________________
顶部
在线/呼叫 eygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206875 (1)
社区积分 6449 (240)
注册日期 2001-10-8
论坛徽章:61
现任管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人ITPUB北京九华山庄2008年会纪念徽章
管理团队2006纪念徽章授权会员2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:龙ITPUB新首页上线纪念徽章

发表于 2004-10-19 20:45 
这个命令是当你选择了使用典型方式创建了种子数据库以后,Oracle会根据你选择的字符集设置,把当前种子数据库的字符集更改为期望字符
集,这就是这条命令的作用.

在使用这个命令时,Oracle会跳过所有子集及超集的检查,在任意字符集之间进行强制转换,所以,使用这个命令时你必须十分小心,你必须
清楚这一操作会带来的风险.
我们之前讲过的内容仍然有效,你可以使用csscan扫描整个数据库,如果在转换的字符集之间确认没有严重的数据损坏,或者你可以使用有效
的方式更改,你就可以使用这种方式进行转换.
我们来看一下具体的操作过程及Oracle的内部操作:

这是alert.log文件中的记录信息:
PHP code:


Tue Oct 19 16
:26:30 2004

Database Characterset is ZHS16GBK

replication_dependency_tracking turned off 
(no async multimaster replication found)

CompletedALTER DATABASE OPEN

Tue Oct 19 16
:27:07 2004

alter database character set INTERNAL_USE ZHS16CGB231280

Updating character set in controlfile to ZHS16CGB231280

Tue Oct 19 16
:27:15 2004

Thread 1 advanced to log sequence 118

  Current log
# 2 seq# 118 mem# 0: /opt/oracle/oradata/primary/redo02.log

Tue Oct 19 16:27:15 2004

ARC0
Evaluating archive   log 3 thread 1 sequence 117

ARC0
Beginning to archive log 3 thread 1 sequence 117

Creating archive destination LOG_ARCHIVE_DEST_1
'/opt/oracle/oradata/primary/archive/1_117.dbf'

ARC0Completed archiving  log 3 thread 1 sequence 117

Tue Oct 19 16
:27:20 2004

Completed
alter database character set INTERNAL_USE ZHS16CGB231280

Shutting down instance
further logons disabled

Shutting down instance 
(immediate)

License high water mark 1

Tue Oct 19 16
:29:06 2004

ALTER DATABASE CLOSE NORMAL

...

...

.




__________________
顶部
在线/呼叫 eygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206875 (1)
社区积分 6449 (240)
注册日期 2001-10-8
论坛徽章:61
现任管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人ITPUB北京九华山庄2008年会纪念徽章
管理团队2006纪念徽章授权会员2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:龙ITPUB新首页上线纪念徽章

发表于 2004-10-19 20:49 
格式化10046跟踪文件,得到以下信息(摘要):
PHP code:


alter session set events 
'10046 trace name context forever,level 12'





alter database character set INTERNAL_USE ZHS16CGB231280





call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          0          0           0

Execute      1      4.88       6.04        910      16825      18099           0

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        2      4.88       6.04        910      16825      18099           0



Misses in library cache during parse
1

Optimizer goal
CHOOSE

Parsing user id
SYS



Elapsed times 
include waiting on following events:

  
Event waited on                             Times   MaxWait  Total Waited

  
----------------------------------------   Waited  ----------  ------------

  
control file sequential read                    4        0.00          0.00

  control file parallel write                     2        0.05          0.08

  log file sync                                   2        0.08          0.08

  SQL
*Net message to client                       1        0.00          0.00

  SQL
*Net message from client                     1       18.06         18.06

********************************************************************************



....



update colset charsetid = :

where

 charsetform 
= :2



....



update argumentset charsetid = :

where

 charsetform 
= :2



....



update collectionset charsetid = :

where

 charsetform 
= :2



....



update attributeset charsetid = :

where

 charsetform 
= :2

....



update parameterset charsetid = :

where

 charsetform 
= :2

....



update resultset charsetid = :

where

 charsetform 
= :2



....



update partcolset spare1 = :

where

 charsetform 
= :2



....



update subpartcolset spare1 = :

where

 charsetform 
= :2



....



update propsset value$ = :

where

 name 
= :2



....



update &quot;SYS&quot;.&quot;KOTAD$&quotset SYS_NC_ROWINFO$ = :

where

 SYS_NC_OID
$ = :2

....



update seqset increment$=:2,minvalue=:3,maxvalue=:4,cycle#=:5,order$=:6,

  
cache=:7,highwater=:8,audit$=:9,flags=:10 

where

 obj
#=:1



....



update kopmset metadata = :1,  length 

  
= :

where

 name
='DB_FDO'



....



ALTER DATABASE CLOSE NORMAL

                      

..




__________________
顶部
在线/呼叫 eygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206875 (1)
社区积分 6449 (240)
注册日期 2001-10-8
论坛徽章:61
现任管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人ITPUB北京九华山庄2008年会纪念徽章
管理团队2006纪念徽章授权会员2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:龙ITPUB新首页上线纪念徽章

发表于 2004-10-19 20:50 
此处生成的日志你可以在这里下载(供参考):

http://www.eygle.com/special/primary_ora_13730.zip
http://www.eygle.com/special/primary_ora_13730.tkf.log

我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使
Oracle数据库绕过了子集与超集的校验.
这一方法在某些方面是有用处的,比如测试;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责


结语(我们不妨再说一次):

对于DBA来说,有一个很重要的原则就是:不要把你的数据库置于危险的境地!

这就要求我们,在进行任何可能对数据库结构发生改变的操作之前,先做有效的备份,很多DBA没有备份的操作中得到了惨痛的教训。


__________________
顶部
在线/呼叫 eygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206875 (1)
社区积分 6449 (240)
注册日期 2001-10-8
论坛徽章:61
现任管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人ITPUB北京九华山庄2008年会纪念徽章
管理团队2006纪念徽章授权会员2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:龙ITPUB新首页上线纪念徽章

发表于 2004-10-19 21:49 
前6部分专题见以下链接:

http://www.eygle.com/index-special.htm


__________________
顶部
离线 yl1998
中级会员


精华贴数 0
个人空间 0
技术积分 480 (4104)
社区积分 9 (11344)
注册日期 2001-12-3
论坛徽章:1
授权会员     
      

发表于 2005-8-7 02:49 
真是经典!! 向你学习!!


__________________
鸟生鱼汤....
顶部
离线 abcd
┖ 選擇離開 ┐



精华贴数 0
个人空间 0
技术积分 524 (3744)
社区积分 68 (4255)
注册日期 2001-12-30
论坛徽章:1
授权会员     
      

发表于 2005-8-8 11:34 
呵呵,
这种改字符集的方法在ORACLE 11i 的系统中很早就有使用了,
可以在Metalink上找到官方的详细的说明


__________________
随风飘逝。。。
顶部
离线 rwq_
笨笨


精华贴数 0
个人空间 0
技术积分 6588 (206)
社区积分 2241 (570)
注册日期 2001-10-9
论坛徽章:16
会员2007贡献徽章ITPUB新首页上线纪念徽章    
      

发表于 2005-8-10 10:52 
真的让我在生产系统上修改字符集,杀了我我都不敢!!!作理论研究还行,作生产系统上用,怕怕。


__________________
山外有山,天外有天做事,先做人我的简单的BLOG
顶部
离线 ArthurXu
版主



精华贴数 0
个人空间 0
技术积分 472 (4172)
社区积分 80 (3929)
注册日期 2001-11-1
论坛徽章:4
管理团队成员     
      

发表于 2005-9-23 17:50 
说说我两年前用的办法,主要是针对一些刚建的数据库,不想重建,投机取巧而已。

先暴力修改props$,该数据库到最简单的ASCII字符模式。我知道这样修改危险,但是我有补救措施。
有用ALTER DATABASE CHARACTER SET命令修改数据库成你要的字符集,因为你的字符级别是最简单的,肯定可以修改成功。

这样就相当于绕过ALTER的检查,但是该方法也能保证数据库修改后能正确运行。

没有枪也要干革命的办法!


顶部
离线 ArthurXu
版主



精华贴数 0
个人空间 0
技术积分 472 (4172)
社区积分 80 (3929)
注册日期 2001-11-1
论坛徽章:4
管理团队成员     
      

发表于 2005-9-23 17:55 
什么情况下发现这个命令的?


顶部

CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问