【CREATE DATABASE】因缺失單引號導致手工建庫命令執行報錯的故障排查

secooler發表於2011-05-11
今天有朋友反映,在執行手工建庫命令之後報錯退出,丟擲“ORA-02165”錯誤。這是一個“既簡單有複雜”的故障。之所以說它複雜,就是因為在資料庫建立指令碼中涉及的語句眾多,很難一時間定位問題的出處,進而浪費了大量的時間;說它簡單是因為我們有一些小技巧協助我們很快地定位這類錯誤。介紹在此,供參考。

1.手工建庫指令碼執行報錯提示資訊
SQL> CREATE DATABASE secdb
  2     USER SYS IDENTIFIED BY oracle1
  3     USER SYSTEM IDENTIFIED BY oracle1
  4     LOGFILE GROUP 1 ('/u01/app/oracle/oradata/secdb/lfile/redo01a.log') SIZE 100M,
  5             GROUP 2 ('/u01/app/oracle/oradata/secdb/lfile/redo02a.log') SIZE 100M,
  6             GROUP 3 ('/u01/app/oracle/oradata/secdb/lfile/redo03a.log') SIZE 100M
  7     MAXLOGFILES 30
  8     MAXLOGMEMBERS 5
  9     MAXLOGHISTORY 1
 10     MAXDATAFILES 100
 11     MAXINSTANCES 1
 12     CHARACTER SET US7ASCII
 13     NATIONAL CHARACTER SET AL16UTF16
 14     DATAFILE '/u01/app/oracle/oradata/secdb/dfile/system01.dbf' SIZE 325M REUSE
 15     EXTENT MANAGEMENT LOCAL
 16     SYSAUX DATAFILE '/u01/app/oracle/oradata/secdb/dfile/sysaux01.dbf' SIZE 325M REUSE
 17     DEFAULT TABLESPACE tbs_1 DATAFILE '/u01/app/oracle/oradata/secdb/dfile/tbs_1.dbf size 50m
 18     DEFAULT TEMPORARY TABLESPACE tempts1
 19        TEMPFILE '/u01/app/oracle/oradata/secdb/dfile/temp01.dbf'
 20        SIZE 20M REUSE
 21     UNDO TABLESPACE undotbs
 22        DATAFILE '/u01/app/oracle/oradata/secdb/dfile/undotbs01.dbf'
 23        SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
      TEMPFILE '/u01/app/oracle/oradata/secdb/dfile/temp01.dbf'
                *
ERROR at line 19:
ORA-02165: invalid option for CREATE DATABASE


請給大家暫停先不要向下看,仔細觀察一下上面的建立資料庫的命令,問題到底出在哪裡呢?

……自行思考時間……

……自行思考時間……

……自行思考時間……

……自行思考時間……

……自行思考時間……

……自行思考時間……

……時間到!是不是還是沒有思路?……

2.問題原因揭曉
首先這個報錯有它本身的誤導性,真正出問題的位置不是第19行,而是第17行:資料檔案後面缺少一個“單引號”!
類似這樣的語句錯誤很難快速的定位並進行處理。有沒有比較好的方法避免類似問題的發生呢?答案是肯定的,繼續分解。

3.快速定位問題的方法和技巧
解決這類語句結構方面的問題的最好方法便是使用“編輯器的語法高亮顯示功能”。可以根據自己的習慣選擇編輯器,推薦的編輯器有:vim、UltraEdit、Notepad++等。
在vim中使用SQL語法高亮的方法是“:set filetype=sql”。

另外一種方法便是將建立資料庫的命令複製到Toad或PL/SQL Developer等資料庫連線工具,這些工具自身便帶有SQL語句語法高亮顯示的功能。

在使用語法高亮顯示之後語句問題便會瞬間浮出水面!
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONECREATE DATABASE secdb    USER SYS IDENTIFIED BY oracle1    USER SYSTEM IDENTIFIED BY oracle1    LOGFILE GROUP 1 ('/u01/app/oracle/oradata/secdb/lfile/redo01a.log') SIZE 100M,            GROUP 2 ('/u01/app/oracle/oradata/secdb/lfile/redo02a.log') SIZE 100M,            GROUP 3 ('/u01/app/oracle/oradata/secdb/lfile/redo03a.log') SIZE 100M    MAXLOGFILES 30    MAXLOGMEMBERS 5    MAXLOGHISTORY 1    MAXDATAFILES 100    MAXINSTANCES 1    CHARACTER SET US7ASCII    NATIONAL CHARACTER SET AL16UTF16    DATAFILE '/u01/app/oracle/oradata/secdb/dfile/system01.dbf' SIZE 325M REUSE    EXTENT MANAGEMENT LOCAL    SYSAUX DATAFILE '/u01/app/oracle/oradata/secdb/dfile/sysaux01.dbf' SIZE 325M REUSE    DEFAULT TABLESPACE tbs_1 DATAFILE '/u01/app/oracle/oradata/secdb/dfile/tbs_1.dbf size 50m    DEFAULT TEMPORARY TABLESPACE tempts1       TEMPFILE '/u01/app/oracle/oradata/secdb/dfile/temp01.dbf'       SIZE 20M REUSE    UNDO TABLESPACE undotbs       DATAFILE '/u01/app/oracle/oradata/secdb/dfile/undotbs01.dbf'       SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
語句上的錯誤此時已經很容易定位。

4.故障處理

既然問題已經定位,處理的方法便非常簡單,將缺失的單引號補全後執行便可。

5.小結
對於一名優秀的DBA,細心是最重要的基本素質!與此同時,好的方法和技巧可以大大減少出錯的機率。
當故障來臨時,我們應該做到沉著、冷靜,往往變通一下便會柳暗花明!

Good luck.

secooler
11.05.11

-- The End --


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-695060/,如需轉載,請註明出處,否則將追究法律責任。

相關文章