您的位置:首页 > 其它

字符集问题的初步探讨(七)----关于字符集更改的内部操作

2008-04-26 22:49 288 查看
原文链接:
http://www.eygle.com/special/NLS_CHARACTER_SET_07.htm
前面我们提到,通过修改props$的方式更改字符集在7之后是一种极其危险的方式,应该尽量避免。

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

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

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

alterdatabasecharactersetINTERNAL_CONVERTZHS16GBKUpdatingcharactersetincontrolfiletoZHS16GBKSYS.SNAP$(REL_QUERY)-CLOBrepresentationalteredSYS.METASTYLESHEET(STYLESHEET)-CLOBrepresentationalteredSYS.EXTERNAL_TAB$(PARAM_CLOB)-CLOBrepresentationalteredXDB.XDB$RESOURCE(SYS_NC00027$)-CLOBrepresentationalteredODM.ODM_PMML_DTD(DTD)-CLOBrepresentationalteredOE.WAREHOUSES(SYS_NC00003$)-CLOBrepresentationalteredPM.ONLINE_MEDIA(SYS_NC00042$)-CLOBrepresentationalteredPM.ONLINE_MEDIA(SYS_NC00062$)-CLOBrepresentationalteredPM.ONLINE_MEDIA(PRODUCT_TEXT)-CLOBrepresentationalteredPM.ONLINE_MEDIA(SYS_NC00080$)-CLOBrepresentationalteredPM.PRINT_MEDIA(AD_SOURCETEXT)-CLOBrepresentationalteredPM.PRINT_MEDIA(AD_FINALTEXT)-CLOBrepresentationalteredCompleted:alterdatabasecharactersetINTERNAL_CONVERTZHS1

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

alterdatabasecharactersetINTERNAL_CONVERT/INTERNAL_USEZHS16GBK

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

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

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

TueOct1916:26:302004

DatabaseCharactersetisZHS16GBK

replication_dependency_trackingturnedoff(noasyncmultimasterreplicationfound)

Completed:ALTERDATABASEOPEN

TueOct1916:27:072004

alterdatabasecharactersetINTERNAL_USEZHS16CGB231280

UpdatingcharactersetincontrolfiletoZHS16CGB231280

TueOct1916:27:152004

Thread1advancedtologsequence118

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

TueOct1916:27:152004

ARC0:Evaluatingarchive log3thread1sequence117

ARC0:Beginningtoarchivelog3thread1sequence117

CreatingarchivedestinationLOG_ARCHIVE_DEST_1:'/opt/oracle/oradata/primary/archive/1_117.dbf'

ARC0:Completedarchiving log3thread1sequence117

TueOct1916:27:202004

Completed:alterdatabasecharactersetINTERNAL_USEZHS16CGB231280

Shuttingdowninstance:furtherlogonsdisabled

Shuttingdowninstance(immediate)

Licensehighwatermark=1

TueOct1916:29:062004

ALTERDATABASECLOSENORMAL

...

...

格式化10046跟踪文件,得到以下信息(摘要):

altersessionsetevents'10046tracenamecontextforever,level12'alterdatabasecharactersetINTERNAL_USEZHS16CGB231280callcountcpuelapseddiskquerycurrentrows-----------------------------------------------------------------------Parse10.000.000000Execute14.886.0491016825180990Fetch00.000.000000-----------------------------------------------------------------------total24.886.0491016825180990Missesinlibrarycacheduringparse:1Optimizergoal:CHOOSEParsinguserid:SYSElapsedtimesincludewaitingonfollowingevents:EventwaitedonTimesMax.WaitTotalWaited----------------------------------------Waited----------------------controlfilesequentialread40.000.00controlfileparallelwrite20.050.08logfilesync20.080.08SQL*Netmessagetoclient10.000.00SQL*Netmessagefromclient118.0618.06********************************************************************************....updatecol$setcharsetid=:1wherecharsetform=:2....updateargument$setcharsetid=:1wherecharsetform=:2....updatecollection$setcharsetid=:1wherecharsetform=:2....updateattribute$setcharsetid=:1wherecharsetform=:2....updateparameter$setcharsetid=:1wherecharsetform=:2....updateresult$setcharsetid=:1wherecharsetform=:2....updatepartcol$setspare1=:1wherecharsetform=:2....updatesubpartcol$setspare1=:1wherecharsetform=:2....updateprops$setvalue$=:1wherename=:2....update"SYS"."KOTAD$"setSYS_NC_ROWINFO$=:1whereSYS_NC_OID$=:2....updateseq$setincrement$=:2,minvalue=:3,maxvalue=:4,cycle#=:5,order$=:6,cache=:7,highwater=:8,audit$=:9,flags=:10whereobj#=:1....updatekopm$setmetadata=:1,length=:2wherename='DB_FDO'....ALTERDATABASECLOSENORMAL1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: