Oracle管理與維護.安裝建立啟動關閉資料庫的常見問題(一)

來源:互聯網
上載者:User

Oracle管理與維護.安裝建立啟動關閉資料庫的常見問題(一)

20070605

草木瓜

一、內容概要

    本文主要介紹Oracle在Linux下安裝建立啟動資料庫過程中常見問題的解決方案。這部分
內容在組態管理伺服器系列文章中也已有比較詳細的提及,這裡做一次專題總結。

二、Oracle資料庫在Linux環境下的安裝

    《虛擬機器RedHatLinux9安裝Oralce92全過程》
    http://blog.csdn.net/liwei_cmg/archive/2006/05/28/759286.aspx
    《從伺服器構建說起(四).Linux下安裝配置Oracle》
    http://blog.csdn.net/liwei_cmg/archive/2007/04/18/1568923.aspx
   
三、建立資料庫

    建立資料庫通常使用兩種方式:
   
    A.oracle內建的database configuration assistent
   
    圖形化安裝模式十分簡單,不在贅述,在linux下使用database configuration assistent
    容易出錯,並不推薦使用。不過dbca有個十分有用的功能,那就是產生建庫指令碼。
   
     
       問題一.點擊建立資料庫後,出現錯誤:home/oracle/ora9/oracle/bin/dbca: line 124: 31614 Segmentation fault      $JRE_DIR/bin/jre -DORACLE_HOME=$OH -DJDBC_PROTOCOL=thin -mx64m -classpath $CLASSPATH oracle.sysman.assistants.dbca.Dbca $ARGUMENTS
        圖形化介面消失。
   
        修改dbca,將最後一行改為:
     # Run DBCA
     $JRE_DIR/bin/jre -native -DORACLE_HOME=$OH -DJDBC_PROTOCOL=thin -mx64m -classpath $CLASSPATH oracle.sysman.assistants.dbca.Dbca $ARGUMENTS
     fi
    即添加了一個native參數即可。

      
       問題二.建立資料庫過程中出現ora-29807錯誤
     
      ORA-29807: specified operator does not exist
    This is a known issue (bug 2925665). You can click on the "Ignore" button to continue.
    Once DBCA has completed database creation, remember to run the 'prvtxml.plb' script
    from $ORACLE_HOME/rdbms/admin independently, as the user SYS. It is also advised
    to run the 'utlrp.sql' script to ensure that there are no invalid objects in the database at
    this time.

        這是oracle本身的bug,此時可選擇“ignore”,資料庫建立成功後,以sys使用者執行rdbms/admin/utlrp.sql即可解決。
    
    
    問題三.建庫最後彈出使用者名稱密碼提示框,輸入密碼後退出後,畫面僵死無反應
    
    這個問題很可能來源於dbca的最後一行設定了native參數,解決方案和問題一恰好相反。這
    時即使kill掉dbca,資料庫也是無法啟動的。至於如何解決啟動的問題,見資料庫啟動問題
    一節。
   
   
    B.使用指令碼 create database 語句建立資料庫

    在database configuration assistent最後一步存為script指令碼,通過oracle使用者運行
    即可。
   
    主要由以下這些檔案組成,linux.sh是主shell:
  CreateDBCatalog.sql  CreateDB.sql  linux.sh
  CreateDBFiles.sql    init.ora      postDBCreation.sql

    成功後顯示:

  SQL> show errors;
  No errors.
  SQL>
  SQL> Rem ===========================================================================
  SQL> Rem END utlrcmp.sql
  SQL> Rem ===========================================================================
  SQL> execute utl_recomp.recomp_serial();
  
  PL/SQL procedure successfully completed.
  
  SQL>
  SQL> Rem =====================================================================
  SQL> Rem Run component validation procedure
  SQL> Rem =====================================================================
  SQL>
  SQL> EXECUTE dbms_registry.validate_components;
  
  PL/SQL procedure successfully completed.
  
  SQL>
  SQL> Rem ===========================================================================
  SQL> Rem END utlrp.sql
  SQL> Rem ===========================================================================
  SQL> shutdown ;
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  SQL> connect SYS/change_on_install as SYSDBA
  Connected to an idle instance.
  SQL> set echo on
  SQL> spool /home/ora/ora9/oracle/assistants/dbca/logs/postDBCreation.log
  SQL> create spfile='/home/ora/ora9/oracle/dbs/spfilelinux.ora' FROM pfile='/home/ora/ora9/admin/linux/scripts/init.ora';
  
  File created.
  
  SQL> startup ;
  ORACLE instance started.
  
  Total System Global Area  122754448 bytes
  Fixed Size                   451984 bytes
  Variable Size              58720256 bytes
  Database Buffers           62914560 bytes
  Redo Buffers                 667648 bytes
  Database mounted.
  Database opened.
  SQL> exit;
  Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
  With the Partitioning, OLAP and Oracle Data Mining options
  JServer Release 9.2.0.4.0 - Production
  
  

