作者 楊禹航·沃趣科技高級數(shù)據(jù)庫技術專家 出品 沃趣科技
Oracle 12.1發(fā)布至今已有多年,但國內(nèi)Oracle 12C的用戶并不多,隨著12.2在去年的發(fā)布,選擇安裝Oracle 12c的客戶量明顯增加,在接下來的幾年中,Oracle 12c將逐步得到普及。 目前關于12C新特性的文章很多,但大多都不成體系,本次的文章是一個非常完整、連貫的系列,將帶你全面的從基礎到深入全方位的理解Oracle 12C。
Oracle Multitenant Container Database(CDB),即多租戶容器數(shù)據(jù)庫,是Oracle 12C引入的特性,指的是可以容納一個或者多個可插拔數(shù)據(jù)庫的數(shù)據(jù)庫,這個特性允許在CDB容器數(shù)據(jù)庫中創(chuàng)建并且維護多個數(shù)據(jù)庫,在CDB中創(chuàng)建的數(shù)據(jù)庫被稱為PDB,每個PDB在CDB中是相互獨立存在的,在單獨使用PDB時,與普通數(shù)據(jù)庫無任何區(qū)別。
CDB根容器數(shù)據(jù)庫的主要作用就是容納所有相關的PDB的元數(shù)據(jù),以及在CDB中對所有的PDB進行管理。
ROOT Root容器數(shù)據(jù)庫,是CDB環(huán)境中的根數(shù)據(jù)庫,在根數(shù)據(jù)庫中含有主數(shù)據(jù)字典視圖,其中包含了與Root容器有關的元數(shù)據(jù)和CDB中所包含的所有的PDB信息。在CDB環(huán)境中被標識為CDB$ROOT,每個CDB環(huán)境中只能有一個Root容器數(shù)據(jù)庫。 CDB seed CDB seed為PDB的種子,其中提供了數(shù)據(jù)文件,在CDB環(huán)境中被標識為PDB$SEED,是創(chuàng)建新的 PDB的模板,你可以連接PDB$SEED,但是不能執(zhí)行任何事物,因為PDB$SEED是只讀的,不可進行修改。 PDBs PDB數(shù)據(jù)庫,在CDB環(huán)境中每個PDB都是獨立存在的,與傳統(tǒng)的Oracle數(shù)據(jù)庫基本無差別,每個PDB擁有自己的數(shù)據(jù)文件和objects,唯一的區(qū)別在于PDB可以插入到CDB中,以及在CDB中拔出,并且在任何一個時間點之上PDB必須拔出或者插入到一個CDB中,當用戶鏈接PDB時不會感覺到根容器和其他PDB的存在。
CDBwith PDBs sys. ora12c>show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORA12CPDB READ WRITE NO 4 PDB2 MOUNTED 5 PDB1 MOUNTED 6 PDB3 READ WRITE NO sys. ora12c>
PDB$SEED為CDB seed,ORA12CPDB/PDB1/PDB2/PDB3為PDB數(shù)據(jù)庫。
在12cR2版本中,Oracle對多租戶功能進行了增強,在CDB root容器中可以創(chuàng)建一個叫做Application root的容器,可在其內(nèi)創(chuàng)建多個依賴于Application root的Application PDBs,架構(gòu)圖如下: ApplicationContainers in a CDB Application 更多的關于Application Containers相關內(nèi)容請參考之前的ApplicationContainers系列: 《Oracle12cR2版本Application Containers特性(1)》 《Oracle12cR2版本Application Containers特性(2)》 《Oracle12cR2版本Application Containers特性(3)》
CDB環(huán)境中包含兩類用戶,公用用戶和本地用戶。 | 公用用戶 公用用戶是在root數(shù)據(jù)庫中和所有的PDB數(shù)據(jù)庫中都存在的用戶,公用用戶必須在根容器中創(chuàng)建,然后此用戶會在所有的現(xiàn)存的PDB中自動創(chuàng)建,公用用戶標識必須以c##或者C##開頭,sys和system用戶是Oracle在CDB環(huán)境中自動創(chuàng)建的公用用戶。
create user c##yyh identified by yyh;
創(chuàng)建完成公用用戶,需要為公用用戶賦予所有可插拔數(shù)據(jù)庫的權限,公用用戶才可以訪問其他PDB,如果在連接根容器時僅僅為公用用戶賦予了相關權限,那么該權限不會被傳遞到所有的可插拔數(shù)據(jù)庫中,必須為公用用戶賦予能夠傳遞到PDB中的權限,可以創(chuàng)建公用角色然后賦予公用用戶,或者在為公共用戶付權時指定子句container=ALL; 例如:
或者 grant dba to c##yyh container=all; create role c##dbaprivs container=all; grant dba to c##dbaprivs container=all; grant c##dbaprivs to c##yyh container=all; 或者 grant dba to c##yyh container=all;
| 本地用戶本地用戶指的是在PDB中創(chuàng)建的普通用戶,只有在創(chuàng)建它的PDB中才會存在該用戶,并且PDB中只能創(chuàng)建本地用戶。
在CDB的數(shù)據(jù)庫環(huán)境中,SYSTEM/SYSAUX表空間并不是公用,CDB$ROOT以及每個PDB都擁有自己的SYSTEM和SYSAUX表空間。
丨REDO文件在CDB環(huán)境中所有的PDB共用CDB$ROOT中的REDO文件,REDO中的條目標識REDO來自那個PDB。 在PDB中無法執(zhí)行ALTERSYSTEM SWITCH LOGFILE命令,只有公用用戶在ROOT容器中才可以執(zhí)行該命令。 另外ALTER SYSTEM CHECKPOINT命令是可以在PDB中執(zhí)行的。
丨歸 檔在CDB環(huán)境中所有的PDB共用CDB的歸檔模式,以及歸檔文件,不可以單獨為PDB設置自己的歸檔模式,只有特權用戶連接根容器之后才可以啟動歸檔模式。
丨UNDO MODE在12.2之前的版本中,所有的PDB共用CDB$ROOT中的UNDO文件,在12.2之后的版本中UNDO的使用模式有兩種:SHARED UNDO MODE和LOCAL UNDO MODE,顧名思義,LOCAL UNDO MODE就是每個PDB使用自己的UNDO表空間,但當PDB中沒有自己的UNDO表空間時,會使用CDB$ROOT中的公共UNDO表空間。 查看UNDO表空間的使用模式(CDB$ROOT):
COL PROPERTY_NAME FOR A50 COL PROPERTY_VALUE FOR A50 COL DESCRIPTION FOR A50 SELECT property_name, property_value FROM database_properties WHERE property_name='LOCAL_UNDO_ENABLED'; PROPERTY_NAME PROPERTY_VALUE -------------------- -------------------- LOCAL_UNDO_ENABLED TRUE
在創(chuàng)建CDB時使用了SHARED UNDO MODE方式,如果后續(xù)想更改為LOCAL UNDO MODE,我們可以使用如下命令更改UNDO MODE為LOCAL UNDO MODE:
startup upgrade alter database local undo on; shutdown immediate startup
更改為local undo后CDB中的所有的PDB會自動創(chuàng)建自己的UNDO表空間。
丨臨時文件每個PDB都有自己的臨時表空間,如果PDB沒有自己的臨時表空間文件,那么,PDB可以使用CDB$ROOT中的臨時表空間。 08:42:46 sys. woqu>select con_id, tablespace_name from cdb_temp_files; CON_ID TABLESPACE_NAME ---------- -------------------- 1 TEMP 3 TEMP Elapsed: 00:00:00.11 08:43:02 sys. woqu>
丨參數(shù)文件參數(shù)文件中只記錄了根容器的參數(shù)信息,沒有記錄PDB級別的參數(shù)信息,在根容器中修改初始化參數(shù),會被繼承到所有的PDB中,在PDB中修改參數(shù)后,PDB的參數(shù)會覆蓋CDB級別的參數(shù),PDB級別的參數(shù)記錄在根容器的pdb_spfile$視圖中,但并不是所有的參數(shù)都可以在PDB中修改,可以通過v$system_parameter視圖查看PDB中可修改的參數(shù): SELECT name FROM v$system_parameter WHERE ispdb_modifiable = 'TRUE' ORDER BY name; pdb_spfile$: 08:37:58 sys. yyh>show parameter open_cursors NAME TYPE VALUE ------------------------------------ ----------- ----- open_cursors integer 999 08:38:04 sys. yyh>show parameter local_listener NAME TYPE VALUE ------------------------------------ ----------- ---------------- local_listener string PDB_YYH 08:38:08 sys. yyh>select pdb_uid, name, value$ from pdb_spfile$; PDB_UID NAME VALUE$ ---------- ------------------ ------------------ 1167267009 open_cursors 999 1167267009 local_listener 'PDB_YYH' Elapsed: 00:00:00.00 08:38:11 sys. yyh>
這里在PDB:1167267009中更改了open_cursors/ local_listener兩個參數(shù)。
丨控制文件CDB環(huán)境中只有一組控制文件,所有的PDB共用這組公共的控制文件,從任何PDB中添加數(shù)據(jù)文件都會記錄到公共控制文件當中,公用用戶連接根容器時,可對控制文件進行管理。 20:51:03 sys. woqu>show parameter control_files NAME TYPE VALUE ------------------------------------ ----------------------------------------- control_files string /u01/app/oracle/oradata/woqu/c ontrol01.ctl, /u01/app/oracle/ oradata/woqu/control02.ctl 20:51:06 sys. woqu> 20:50:55 sys. woqupdb>show parameter control_files NAME TYPE VALUE ------------------------------------ ----------------------------------------- control_files string /u01/app/oracle/oradata/woqu/c ontrol01.ctl,/u01/app/oracle/ oradata/woqu/control02.ctl 20:51:23 sys.woqupdb>
丨告警日志以及跟蹤文件在CDB中所有的PDB共用一個告警日志和一組跟蹤文件,所有的PDB告警信息都會寫入同一個告警日志中。
丨時區(qū)在CDB環(huán)境中可以為CDB以及所有的PDB設置相同的時區(qū),也可以為每個PDB設置單獨的時區(qū)。 20:51:50 sys. woqu>show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 WOQUPDB READ WRITE NO 20:52:00 sys. woqu>select dbtimezone from dual; DBTIME ------ +00:00 Elapsed: 00:00:00.00 20:52:01 sys. woqu> 20:51:53 sys. woqupdb>select dbtimezone from dual; DBTIME ------ +08:00 Elapsed: 00:00:00.00 20:52:02 sys. woqupdb>
丨字符集在CDB中定義字符集也可以應用于它所含有的PDB中,每個PDB也可以有自己的字符集設置。 20:52:33 sys. woqu>SELECT a.value || '_' || b.value || '.'|| c.value NLS_LANG 20:52:33 2 FROM nls_database_parameters a,nls_database_parameters b, nls_database_parameters c 20:52:33 3 WHERE a.parameter = 'NLS_LANGUAGE' ANDb.parameter = 'NLS_TERRITORY' AND c.parameter = 'NLS_CHARACTERSET'; NLS_LANG ---------------------------------------- AMERICAN_AMERICA.AL32UTF8 Elapsed: 00:00:00.06 20:52:33 sys. woqu>20:52:33 sys. woqu> 20:52:36 sys. woqupdb>SELECT a.value || '_' || b.value || '.'|| c.value NLS_LANG 20:52:36 2 FROM nls_database_parameters a,nls_database_parameters b, nls_database_parameters c 20:52:36 3 WHERE a.parameter = 'NLS_LANGUAGE' ANDb.parameter = 'NLS_TERRITORY' AND c.parameter = 'NLS_CHARACTERSET'; NLS_LANG ---------------------------------------- AMERICAN_AMERICA.ZHS16GBK Elapsed: 00:00:00.08 20:52:36 sys. woqupdb>20:52:36 sys. woqupdb>
丨數(shù)據(jù)字典視圖與動態(tài)性能視圖在CDB環(huán)境中引入了CDB級別的數(shù)據(jù)字典視圖,它的級別高于DBA_/ALL_/USER_,CDB級別的數(shù)據(jù)字典視圖含有所有PDB的元數(shù)據(jù)信息,其中增加了con_id列,con_id為CDB中所有容器唯一標識符,其中con_id為0的是CDB$ROOT,con_id為2的是PDB$SEED,每個PDB在CDB中都會分配一個唯一的con_id。如果要想查看CDB級別的數(shù)據(jù)字典視圖,必須使用公用用戶在跟容器中查看,并且要查看的PDB必須處于open狀態(tài),才可以看到PDB中的信息。 20:53:42 sys. woqu>showpdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 WOQUPDB READ WRITE NO 20:53:45 sys. woqu> 20:54:40 sys. woqu>select con_id, pdb_id, pdb_name, dbid, status fromcdb_pdbs; CON_ID PDB_ID PDB_NAME DBID STATUS ---------- --------- ------------------------------ -------------- 2 2 PDB$SEED 2834527297 NORMAL 3 3 WOQUPDB 3238406520 NORMAL 20:54:43 sys. woqu>
如果要使用可插拔數(shù)據(jù)庫的功能,需要在創(chuàng)建數(shù)據(jù)庫時專門指定啟用可插拔數(shù)據(jù)庫,創(chuàng)建CDB通常有如下兩種方式: 使用DBCA圖形工具創(chuàng)建CDB 這里需要注意的是Oracle 12.2之后支持LOCAL UNDO,這里注意需要手動要勾選LOCAL UNDO選項。 CREATE DATABASE語句創(chuàng)建CDB 在使用腳本創(chuàng)建CDB時Oracle提供了兩種方法,一種是使用OMF,另外一種是非OMF的方式,注意參數(shù)文件中需要將ENABLE_PLUGGABLE_DATABASE設置為TRUE。
這里演示使用非OMF方式創(chuàng)建CDB,數(shù)據(jù)名稱為ora12c: 1.設置ENABLE_PLUGGABLE_DATABASE參數(shù)為TRUE,參數(shù)文件如下: audit_file_dest='/u01/app/oracle/admin/ora12c/adump' audit_trail='none' compatible='12.2.0' control_files='/u01/app/oracle/oradata/ora12c/control01.ctl',' /u01/app/oracle/oradata/ora12c/control02.ctl' db_block_size=8192 db_domain='linux.com' db_name='ora12c' diagnostic_dest='/u01/app/oracle' enable_pluggable_database=true memory_target=801m nls_language='AMERICAN' nls_territory='AMERICA' remote_login_passwordfile='EXCLUSIVE' undo_tablespace='UNDOTBS1'
2.創(chuàng)建相應目錄以及設置環(huán)境變量
export ORACLE_SID=ora12c export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/dbhome_1 export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$ORACLE_HOME/perl/bin:$ORACLE_HOME/jdk/bin:$PATH
3.CREATE DATABASE腳本createdb.sql如下:
CREATE DATABASE ora12c USER SYS IDENTIFIED BY oracle USER SYSTEM IDENTIFIED BY oracle LOGFILE GROUP 1('/u01/app/oracle/oradata/ora12c/redo01a.log','/u01/app/oracle/oradata/ora12c/redo01b.log') SIZE 100M BLOCKSIZE 512, GROUP 2('/u01/app/oracle/oradata/ora12c/redo02a.log','/u01/app/oracle/oradata/ora12c/redo02b.log') SIZE 100M BLOCKSIZE 512, GROUP 3('/u01/app/oracle/oradata/ora12c/redo03a.log','/u01/app/oracle/oradata/ora12c/redo03b.log') SIZE 100M BLOCKSIZE 512 MAXLOGHISTORY 1 MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 1024 CHARACTER SET AL32UTF8 NATIONAL CHARACTER SET AL16UTF16 EXTENT MANAGEMENT LOCAL DATAFILE '/u01/app/oracle/oradata/ora12c/system01.dbf' SIZE 700M REUSE AUTOEXTEND ON NEXT10240K MAXSIZE UNLIMITED SYSAUX DATAFILE '/u01/app/oracle/oradata/ora12c/sysaux01.dbf' SIZE 550M REUSE AUTOEXTEND ON NEXT10240K MAXSIZE UNLIMITED DEFAULT TABLESPACE deftbs DATAFILE'/u01/app/oracle/oradata/ora12c/deftbs01.dbf' SIZE 500M REUSE AUTOEXTEND ONMAXSIZE UNLIMITED DEFAULT TEMPORARY TABLESPACE tempts1 TEMPFILE '/u01/app/oracle/oradata/ora12c/temp01.dbf' SIZE 20M REUSE AUTOEXTEND ON NEXT640K MAXSIZE UNLIMITED UNDO TABLESPACE undotbs1 DATAFILE'/u01/app/oracle/oradata/ora12c/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ONNEXT 5120K MAXSIZE UNLIMITED ENABLE PLUGGABLE DATABASE SEED FILE_NAME_CONVERT =('/u01/app/oracle/oradata/ora12c/', '/u01/app/oracle/oradata/ora12c/pdbseed/') SYSTEM DATAFILES SIZE 125MAUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED SYSAUX DATAFILES SIZE 100M USER_DATA TABLESPACE usertbs DATAFILE'/u01/app/oracle/oradata/ora12c/pdbseed/usertbs01.dbf' SIZE 200M REUSE AUTOEXTEND ONMAXSIZE UNLIMITED;
這段代碼中"ENABLE PLUGGABLE DATABASE"之后部分與PDB有關,其他部分與創(chuàng)建傳統(tǒng)的Oracle數(shù)據(jù)庫語句均相同。 FILE_NAME_CONVERT 子句指定了使用'/u01/app/oracle/oradata/ora12c/'中的文件名在'/u01/app/oracle/oradata/ora12c/pdbseed/'中生產(chǎn)CDBseeds。 USER_DATA_TABLESPACE 子句可以在容器中創(chuàng)建額外的表空間,這個表空間在后續(xù)使用PDB$SEED創(chuàng)建PDB時會被復制到PDB中。 4.將數(shù)據(jù)庫啟動到nomount狀態(tài),然后執(zhí)行上面createdb.sql腳本創(chuàng)建CDB
startup nomount; @createdb.sql
當數(shù)據(jù)庫創(chuàng)建成功之后可以看到新建立的數(shù)據(jù)庫被加入到/etc/oratab文件中。 #cat/etc/oratab +ASM:/u01/app/11.2.0/grid:N ora12c:/u01/app/oracle/product/12.2.0/dbhome_1:N orcl:/u01/app/oracle/product/11.2.0/dbhome_1:N # line added by Agent newdb:/u01/app/oracle/product/12.2.0/dbhome_1:N yyh:/u01/app/oracle/product/12.2.0/dbhome_1:N
5.查看監(jiān)聽,根容器的服務ora12c.linux.com已經(jīng)被注冊到監(jiān)聽中。 Service"ora12c.linux.com" has 1 instance(s). Instance "ora12c", status READY,has 1 handler(s) for this service...
6.運行catcdb.sql腳本創(chuàng)建CDB相關視圖: @?/rdbms/admin/catcdb.sql
注意事項: 1.在catcdb.pl執(zhí)行過中需要輸入兩個參數(shù),文檔中并沒有指出是什么參數(shù). 第一個參數(shù)應輸入:
第二個參數(shù)應輸入:
2.環(huán)境變量中必須將$ORACLE_HOME/perl/bin指定到PATH中,否則報如下錯誤:
Can'tlocate Term/ReadKey.pm
3.需要將$ORACLE_HOME/perl/lib/5.22.0/x86_64-linux-thread-multi/Hash中的catcdb.pl文件內(nèi)容:
use Data::Dumper; use util qw(trim, splitToArray); use catcon qw(catconSqlplus); 更改為 use Data::Dumper; use Utilqw(trim, splitToArray); use catcon qw(catconSqlplus);
4.切換到$ORACLE_HOME/perl/lib/5.22.0/x86_64-linux-thread-multi/Hash目錄中,然后sqlplus連接到數(shù)據(jù),在執(zhí)行catcdb.sql,否則報如下錯誤:
5.開啟localundo mode(因為上面再創(chuàng)建CDB時沒有加入localundo mode子句)
sys. ora12c>shutdown immediate sys. ora12c>startup upgrade sys. ora12c>alter database local undo on; Database altered. Elapsed: 00:00:00.72
查看是否為local undo mode:
SELECT property_name, property_value FROM database_properties WHERE property_name='LOCAL_UNDO_ENABLED'; PROPERTY_NAME PROPERTY_VALUE -------------------- -------------------- LOCAL_UNDO_ENABLED TRUE Elapsed: 00:00:00.02 sys. ora12c>
重啟數(shù)據(jù)庫:
shutdown immediate startup
啟動數(shù)據(jù)庫的過程中會在PDB$SEED中自動創(chuàng)建UNDO表空間,提供給后來采用PDB$SEED方式創(chuàng)建PDB所使用。 PS:如果CDB中已經(jīng)存在多個PDB,當在根容器中使用alter database local undo on;開啟local undo mode時會自動為每個PDB創(chuàng)建local undo。 6.檢查CDB是否已經(jīng)創(chuàng)建成功
sys. ora12c>SELECT dbid, name, open_mode, cdb, con_id FROM v$database; DBID NAME OPEN_MODE CDB CON_ID ---------- --------- -------------------- --- ---------- 323027068 ORA12C READ WRITE YES 0 Elapsed: 00:00:00.11 sys. ora12c>
此時CDB中含有兩個容器:根容器CDB$ROOT和種子容器PDB$SEED,如下:
sys. ora12c>SELECT con_id, dbid, con_uid, guid, name FROM v$containers; CON_ID DBID CON_UID GUID NAME ------ ---------- ---------- --------------------------------- ---------- 1 323027068 150A57CDEFD150C96E0530838A8C0206E CDB$ROOT 2 1453953285 145395328550A57CDEFD160C96E0530838A8C0206E PDB$SEED Elapsed: 00:00:00.00 sys. ora12c>SELECT con_id, tablespace_name, file_id, file_name FROM cdb_data_files; CON_ID TABLESPACE_NAME FILE_ID FILE_NAME ------ --------------- --------------------------------------------------- 1 SYSTEM 1/u01/app/oracle/oradata/ora12c/system01.dbf 1 SYSAUX 3/u01/app/oracle/oradata/ora12c/sysaux01.dbf 1 UNDOTBS1 5/u01/app/oracle/oradata/ora12c/undotbs01.dbf 1 DEFTBS 6/u01/app/oracle/oradata/ora12c/deftbs01.dbf Elapsed: 00:00:00.01 sys. ora12c>show con_id con_name user CON_ID ------------------------------ 1 CON_NAME ------------------------------ CDB$ROOT USER is "SYS" sys. ora12c>
管理CDB時,通常需要使用sys用戶連接根容器數(shù)據(jù)庫,在操作方式上與非CDB數(shù)據(jù)庫同樣。 當前連接容器的信息:
1. 23:03:31 sys. woqu>show con_id con_name user CON_ID ------------------------------ 1 CON_NAME ------------------------------ CDB$ROOT USER is "SYS" 23:03:33 sys. woqu> 2. COL CON_ID FOR A10 COL CUR_CONTAINER FOR A25 COL CUR_USER FOR A25 SELECT sys_context('USERENV','CON_ID')con_id, sys_context('USERENV','CON_NAME') cur_container, sys_context('USERENV','session_user') cur_user FROM dual; CON_ID CUR_CONTAINER CUR_USER ---------- ------------------------- ------------------------- 1 CDB$ROOT SYS
丨啟動和停止CDB只有公用用戶才可以連接根容器,并且啟動和停止CDB,停止和啟動與普通數(shù)據(jù)庫的處理過程相同,當公用用戶連接PDB時,無法啟動和停止CDB:
默認情況下啟動CDB時不會自動啟動PDBs,我們可以使用手工的方式啟動PDB:
ALTER PLUGGABLE DATABASE [pdb_name] OPEN; ALTER PLUGGABLE DATABASE ALL OPEN; --打開所有PDB sys. ora12c>shutdown immediate
在關閉CDB時,CDB中正在運行PDSs會也會關閉,連接CDB與PDBs的session均會斷開。 查看CDB環(huán)境中表空間使用情況:with generator0 as (select cf.con_id,cf.tablespace_name, sum(cf.bytes) / 1024 / 1024 frm from cdb_free_space cf group by cf.con_id,cf.tablespace_name), generator1 as (select cd.con_id,cd.tablespace_name, sum(cd.bytes) / 1024 / 1024 usm from cdb_data_files cd group by cd.con_id,cd.tablespace_name), generator2 as( select g0.con_id, c.name con_name, g0.tablespace_name, g0.frm, g1.usm from generator0 g0, generator1 g1,v$containers c where g0.con_id = g1.con_id and g0.tablespace_name =g1.tablespace_name and c.con_id = g1.con_id union select c.con_id, c.name, ct.tablespace_name, null, sum(ct.bytes) / 1024 / 1024 from v$containers c,cdb_temp_files ct where c.con_id = ct.con_id group by c.con_id, c.name,ct.tablespace_name) select con_id, case when con_name = LAG(con_name, 1) OVER(PARTITION BY con_name ORDER BYtablespace_name) THEN null ELSE con_name END con_name, tablespace_name, frm freemb, usm usemb from generator2 order by con_id; CON_ID CON_NAME TABLESPACE_NAME FREEMB USEMB ------ ------------ --------------- ---------- ---------- 1 CDB$ROOT SYSAUX 28 470 1 SYSTEM 6.5625 810 1 TEMP 33 1 UNDOTBS1 1.9375 60 1 USERS 4 5 3 ORA12CPDB SYSAUX 18.125 360 3 SYSTEM 1.25 250 3 TEMP 64 3 UNDOTBS1 33 100 3 USERS 4 5
丨切換容器使用公用用戶連接CDB后可以使用alter session的方式切換不同的容器:
alter session set container=pdb1; alter session set container = cdb$root;
在切換容器時無需運行監(jiān)聽器和密碼文件。只要公用用戶擁有相關權限就可以切換到另外的容器中。
| 作者簡介 楊禹航·沃趣科技高級數(shù)據(jù)庫技術專家 熟悉Oracle數(shù)據(jù)庫內(nèi)部機制,豐富的數(shù)據(jù)庫及RAC集群層故障診斷、性能調(diào)優(yōu)、OWI、數(shù)據(jù)庫備份恢復及遷移經(jīng)驗。
更多干貨,歡迎來撩~
|