1、不可見字段(Invisible columns)
在 12c R1中,可以在表中創(chuàng)建不可見字段。當一個字段為不可見時,這一字段就不會出現(xiàn)在查詢結果中,除非顯式在 SQL 語句或條件中指定,或是在表定義中有 DESCRIBED。
實例:
創(chuàng)建一張表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參數(shù),對表同一字段創(chuàng)建不同類型的索引
實例:
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特權來執(zhí)行ASM的特定操作。同樣地,在12c中引入了SYSBACKUP特權用來在 RMAN中執(zhí)行備份和恢復命令。因此,你可以在數(shù)據(jù)庫中創(chuàng)建一個本地用戶并在不授予其SYSDBA權限的情況下,通過授予SYSBACKUP權限讓其能夠在RMAN中執(zhí)行備份和恢復相關的任務。
grant sysbackup to admin
rman
connect target "admin/oracle@pdb as sysbackup"
5、 數(shù)據(jù)泵的增強
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、完整可傳輸導出/導入 遷移數(shù)據(jù)庫(Full transportable export/import)
Oracle 數(shù)據(jù)庫 12c 的完整可傳輸導出/導入(Full Transportable Export/Import)功能來使用較少的停機時間,將數(shù)據(jù)庫升級/遷移到 Oracle 數(shù)據(jù)庫 12c (12.1.0.2以上)中。(支持單實例遷移到RAC集群)
可以使用full transportable export/import功能將整個數(shù)據(jù)庫從一個數(shù)據(jù)庫實例復制到另一個數(shù)據(jù)庫實例。可以使用Data Pump來生成一個導出dump文件,如果需要將這個dump文件傳輸?shù)侥繕藬?shù)據(jù)庫,然后導入dump文件。另外也可以使用Data Pump跨網絡來復制數(shù)據(jù)庫。
數(shù)據(jù)庫中要被傳輸?shù)谋砜臻g可以是字典管理或本地管理表空間。源數(shù)據(jù)庫中的表空間的塊大小不必與目標數(shù)據(jù)庫中標準塊大小相同。
這種傳輸數(shù)據(jù)庫的方法要求直到完成導出dump文件之前所要傳輸?shù)挠脩魟?chuàng)建的表空間必須設置為只讀狀態(tài)。如果不能滿足這個條件那么可以使用備份功能來完成傳輸表空間。
這個后面單獨演示一下。。。
使用導出dump文件方式來傳輸數(shù)據(jù)庫必須執(zhí)行以下步驟:
1)在源數(shù)據(jù)庫上,將每個用戶表空間設置為只讀狀態(tài)。在執(zhí)行導出操作時要確保設置參數(shù)transportable=always與full=y。如果源數(shù)據(jù)庫的版本是11.2.0.3或11G之后的版本,那么還必須設置version=12或更高版本號。導出的dump文件包含了存儲在用戶表空間中對象的元數(shù)據(jù)與存儲在管理表空間(比如system與sysaux)中用戶創(chuàng)建對象的元數(shù)據(jù)與實際數(shù)據(jù)。
2)將導出的dump文件傳輸?shù)侥繕藬?shù)據(jù)庫
3)將所有用戶表空間的所有數(shù)據(jù)文件傳輸?shù)侥繕藬?shù)據(jù)庫,如果源平臺與目標平臺不同,那么需要檢查字節(jié)編碼,可以通過查詢v$transportable_platform視圖進行查看。如果源平臺與目標平臺的字節(jié)編碼不一樣,那么使用以下方法來轉換數(shù)據(jù)文件:
(1)使用dbms_file_transfer包中的get_file或put_file過程來傳輸數(shù)據(jù)文件。這些過程會將源數(shù)據(jù)文件自動轉換為目標平臺的字節(jié)編碼方式。
(2)使用rman的convert命令將源數(shù)據(jù)文件轉換為目標平臺的字節(jié)編碼方式
4)可選操作,將源數(shù)據(jù)庫中的將被傳輸?shù)谋砜臻g設置為讀寫狀態(tài)
5)在目標數(shù)據(jù)庫中導入數(shù)據(jù),當導入完成后,用戶表空間將會設置為讀寫狀態(tài)。
7、擴展數(shù)據(jù)類型長度32k Strings
VARCHAR2, NAVARCHAR2 以及 RAW 這些數(shù)據(jù)類型的 大小可以從 4K 以及 2K 字節(jié)擴展至32K 字節(jié)。
開啟方法:
7.1、關閉cdb
alter pluggable database SRMPDB close;
7.2、啟動數(shù)據(jù)庫到upgrade模式
startup upgrade;
7.3、在cdb內修改初始化參數(shù)MAX_STRING_SIZE
ALTER SESSION SET CONTAINER=CDB$ROOT;
ALTER SYSTEM SET max_string_size=extended SCOPE=SPFILE;
7.4、以sys用戶執(zhí)行擴展腳本
@?/rdbms/admin/utl32k.sql
7.5、重啟數(shù)據(jù)庫到normal模式
shutdown immediate;
startup;
7.6、執(zhí)行腳本編譯無效對象
@?/rdbms/admin/utlrp.sql
8、在SQL語句中通過with語句定義函數(shù)(12.1.0.2)
ORACLE 12C可以在sql語句中編寫函數(shù),在read only或者不想新建函數(shù),可通過這種方法實現(xiàn)。
如下創(chuàng)建一個函數(shù),用來判斷輸入數(shù)據(jù)是否是數(shù)字,如果是數(shù)字輸出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函數(shù)
select is_number('1') from dual;
/
9、在線移動并重命名數(shù)據(jù)文件
當數(shù)據(jù)文件正在傳輸時,終端用戶可以執(zhí)行查詢,DML 以及 DDL 方面的任務
--移動數(shù)據(jù)文件并且重命名(容器數(shù)據(jù)只能移動自己所屬數(shù)據(jù)文件)
alter database move datafile '/u01/app/oracle/oradata/orcl/pdborcl/admin.dbf' to '/home/oracle/admin1.dbf';
--文件系統(tǒng)移動到ASM磁盤(如果rac環(huán)境中數(shù)據(jù)文件創(chuàng)建在某個節(jié)點,移動數(shù)據(jù)文件之后,需要在另外節(jié)點重啟cdb)
alter database move datafile '/home/oracle/admin.dbf' to '+DATA/pdborcl_admin.dbf';
10、高級索引壓縮(COMPRESS ADVANCED LOW)
在使用高級索引壓縮之后,可以一定程度下降低數(shù)據(jù)庫IO。
場景實驗;a表普通索引,b表壓縮索引,簡單看看段大小
10.1、a表創(chuàng)建普通索引
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表創(chuàng)建壓縮索引
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');
我這里數(shù)據(jù)量太少了,一個段的空間都沒占滿,所以看到的都是一樣。
11、PGA大小限制(PGA Size Limit)
在12C之前,對于PGA內存的管理是使用PGA_AGGREGATE_TARGET參數(shù)來控制的,但這個參數(shù)只是一個目標值,可以超過設定的大小,無法直接對pga限定大小。
在12C中可使用PGA_AGGREGATE_LIMIT參數(shù)來限制Oracle實例PGA使用內存的上限,如果超過限制就采取終止會話的方式來降低PGA內存的使用量。
備注:如果使用ASMM,PGA_AGGREGATE_LIMIT大小為2G(初始化參數(shù)未超過2G)或者PGA_AGGREGATE_TARGET的2倍(超過2G)
12、RMAN 表級恢復
在Oracle 12C之前RMAN只能在數(shù)據(jù)庫級(數(shù)據(jù)文件)、表空間級進行完全恢復或者不完全恢復。如果是某張表發(fā)生了截斷或者刪除,可通過閃回表或者閃回數(shù)據(jù)庫快速恢復,或者是dmp文件。然而到了12C,RMAN可以通過備份將數(shù)據(jù)表恢復到故障時間點,而其他表不受影響。其過程是在恢復過程中創(chuàng)建輔助實例,還原系統(tǒng)數(shù)據(jù)文件(system、sysaux、undotbs),基于redo或者archivelog應用,最后通過數(shù)據(jù)泵導入目標shemas,恢復之后自動創(chuàng)建的輔助實例會被自動刪除。
13、In-Memory選件
啟用IMO非常簡單,12.1.0.2及之后版本下,設置INMEMORY_SIZE 為非0值便可啟用IM column store特性。
INMEMORY_SIZE 是個實例級參數(shù),默認為0,設置一個非0值時,最小值為100M。
通常情況下,sys用戶下的對象及SYSTEM、SYSAUX表空間上的對象無法使用IMO特性,但通過設置“_enable_imc_sys”隱含參數(shù)也可以使用
開啟DB In-Memory過程如下:
1)修改INMEMORY_SIZE參數(shù):
SQL> ALTER SYSTEM SET INMEMORY_SIZE=1G SCOPE=SPFILE;
2)檢查sga參數(shù)的設置,確保在設置完inmemroy_size參數(shù)之后數(shù)據(jù)庫實例還可以正常啟動。如果數(shù)據(jù)庫使用了ASMM,則需要檢查sga_target參數(shù)。如果使用了AMM,則需要檢查MEMORY_TARGET參數(shù),同時也需要檢查SGA_MAX_TARGET(或MEMORY_MAX_TARGET)。
備注:從 12.2 開始,可以動態(tài)增加 In-Memory 區(qū)域的大小,為此,只需 通過 ALTER SYSTEM 命令增加 INMEMORY_SIZE 參數(shù)值即可
3)重啟數(shù)據(jù)庫實例
4)查看IM特性是否開啟
SHOW PARAMETER inmemory;
14、全庫緩存(Force Full Database Caching Mode)
通常情況下,Oracle會決定哪些數(shù)據(jù)會留在緩沖區(qū)中。當沒足夠的空間時,數(shù)據(jù)會被寫出內存。此外,為了避免大量讀取將有用的信息擠出緩沖區(qū),Oracle對有些操作也許會采取繞過緩沖區(qū)的措施。Oracle12cR1 (12.1.0.2)引入了全數(shù)據(jù)緩沖的概念。如果Oracle認為緩沖區(qū)大的足以容納整個數(shù)據(jù)庫,那么,它將會緩沖所有的數(shù)據(jù)塊。此外,可以強制啟用全數(shù)據(jù)緩沖模式。
要想強制開啟該模式,需要先將關閉并將庫置于mount狀態(tài),否則,在打開的數(shù)據(jù)庫上執(zhí)行該ALTER DATABASE命令將會報錯。
開啟強制全庫緩存模式數(shù)據(jù)庫兼容性級別必須是12.0.0或者更高;
14.1、查看是否啟用全數(shù)據(jù)庫緩存
SELECT FORCE_FULL_DB_CACHING FROM V$DATABASE;
14.2、啟用全數(shù)據(jù)庫緩存
startup mount;
ALTER DATABASE FORCE FULL DATABASE CACHING;
ALTER DATABASE OPEN;
15、Sharding Database
Oracle Sharding是Oracle 12.2版本推出的新功能,也稱為數(shù)據(jù)分片,適用于online transaction processing (OLTP). Oracle Sharding基于表分區(qū)技術,是一種在數(shù)據(jù)層將數(shù)據(jù)水平分區(qū)存儲到不同的數(shù)據(jù)庫的技術. Sharding可以實現(xiàn)將一個分區(qū)表的不同分區(qū)存儲在不同的數(shù)據(jù)庫中,每個數(shù)據(jù)庫位于不同的服務器,每一個數(shù)據(jù)庫都稱為shard, 這些shard組成一個邏輯數(shù)據(jù)庫,稱為sharded database (SDB). 這個table也稱為sharded table, 每個shard數(shù)據(jù)庫中保存該表的不同數(shù)據(jù)集(按照sharding key分區(qū)), 但是他們有相同的列(columns)。
Shard是一種shared-nothing技術,每個shard數(shù)據(jù)庫使用獨立的服務器硬件(CPU,內存等)。Shard可以運行在單機數(shù)據(jù)庫或者DATAGUARD/ADG數(shù)據(jù)庫。
16、在線把非分區(qū)表轉為分區(qū)表(12.2.0.1)
在Oracle12.2版本之前,如果想把一個非分區(qū)表轉為分區(qū)表常用的有這幾種方法:
1)建好分區(qū)表然后insert into select 把數(shù)據(jù)插入到分區(qū)表中;
2)使用在線重定義(DBMS_REDEFINITION)的方法。
Oracle12cR2版本中提供了一種新特性,一條語句就可以把非分區(qū)表轉換為分區(qū)表,例如:
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通過網絡恢復數(shù)據(jù)文件
在Oracle 12C中可以通過rman指定網絡服務名方式,在主備庫之間恢復數(shù)據(jù)庫文件,有如下幾種方式:
- 數(shù)據(jù)庫級別: restore database from service <服務別名>恢復數(shù)據(jù)文件、控制文件、參數(shù)文件。
- 表空間: restore tablespace from service <服務別名>
- 控制文件: restore controlfile to ‘指定的位置’ from service <服務別名>
- SPFILE: restore spfile from service <服務別名>
19、In-Database Archiving數(shù)據(jù)庫內歸檔
通常,在應用程序開發(fā)中對表做設計時,不可避免的會對表中的數(shù)據(jù)做刪除處理,如果直接使用硬刪除,則不能有效地對已刪除的數(shù)據(jù)進行追蹤;如果采用軟刪除(例如表中增加了刪除標記的字段delete_flag),雖然可以對已刪除的字段進行追蹤,但如果使用未刪除的數(shù)據(jù)時,需要加上delete_flag='N',這種帶刪除標記的數(shù)據(jù)對應用來說是可見的,而且占用一定的存儲空間。
Oracle Database 12c中引入了 In-Database Archiving的新特性, 該特性允許用戶通過對表上的數(shù)據(jù)行標記為inactive不活躍的,以歸檔數(shù)據(jù)。 這些inactive的數(shù)據(jù)行可以通過壓縮進一步優(yōu)化,且對應用來說默認不可見。該特性可以對現(xiàn)有代碼做最少改動的情況下,實現(xiàn)了這種“標記刪除”的功能和需求。
了解更多