Oracle DBCA高階玩法:從模板選擇、指令碼呼叫到多租戶
作者介紹
楊建榮,DBAplus社群聯合發起人。現就職於搜狐暢遊,OracleACE-A、YEP成員,超7年資料庫開發和運維經驗,擅長電信資料業務、資料庫遷移和效能調優。持Oracle10GOCP,OCM,MySQLOCP認證,《OracleDBA工作筆記》作者。
本篇文章的思路如下:
1.DBCA-熟悉而又陌生
2.Oracle中建立資料庫的模板
3.解讀seed模板的原理
4.解析seed模板建立資料庫的過程
5.解析DBCA的呼叫指令碼
6.DBCA和技術趨勢發展的關係
1)DBDA和多租戶的關係
2)通過DBCA建立DataGuard
一、DBCA-熟悉而又陌生
但凡是學過Oracle的同學,對DBCA(DatabaseConfigurationAssistant,DBCA)都不會陌生,有了這個工具,使得建立資料庫成為可能。而DBCA本身有圖形和靜默兩種方式。其中靜默方式看起來高大上一些,因為一個看似複雜的建立資料庫的過程,用一個命令就可以輕鬆搞定。靜默安裝的命令類似下面的形式,其中建立的資料庫為testdb,字符集為ZHS16GBK。
dbca-silent-createDatabase-templateName$ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc-gdbnametestdb-sidtestdb-characterSetZHS16GBK-sysPasswordoracle-systemPasswordoracle
這樣就瞭解了DBCA的整個過程嗎?肯定不是。
二、Oracle中建立資料庫的模板
首先需要了解一下上面命令裡提到的模板General_Purpose.dbc,在10g中是分為四個模板(通用,OLTP,OLAP,定製)可供選擇,而11g中目前存在三種模板可供選擇,就是通用/OLTP、OLAP和定製型別,主要是通用模板和OLTP模板耦合度太高,所以11g中我們看到的是三個模板,如下圖所示。
需要說明的是對於模板型別有seed和noseed兩種,主要的區別在於是否包含資料檔案(對應上圖紅色標識的“IncludesDatafiles”),簡單來說,seed就是從RMAN備份中還原恢復資料庫,由於是這個過程是使用通用模板,不能做其他更多的定製修改,但是最大的特點是建立速度快,OLTP和OLAP的模板就屬於seed模板型別;而“定製資料庫”模板則屬於noseed模板,不包含資料檔案,需要使用createdatabase命令建立資料庫,需要初始化資料字典,安裝元件等,建立時間要長很多,對於大部分系統業務來說,需要根據自己的需求來選擇合適的模板型別。
三、解讀seed模板的原理
seed模板的方式是使用RMAN恢復來完成,那麼資料備份在哪裡呢?在$ORACLE_HOME/assistants/dbca/templates下面。
[[email protected] templates]$ ll
total 301544
-rw-r–r– 1 oracle oinstall 5104 Aug 24 2013 Data_Warehouse.dbc
-rwxr-xr-x 1 oracle oinstall 21741568 Aug 27 2013 example01.dfb
-rwxr-xr-x 1 oracle oinstall 1507328 Aug 27 2013 example.dmp
-rw-r–r– 1 oracle oinstall 4984 Aug 24 2013 General_Purpose.dbc
-rw-r–r– 1 oracle oinstall 11489 May 1 2013 New_Database.dbt
-rwxr-xr-x 1 oracle oinstall 9748480 Aug 27 2013 Seed_Database.ctl
-rwxr-xr-x 1 oracle oinstall 275750912 Aug 27 2013 Seed_Database.dfb
可能到這裡還不大明白,其實在這裡Seed_Database.dfb就是RMAN的備份。
而可以很清楚看到資料庫的db_name是seed_database這樣的字眼,其實是在建立的過程中修改了db_name,如果用資料庫的工具來理解,就是一個nid修改db_name。 如果我們通過strings的方式解析這些檔案就會發現db_name是seeddata.
四、解析seed模板建立資料庫的過程
當然DBCA靜默這個過程很容易實踐。我們花幾分鐘就能手工完成這個過程。
首先假設我們需要建立的資料庫為testdb,我們初始化目錄結構。
1、如何處理引數檔案
然後在$ORACLE_HOME/dbs下初始化引數檔案initseeddata.ora,內容如下:
db_name=seeddata
sga_target=500M
control_files=/U01/app/oracle/oradata/testdb/control01.ctl
這裡尤其注意引數的設定,db_name為seeddata,控制檔案的目錄為testdb相關。完成這一步我們就可以上道了。
啟動資料庫到nomount階段,證明引數檔案是設定生效了。
SQL> startup nomount
ORACLE instance started.
Total System Global Area 521936896 bytes
Fixed Size 2254824 bytes
2、如何處理控制檔案
而要啟動到mount階段,控制檔案怎麼處理,我們是從模板的路徑下拷貝一個,就可以啟動到mount階段了。
cp Seed_Database.ctl /U01/app/oracle/oradata/testdb/control01.ctl
SQL> alter database mount;
Database altered.
3、如何處理Redo日誌
那資料檔案,redo這些檔案怎麼處理,我們先來處理redo,資料檔案稍後處理。
當前的redo的設定如下,目前來看是不可用的情況,因為路徑是不符合需求的。
SQL> select member from v$logfile;
MEMBER
—————————————————
/ade/b/2232964209/oracle/oradata/seeddata/redo01.log
/ade/b/2232964209/oracle/oradata/seeddata/redo02.log
/ade/b/2232964209/oracle/oradata/seeddata/redo03.log
我們需要修改為自己需要的格式。
alter database rename file ‘/ade/b/2232964209/oracle/oradata/seeddata/redo01.log’ to ‘/U01/app/oracle/oradata/testdb/redo01.log’;
alter database rename file ‘/ade/b/2232964209/oracle/oradata/seeddata/redo02.log’ to ‘/U01/app/oracle/oradata/testdb/redo02.log’;
alter database rename file ‘/ade/b/2232964209/oracle/oradata/seeddata/redo03.log’ to ‘/U01/app/oracle/oradata/testdb/redo03.log’;
4、如何處理資料檔案
接下來的事情,就是資料檔案了。
處理起來還是常規思路,就是RMAN註冊資訊,做還原,恢復。
RMAN> catalog start with ‘/U01/app/oracle/product/11.2.0.4/assistants/dbca/templates/Seed_Database.dfb’;
run
{set newname for datafile 1 to ‘/U01/app/oracle/oradata/testdb/system01.dbf’;
set newname for datafile 2 to ‘/U01/app/oracle/oradata/testdb/sysaux01.dbf’;
set newname for datafile 3 to ‘/U01/app/oracle/oradata/testdb/undotbs01.dbf’;
set newname for datafile 4 to ‘/U01/app/oracle/oradata/testdb/user01.dbf’;
restore database;
switch datafile all;
recover database;
}
整個過程持續時間很短,很快就可以完成,最後提示完成了一個基於SCN的恢復。
RMAN-08187: WARNING: media recovery until SCN 925701 complete
Finished recover at 2016-12-03 22:34:1
啟動資料庫到open階段resetlogs,就可以開啟資料庫了。
SQL> alter database open resetlogs;
Database altered.
5、如何修改臨時資料檔案
還有什麼檔案需要處理,就是臨時資料檔案了。
檢視臨時資料檔案會丟擲錯誤,我們還是需要修改一下路徑。
SQL>select file_name from dba_temp_files
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 201 – see DBWR trace file
ORA-01110: data file 201:
‘/ade/b/2232964209/oracle/oradata/seeddata/temp01.dbf’
策略就是先加後刪(加新的臨時資料檔案,不存在的冗餘臨時檔案)
alter tablespace temp add tempfile ‘/U01/app/oracle/oradata/testdb/temp01.dbf’ size 100m;
alter tablespace temp drop tempfile ‘/ade/b/2232964209/oracle/oradata/seeddata/temp01.dbf’
6、如何修改db_name
整個資料的還原恢復就完成了,接下來就是修改db name了。啟動到mount階段即可處理。
startup mount
在命令列下使用nid來修改db_name
nid target=sys/oracle dbname=testdb
當然處理好之後原來的引數檔案就不可用了,我們直接重新建立一個引數檔案inittestdb.ora ,內容如下:
db_name=testdb
sga_target=500M
control_files=/U01/app/oracle/oradata/testdb/control01.ctl
compatible=11.2.0.4 –我使用的當前版本為11.2.0.4
在這個基礎上啟動資料庫到mount,使用open resetlogs就可以開啟資料庫了。
SQL>startup mount
SQL>alter database open resetlogs;
當然這個思路對於理解DBCA來說是有益無害的。
那麼,在這個基礎上怎麼繼續理解DBCA的過程呢?
五、解析DBCA的呼叫指令碼
毫無疑問就是看到一些詳細的呼叫方式,比如指令碼之類的,引數檔案的處理等,這些Oracle處理起來還是有一些方法論的。
得到DBCA的靜默建立指令碼很簡單,就是新增一個generateScripts選項即可。
比如下面的方式,輸出會告訴你一個路徑。假設db name為testdb1:
dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname testdb1 -sid testdb1 -characterSet ZHS16GBK -sysPassword oracle -systemPassword oracle -generateScripts
那麼RMAN還原的過程呢,本質上RMAN的核心就是dbms_backup_restore,dbms_rcvman的包。我們可以在得到的指令碼中看到。
重點工作就是下面的這句:
dbms_backup_restore.restoreBackupPiece(‘/U01/app/oracle/product/10.2/assistants/dbca/templates/Seed_Database.dfb’, done);
我們分析生成的指令碼可以讓自己的理解更上一個層次。生成的指令碼如下:
-rw-r—– 1 oracle oinstall 2165 Dec 3 22:04 cloneDBCreation.sql
-rw-r—– 1 oracle oinstall 286 Dec 3 22:04 CloneRmanRestore.sql
-rw-r—– 1 oracle oinstall 2061 Dec 3 22:04 init.ora
-rw-r—– 1 oracle oinstall 2155 Dec 3 22:04 inittestdb1Temp.ora
-rw-r—– 1 oracle oinstall 510 Dec 3 22:04 lockAccount.sql
-rw-r—– 1 oracle oinstall 726 Dec 3 22:04 postDBCreation.sql
-rw-r—– 1 oracle oinstall 649 Dec 3 22:04 postScripts.sql
-rw-r—– 1 oracle oinstall 1373 Dec 3 22:04 rmanRestoreDatafiles.sql
-rw-r—– 1 oracle oinstall 399 Dec 3 22:04 testdb1.log
-rwxr-xr-x 1 oracle oinstall 704 Dec 3 22:04 testdb1.sh
-rwxr-xr-x 1 oracle oinstall 554 Dec 3 22:04 testdb1.sql
執行的主體是testdb1.sh這個shell指令碼,而腳本里呼叫的SQL指令碼是testdb1.sql,我們就不兜圈子了,呼叫的順序如下:
@/U01/app/oracle/admin/testdb1/scripts/CloneRmanRestore.sql
@/U01/app/oracle/admin/testdb1/scripts/cloneDBCreation.sql
@/U01/app/oracle/admin/testdb1/scripts/postScripts.sql
@/U01/app/oracle/admin/testdb1/scripts/lockAccount.sql
@/U01/app/oracle/admin/testdb1/scripts/postDBCreation.sql
- CloneRmanRestore.sql的工作是完成備份的還原
- cloneDBCreation.sql的工作是重建控制檔案,重建臨時表空間,修改db_name,修改字符集。
- postScripts.sql是初始化一些目錄結構。
- lockAccount.sql是對一些非系統使用者做鎖定操作。
- postDBCreation.sql是做一些資料庫建立後的基本補充,做一些編譯的工作。
學習了這個過程,突然發現我們熟悉的DBCA其實還是有一些持續學習的必要。看起來簡單的工具能夠掌握本質,本身就是一種無形的進步。
六、DBCA和技術趨勢發展的關係
這裡我們分兩個方面來看,一個是DBCA和多租戶的關係,看似不大起眼的DBCA其實和12c的架構設計密不可分。另外一個是12.2的一個新特性,絕對會讓人眼前一亮。
1、DBCA和多租戶的關係
而結合技術趨勢來看DBCA其實發現它還是有很大的改進,我們簡單說說。
首先是12c引入的多租使用者特性(Multitenant Environment),它允許一個數據庫容器(CDB)承載多個可插拔資料庫(PDB),通俗點說就是庫中庫,或者說是資料庫裡的Docker。在即將推出的12.2中支援的PDB數從252增加到了4096個,下面這個經典的架構圖來自官方。
這個和DBCA有什麼關係呢?裡面有一個SEED的PDB,是容器架構的一個重點部分。
Seed又叫PDB$SEED,建立PDBS資料庫的模板,你不能在Seed中新增或修改一個物件(因為是這個PDB是隻讀的)。一個CDB中有且只能有一個Seed。
這裡的這個PDB其實就是一個”活”的模板庫,它有自己獨立的系統表空間。如圖左下所示。
我們可以很輕鬆地建立一個PDB,比如:
Pluggable database created.
這個實現過程其實就和我們上面模擬DBCA模板建庫如出一轍了。
2、通過DBCA建立Data Guard
對於DBCA,我們還有些沒想到的功能,而Oracle在12.2已經要推出新功能了,那就是通過DBCA建立Data Guard。而如果明白了上面解析的過程,其實理解這個特性也不大難了。這個過程會指向主庫來獲取檔案,使得建立備庫更加便捷,簡單。
一個很簡單的知識點可以由點及面地學習,掌握了本質的東西,就可以觸類旁通了,不能輕視和浮躁。
文章出處:DBAplus社群(訂閱號ID:dbaplus)