深入理解Oracle中的DBCA
但凡是學習 過Oracle的同學,DBCA都是一個必備工具,有了這個工具,建立資料庫成為可能。而DBCA本身有圖形和靜默兩種方式。靜默方式看起來高大上,可以輕鬆搞定一個看似很複雜的建立資料庫過程,而只需要一個命令。類似下面的形式。
dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname testdb -sid testdb -characterSet ZHS16GBK -sysPassword oracle -systemPassword oracle -generateScripts
而我們跟進一步,DBCA的整個過程就瞭解嗎。
第一點需要明確的是建立資料庫的過程中模板型別有seed,noseed之分,不明白沒關係,看到下面這個圖就應該理解了。
關鍵就是紅色框圖的部分,“Includes Datafiles”, seed模板的方式建立要快,而noseed的要相對慢一些,差別就在於此。而這句話進一步怎麼理解呢。seed模板的方式本質上就是RMAN的還原恢復過程。noseed的則是邏輯建立的過程,初始化資料字典等操作,都是完全重新初始化的。
那麼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的過程。
當然這個過程很容易實踐。我們來花幾分鐘就能搞定這個過程。
首先假設我們需要建立的資料庫為testdb
我們初始化目錄結構。
mkdir -p /U01/app/oracle/oradata/testdb/
然後在$ORACLE_HOME/dbs下初始化引數檔案initseeddata.ora,內容如下:
db_name=seeddata
sga_target=500M
control_files=/U01/app/oracle/oradata/testdb/control01.ctl
這裡尤其注意引數的設定,db_name為seeddata,控制檔案的目錄為testdb相關。完成這一步我們就開始上路了。
SQL> startup nomount
ORACLE instance started.
Total System Global Area 521936896 bytes
Fixed Size 2254824 bytes
控制檔案怎麼處理,我們還是從模板的路徑下拷貝一個,就可以啟動到mount階段了。
cp Seed_Database.ctl /U01/app/oracle/oradata/testdb/control01.ctl
SQL> alter database mount;
Database altered.
那資料檔案,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';
剩下的事情,就是資料檔案了。
處理起來還是常規思路,就是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.
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'整個資料的還原恢復就完成了,接下來就是修改db name了。啟動到mount階段即可處理。
startup mount
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然後在這個基礎上啟動資料庫到Mount,open resetlogs就可以了。
SQL>startup mount
SQL>alter database open resetlogs;
當然這個思路對於理解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,dbms_rcv的包。我們可以在得到的指令碼中看到。重點工作就是下面的這句。
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其實還是有一些持續學習的必要。看起來簡單的工具能夠掌握本質,本身就是一種無形的進步。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2129629/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中Hint深入理解(原創)Oracle
- Oracle OCP(36):DBCA建庫Oracle
- JS中this的深入理解JS
- 深入理解Js中的thisJS
- 深入理解oracle的事務隔離性Oracle
- 深入理解JavaScirpt中的this(轉)Java
- 深入理解Java中的AQSJavaAQS
- 深入理解Java中的鎖Java
- 深入理解 Java 中的 LambdaJava
- 深入理解python中的yieldPython
- 深入理解gradle中的taskGradle
- 深入理解 JavaScript 中的 classJavaScript
- 更深入的理解Python中的迭代Python
- 更深入的理解 Python 中的迭代Python
- 深入理解Flink中的狀態
- 深入理解Java中的逃逸分析Java
- 深入理解JMeter中的JSON ExtractorJMeterJSON
- 深入理解Java中的鎖(二)Java
- 深入理解Java中的鎖(一)Java
- 深入理解Java中的Garbage CollectionJava
- 深入理解JavaScript中的箭頭JavaScript
- oracle RAC dbca的時候報錯提示cluster nodes are not accessibleOracle
- Oracle 18c使用dbca建立級聯DGOracle
- 深入理解Java中的不可變物件Java物件
- 深入理解 ES6中的 Reflect
- 深入理解python中的類和物件Python物件
- 深入理解koa中的co原始碼原始碼
- 深入理解Swift中的Class和StructSwiftStruct
- 深入理解 MVC 中的 M 與 CMVC
- 關於react中setState的深入理解React
- 深入理解JavaScript中的精度丟失JavaScript
- 深入理解JavaScript中的WeakMap和WeakSetJavaScript
- 深入理解Python中的裝飾器Python
- JAVA中鎖的深入理解與解析Java
- 深入理解Javascript中的隱式呼叫JavaScript
- 深入理解 Android 中的各種 ContextAndroidContext
- 深入理解Vue中的slots/scoped slotsVue
- 深入理解JavaScript中的類繼承JavaScript繼承
- 深入理解Java中的volatile關鍵字Java