字元集問題的初步探討(七)----關於字元集更改的內部操作

來源:互聯網
上載者:User
問題 原文連結:

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

前面我們提到,通過修改props$的方式更改字元集在Oracle7之後是一種極其危險的方式,應該盡量避免。

我們又知道,通過ALTER DATABASE CHARACTER SET更改字元集雖然安全可靠,但是有嚴格的子集和超集的約束,實際上我們很少能夠
用到這種方法。


實際上Oracle還存在另外一種更改字元集的方式.

如果你注意過的話,在Oracle的alert<sid>.log檔案中,你可能看到過這樣的日誌資訊:


alter database character set INTERNAL_CONVERT ZHS16GBKUpdating 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 alteredCompleted: alter database character set INTERNAL_CONVERT ZHS1



在這裡面,我們看到這樣一條重要的,Oracle非公開的命令:

alter database character set INTERNAL_CONVERT/ INTERNAL_USE ZHS16GBK

 

這個命令是當你選擇了使用典型方式建立了種子資料庫以後,Oracle會根據你選擇的字元集設定,把當前種子資料庫的字元集更改為期望字元
集,這就是這條命令的作用.

在使用這個命令時,Oracle會跳過所有子集及超集的檢查,在任一字元集之間進行強制轉換,所以,使用這個命令時你必須十分小心,你必須
清楚這一操作會帶來的風險.
我們之前講過的內容仍然有效,你可以使用csscan掃描整個資料庫,如果在轉換的字元集之間確認沒有嚴重的資料損毀,或者你可以使用有效
的方式更改,你就可以使用這種方式進行轉換.
我們來看一下具體的操作過程及Oracle的內部操作:

這是alert.log檔案中的記錄資訊:

Tue Oct 19 16:26:30 2004

Database Characterset is ZHS16GBK

replication_dependency_tracking turned off (no async multimaster replication found)

Completed: ALTER 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'

ARC0: Completed 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

...

...


格式化10046追蹤檔案,得到以下資訊(摘要):


alter session set events '10046 trace name context forever,level 12'alter database character set INTERNAL_USE ZHS16CGB231280call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 1 0.00 0.00 0 0 0 0Execute 1 4.88 6.04 910 16825 18099 0Fetch 0 0.00 0.00 0 0 0 0------- ------ -------- ---------- ---------- ---------- ---------- ----------total 2 4.88 6.04 910 16825 18099 0Misses in library cache during parse: 1Optimizer goal: CHOOSEParsing user id: SYSElapsed times include waiting on following events: Event waited on Times Max. Wait 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 col$ set charsetid = :1 where charsetform = :2....update argument$ set charsetid = :1 where charsetform = :2....update collection$ set charsetid = :1 where charsetform = :2....update attribute$ set charsetid = :1 where charsetform = :2....update parameter$ set charsetid = :1 where charsetform = :2....update result$ set charsetid = :1 where charsetform = :2....update partcol$ set spare1 = :1 where charsetform = :2....update subpartcol$ set spare1 = :1 where charsetform = :2....update props$ set value$ = :1 where name = :2....update "SYS"."KOTAD$" set SYS_NC_ROWINFO$ = :1 where SYS_NC_OID$ = :2....update seq$ set increment$=:2,minvalue=:3,maxvalue=:4,cycle#=:5,order$=:6, cache=:7,highwater=:8,audit$=:9,flags=:10 where obj#=:1....update kopm$ set metadata = :1, length = :2 where name='DB_FDO'....ALTER DATABASE CLOSE NORMAL


此處產生的日誌你可以在這裡下載(供參考):

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,Oracle技術粉絲,來自中國最大的Oracle技術論壇itpub.
www.eygle.com是作者的個人網站.你可通過Guoqiang.Gai@gmail.com來聯絡作者.歡迎技術探討交流以及連結交換.

原文出處:

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



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。