閱讀261 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Oracle DBCA高級玩法:從模板選擇、腳本調用到多租戶

作者介紹

楊建榮DBAplus社群聯合發起人。現就職於搜狐暢遊,Oracle ACE-A、YEP成員,超7年數據庫開發和運維經驗,擅長電信數據業務、數據庫遷移和性能調優。持Oracle 10G OCP,OCM,MySQL OCP認證,《Oracle DBA工作筆記》作者

 

本篇文章的思路如下:

  1. DBCA-熟悉而又陌生

  2. Oracle中創建數據庫的模板     

  3. 解讀seed模板的原理

  4. 解析seed模板創建數據庫的過程    

  5. 解析DBCA的調用腳本     

  6. DBCA和技術趨勢發展的關係   

    1)DBDA和多租戶的關係      

    2)通過DBCA創建Data Guard   

 

 一、DBCA-熟悉而又陌生  

 

但凡是學過Oracle的同學,對DBCA(Database Configuration Assistant, DBCA)都不會陌生,有了這個工具,使得創建數據庫成為可能。而DBCA本身有圖形和靜默兩種方式。其中靜默方式看起來高大上一些,因為一個看似複雜的創建數據庫的過程,用一個命令就可以輕鬆搞定。靜默安裝的命令類似下麵的形式,其中創建的數據庫為testdb,字符集為ZHS16GBK。

dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname testdb -sid testdb  -characterSet ZHS16GBK  -sysPassword oracle -systemPassword oracle

 

這樣就了解了DBCA的整個過程嗎?肯定不是。

 

 二、Oracle中創建數據庫的模板  

 

首先需要了解一下上麵命令裏提到的模板General_Purpose.dbc,在10g中是分為四個模板(通用,OLTP,OLAP,定製)可供選擇,而11g中目前存在三種模板可供選擇,就是通用/OLTP、OLAP和定製類型,主要是通用模板和OLTP模板耦合度太高,所以11g中我們看到的是三個模板,如下圖所示。

 

20161207100503472.jpg
 

需要說明的是對於模板類型有seed和noseed兩種,主要的區別在於是否包含數據文件(對應上圖紅色標識的“Includes Datafiles”),簡單來說,seed就是從RMAN備份中還原恢複數據庫,由於是這個過程是使用通用模板,不能做其他更多的定製修改,但是最大的特點是創建速度快,OLTP和OLAP的模板就屬於seed模板類型;而“定製數據庫”模板則屬於noseed模板,不包含數據文件,需要使用create database命令創建數據庫,需要初始化數據字典,安裝組件等,創建時間要長很多,對於大部分係統業務來說,需要根據自己的需求來選擇合適的模板類型。

 

 三、解讀seed模板的原理  

 

seed模板的方式是使用RMAN恢複來完成,那麼數據備份在哪裏呢?在$ORACLE_HOME/assistants/dbca/templates下麵。

[oracle@newtest 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,我們初始化目錄結構。

mkdir -p /U01/app/oracle/oradata/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個,下麵這個經典的架構圖來自官方。

 

20161207100521465.jpg

 

這個和DBCA有什麼關係呢?裏麵有一個SEED的PDB,是容器架構的一個重點部分。

 

Seed又叫PDB$SEED,創建PDBS數據庫的模板,你不能在Seed中添加或修改一個對象(因為是這個PDB是隻讀的)。一個CDB中有且隻能有一個Seed。

這裏的這個PDB其實就是一個”活”的模板庫,它有自己獨立的係統表空間。如圖左下所示。

 

20161207100535734.jpg

 

我們可以很輕鬆地創建一個PDB,比如:

SQL>CREATE PLUGGABLE DATABASE testpdb ADMIN USER pdb_mgr IDENTIFIED BY xxx file_name_convert=('/U01/app/oracle/oradata/testdb,'/U01/app/oracle/oradata/testdb/testpdb);
Pluggable database created.

 

這個實現過程其實就和我們上麵模擬DBCA模板建庫如出一轍了。

 

2、通過DBCA創建Data Guard

 

對於DBCA,我們還有些沒想到的功能,而Oracle在12.2已經要推出新功能了,那就是通過DBCA創建Data Guard。而如果明白了上麵解析的過程,其實理解這個特性也不大難了。這個過程會指向主庫來獲取文件,使得創建備庫更加便捷,簡單。

原文發布時間為:2016-12-07

本文來自雲棲社區合作夥伴DBAplus

最後更新:2017-05-11 14:31:15

  上一篇:go  透過DB-Enginges,看數據庫管理係統的潮起浪湧
  下一篇:go  在阿裏雲ECS上輕鬆實現無域控的SQL Server AlwaysOn可用性組