1、不可見字段(Invisible columns)
在 12c R1中,可以在表中創建不可見字段。當一個字段為不可見時,這一字段就不會出現在查詢結果中,除非顯式在 SQL 語句或條件中指定,或是在表定義中有 DESCRIBED。
實例:
創建一張表TEST,將其中一列設置為invisible,字段查詢觀察結果。
1.1、建表
create table emp (id number,name varchar2(20) invisible);
insert into emp(id,name) values(1,'tom');
insert into emp(id,name) values(2,'mike');
commit;
1.2、字段查詢
select * from emp;
select id,name from emp;
1.3、PLSQL查看
2、相同字段上的多重索引(Multiple indexes on the same set of columns)
在12c中可使用invisible參數,對表同一字段創建不同類型的索引
實例:
2.1、建表及索引
create table dup(name varchar2(10),sex varchar2(10),adr varchar2(200),id number(10),birth date);
create index idx_dup_adr on dup(adr);
create bitmap index bitidx_dup_adr on dup(adr) invisible;
SELECT OWNER,INDEX_NAME,INDEX_TYPE,TABLE_NAME,STATUS,VISIBILITY FROM DBA_INDEXES WHERE TABLE_NAME='DUP';
2.2、如果要使bitmap索引生效,將btree索引設為隱藏
alter index idx_dup_adr invisible;
alter index bitidx_dup_adr visible;
3、DDL日志
DDL log開啟之后可在記錄的xml文件中找到對應的時間戳以及主機ip。
以下的 DDL 語句可能會記錄在 xml 或日志文件中:
- CREATE|ALTER|DROP|TRUNCATE TABLE
- DROP USER
- CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENCE
3.1、開啟 DDL 日志功能
ALTER SYSTEM|SESSION SET ENABLE_DDL_LOGGING=TRUE;
3.2、刪除表dup
drop table dup;
3.3、查看日志
$cat /u01/App/oracle/diag/rdbms/srm/SRM/log/ddl/log.xml
4、新的備份用戶特權
在11g R2中,引入了SYSASM特權來執行ASM的特定操作。同樣地,在12c中引入了SYSBACKUP特權用來在 RMAN中執行備份和恢復命令。因此,你可以在數據庫中創建一個本地用戶并在不授予其SYSDBA權限的情況下,通過授予SYSBACKUP權限讓其能夠在RMAN中執行備份和恢復相關的任務。
grant sysbackup to admin
rman
connect target "admin/oracle@pdb as sysbackup"
5、 數據泵的增強
5.1、關閉redo日志的生成
在導入大型表時可以通過增加TRANSFORM選項,關閉redo日志的生成,從而加快導入。
impdp admin/oracle@pdb directory=dump dumpfile=admin.dmp logfile=admin_nolog.log
schemas=admin TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y
5.2、導出將視圖轉換為表
expdp admin/oracle@pdb directory=dump dumpfile=admin.dmp logfile=admin.log
views_as_tables=view_test
6、完整可傳輸導出/導入 遷移數據庫(Full transportable export/import)
Oracle 數據庫 12c 的完整可傳輸導出/導入(Full Transportable Export/Import)功能來使用較少的停機時間,將數據庫升級/遷移到 Oracle 數據庫 12c (12.1.0.2以上)中。(支持單實例遷移到RAC集群)
可以使用full transportable export/import功能將整個數據庫從一個數據庫實例復制到另一個數據庫實例。可以使用Data Pump來生成一個導出dump文件,如果需要將這個dump文件傳輸到目標數據庫,然后導入dump文件。另外也可以使用Data Pump跨網絡來復制數據庫。
數據庫中要被傳輸的表空間可以是字典管理或本地管理表空間。源數據庫中的表空間的塊大小不必與目標數據庫中標準塊大小相同。
這種傳輸數據庫的方法要求直到完成導出dump文件之前所要傳輸的用戶創建的表空間必須設置為只讀狀態。如果不能滿足這個條件那么可以使用備份功能來完成傳輸表空間。
這個后面單獨演示一下。。。
使用導出dump文件方式來傳輸數據庫必須執行以下步驟:
1)在源數據庫上,將每個用戶表空間設置為只讀狀態。在執行導出操作時要確保設置參數transportable=always與full=y。如果源數據庫的版本是11.2.0.3或11G之后的版本,那么還必須設置version=12或更高版本號。導出的dump文件包含了存儲在用戶表空間中對象的元數據與存儲在管理表空間(比如system與sysaux)中用戶創建對象的元數據與實際數據。
2)將導出的dump文件傳輸到目標數據庫
3)將所有用戶表空間的所有數據文件傳輸到目標數據庫,如果源平臺與目標平臺不同,那么需要檢查字節編碼,可以通過查詢v$transportable_platform視圖進行查看。如果源平臺與目標平臺的字節編碼不一樣,那么使用以下方法來轉換數據文件:
(1)使用dbms_file_transfer包中的get_file或put_file過程來傳輸數據文件。這些過程會將源數據文件自動轉換為目標平臺的字節編碼方式。
(2)使用rman的convert命令將源數據文件轉換為目標平臺的字節編碼方式
4)可選操作,將源數據庫中的將被傳輸的表空間設置為讀寫狀態
5)在目標數據庫中導入數據,當導入完成后,用戶表空間將會設置為讀寫狀態。
7、擴展數據類型長度32k Strings
VARCHAR2, NAVARCHAR2 以及 RAW 這些數據類型的 大小可以從 4K 以及 2K 字節擴展至32K 字節。
開啟方法:
7.1、關閉cdb
alter pluggable database SRMPDB close;
7.2、啟動數據庫到upgrade模式
startup upgrade;
7.3、在cdb內修改初始化參數MAX_STRING_SIZE
ALTER SESSION SET CONTAINER=CDB$ROOT;
ALTER SYSTEM SET max_string_size=extended SCOPE=SPFILE;
7.4、以sys用戶執行擴展腳本
@?/rdbms/admin/utl32k.sql
7.5、重啟數據庫到normal模式
shutdown immediate;
startup;
7.6、執行腳本編譯無效對象
@?/rdbms/admin/utlrp.sql
8、在SQL語句中通過with語句定義函數(12.1.0.2)
ORACLE 12C可以在sql語句中編寫函數,在read only或者不想新建函數,可通過這種方法實現。
如下創建一個函數,用來判斷輸入數據是否是數字,如果是數字輸出Y,如果不是輸出N.
with function Is_Number
(x in varchar2) return varchar2 is
Plsql_Num_Error exception;
pragma exception_init(Plsql_Num_Error, -06502);
begin
if (To_Number(x) is NOT null) then
return 'Y';
else
return '';
end if;
exception
when Plsql_Num_Error then
return 'N';
end Is_Number;
用select語句調用Is_Number函數
select is_number('1') from dual;
/
9、在線移動并重命名數據文件
當數據文件正在傳輸時,終端用戶可以執行查詢,DML 以及 DDL 方面的任務
--移動數據文件并且重命名(容器數據只能移動自己所屬數據文件)
alter database move datafile '/u01/app/oracle/oradata/orcl/pdborcl/admin.dbf' to '/home/oracle/admin1.dbf';
--文件系統移動到ASM磁盤(如果rac環境中數據文件創建在某個節點,移動數據文件之后,需要在另外節點重啟cdb)
alter database move datafile '/home/oracle/admin.dbf' to '+DATA/pdborcl_admin.dbf';
10、高級索引壓縮(COMPRESS ADVANCED LOW)
在使用高級索引壓縮之后,可以一定程度下降低數據庫IO。
場景實驗;a表普通索引,b表壓縮索引,簡單看看段大小
10.1、a表創建普通索引
create table a(id int,object_name varchar2(20));
insert into a values(1,'hwb');
create index idx_obname_a on a(object_name);
select segment_name,bytes/1024/1024 from dba_segments where segment_name =upper('idx_obname_a');
10.2、b表創建壓縮索引
create table b(id int,object_name varchar2(20));
insert into b values(1,'hwb');
create index idx_obname_b on b(object_name) COMPRESS ADVANCED LOW;
select segment_name,bytes/1024/1024 from dba_segments where segment_name =upper('idx_obname_b');
我這里數據量太少了,一個段的空間都沒占滿,所以看到的都是一樣。
11、PGA大小限制(PGA Size Limit)
在12C之前,對于PGA內存的管理是使用PGA_AGGREGATE_TARGET參數來控制的,但這個參數只是一個目標值,可以超過設定的大小,無法直接對pga限定大小。
在12C中可使用PGA_AGGREGATE_LIMIT參數來限制Oracle實例PGA使用內存的上限,如果超過限制就采取終止會話的方式來降低PGA內存的使用量。
備注:如果使用ASMM,PGA_AGGREGATE_LIMIT大小為2G(初始化參數未超過2G)或者PGA_AGGREGATE_TARGET的2倍(超過2G)
12、RMAN 表級恢復
在Oracle 12C之前RMAN只能在數據庫級(數據文件)、表空間級進行完全恢復或者不完全恢復。如果是某張表發生了截斷或者刪除,可通過閃回表或者閃回數據庫快速恢復,或者是dmp文件。然而到了12C,RMAN可以通過備份將數據表恢復到故障時間點,而其他表不受影響。其過程是在恢復過程中創建輔助實例,還原系統數據文件(system、sysaux、undotbs),基于redo或者archivelog應用,最后通過數據泵導入目標shemas,恢復之后自動創建的輔助實例會被自動刪除。
13、In-Memory選件
啟用IMO非常簡單,12.1.0.2及之后版本下,設置INMEMORY_SIZE 為非0值便可啟用IM column store特性。
INMEMORY_SIZE 是個實例級參數,默認為0,設置一個非0值時,最小值為100M。
通常情況下,sys用戶下的對象及SYSTEM、SYSAUX表空間上的對象無法使用IMO特性,但通過設置“_enable_imc_sys”隱含參數也可以使用
開啟DB In-Memory過程如下:
1)修改INMEMORY_SIZE參數:
SQL> ALTER SYSTEM SET INMEMORY_SIZE=1G SCOPE=SPFILE;
2)檢查sga參數的設置,確保在設置完inmemroy_size參數之后數據庫實例還可以正常啟動。如果數據庫使用了ASMM,則需要檢查sga_target參數。如果使用了AMM,則需要檢查MEMORY_TARGET參數,同時也需要檢查SGA_MAX_TARGET(或MEMORY_MAX_TARGET)。
備注:從 12.2 開始,可以動態增加 In-Memory 區域的大小,為此,只需 通過 ALTER SYSTEM 命令增加 INMEMORY_SIZE 參數值即可
3)重啟數據庫實例
4)查看IM特性是否開啟
SHOW PARAMETER inmemory;
14、全庫緩存(Force Full Database Caching Mode)
通常情況下,Oracle會決定哪些數據會留在緩沖區中。當沒足夠的空間時,數據會被寫出內存。此外,為了避免大量讀取將有用的信息擠出緩沖區,Oracle對有些操作也許會采取繞過緩沖區的措施。Oracle12cR1 (12.1.0.2)引入了全數據緩沖的概念。如果Oracle認為緩沖區大的足以容納整個數據庫,那么,它將會緩沖所有的數據塊。此外,可以強制啟用全數據緩沖模式。
要想強制開啟該模式,需要先將關閉并將庫置于mount狀態,否則,在打開的數據庫上執行該ALTER DATABASE命令將會報錯。
開啟強制全庫緩存模式數據庫兼容性級別必須是12.0.0或者更高;
14.1、查看是否啟用全數據庫緩存
SELECT FORCE_FULL_DB_CACHING FROM V$DATABASE;
14.2、啟用全數據庫緩存
startup mount;
ALTER DATABASE FORCE FULL DATABASE CACHING;
ALTER DATABASE OPEN;
15、Sharding Database
Oracle Sharding是Oracle 12.2版本推出的新功能,也稱為數據分片,適用于online transaction processing (OLTP). Oracle Sharding基于表分區技術,是一種在數據層將數據水平分區存儲到不同的數據庫的技術. Sharding可以實現將一個分區表的不同分區存儲在不同的數據庫中,每個數據庫位于不同的服務器,每一個數據庫都稱為shard, 這些shard組成一個邏輯數據庫,稱為sharded database (SDB). 這個table也稱為sharded table, 每個shard數據庫中保存該表的不同數據集(按照sharding key分區), 但是他們有相同的列(columns)。
Shard是一種shared-nothing技術,每個shard數據庫使用獨立的服務器硬件(CPU,內存等)。Shard可以運行在單機數據庫或者DATAGUARD/ADG數據庫。
16、在線把非分區表轉為分區表(12.2.0.1)
在Oracle12.2版本之前,如果想把一個非分區表轉為分區表常用的有這幾種方法:
1)建好分區表然后insert into select 把數據插入到分區表中;
2)使用在線重定義(DBMS_REDEFINITION)的方法。
Oracle12cR2版本中提供了一種新特性,一條語句就可以把非分區表轉換為分區表,例如:
alter table tablename modify
partition by range (字段) interval (10)
(
partition p1 values less than (10),
partition p2 values less than (20)
) online
;
17、表在線移動
在11g以及12C R1,如果通過alter table move降低高水位,表的索引在move之后會失效。在12C R2中可通過獨有關鍵字online子句以及update indexes在線移動表,并且索引不會失效。
alter table tablename move online;
18、DataGuard通過網絡恢復數據文件
在Oracle 12C中可以通過rman指定網絡服務名方式,在主備庫之間恢復數據庫文件,有如下幾種方式:
- 數據庫級別: restore database from service <服務別名>恢復數據文件、控制文件、參數文件。
- 表空間: restore tablespace from service <服務別名>
- 控制文件: restore controlfile to ‘指定的位置’ from service <服務別名>
- SPFILE: restore spfile from service <服務別名>
19、In-Database Archiving數據庫內歸檔
通常,在應用程序開發中對表做設計時,不可避免的會對表中的數據做刪除處理,如果直接使用硬刪除,則不能有效地對已刪除的數據進行追蹤;如果采用軟刪除(例如表中增加了刪除標記的字段delete_flag),雖然可以對已刪除的字段進行追蹤,但如果使用未刪除的數據時,需要加上delete_flag='N',這種帶刪除標記的數據對應用來說是可見的,而且占用一定的存儲空間。
Oracle Database 12c中引入了 In-Database Archiving的新特性, 該特性允許用戶通過對表上的數據行標記為inactive不活躍的,以歸檔數據。 這些inactive的數據行可以通過壓縮進一步優化,且對應用來說默認不可見。該特性可以對現有代碼做最少改動的情況下,實現了這種“標記刪除”的功能和需求。
了解更多