四、啟動資料庫

    ORACLE資料庫啟動需要管理員權限的使用者登陸。一般地使用如下命令操作:
    #sqlplus /nolog
    SQL> conn / as sysdba
  
  註:<dbname>表示是資料庫名的參數,如 alter database linuxdb open。

    ORACLE資料庫啟動可以分為三個步驟:

  A.建立ORACLE執行個體(非安裝階段)
    -----------------------------------------------------------
   
    SQL> startup nomount
   
  這個步驟只建立了Oracle執行個體。首先讀取init.ora初始化參數檔案,啟動後台相關進程和
初始化系統全域區SGA。nomount狀態下常用於修複資料庫,如重建參數檔案,控制檔案和資料庫
等。
    init.ora參數檔案定義了包括記憶體結構大小,控制檔案,進程數,遊標數,復原段方式等
重要的初始化資料庫參數。資料庫執行個體名根據db_name設定,但不一定要與開啟的資料庫名稱相
同。執行個體開啟後,系統將顯示一個SGA記憶體結構和大小的列表,如下所示:

  ORACLE instance started.
  
  Total System Global Area  202445884 bytes
  Fixed Size                   451644 bytes
  Variable Size              83886080 bytes
  Database Buffers          117440512 bytes
  Redo Buffers                 667648 bytes

  B.用執行個體安裝資料庫(安裝階段)
    -----------------------------------------------------------
   
    SQL> startup nomount
  SQL> alter database <dbname> mount 
  
  或者
  
  SQL> startup mount <dbname>
  
    開啟執行個體並安裝資料庫。ORACLE讀取控制檔案中關於資料檔案和重作記錄檔的內容,確認
資料檔案和聯機記錄檔的位置,但此時不對資料檔案和記錄檔進行校正檢查。這種方式常在
資料庫維護操作中使用。如資料庫日誌歸檔,資料庫介質恢複,使資料檔案聯機或離線,重新定
位元據檔案、重做記錄檔,開啟歸檔方式等。

  通過下面命令可以更改到前一狀態
  
  SQL > alter database <dbname> dismount

  C.開啟資料庫(開啟階段)
    -----------------------------------------------------------
   
    SQL> startup nomount
  SQL> alter database <dbname> mount 
  SQL> alter database <dbname> open
  
  或者
  
  SQL> startup open <dbname> 
  
  或者
  
  SQL> startup
  
  此時資料庫開啟,使資料檔案和重作記錄檔線上,通常還會請求一個或者是多個復原段。
資料庫系統處於正常工作狀態,可以接受使用者請求。

  通過下面命令可以更改到前一狀態
  
  SQL > alter database <dbname> close
  
  
五、其他的一些啟動資料庫方式

   A. startup restrict  約束方式啟動 
    這種方式能夠啟動資料庫,但只允許具有一定特權的使用者訪問。非特權使用者訪問時,會出現
