oracle 12cR2 版本推出后,其新特性吸引了眾多 dba 的關注。為了充分了解新版本,我們需要進行充分的測試和演練。從 12cR2 Linux 版本發布之日起,我就開始使用 DBCA 靜默創建數據庫進行測試,其中多租戶架構(容器數據庫 CDB)無疑是一個亮點。
CDB 架構在 12c 中的引入對 Oracle 數據庫底層架構產生了重大影響,因此 CREATE database 語句也發生了顯著變化,引入了種子數據庫 (seed) 的概念。此外,12.2 版本中 undo 表空間的管理模式也引入了 local 和 share 兩種模式,這是與 12.1 版本的主要區別。
您是否嘗試過手動創建數據庫?根據我的測試經驗,其中存在一些潛在問題,本文旨在幫助您避免這些彎路。
首先,使用 CREATE DATABASE 語句創建數據庫。Oracle 官方文檔對 12.2 版本中的該語句進行了詳細說明。
創建容器數據庫時,文檔提供了兩種方式:一種使用 OMF(Oracle Managed Files),另一種是非 OMF 方式。日常使用中,我們通常更傾向于非 OMF 方式;如果數據庫位于 ASM 中,則會傾向于自動管理,因為 ASM 的文件管理基于 OMF 方式。
為了方便演示,我將使用 OMF 方式進行說明,這樣 CREATE DATABASE 語句的結構會更清晰簡潔。
創建一個 CDB,創建參數文件,并將數據庫啟動至 nomount 狀態后,可以使用以下語句:
CREATE DATABASE newcdb USER SYS IDENTIFIED BY sys_password USER SYSTEM IDENTIFIED BY system_password EXTENT MANAGEMENT LOCAL DEFAULT TABLESPACE users DEFAULT TEMPORARY TABLESPACE temp UNDO TABLESPACE undotbs1 ENABLE PLUGGABLE DATABASE SEED SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED SYSAUX DATAFILES SIZE 100M;
與之前的版本不同之處在于以上黃色部分。
完成數據庫創建步驟后,工作才完成了一半。另一項重要工作是初始化數據字典,這需要手動運行 catalog.sql 和 catproc.sql 這兩個核心腳本,以及其他輔助腳本(如 publd.sql 等)。然而,12.2 版本有所改變,文檔中指出只需使用 catcdb.sql 腳本即可。
在 12.1 版本中,catcdb.sql 是一個標準的 SQL 文件,它會引用其他 SQL 腳本。但在 12.2 版本中,catcdb.sql 引用的是 catcdb.pl perl 腳本,您不會直接看到 catalog.sql 和 catproc.sql 等腳本的調用,這些都被封裝起來了。
調用方式仍然類似。
運行 catcdb.sql 腳本需要輸入兩個參數,但文檔并未解釋參數含義。這兩個參數分別是 $ORACLE_HOME/rdbms/admin 和 catcdb.pl。如果不知道參數,也不用擔心,因為您可能首先會遇到其他問題。我們先不輸入任何參數,直接回車:
@?/rdbms/admin/catcdb.sql
系統會提示輸入兩個參數值,然后報錯:
Can’t locate Term/ReadKey.pm in @INC (@INC contains: /U01/app/oracle/product/12.2/rdbms/admin /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /U01/app/oracle/product/12.2/rdbms/admin/catcdb.pl line 30. BEGIN failed–compilation aborted at /U01/app/oracle/product/12.2/rdbms/admin/catcdb.pl line 30.
錯誤提示找不到 ReadKey.pm 模塊。雖然 Linux 和 unix 系統自帶 Perl,但無需重新安裝 Perl。所需文件位于 $ORACLE_HOME 下的 Perl 目錄(版本為 5.22.0),只需將該目錄添加到 PATH 環境變量即可:
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$ORACLE_HOME/perl/bin:$ORACLE_HOME/jdk/bin:$PATH
這樣就解決了第一個問題。
接下來,可能會遇到找不到 util.pm 模塊的問題:
Can’t locate util.pm in @INC (you may need to install the util module) (@INC contains: /U01/app/oracle/product/12.2/rdbms/admin /home/U01/app/oracle/product/12.2/perl/lib/site_perl/5.22.0/x86_64-linux-thread-multi /home/U01/app/oracle/product/12.2/perl/lib/site_perl/5.22.0 /home/U01/app/oracle/product/12.2/perl/lib/5.22.0/x86_64-linux-thread-multi /home/U01/app/oracle/product/12.2/perl/lib/5.22.0 .) at /U01/app/oracle/product/12.2/rdbms/admin/catcdb.pl line 35. BEGIN failed–compilation aborted at /U01/app/oracle/product/12.2/rdbms/admin/catcdb.pl line 35.
這時,我們需要查找 util.pm 文件。如果找不到,可以嘗試將 util 改為 Util,看看是否能找到匹配的文件。
找到 Util.pm 文件后,需要修改 catcdb.pl 腳本,將 util 修改為 Util:
use Term::ReadKey; # to not echo password use Getopt::Long; use Cwd; use File::Spec; use Data::Dumper; use Util qw(trim, splitToArray); #修改為Util use catcon qw(catconSqlplus);
修改后再次運行,仍然可能報錯。這時,需要切換到 Hash 目錄下運行腳本。
以上問題希望能幫助大家避免在 12.2 版本中手動創建數據庫時遇到的問題。 這些細節問題提醒我們,在使用新版本數據庫時,需要仔細閱讀文檔并進行充分的測試。 希望本文能對您的工作有所幫助。