關於create database語句在10g,11g中的不同

jeanron100發表於2015-07-04
最近抽空練習了下手工建庫,在10g的時候基本都在20分鐘搞定,在11g中其實還可以更快,因為10g中需要配置的admin目錄,需要建立bdump,udump之類的目錄等等,在11g都被adr給預設替代了,只要提供了$ORACLE_BASE,就會預設在$ORACLE_BASE下生成對應的目錄結構。
其它步驟完全可以按照10g的指令碼來使用,沒有任何問題,但是如果反過來,在11g裡使用的一些語句在10g中可能會有一些問題,這一點也是在今天的測試中發現的一個小細節。
首先我在11g的庫中建立了一個資料庫例項,使用create database來完成,建立語句類似下面的形式。

CREATE DATABASE mynewdb
   USER SYS IDENTIFIED BY sys_password USER SYSTEM IDENTIFIED BY system_password 
LOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/my/redo01b.log') SIZE 100M BLOCKSIZE 512,
           GROUP 2 ('/u01/logs/my/redo02a.log','/u02/logs/my/redo02b.log') SIZE 100M BLOCKSIZE 512,
           GROUP 3 ('/u01/logs/my/redo03a.log','/u02/logs/my/redo03b.log') SIZE 100M BLOCKSIZE 512
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   CHARACTER SET AL32UTF8
   NATIONAL CHARACTER SET AL16UTF16
   EXTENT MANAGEMENT LOCAL
   DATAFILE '/u01/app/oracle/oradata/mynewdb/system01.dbf' SIZE 325M REUSE
   SYSAUX DATAFILE '/u01/app/oracle/oradata/mynewdb/sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TABLESPACE users
      DATAFILE '/u01/app/oracle/oradata/mynewdb/users01.dbf'
      SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TEMPORARY TABLESPACE tempts1
      TEMPFILE '/u01/app/oracle/oradata/mynewdb/temp01.dbf'
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs
      DATAFILE '/u01/app/oracle/oradata/mynewdb/undotbs01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
這個語句基本不用修改太多的地方,基本就是檔案的路徑,結構部分不用做任何修改。
11g的例項很快就建立完成了。然後就想直接引用這個現成的指令碼,簡單修改一下路徑,資料庫例項名,在10g的環境中建立一個資料庫例項。
但是卻報出了下面的錯誤。
SQL> @createdb.sql
   LOGFILE GROUP 1 ('/u02/oracle/oradata/TEST10G/disk1/redo01a.log','/u02/oracle/oradata/TEST10G/disk2/redo01b.log') SIZE 100M BLOCKSIZE 512,
                                                                                                                               *
ERROR at line 4:
ORA-02165: invalid option for CREATE DATABASE
對於這個錯誤自己還是很疑惑,不知道是哪兒出了問題,開始以為是做路徑替換的時候出了問題,排除了亂碼等的影響。最後發現語句實在沒有其它的問題了。
這個時候把10g的建立語句拿出來比較一下,發現有3處不同之處。
CREATE DATABASE mynewdb
   USER SYS IDENTIFIED BY pz6r58
   USER SYSTEM IDENTIFIED BY y1tz5p
   LOGFILE GROUP 1 ('/u01/oracle/oradata/mynewdb/redo01.log') SIZE 100M,
           GROUP 2 ('/u01/oracle/oradata/mynewdb/redo02.log') SIZE 100M,
           GROUP 3 ('/u01/oracle/oradata/mynewdb/redo03.log') SIZE 100M
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   MAXINSTANCES 1
   CHARACTER SET US7ASCII
   NATIONAL CHARACTER SET AL16UTF16
   DATAFILE '/u01/oracle/oradata/mynewdb/system01.dbf' SIZE 325M REUSE
   EXTENT MANAGEMENT LOCAL
   SYSAUX DATAFILE '/u01/oracle/oradata/mynewdb/sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TABLESPACE tbs_1
   DEFAULT TEMPORARY TABLESPACE tempts1
      TEMPFILE '/u01/oracle/oradata/mynewdb/temp01.dbf' 
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs 
      DATAFILE '/u01/oracle/oradata/mynewdb/undotbs01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

第一處是關於redo日誌組的設定,10g中預設配置一組日誌中只有一個日誌成員。在11g中是預設有2個
第二個不同之處是在10g中有一個配置MAXINSTANCES,在11g中缺沒有,因為是單例項資料庫,是在找不出理由是這個地方的不同引起的問題。
第三個問題就更加明顯了,在10g中 只有一句default tablespace tbs_1 然後沒有定義明細的資訊,這個語句是不能執行的,還需要手工去補充,在11g中,語句已經補充完整了。只需要簡單的根據自己的需求需要一下就可以了。

所以第二個第三個問題是很明顯的,應該不是問題的原因,那麼我們看看第一處不同,還有什麼地方有可能會匯出語句出問題。
11g中這樣定義的
LOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/my/redo01b.log') SIZE 100M BLOCKSIZE 512,
10g中是這樣定義的
   
LOGFILE GROUP 1 ('/u01/oracle/oradata/mynewdb/redo01.log') SIZE 100M,
除了日誌成員的不同外,還有一個地方就是blocksize的不同了,在10g中沒有blocksize的字樣。
帶著試試看的態度把blocksize去掉,然後再次執行語句,語句就執行成功了。
問題解決了,我們來看看blocksize是什麼東東。
這個值是在資料庫的原始碼中固定的,與作業系統相關,預設的值為512. 在不同的os中可能會有所不同。
檢視blocksize的配置,可以使用基表。
這個Log size可以從Oracle的內部檢視中獲得:
SQL> select max(lebsz) from x$kccle;

MAX(LEBSZ)
----------
       512
所以可見在10g,11g的很多細節之處還是會存在一定的差距,11g中也在不斷的進行改進。

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

相關文章