以下提示: 
    ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

  B. startup force 強制啟動方式 
    當不能關閉資料庫時,可以用startup force來完成資料庫的關閉再啟動,不常用。 

  C. startup pfile=參數檔案名稱 
    帶初始化參數檔案的啟動方式。先讀取參數檔案,再按參數檔案中的設定啟動資料庫 
    如:startup pfile='/home/ora/ora9/oracle/dbs/initlinux.ora';
   
    D. 並行服務時的選項,即可以啟動多個執行個體同時訪問一個資料庫。  
    startup exclusive   獨佔方式開啟資料庫(只能運行一個執行個體,預設)   
    startup parallel    並行方式開啟資料庫  

六、關閉資料庫

    資料庫的關閉,有四種選項。

  A. shutdown normal

  這是資料庫關閉shutdown命令的預設選項。命令執行後,不允許任何新的資料庫連接。在資料
庫關閉之前,Oracle將等待目前串連的所有使用者都從資料庫中退出後才開始關閉資料庫。採用這種
方式關閉資料庫,在下一次啟動時不需要進行任何的執行個體恢複。但需要注意一點的是,採用這種方
式,必須等待使用者,時間不能確定。

  B. shutdown immediate

  這是最常用的一種關閉資料庫的方式,當前正在被Oracle處理的SQL語句立即中斷,系統中任
何沒有提交的事務全部復原。如果系統中存在一個很長的未提交的事務,採用這種方式關閉資料庫
也需要一段時間(該交易回復時間)。系統不等待串連到資料庫的所有使用者退出系統,強行復原當
前所有的活動事務,然後斷開所有的串連使用者。
    實際應用中最為推薦的方式,但是對於繁忙的資料庫,執行命令後也遲遲不能關閉,這時可以
手工kill資料庫後台進程(oraSID)再行關閉。

  C. shutdown transactional

  該選項僅在Oracle8i後才可以使用。該命令常用來計劃關閉資料庫,它使當前串連到系統且正
在活動的事務執行完畢,運行該命令後,任何新的串連和事務都是不允許的。在所有活動的事務完
成後,資料庫將和shutdown immediate同樣的方式關閉資料庫。

  D. shutdown abort

  這是關閉資料庫的萬不得已的最後一招,沒有任何辦法關閉資料庫的情況下才不得不採用的方
式,大概有1%~4%機率導致資料庫不能啟動。執行這個命令之前最好確保背景Oracle進程基本清
除,這樣能很大提高安全係數。

  執行命令後,所有正在啟動並執行SQL語句都將立即中止。所有未提交的事務將不復原。Oracle也
不等待目前串連到資料庫的使用者退出系統。下一次啟動資料庫時需要執行個體恢複,啟動時間可能比平
時需要更多。

  資料庫不同關閉方式對比:

                                  D   B   C   A 
    允許新的串連                  ×  ×  ×  ×
    等待直到當前會話中止          ×  ×  ×  √
    等待直到當前事務中止          ×  ×  √  √
    強制CheckPoint,關閉所有檔案  ×  √  √  √
  
   
