Oracle12c中多宿主容器資料庫(CDBs)和可插拔資料庫(PDBs)新特性之執行指令碼
對開發者和DBA們來說,對shell指令碼批次任務的影響成了多宿主選項帶來的最大改變之一。因為多宿主環境透過服務來連線到可插拔資料庫,因此,依靠CRON和OS認證成了換成多宿主環境後的一個最大問題。本文提供了一些辦法來解決之前shell指令碼工作在多宿主環境的問題。
1. 設定容器
對於那些工作在容器級的DBA指令碼來說,用"/ AS SYSDBA"就可以像之前一樣工作。當你在可插拔資料庫內執行指令碼時,就會出現問題。解決這個問題的最簡單辦法就是繼續用"/ asSYSDBA"連線,但在指令碼中用ALTER SESSION SET CONTAINER命令設定容器。
sqlplus / as sysdba <<EOF
ALTER SESSION SET CONTAINER = pdb1;
-- 和之前一樣執行任務
SHOW CON_NAME;
EXIT;
EOF
為了讓指令碼更通用,把PDB名當做引數。將下面的指令碼存為"set_container_test.sh".
sqlplus / as sysdba <<EOF
ALTER SESSION SET CONTAINER = $1;
--像之前一樣執行任務
SHOW CON_NAME;
EXIT;
EOF
把PDB名作為第一個引數執行指令碼顯示,設定的容器是對的。
$ chmod u+x set_container_test.sh
$ ./set_container_test.sh pdb1
SQL*Plus: Release 12.1.0.1.0 Production onFri Apr 18 16:48:51 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options
SQL> SQL>
Session altered.
SQL> SQL> SQL>
CON_NAME
------------------------------
PDB1
SQL> SQL> Disconnected from OracleDatabase 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options
$
2. TWO_TASK方法
用TWO_TASK環境變數是連線到特定使用者的一個淺顯的方法,可惜的是,用"/ ASSYSDBA"連線方法行不通。
$ export TWO_TASK=pdb1
$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production onFri Apr 18 16:54:34 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logondenied
Enter user-name:
用確定的使用者名稱和口令結合TWO_TASK方法,能像之前一樣正常工作。
$ export TWO_TASK=pdb1
$ sqlplus test/test
SQL*Plus: Release 12.1.0.1.0 Production onFri Apr 18 16:57:46 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Last Successful login time: Wed Apr 02 201410:05:22 +01:00
Connected to:
Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options
SQL> SHOW CON_NAME;
CON_NAME
------------------------------
PDB1
SQL>
也許你並不希望在指令碼中包含確定的使用者名稱和密碼,但如果增加一個指向連線的服務或使用TWO_TASK環境變數,就可以連線到確定的PDB。
3. 安全的外部口令儲存
Oracle 10g引進了不用顯式提供認證,而是使用安全外部口令儲存來連線資料庫的能力。這種基於服務的方式事實上也會很好的使用PDB環境。
把下面的項放入"$ORACLE_HOME/network/admin/sqlnet.ora" 檔案,並確定要求的錢包目錄。
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
SQLNET.WALLET_OVERRIDE = TRUE
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 0
建立一個錢包來儲存認證資訊。Oracle11gR2之後,透過orapki很好的實現了該功能,如果將錢包拷到其他機器,將會阻止自動登入。
$ mkdir -p /u01/app/oracle/wallet
$ orapki wallet create -wallet"/u01/app/oracle/wallet" -pwd "mypassword"-auto_login_local
Oracle Secret Store Tool : Version 12.1.0.1
Copyright (c) 2004, 2012, Oracle and/or itsaffiliates. All rights reserved.
Enter password:
Enter password again:
$
然後,在建立一個和TNS別名相關的認證項。引數為"aliasusername password".
$ mkstore -wrl"/u01/app/oracle/wallet" -createCredential pdb1_test test test
Oracle Secret Store Tool : Version 12.1.0.1
Copyright (c) 2004, 2012, Oracle and/or itsaffiliates. All rights reserved.
Enter wallet password:
Create credentialoracle.security.client.connect_string1
$
在"$ORACLE_HOME/network/admin/tnsnames.ora"檔案中建立一個和錢包中匹配的別名。
PDB1_TEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol6-121.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
至此,我們就可以用錢包中的認證項去連線確定的資料庫。
$ sqlplus /@pdb1_test
SQL*Plus: Release 12.1.0.1.0 Production onSat Apr 19 10:19:38 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Last Successful login time: Sat Apr 19 201410:18:52 +01:00
Connected to:
Oracle Database 12c Enterprise Edition Release12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options
SQL> SHOW USER
USER is "TEST"
SQL> SHOW CON_NAME
CON_NAME
------------------------------
PDB1
SQL>
4. 排程器
Oracle12c中的排程器已被增強,以便可以包含基於指令碼的任務,這樣,你就可以定義行內指令碼,或在檔案系統上呼叫指令碼。這些是外部任務的一個變種,但SQL_SCRIPT和BACKUP_SCRIPT任務型別使得處理認證和多宿主環境變得 更加容易。
catcon.pl
當在多宿主環境執行指令碼時,DBA遇到的另一個問題是在多個PDBS中執行同樣的指令碼。這可以透過前面的方法實現,但Oracle提供的叫"catcon.pl"的PERL模組也許更加方便。
在多宿主環境中,有些Oracle提供的指令碼必須按照特定順序執行,先在CDB$ROOT容器中執行。"catcon.pl" 模組可以完成它,並且提供確定容器的日誌,這樣,你可以很容易的檢查任務完成情況。
該模組的完整語法如下,不帶引數執行該模組會顯示所有的用法。
$ perl catcon.pl
Usage: catcon [-uusername[/password]] [-U username[/password]]
[-d directory] [-l directory]
[{-c|-C} container] [-pdegree-of-parallelism]
[-e] [-s]
[-E { ON |errorlogging-table-other-than-SPERRORLOG } ]
[-g]
-b log-file-name-base
--
{ sqlplus-script [arguments] |--x<SQL-statement> } ...
Optional:
-uusername (optional /password; otherwise prompts for password)
used to connect to the database to run user-supplied scripts or
SQL statements
defaults to "/ as sysdba"
-Uusername (optional /password; otherwise prompts for password)
used to connect to the database to perform internal tasks
defaults to "/ as sysdba"
-ddirectory containing the file to be run
-ldirectory to use for spool log files
-ccontainer(s) in which to run sqlplus scripts, i.e. skip all
Containers not named here; for example,
-c 'PDB1 PDB2',
-Ccontainer(s) in which NOT to run sqlplus scripts, i.e. skip all
Containers named here; for example,
-C 'CDB PDB3'
NOTE: -c and -C are mutually exclusive
-pexpected number of concurrent invocations of this script on a given
host
NOTE: this parameter rarely needs to be specified
-esets echo on while running sqlplus scripts
-soutput of running every script will be spooled into a file whose name
will be
<log-file-name-base>_<script_name_without_extension>_[<container_name_if_any>].<default_extension>
-Esets errorlogging on; if ON is specified, default error logging table
will be used, otherwise, specified error logging table (which must
have been created in every Container) will be used
-gturns on production of debugging info while running this script
Mandatory:
-bbase name (e.g. catcon_test) for log and spool file names
sqlplus-script - sqlplus script to run OR
SQL-statement - a statement toexecute
NOTES:
-if --x<SQL-statement> is the first non-option string, it needs to be
preceeded with -- to avoid confusing module parsing options into
assuming that '-' is an option which that module is not expecting and
about which it will complain
-command line parameters to SQL scripts can be introduced using --p
interactive (or secret) parameters to SQL scripts can be introduced
using --P
For example,
perl catcon.pl ... x.sql '--pJohn' '--PEnter Password for John:' ...
$
關於執行Oracle提供的指令碼,手冊中使用了在所有容器中執行"catblock.sql"指令碼的例子。
$ . oraenv
ORACLE_SID = [cdb1] ?
The Oracle base remains unchanged with value/u01/app/oracle
$ cd $ORACLE_HOME/rdbms/admin/
$ perl catcon.pl -d $ORACLE_HOME/rdbms/admin-b /tmp/catblock_output catblock.sql
$ ls /tmp/catblock_output*
catblock_output0.log catblock_output1.log catblock_output2.log catblock_output3.log
$
第一個輸出檔案包含了來自"cdb$root" and "pdb$seed"容器的輸出。最後一個檔案包含了該任務的整體狀態輸出資訊。中間的其他檔案包含了所有使用者自己建立的PDBS的輸出。
"catcon.pl"模組也能用來在CDB中所有容器中執行查詢。下面的命令在所有容器中執行一個查詢,針對每個容器,其資訊將會輸出到名為"/tmp/tbs_files_outputN.log"的檔案中。
$ cd $ORACLE_HOME/rdbms/admin/
$ perl catcon.pl -e -b /tmp/tbs_files_output-- --x"SELECT tablespace_name,file_name FROM dba_data_files"
$ ls /tmp/tbs_files_output*
/tmp/tbs_files_output0.log /tmp/tbs_files_output1.log /tmp/tbs_files_output2.log /tmp/tbs_files_output3.log
$
透過"-c"選項和"-C"選項,你可以包含和排除特定的PDBS。下例透過漏掉root 和seed容器來在所有使用者定義的容器中執行一個查詢。
$ rm -f /tmp/tbs_files_output*
$ cd $ORACLE_HOME/rdbms/admin/
$ perl catcon.pl -e -C 'CDB$ROOT PDB$SEED' -b/tmp/tbs_files_output -- --x"SELECT tablespace_name,file_name FROM dba_data_files"
$
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2120394/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 詳談Oracle12c新特點容器資料庫&可插拔資料庫(CDB&PDB)Oracle資料庫
- Oracle12cr1新特性之容器資料庫(CDB)和可插拔資料庫(PDB) 的啟動和關閉Oracle資料庫
- Oracle12c中配置例項引數和修改容器資料庫(CDB)及可插拔資料庫(PDB)Oracle資料庫
- oracle12c新特點之可插拔資料庫(Pluggable Database,PDB)Oracle資料庫Database
- kettl連線oracle12c 可插拔資料庫pdbOracle資料庫
- 【12C】Oracle 12C 新特性“可插拔資料庫”功能體驗Oracle資料庫
- Shell多執行緒備份資料庫的指令碼執行緒資料庫指令碼
- Oracle12c中資料刪除(delete)新特性之資料庫內歸檔功能Oracledelete資料庫
- R12c 新特性:RMAN 可插拔資料庫的備份和恢復 (文件 ID 1945849.1)資料庫
- 多租戶:防止意外建立可插拔資料庫(PDB)- Lone-PDB資料庫
- Oracle Database 12c可插拔資料庫案例OracleDatabase資料庫
- Oracle12c多租戶資料庫備份與恢復 - 備份CDB和下面的所有PDBsOracle資料庫
- 【12C】Oracle 12c 可插拔資料庫之資料泵功能體驗Oracle資料庫
- Oracle12c多租戶資料庫備份與恢復 - 備份CDB下的多個PDBsOracle資料庫
- 【新炬網路名師大講堂】12c新特性:備份CDBs和PDBs
- ORACLE資料庫定時執行一些指令碼。Oracle資料庫指令碼
- SOS?求教執行CMP之create,能正常執行,但資料庫中無資料資料庫
- Oracle12c中多宿主環境(CDB&PDB)的資料庫觸發器(Database Trigger)Oracle資料庫觸發器Database
- 透過shell得到資料庫中許可權的指令碼資料庫指令碼
- 通過shell得到資料庫中許可權的指令碼資料庫指令碼
- Oracle12c中效能最佳化增強新特性之資料庫智慧快閃記憶體Oracle資料庫記憶體
- Oracle12c多租戶資料庫備份與恢復 - 恢復整個CDB和其下的PDBs 4Oracle資料庫
- Oracle12c多租戶資料庫備份與恢復 - 恢復整個CDB和其下的PDBs 3Oracle資料庫
- Oracle12c多租戶資料庫備份與恢復 - 恢復整個CDB和其下的PDBs 2Oracle資料庫
- Oracle12c多租戶資料庫備份與恢復 - 恢復整個CDB和其下的PDBs 1Oracle資料庫
- 資料庫執行計劃和資料存取方式資料庫
- Oracle12c多租戶資料庫 - PDB資料庫的unplug及plug 2Oracle資料庫
- Oracle12c多租戶資料庫 - PDB資料庫的unplug及plug 1Oracle資料庫
- Oracle12c多租戶資料庫 - PDB資料庫的unplug及plug 3Oracle資料庫
- 執行在容器中Postgres資料庫資料損壞後如何恢復?資料庫
- Oracle12c多租戶資料庫 - PDB資料庫的unplug及plug 參考Oracle資料庫
- 9i新特性之資料庫監控系列資料庫
- oracle 資料庫中壞塊概念和檢查指令碼Oracle資料庫指令碼
- 資料庫備份指令碼資料庫指令碼
- 刪除資料庫指令碼資料庫指令碼
- 資料庫監控指令碼資料庫指令碼
- 資料庫全備指令碼資料庫指令碼
- 監控資料庫指令碼資料庫指令碼