《Oracle DBCA高級(jí)玩法:從模板選擇、腳本調(diào)用到多租戶》要點(diǎn):
本文介紹了Oracle DBCA高級(jí)玩法:從模板選擇、腳本調(diào)用到多租戶,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
作者介紹
楊建榮,DBAplus社群聯(lián)合發(fā)起人.現(xiàn)就職于搜狐暢游,OracleACE-A、YEP成員,超7年數(shù)據(jù)庫開發(fā)和運(yùn)維經(jīng)驗(yàn),擅長電信數(shù)據(jù)業(yè)務(wù)、數(shù)據(jù)庫遷移和性能調(diào)優(yōu).持Oracle10GOCP,OCM,MySQLOCP認(rèn)證,《OracleDBA工作筆記》作者.
本篇文章的思路如下:
1.DBCA-熟悉而又陌生
2.Oracle中創(chuàng)建數(shù)據(jù)庫的模板
3.解讀seed模板的原理
4.解析seed模板創(chuàng)建數(shù)據(jù)庫的過程
5.解析DBCA的調(diào)用腳本
6.DBCA和技術(shù)趨勢發(fā)展的關(guān)系
1)DBDA和多租戶的關(guān)系
2)通過DBCA創(chuàng)建DataGuard
但凡是學(xué)過Oracle的同學(xué),對(duì)DBCA(DatabaseConfigurationAssistant,DBCA)都不會(huì)陌生,有了這個(gè)工具,使得創(chuàng)建數(shù)據(jù)庫成為可能.而DBCA本身有圖形和靜默兩種方式.其中靜默方式看起來高大上一些,因?yàn)橐粋€(gè)看似復(fù)雜的創(chuàng)建數(shù)據(jù)庫的過程,用一個(gè)命令就可以輕松搞定.靜默安裝的命令類似下面的形式,其中創(chuàng)建的數(shù)據(jù)庫為testdb,字符集為ZHS16GBK.
dbca-silent-createDatabase-templateName$ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc-gdbnametestdb-sidtestdb-characterSetZHS16GBK-sysPasswordoracle-systemPasswordoracle
這樣就了解了DBCA的整個(gè)過程嗎?肯定不是.
首先需要了解一下上面命令里提到的模板General_Purpose.dbc,在10g中是分為四個(gè)模板(通用,OLTP,OLAP,定制)可供選擇,而11g中目前存在三種模板可供選擇,就是通用/OLTP、OLAP和定制類型,主要是通用模板和OLTP模板耦合度太高,所以11g中我們看到的是三個(gè)模板,如下圖所示.
需要說明的是對(duì)于模板類型有seed和noseed兩種,主要的區(qū)別在于是否包含數(shù)據(jù)文件(對(duì)應(yīng)上圖紅色標(biāo)識(shí)的“IncludesDatafiles”),簡單來說,seed就是從RMAN備份中還原恢復(fù)數(shù)據(jù)庫,由于是這個(gè)過程是使用通用模板,不能做其他更多的定制修改,但是最大的特點(diǎn)是創(chuàng)建速度快,OLTP和OLAP的模板就屬于seed模板類型;而“定制數(shù)據(jù)庫”模板則屬于noseed模板,不包含數(shù)據(jù)文件,需要使用createdatabase命令創(chuàng)建數(shù)據(jù)庫,需要初始化數(shù)據(jù)字典,安裝組件等,創(chuàng)建時(shí)間要長很多,對(duì)于大部分系統(tǒng)業(yè)務(wù)來說,需要根據(jù)自己的需求來選擇合適的模板類型.
seed模板的方式是使用RMAN恢復(fù)來完成,那么數(shù)據(jù)備份在哪里呢?在$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
可能到這里還不大明白,其實(shí)在這里Seed_Database.dfb就是RMAN的備份.
而可以很清楚看到數(shù)據(jù)庫的db_name是seed_database這樣的字眼,其實(shí)是在創(chuàng)建的過程中修改了db_name,如果用數(shù)據(jù)庫的工具來理解,就是一個(gè)nid修改db_name. 如果我們通過strings的方式解析這些文件就會(huì)發(fā)現(xiàn)db_name是seeddata.
當(dāng)然DBCA靜默這個(gè)過程很容易實(shí)踐.我們花幾分鐘就能手工完成這個(gè)過程.
首先假設(shè)我們需要?jiǎng)?chuàng)建的數(shù)據(jù)庫為testdb,我們初始化目錄結(jié)構(gòu).
1、如何處理參數(shù)文件
然后在$ORACLE_HOME/dbs下初始化參數(shù)文件initseeddata.ora,內(nèi)容如下:
db_name=seeddata
sga_target=500M
control_files=/U01/app/oracle/oradata/testdb/control01.ctl
這里尤其注意參數(shù)的設(shè)置,db_name為seeddata,控制文件的目錄為testdb相關(guān).完成這一步我們就可以上道了.
啟動(dòng)數(shù)據(jù)庫到nomount階段,證明參數(shù)文件是設(shè)置生效了.
SQL> startup nomount
ORACLE instance started.
Total System Global Area? 521936896 bytes
Fixed Size???????? 2254824 bytes
2、如何處理控制文件
而要啟動(dòng)到mount階段,控制文件怎么處理,我們是從模板的路徑下拷貝一個(gè),就可以啟動(dòng)到mount階段了.
cp Seed_Database.ctl ?/U01/app/oracle/oradata/testdb/control01.ctl
SQL> alter database mount;
Database altered.
3、如何處理Redo日志
那數(shù)據(jù)文件,redo這些文件怎么處理,我們先來處理redo,數(shù)據(jù)文件稍后處理.
當(dāng)前的redo的設(shè)置如下,目前來看是不可用的情況,因?yàn)槁窂绞遣环闲枨蟮?
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、如何處理數(shù)據(jù)文件
接下來的事情,就是數(shù)據(jù)文件了.
處理起來還是常規(guī)思路,就是RMAN注冊信息,做還原,恢復(fù).
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;
}
整個(gè)過程持續(xù)時(shí)間很短,很快就可以完成,最后提示完成了一個(gè)基于SCN的恢復(fù).
RMAN-08187: WARNING: media recovery until SCN 925701 complete
Finished recover at 2016-12-03 22:34:1
啟動(dòng)數(shù)據(jù)庫到open階段resetlogs,就可以打開數(shù)據(jù)庫了.
SQL> alter database open resetlogs;
Database altered.
5、如何修改臨時(shí)數(shù)據(jù)文件
還有什么文件需要處理,就是臨時(shí)數(shù)據(jù)文件了.
查看臨時(shí)數(shù)據(jù)文件會(huì)拋出錯(cuò)誤,我們還是需要修改一下路徑.
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’
策略就是先加后刪(加新的臨時(shí)數(shù)據(jù)文件,不存在的冗余臨時(shí)文件)
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
整個(gè)數(shù)據(jù)的還原恢復(fù)就完成了,接下來就是修改db name了.啟動(dòng)到mount階段即可處理.
startup mount
在命令行下使用nid來修改db_name
nid target=sys/oracle dbname=testdb
當(dāng)然處理好之后原來的參數(shù)文件就不可用了,我們直接重新創(chuàng)建一個(gè)參數(shù)文件inittestdb.ora ,內(nèi)容如下:
db_name=testdb
sga_target=500M
control_files=/U01/app/oracle/oradata/testdb/control01.ctl
compatible=11.2.0.4? –我使用的當(dāng)前版本為11.2.0.4
在這個(gè)基礎(chǔ)上啟動(dòng)數(shù)據(jù)庫到mount,使用open resetlogs就可以打開數(shù)據(jù)庫了.
SQL>startup mount
SQL>alter database open resetlogs;
當(dāng)然這個(gè)思路對(duì)于理解DBCA來說是有益無害的.
那么,在這個(gè)基礎(chǔ)上怎么繼續(xù)理解DBCA的過程呢?
毫無疑問就是看到一些詳細(xì)的調(diào)用方式,比如腳本之類的,參數(shù)文件的處理等,這些Oracle處理起來還是有一些方法論的.
得到DBCA的靜默創(chuàng)建腳本很簡單,就是添加一個(gè)generateScripts選項(xiàng)即可.
比如下面的方式,輸出會(huì)告訴你一個(gè)路徑.假設(shè)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還原的過程呢,本質(zhì)上RMAN的核心就是dbms_backup_restore,dbms_rcvman的包.我們可以在得到的腳本中看到.
重點(diǎn)工作就是下面的這句:
dbms_backup_restore.restoreBackupPiece(‘/U01/app/oracle/product/10.2/assistants/dbca/templates/Seed_Database.dfb’, done);
我們分析生成的腳本可以讓自己的理解更上一個(gè)層次.生成的腳本如下:
-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
運(yùn)行的主體是testdb1.sh這個(gè)shell腳本,而腳本里調(diào)用的SQL腳本是testdb1.sql,我們就不兜圈子了,調(diào)用的順序如下:
@/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
學(xué)習(xí)了這個(gè)過程,突然發(fā)現(xiàn)我們熟悉的DBCA其實(shí)還是有一些持續(xù)學(xué)習(xí)的必要.看起來簡單的工具能夠掌握本質(zhì),本身就是一種無形的進(jìn)步.
這里我們分兩個(gè)方面來看,一個(gè)是DBCA和多租戶的關(guān)系,看似不大起眼的DBCA其實(shí)和12c的架構(gòu)設(shè)計(jì)密不可分.另外一個(gè)是12.2的一個(gè)新特性,絕對(duì)會(huì)讓人眼前一亮.
1、DBCA和多租戶的關(guān)系
而結(jié)合技術(shù)趨勢來看DBCA其實(shí)發(fā)現(xiàn)它還是有很大的改進(jìn),我們簡單說說.
首先是12c引入的多租用戶特性(Multitenant Environment),它允許一個(gè)數(shù)據(jù)庫容器(CDB)承載多個(gè)可插拔數(shù)據(jù)庫(PDB),通俗點(diǎn)說就是庫中庫,或者說是數(shù)據(jù)庫里的Docker.在即將推出的12.2中支持的PDB數(shù)從252增加到了4096個(gè),下面這個(gè)經(jīng)典的架構(gòu)圖來自官方.
這個(gè)和DBCA有什么關(guān)系呢?里面有一個(gè)SEED的PDB,是容器架構(gòu)的一個(gè)重點(diǎn)部分.
Seed又叫PDB$SEED,創(chuàng)建PDBS數(shù)據(jù)庫的模板,你不能在Seed中添加或修改一個(gè)對(duì)象(因?yàn)槭沁@個(gè)PDB是只讀的).一個(gè)CDB中有且只能有一個(gè)Seed.
這里的這個(gè)PDB其實(shí)就是一個(gè)”活”的模板庫,它有自己獨(dú)立的系統(tǒng)表空間.如圖左下所示.
我們可以很輕松地創(chuàng)建一個(gè)PDB,比如:
這個(gè)實(shí)現(xiàn)過程其實(shí)就和我們上面模擬DBCA模板建庫如出一轍了.
2、通過DBCA創(chuàng)建Data Guard
對(duì)于DBCA,我們還有些沒想到的功能,而Oracle在12.2已經(jīng)要推出新功能了,那就是通過DBCA創(chuàng)建Data Guard.而如果明白了上面解析的過程,其實(shí)理解這個(gè)特性也不大難了.這個(gè)過程會(huì)指向主庫來獲取文件,使得創(chuàng)建備庫更加便捷,簡單.
一個(gè)很簡單的知識(shí)點(diǎn)可以由點(diǎn)及面地學(xué)習(xí),掌握了本質(zhì)的東西,就可以觸類旁通了,不能輕視和浮躁.
文章出處:DBAplus社群(訂閱號(hào)ID:dbaplus)
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4379.html