講解Oracle數據庫10g疑難問題的解決方法

  一、怎樣配置EM使其支持SSL 協議
  10G EM 中的OMS, DBConsole,Agent 都支持SSL 協議.
  具體操作:
  ◆1. 如果沒有環境變量ORACLE_SID,請先配置,或者直接敲入set ORACLE_SID=xxx (UNIX環境下請根據不同的shell類型使用不同的語法:setenv, export...)
  ◆2. 鍵入 emctl secure ,可以看到全部的選項:
  secure oms
  [] [-reset]
  secure agent
  secure em
  secure dbconsole
  []
  secure setpwd
  secure status [oms url]
  secure lock | unlock
  ◆3. 以配置oms爲例
  ◆3.1 先停掉所有與oms相關的 服務(opmnctl stopall)
  ◆3.2 敲入: emctl secure oms,會讓你輸入registration password,然後系統會産生相關的證書文件, 如果一切順利的話,系統會有提示配置成功的信息
  ◆3.3 重新啓動服務(opmnctl startall)
  缺省情況下,7777和4889這兩個端口是可用的, 配置成secure 模式後,4888端口是支持SSL協議的. 從$EM_HOME\sysman\config目錄下的emoms.properties文件中可以看到配置信息.
  ◆3.4 檢測oms是否已經運行在https協議下
  emctl secure status oms url
  注意: URL 要輸入完整,
  例如: https://myserver:4888/em/upload/
  ◆4. Agent, DBconsole的配置基本類似.
  ◆5. 啓動浏覽器運行時,IE會彈出一個安裝安全證書的窗口,按"確認".
  二、出現了問題,怎樣解決
  以DB Control爲例, 大致的步驟是這樣的:
  ◆1. emctl status dbconsole 查看db control 的狀態
  ◆2.去 $ORACLE_HOME\hostname_sid\sysman\log目錄下查看相關日志(emoms.log,emagent.log等)
  ◆3. 檢查配置文件 emd.properties,emoms.properties
  目錄: $ORACLE_HOME\hostname_sid\sysman\config
  ◆4. 確保監聽器工作正常: lsnrctl status
  ◆5. 10G EM 使用的是配置文件中定義的連接串,而不是直接訪問tnsnames.ora .
  目錄: $ORACLE_HOME\hostname_sid\sysman\config
  文件: emoms.properties.
  參數: oracle.sysman.eml.mntr.emdRepConnectDescriptor
  三、修改了監聽端口, 怎樣保證 DB Control 正常運行
  ◆1. 修改 listener.ora 和tnsnames.ora 這兩個文件:
  tnsnames.ora 中需要加入:
  listener_1 =
  (ADDRESS = (PROTOCOL = TCP)
  (HOST = xxxx)(PORT = 新的端口))
  然後啓動數據庫:
  SQL> show parameter local_listener ;
  SQL> alter system set local_listener='listener_1' scope=spfile;
  重啓數據庫使得修改生效
  ◆2. 修改 $ORACLE_HOME\hostname_sid\sysman\config
  下的emoms.properties文件:
  oracle.sysman.eml.mntr.emdRepPort=新的端口
  oracle.sysman.eml.mntr.emdRepConnectDescriptor=(DESCRIPTION\=(ADDRESS_LIST\=(ADDRESS\=(PROTOCOL\=TCP)(HOST\=xxx)(PORT\=新的端口)))(CONNECT_DATA\=(SERVICE_NAME\=xxx)))
  ◆3. 最後,還要修改 $ORACLE_HOME\hostname_sid\sysman\emd
  下的targets.xml:
  ◆4. 重新啓動監聽器和dbconsole 服務.
  ◆5. 如果嫌上面的操作麻煩,可以用emca這個命令行工具:
  emca -h 查看所有可用的命令
  emca -r 跳過資料檔案庫的創建.
  四、怎樣修改 DB Control 的服務端口
  缺省情況下, DB Control 的端口是5500, 可以參考下面的說明更改端口。
  如果用戶想改變oms端口,必須改變以下三個文件,然後重啓db control以使得改變生效:
  ◆1.編輯$ORACLE_HOME/_/sysman/config/emoms.properties並改變以下參數:
  oracle.sysman.emSDK.svlt.ConsoleServerPort
  oracle.sysman.emSDK.svlt.ConsoleServerHTTPSPort
  ◆2.編輯$ORACLE_HOME/_/sysman/config/emd.properties並改變以下參數:
  REPOSITORY_URL
  emdWalletSrcUrl
  ◆3.編輯$ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole__/config/http-web-site.xml並改變以下參數:
  web-site port
  注:請在修改前備份。
  ◆五、如何使用"Automatic SGA Management"
  Automatic SGA Management 是 10G 引入的新特性之一,將初始化參數文件中與內存管理密切有關的幾個參數抽取出來,交由數據庫去自行管理(由新增加的參數SGA_TARGET來管理),在一定程序上能減輕DBA的負擔.
  至于參數的合理性,還需要結合AWR Report 去驗證.
  SGA_TARGET = db_cache_size + db_nk_cache_size(n=2,4,...)
  + db_keep_cache_size + db_recycle_cache_size +
  shared_pool_size + java_pool_size + large_pool_size + xxxx
  xxx: 是一個保留值,從目前的實驗來看,基本是4M
  步驟:
  ◆1.
  alter system set sga_target=300m scope=both
  create pfile from spfile;
  shutdown immediate;
  修改init.ora 文件,將這些參數的值設成0:
  db_cache_size, shared_pool_size, java_pool_size,large_pool_size
  ◆2. 啓動SQLPLUS,以新的pfile文件啓動數據庫
  SQL> startup pfile='....'
  讓我們來看看調整的結果:
  SQL> select name, block_size, current_size from v$buffer_pool;
  name block_size current_size
  -------------------------------------------------------------
  KEEP 8192 204
  SQL> Select pool, sum(bytes)/1024/1024 as "M bytes" from v$SGASTAT
  group by pool;
  pool M bytes
  -------------------------------------------------
  java pool 4
  large pool 4
  shared pool 84
  205.002403
  205.002403=buffer cache + log buffer + fixed sga + all others ...
  改動java pool的值
  SQL> alter system set java_pool_size=20M;
  SQL> select name, block_size, current_size,prev_size from v$buffer_pool;
  name block_size current_size prev_size
  ----------------------------------------------------------------------------------------------
  KEEP 8192 188 204
  SQL> Select pool, sum(bytes)/1024/1024 as "M bytes" from v$SGASTAT
  group by pool;
  pool M bytes
  -------------------------------------------------
  java pool 20
  large pool 4
  shared pool 84
  189.002403
  可以看出, db_cache_size的值已經被自動調小了.
  再把java pool 的值改回去
  SQL> alter system set java_pool_size=8M;
  SQL> select name, block_size, current_size,prev_size from v$buffer_pool;
  name block_size current_size prev_size
  -----------------------------------------------------------------------------------
  KEEP 8192 188 204
  SQL> select name, block_size, current_size,prev_size from v$buffer_pool;
  pool M bytes
  -------------------------------------------------
  java pool 20
  large pool 4
  shared pool 84
  189.002403
  這一次, db_cache_size的值沒有變化 , JAVA_POOL_SIZE的值也沒有變化
  修改large pool的值爲16M
  SQL> alter system set large_pool_size=16M;
  System altered.
  SQL> select name,block_size,current_size,prev_size from v$buffer_pool;
  NAME BLOCK_SIZE CURRENT_SIZE PREV_SIZE
  -------------------- ---------- ------------ ---------
  DEFAULT 8192 176 188
  SQL> Select pool, sum(bytes)/1024/1024 as "M bytes" from v$sgastat group by pool;
  POOL M bytes
  ------------ ----------
  java pool 20
  large pool 16
  shared pool 84
  177.002403
  這次,db_cache_size和large_pool_size的值都變了
  同樣,調大shared_pool_size後, db_cache_size會自動減小.
  雖然db_nk_cache_size的值不會隨著workload 的改變而自動調整, 我們還是可以看看手工改動db_nk_block_size 的情況
  SQL> alter system set db_2k_cache_size=4m;
  System altered.
  SQL> select name,block_size,current_size,prev_size from v$buffer_pool;
  NAME BLOCK_SIZE CURRENT_SIZE PREV_SIZE
  ---------------- ----------------- ------------ ----------
  DEFAULT 8192 172 176
  DEFAULT 2048 4 0
  SQL> alter system set db_2k_cache_size=0;
  System altered.
  SQL> select name,block_size,current_size,prev_size from v$buffer_pool;
  NAME BLOCK_SIZE CURRENT_SIZE PREV_SIZE
  ----------------- ---------------- ------------------ --------------
  DEFAULT 8192 176 172
  SQL> alter system set db_2k_cache_size=8m;
  System altered.
  SQL> select name,block_size,current_size,prev_size from v$buffer_pool;
  NAME BLOCK_SIZE CURRENT_SIZE PREV_SIZE
  -------------------- ---------- ------------ ----------
  DEFAULT 8192 168 176
  DEFAULT 2048 8 0
  結論: 手工調整db_nk_cache_size確實會影響原有的參數.
  最後說一點: SGA_TARGET參數與SGA_MAX_SIZE參數有密切關聯,基本的原則就是前者的值不能大于後者的值.
  總結:設置了SGA_TARGET參數後,數據庫會在這個範圍內自行調整;但許多情況下, 怎樣合理地設置這個參數仍是DBA需要考慮的問題, 他們需要結合AWR Report等輔助的工具來分析.( 當然,我們可以根據Advisor的曆史信息而確定一個比較合理的值)。
  
  一、亂碼問題
  Redhat RHEL AS3 下安裝 Oracle DB 10g 中文亂碼問題
  不少兄弟反映在rhel3下安裝oracle10g時出現亂碼, 其實在安裝和使用時出現亂碼的地方有多個, 可以分爲三類:
  1. 安裝時的亂碼
  2. 一些應用程序的亂碼, 比如 dbca, netca
  3. 一些基于oc4j的web應用的亂碼, 比如 isqlplus, em
  造成這些問題的原因都是一個, 就是這些程序都使用jdk, 相應的jdk(或jre) 使用的字體配置文件 font.properties 中的字體和操作系統的字體或者字體配置文件不匹配. 解決的辦法是把兩者改成一致.
  ◆1. 下載, 解包 ship.db.cpio.gz, 生成目錄 Disk1
  ◆2. cd Disk1/stage/Components/oracle.swd.jre/1.4.2.0.0/1/DataFiles/
  unzip all_except_bin.jar(這時生成一個 jre 的目錄)
  cd jre/1.4.2/lib/
  mv font.properties font.properties.bak
  cp font.properties.zh_CN.Redhat8.0 font.properties
  cd ../../../
  zip -r all_except_bin.jar.new jre/
  mv all_except_bin.jar.new all_except_bin.jar
  (其實就是把 font.properties 文件換掉. 這樣安裝時漢字顯示就沒有問題了)
  ◆3. 如法炮制, 把Disk1/stage/Components/oracle.jdk/1.4.2.0.0/1/DataFiles/sol_bin.1.1.jar文件裏面的font.properties 文件換掉, 創建數據庫和執行網絡配置時的亂碼就沒有了. isqlplus 和em 的亂碼也解決了。
  用IE登錄Linux服務器上的em出現的亂碼
  不知道大家有沒有注意到,EM顯示的中文翻譯很是糟糕,up/down 動不動就翻譯成「向上」「向下」,讓人哭笑不得.很多朋友都說,幹脆給顯示英文算了,可是怎麽顯示呢?
  好了,現在我們有一種辦法很容易的解決這個問題:
  打開你的IE浏覽器,選擇'工具"-->Internet選項-->常規
  選擇「語言」,默認只有「中文」,選擇「添加」,加入英語(美國),調整順序,把」英語(美國)「放到最上面
  OK ,確定。
  打開你的 http://yoururl:5500/em
  問題解決了。
  二、10g如何更改歸檔模式
  ◆1. 對于初始化文件,只需要修改log_archive_dest_n 這個參數.n=1,2,3,....10, Oracle 缺省會使用log_archive_dest_10這個參數來使用flash recovery area裏面存放的歸檔日志文件,大小由參數db_recovery_file_dest_size來決定.
  修改:
  log_archive_dest_1="location=c:\oracle\10g\...\archivelog quota_size=2G"
  ...
  如果歸檔使用flash recovery area, 上面的參數不需要指定任何值,Oracle 會自動使用db_recovery_file_dest這個參數所指定的路徑。
  ◆2. 啓動sqlplus:
  startup mount pfile='....'
  alter database archivelog;
  (如果啓用flashback, alter database flashback on)
  alter database open;
  archive log list(查看是否運行在歸檔模式)
  (如果前面的log_archive_dest_n沒有設置,則會顯示USE_DB_RECOVERY_FILE_DEST)
  ◆3. 怎樣變成noarchivelog 模式
  步驟基本同上。
  三、用dblink在10G中做create table ..as select * from ..varchar2()的column寬度變成3倍
  問題描述:例如:varchar2(255)==>varchar(765)
  測試:
  ◆1. 環境: 兩台機器都裝的10G的數據庫
  ◆2. 測試步驟和結果:
  SQL> conn test1/test1@db10G_server1
  SQL> create database link link_server2
  connect to test1 identified by test1
  using 'db10G_server2'
  SQL> conn test1/test1@db10G_server2
  SQL> create table test1_t1 as select * from all_objects
  where rownum<=3000;
  SQL> desc test1_t1;
  Name Null? Type
  ---------------------------------------------------------------
  OWNER VARCHAR2(30)
  OBJECT_NAME VARCHAR2(30)
  SUBOBJECT_NAME VARCHAR2(30)
  OBJECT_ID NUMBER
  DATA_OBJECT_ID NUMBER
  OBJECT_TYPE VARCHAR2(19)
  CREATED DATE
  LAST_DDL_TIME DATE
  TIMESTAMP VARCHAR2(19)
  STATUS VARCHAR2(7)
  TEMPORARY VARCHAR2(1)
  GENERATED VARCHAR2(1)
  SECONDARY VARCHAR2(1)
  SQL> conn test1/test1@db10G_server1
  SQL> create table test1_linkt1 as
  select * from test1_t1@link_server2;
  SQL> desc test1_linkt1
  Name Null? Type
  ----------------------------------------- -------- ----------------
  OWNER VARCHAR2(60)
  OBJECT_NAME VARCHAR2(60)
  SUBOBJECT_NAME VARCHAR2(60)
  OBJECT_ID NUMBER
  DATA_OBJECT_ID NUMBER
  OBJECT_TYPE VARCHAR2(38)
  CREATED DATE
  LAST_DDL_TIME DATE
  TIMESTAMP VARCHAR2(38)
  STATUS VARCHAR2(14)
  TEMPORARY VARCHAR2(2)
  GENERATED VARCHAR2(2)
  SECONDARY VARCHAR2(2)
  表結構一樣,但是列的長度確實變了, 通過dblink創建的表的varchar2列的長度是原表的兩倍
  再來看看字符集
  ◆1.Server1上的數據庫字符集
  SQL> column value format A20
  SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
  value
  --------------
  ZHS16GBK
  ◆2. Server2上的數據庫字符集
  SQL> conn test1/test1@db10G_server2
  SQL> column value format A20
  SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
  value
  --------------
  AL32UTF8
  四、在10g不支持的Linux發行版上安裝10g的解決方法
  正常安裝的10g只支持Red Hat Enterprise Linux 2.1 and 3, and on UnitedLinux 1.0。如果是其它的版本,比如fedora,rh9等,10g將會說不支持,而不允許安裝,解決方法如下:
  ◆1.運行runInstaller -ignoreSysPrereqs,這樣會跳過檢查
  ◆2.修改/etc/redhat-release文件,讓10g認爲自己處于支持的操作系統中,運行下面的命令即可
  su - root
  cp /etc/redhat-release /etc/redhat-release.backup
  cat > /etc/redhat-release << EOF
  Red Hat Enterprise Linux AS release 3 (Taroon)
  EOF
  安裝完畢,再將那個文件還原:
  su - root
  cp /etc/redhat-release.backup /etc/redhat-release
  ◆3.同樣的思路,我們可以去修改Oracle 的install/oraparam.ini文件:
  [Certified Versions]
  Linux=redhat-2.1,UnitedLinux-1.0,redhat-3
  把這個屏蔽掉,或者是添加新的內容:
  [Certified Versions]
  Linux=redhat-2.1,UnitedLinux-1.0,redhat-3
  [Linux-redhat-2.1-optional]
  TEMP_SPACE=80
  SWAP_SPACE=150
  MIN_DISPLAY_COLORS=256
  [UnitedLinux-1.0-optional]
  TEMP_SPACE=80
  SWAP_SPACE=150
  MIN_DISPLAY_COLORS=256
  [Linux-redhat-3.0-optional]
  TEMP_SPACE=80
  SWAP_SPACE=150
  MIN_DISPLAY_COLORS=256
  對這個地方定制一下就可以了。
  注:有興趣的朋友不妨測試一下,其實在這個地方可以定制很多東西的,但是不推薦在正式的應用中這麽做。