七、資料庫啟動問題

    A.參數檔案問題
   
    SQL> startup
  ORA-01078: failure in processing system parameters
  LRM-00109: could not open parameter file '/home/ora/ora9/oracle/dbs/initunixdb.ora'
  
  這個問題是由於找不到預設的參數檔案,解決方案:
  查看當前export中的ORACLE_SID,確認與需要啟的資料庫sid名一致,然後進行如下操作。
  SQL> create pfile='/home/ora/ora9/oracle/dbs/initlinuxdb.ora' from spfile='/home/ora/ora9/oracle/dbs/spfilelinux.ora';
    SQL> startup pfile='/home/ora/ora9/oracle/dbs/initlinuxdb.ora';
  
  涉及spfile和pfile的相關知識,英文原文:
  
  In Oracle Databases through 8i, parameters controling memory, processor usage, control file locations and other key parameters are kept in a pfile (short for parameter file).
  
  The pfile is a static, plain text files which can be altered using a text editor, but it is only read at database startup. Any changes to the pfile will not be read until the database is restarted and any changes to a running database will not be written to the pfile.
  
  Due to these limitations, in 9i Oracle introduced the spfile (server parameter file). The spfile cannot be edited by the DBA; instead it is updated by using ALTER SYSTEM commands from within Oracle. This allows parameter changes to be persistent across database restarts, but can leave you in a pinch if you need to change a parameter to get a database started but you need the database running to change the parameter.
  
  A 9i (or later) database can have either a pfile or an spfile, or even both, but how can you tell which you have? If you have both, which one is being used? How do you go from one to the other? How do you get out of the chicken-and-the-egg quandary of a database that will not start up without you changing a parameter that’s in that file you can’t update unless the database is up?
  
  Note: This information is based on an Oracle 9i installation on Solaris. Your mileage may vary. I have also chosen to ignore issues of RAC installation. In my example I have used ORADB as my SID.
  
  Am I using a pfile or an spfile?
  
  The first thing to check is if you have a pfile or spfile. They can be specified at startup or found in the default location. The default path for the pfile is $ORACLE_HOME/dbs/init$ORACLE_SID.ora and the default for the spfile is $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora.
  
  If both a pfile and an spfile exist in their default location and the database is started without a pfile='/path/to/init.ora' then the spfile will be used.
  
  Assuming your database is running you can also check the spfile parameter. Either the command SHOW PARAMETER spfile or SELECT value FROM v$parameter WHERE name='spfile'; will return the path to the spfile if you are using one. If the value of spfile is blank you are not using an spfile.
  
  The path to the spfile will often be represented in the database by ?/dbs/spfile@.ora. This may seem cryptic, but Oracle translates ? to $ORACLE_HOME and @ to $ORACLE_SID so this string translates to the default location of the spfile for this database.
  
  How can I create an spfile from a pfile?
  
  As long as your pfile is in the default locations and you want your spfile in the default location, you can easily create an spfile with the command CREATE SPFILE FROM PFILE;.
  
  If you need to be more specific about the locations you can add paths to the create command like this:
  
  CREATE SPFILE='/u01/app/oracle/product/9.2/dbs/spfileORADB.ora'
  FROM PFILE=’/u01/app/oracle/product/9.2/dbs/initORADB.ora’;
  
  These commands should work even when the database is not running! This is important when you want to change a database to use an spfile before you start it.
  
  How can I create a pfile from an spfile?
  
  The commands for creating a pfile are almost identical to those for creating a spfile except you reverse the order of spfile and pfile:
  
  If your pfile is in the default location and you want your spfile created there as well run CREATE SPFILE FROM PFILE;.
  
  If you have, or want them in custom locations specify the paths like this:
  
  CREATE PFILE='/u01/app/oracle/product/9.2/dbs/initORADB.ora'
  FROM SPFILE=’/u01/app/oracle/product/9.2/dbs/spfileORADB.ora’;
  
  Again, this can be done without the database running. This is useful when the database fails to start due to a parameter set in the spfile. This is also a good step to integrate into your backup procedures.
  
  How can I see what’s in my spfile
  
  To view the settings in the spfile we have two options: First, we can use the command above to create a pfile from the spfile. This is simple, and fairly fast, but unnecessary if the database is running.
  
  The better way, if the database is running, is to select the parameter you want to view from the oracle view v$spparameter with a command like this:
  
  SELECT value FROM v$spparameter WHERE name='processes';
  
  If you try to view the spfile with a text editor it may seem like it is plain text, but beware! The spfile will not behave correctly (if it works at all) if it has been edited by a text editor.
  
  How can I update values in my spfile?
  
  The values in spfile are updated with the ALTER SYSTEM command, but to update the spfile we add an additional parameter of SCOPE.
  
  ALTER SYSTEM SET processes=50 SCOPE=spfile;
  
  This command would update the parameter processes in the spfile. Since this parameter can only be set at startup, we say SCOPE=spfile and the change will be reflected when the database is restarted. Other options for SCOPE are memory which only changes the parameter until the database is restarted, and both which changes the instance immediately and will remain in effect after the database is restarted.
  
  How can I update values in my spfile when my database won’t start?
  
  So your database won’t startup because of a problem in your spfile. You can’t edit it with a text editor and you can’t use ALTER SYSTEM because your database is not running. It sounds like a problem, but really isn’t. Here’s what you do:
  
  Connect up to your database as sysdba. You should get the message Connected to an idle instance
  
  Run the command CREATE pfile FROM spfile; specifying the location as above if necessary. You should now have a fresh version of the spfile.
  
  Edit the pfile to update the parameter you need to update.
  
  Run the command CREATE spfile FROM pfile; to move the changes you have just made back into the spfile.
  
  Startup the database normally. It should read the changed spfile and start up correctly. You can optionally delete the pfile if you are done.  

    B. startup過程中出錯 ORA-01102: cannot mount database in EXCLUSIVE mode
   
    SQL> conn /as sysdba
  Connected to an idle instance.
  SQL> startup
  ORACLE instance started.
  Total System Global Area  202445884 bytes
  Fixed Size                   451644 bytes
  Variable Size              83886080 bytes
  Database Buffers          117440512 bytes
  Redo Buffers                 667648 bytes
  ORA-01102: cannot mount database in EXCLUSIVE mode
  
  原因是$ORACLE_HOME/dbs目錄下的lkSID,即lkLINUX檔案被佔用。root使用者查看:
  # fuser -u lkLINUX
  lkLINUX:   13468(oracle) 13480(oracle)
  釋放檔案
  # fuser -k lkLINUX
  
  關於ORA-01102的錯誤,這裡有詳細說明:
  http://www.hellodba.com/cases/case-unexception_down.htm

    C. startup過程中提示 ORA-01991 error opening password file ...
  SQL> startup
  ORACLE instance started.
  
  Total System Global Area  202445884 bytes
  Fixed Size                   451644 bytes
  Variable Size              83886080 bytes
  Database Buffers          117440512 bytes
  Redo Buffers                 667648 bytes
  ORA-01990: error opening password file '/home/ora/ora9/oracle/dbs/orapw'
  ORA-27037: unable to obtain file status
  Linux Error: 2: No such file or directory
  Additional information: 3

    原因是丟失密碼驗證檔案,重建即可。
   
    [ora@liwei dbs]$ orapwd
  Usage: orapwd file=<fname> password=<password> entries=<users>
  
    where
      file - name of password file (mand),
      password - password for SYS (mand),
      entries - maximum number of distinct DBA and OPERs (opt),
    There are no spaces around the equal-to (=) character.
   
  [ora@liwei dbs]$ orapwd file=/home/ora/ora9/oracle/dbs/orapwlinux password=sys entries=10

  註:忘記sys,system密碼時,可以用這種方式重建密碼檔案,不過還有更簡單的方式,直接
  conn / as sysdba , alter user sys identified by sys 。

    D. startup 過程中提示 ORA-12701: CREATE DATABASE character set is not known
   
    確認ORA_NLS33環境變數的路徑正確性。
   
   
八、資料庫網路設定

    網路設定方麵包括,listen和tns 都有相對應的圖形化介面工具 netca netmgr。
    listen tns檔案均位於/home/ora/ora9/oracle/network/admin 即$ORACLE_HOME/network/admin
    listener 伺服器的執行個體監聽 供網路內使用者訪問本機資料庫,配置後,lsnrctl start即可。
    tnsnames 用於訪問其他網路主機資料庫。在linux/unix下要注意是Unix斷行符號字元,最好使用
vi操作。實際應用中常出現由於斷行符號符不正確不能被ORACLE識別。
   
   
九、總結

    本文所提及問題皆在實踐過程中出現過,這裡也僅是羅列問題,ORACLE體系十分複雜,這
裡只是從應用角度出發。
     

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.