View
19
Download
0
Category
Preview:
Citation preview
Oracle Database 12c
Novas Características para DBAs e
Desenvolvedores
Presented by:
Alex Zaballa, Oracle DBA
Alex Zaballa
http://alexzaballa.blogspot.com/
@alexzaballa147 and counting…
https://www.linkedin.com/in/alexzaballa
Ministério das Finanças de Angola:
Março de 2007 até Março de 2008Março de 2009 até Março de 2015
Sicredi:
Março de 2008 até Março de 2009
ORACLE ACE PROGRAMhttp://www.oracle.com/technetwork/community/oracle-ace/index.html
https://community.oracle.com/community/other-languages/portuguese
Oracle Database 12c
Novas Características para DBAs e
Desenvolvedores
Documentação Oficial - 12.1.0.2
• http://docs.oracle.com/database/121/NEWFT/chapter12102.htm
Oracle Learning Library (OLL)
• https://apexapps.oracle.com/pls/apex/f?p=44785:1:0
Artigos – 12c• https://oracle-base.com/articles/12c/articles-
12c
• http://www.oraclealchemist.com/news/install-oracle-12c-12-1/
• http://www.profissionaloracle.com.br/
“With more than 500 new features, Oracle Database 12c is designed to give Oracle customers exactly what they’ve told us they need for cloud computing, big data, security, and availability.”
Oracle Announces Beta Availability of Oracle Database 12c Release 2 - Oct 26, 2015
• PLUGGABLE DATABASESFrom 252 to 4096
• HOT CLONINGDon’t need to put the source in read-only for cloning
• SHARDINGIt’s like partitioning in a shared nothing databaseThe data is split into multiple databases
• In-MemoryIn-Memory column Store on Active Data GuardHeat Map
• APPLICATION CONTAINERPluggable Databases will share application objects
• More isolation, resource manager will limit the memory in addition to CPU and I/O.• AWR will work on Active Data Guard Database: you can tune your reporting database
Availability of Oracle Database 12.2
Source: https://blogs.oracle.com/UPGRADE/entry/oracle_database_12_2_just
Oracle Database Release StatusMOS Note:742060.1
Devo migrar para 12.1.0.2 ou aguardar a 12.2 ?
CDB ou NON-CDB?
Multitenant
Fonte: Oracle Documentation
Multitenant
Fonte: https://blogs.oracle.com/UPGRADE/entry/non_cdb_architecture_of_oracle
Multitenant
Fonte: https://blogs.oracle.com/UPGRADE/entry/non_cdb_architecture_of_oracle
Multitenant
Fonte: https://blogs.oracle.com/UPGRADE/entry/non_cdb_architecture_of_oracle
In-Memory
Fonte: Oracle Documentation
SIMD Vector Processing
Fonte: http://www.oracle.com/technetwork/database/in-memory/overview/twp-oracle-database-in-memory-2245633.html
In-Memory
In-Memory Area – Pool estático que faz parte da SGA
In-Memory
Fonte: OracleBase.com
In-MemoryAlter table hr.EMPLOYEES inmemory;
ALTER TABLE sales MODIFY PARTITION SALES_Q1_1998 NO INMEMORY;
ALTER TABLE sales INMEMORY NO INMEMORY(prod_id);
CREATE TABLESPACE tbs_test
DATAFILE '+DG01 SIZE 100M
DEFAULT INMEMORY;
In-Memory
Fonte: http://www.oracle.com/technetwork/database/in-memory/overview/twp-oracle-database-in-memory-2245633.html
JSONOTN - Artigo do Alex Zaballa
http://www.oracle.com/technetwork/pt/articles/sql/json-oracle-database-12c-2378776-ptb.html
JSON
• No Oracle Database 12c (12.1.0.2), foiadicionado o suporte nativo ao JavaScript Object Notation (JSON).
• O JSON é um formato leve para intercâmbiode dados que é relativamente fácil para o serhumano ler e escrever, além de ser fácil paraos softwares analisarem e gerarem.
JSON
JSON
SQL Query Row Limits and Offsets
SQL Query Row Limits and Offsetscreate table tabela_teste (codigo number, nome varchar2(20), salarionumber);
insert into tabela_teste values (1,'Alex' ,100);insert into tabela_teste values (2,'Joao' ,200);insert into tabela_teste values (3,'Maria' ,300);insert into tabela_teste values (4,'Pedro',400);insert into tabela_teste values (5,'Paulo',500);insert into tabela_teste values (6,'Fernando',600);insert into tabela_teste values (7,'Rafael',700);insert into tabela_teste values (8,'Samuel',700);insert into tabela_teste values (9,'Daniel',800);insert into tabela_teste values (10,'Luciano',1000);
SQL Query Row Limits and Offsets
Top-N Queries – Pré 12c
select * from ( select codigo, nome, salario
from tabela_teste
order by salario desc)
where rownum <= 5
SQL Query Row Limits and Offsetsselect codigo, nome, salario
from tabela_teste
order by salario desc
FETCH FIRST 5 ROWS ONLY
SQL Query Row Limits and Offsets
select codigo, nome, salario
from tabela_teste
order by salario
FETCH FIRST 30 PERCENT ROWS ONLY
SQL Query Row Limits and Offsets
select codigo, nome, salario
from tabela_teste
order by salario desc
OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY;
Invisible ColumnsCREATE TABLE tabela_teste(coluna1 NUMBER,coluna2 NUMBER,coluna3 NUMBER INVISIBLE,coluna4 NUMBER);
SQL> desc tabela_testeName -----------------------------------------COLUNA1 NUMBERCOLUNA2 NUMBERCOLUNA4 NUMBER
Invisible Columns
INSERT INTO tabela_teste(coluna1,coluna2,coluna3,coluna4) VALUES (1,2,3,4);
INSERT INTO tabela_teste VALUES (1,2,4);
Invisible Columns
SET COLINVISIBLE ON
SQL> desc tabela_teste
Name
-----------------------------------------
COLUNA1 NUMBER
COLUNA2 NUMBER
COLUNA4 NUMBER
COLUNA3 (INVISIBLE) NUMBER
Invisible Columns
ALTER TABLE tabela_teste MODIFY coluna3 VISIBLE;
SQL Text Expansion
SQL> variable retorno clob
SQL> begin
dbms_utility.expand_sql_text( input_sql_text=> 'select * from emp', output_sql_text=> :retorno );
end;
SQL Text Expansion
• Views
• VPDs
PL/SQL From SQLwith
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 rownum, x, is_number(x) is_num from t;
Session Level Sequences
Session level sequences são utilizadas para produzir valores únicos dentro de uma sessão. Assim que a sessão termina, a sequence é reinicializada.
Elas são muito utilizadas para gerar valores de Primary Keys em Global Temporary Tables.
Session Level Sequences
CREATE SEQUENCE sequence_teste
START WITH 1
INCREMENT BY 1
SESSION
/
Session Level Sequences
ALTER SEQUENCE sequence_teste
SESSION;
ALTER SEQUENCE sequence_teste
GLOBAL;
Extended Data Types
SQL> create table tabela_teste(campo01 varchar2(4001));
*
ERROR at line 1:
ORA-00910: specified length too long for its datatype
Extended Data Types
- VARCHAR2 : 32767 bytes
- NVARCHAR2 : 32767 bytes
- RAW : 32767 bytes
Extended Data TypesSHUTDOWN IMMEDIATE;
STARTUP UPGRADE;
ALTER SYSTEM SET max_string_size=extended;
@?/rdbms/admin/utl32k.sql
SHUTDOWN IMMEDIATE;
STARTUP;
**Após aumentar o tamanho máximo dos tipos de dados, não é possível desfazeresta alteração.
Multiple Indexes on the same set of Columns
Pré 12c:
ORA-01408: such column list already indexed error.
Multiple Indexes on the same set of Columns
No 12c é possível ter vários índices em uma mesma coluna ou lista de colunas.
A criação de um índice sobre uma coluna ou lista de colunas que já foram indexadas é simples e você tem que garantir que apenas um índice será visível.
Multiple Indexes on the same set of Columns
• Unique versus nonunique
• B-tree versus bitmap
• Different partitioning strategies
READ Object Privilege and READ ANY TABLE System Privilege
Qual a diferença para SELECT e SELECT ANY TABLE?
READ Object Privilege and READ ANY TABLE System Privilege
O privilégio de objeto SELECT e o privilégio de sistema SELECT ANY TABLE permitem bloquearas linhas de uma tabela através da execução das seguintes operações:
LOCK TABLE table_name IN EXCLUSIVE MODE;
SELECT ... FROM table_name FOR UPDATE;
READ Object Privilege and READ ANY TABLE System Privilege
SQL> grant select on scott.emp to teste;
Grant succeeded.
SQL> lock table scott.emp in exclusive mode;
Table(s) Locked.
READ Object Privilege and READ ANY TABLE System Privilege
SQL> grant read on scott.emp to teste;Grant succeeded.
SQL> lock table scott.emp in exclusive mode;lock table scott.emp in exclusive mode
*ERROR at line 1:ORA-01031: insufficient privileges
Session private statistics for Global Temporary Tables
Até o 12c, as estatísticas para tabelastemporárias globais (GTTs) eram comuns paratodas as sessões.
Session private statistics for Global Temporary Tables
SELECT DBMS_STATS.get_prefs('GLOBAL_TEMP_TABLE_STATS') Stats FROM dual;
STATS
------------------------------------------------------------------------------
SESSION
Session private statistics for Global Temporary Tables
BEGINDBMS_STATS.set_global_prefs (pname => 'GLOBAL_TEMP_TABLE_STATS',pvalue => 'SHARED');
END;/
BEGINDBMS_STATS.set_global_prefs (pname => 'GLOBAL_TEMP_TABLE_STATS',pvalue => 'SESSION');
END;/
Session private statistics for Global Temporary Tables
BEGIN dbms_stats.set_table_prefs('SCOTT','GTT_TESTE','GLOBAL_TEMP_TABLE_STATS','SHARED');
END;
BEGIN dbms_stats.set_table_prefs('SCOTT','GTT_TESTE','GLOBAL_TEMP_TABLE_STATS','SESSION');
END;
Temporary Undo
Uma Global Temporary Table armazena seus dados em uma temporary tablespace e estes dados sãomantidos durante a transação ou durante toda a sessão (ON COMMIT DELETE ROWS ou ON COMMIT PRESERVE ROWS).
Instruções DML em Global Temporary Tables nãogeram REDO, devido ao fato destes dados estaremarmazenados em uma temporary tablespace, mas geram UNDO e isto sim implicará na geração de REDO.
Temporary Undo
alter session set temp_undo_enabled=true;
**pode ser alterado a nível de banco de dados ou de sessão.
Truncate Cascade
SQL> truncate table scott.dept;
truncate table scott.dept
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
Truncate Cascade
SQL> truncate table scott.dept cascade;
Table truncated.
A constraint deve ser do tipo ON DELETE CASCADE.
SQL*Loader Express
• No modo express, não é necessário criar o arquivo de controle.
• O objetivo principal é salvar tempo e diminuiro esforço.
• O express mode pode ser utilizado quandotodas as colunas são do tipo character, number ou datetime
SQL*Loader Express[oracle@oracle01 tmp]$ cat EMPRESA.dat1,Empresa 12,Empresa 23,Empresa 34,Empresa 45,Empresa 56,Empresa 67,Empresa 78,Empresa 89,Empresa 9
SQL*Loader Express
[oracle@oracle01 tmp]$ sqlldr teste/teste TABLE=EMPRESASQL*Loader: Release 12.1.0.1.0 - Production on Sat Jan 11 12:16:28 2014Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.Express Mode Load, Table: EMPRESAPath used: External Table, DEGREE_OF_PARALLELISM=AUTO
Table EMPRESA:9 Rows successfully loaded.
Check the log files:EMPRESA.logEMPRESA_%p.log_xtfor more information about the load.
Limit the PGA
SQL> show parameter pga
NAME TYPE VALUE
-------------------------- ------------- ----------------------
pga_aggregate_limit big integer 2G
Limit the PGA
PGA_AGGREGATE_LIMIT é setado como default para o maior valor entre:
- 2 GB (valor default)
- 200% do valor do parâmetroPGA_AGGREGATE_TARGET
- 3 MB multiplicado pelo valor do parâmetroPROCESSES
Statistics During Loads
O banco de dados irá coletar estatísticasautomaticamente das tabelas durante osseguintes tipos de operações bulk load:
- CREATE TABLE AS SELECT
- INSERT INTO ... SELECT into an empty table using a direct path insert
Partial Indexes for Partitioned Table
• Você pode criar os índices (globais ou locais) para partições ou sub-partições específicas, isto é, os índices serão criados apenas para partições/sub-partições que você deseja.
• Este recurso não é suportado para índices únicos, ou seja, para índices utilizados para impor restrições exclusivas.
Partial Indexes for Partitioned Table
Full Database Caching
Este novo recurso permite armazenar todos ossegmentos do banco de dados em memória(quando os segmentos forem acessados).
Recuperando Tabelas com o RMAN• Utilizado para recuperação de tabelas/partições
de um backup realizado pelo RMAN.
• Este comando, diminui o tempo e a complexidade da restauração, permitindo a recuperação “point-in-time” apenas da tabela/partição, ao invés de toda tablespace como era nas versões anteriores.
• É muito útil quando não temos informações suficientes no UNDO para utilizar o Flashback Table.
Recuperando Tabelas com o RMAN
RMAN> RECOVER TABLE HR.REGIONS
UNTIL TIME "TO_DATE('01/10/2013 09:33:39','DD/MM/RRRR HH24:MI:SS')"
AUXILIARY DESTINATION '/tmp/backups'
In-Database Archiving
SQL> create table tabela_teste(coluna1 number) row archival;
insert into tabela_teste values(1);
insert into tabela_teste values(2);
insert into tabela_teste values(3);
In-Database Archiving
In-Database Archiving
update tabela_testeset ora_archive_state=DBMS_ILM.ARCHIVESTATENAME(1)where coluna1=3;
In-Database Archiving
alter session set row archival visibility=all;
Heat Map, Automatic Data Optimization and ILM
OTN - Artigo do Alex Zaballa e Daniel Da Meda
http://www.oracle.com/technetwork/pt/articles/database-performance/ilm-e-automatic-data-optimization-2601873-ptb.html
Heat Map, Automatic Data Optimization and ILM
• Heat Map: Oracle Database 12c feature that stores system-generated data usage statistics at the block and segment levels. Automatically tracks modification and query timestamps at the row and segment levels.
• Automatic Data Optimization (ADO): automatically moves and compresses data according to user-defined policies based on the information collected by Heat Map
• ILM: Heat Map and Automatic Data Optimization make Oracle Database 12c ideal for implementing ILM
Heat Map, Automatic Data Optimization and ILM
Habilitando o Heat Map
SQL> alter system set heat_map = on;
Heat Map, Automatic Data Optimization and ILM
As estatísticas de Heat Map visualizadasgraficamente através do EM Cloud Control:
Heat Map, Automatic Data Optimization and ILM
Criando políticas ADO
Comprimir a tablespace USER_DATA e todos os seussegmentos utilizando compressão OLTP após 30 dias de baixo acesso:
ALTER TABLESPACE USER_DATA ILM ADD POLICYROW STORE COMPRESS ADVANCEDSEGMENT AFTER 30 DAYS OF LOW ACCESS;
Heat Map, Automatic Data Optimization and ILM
Criando políticas ADO
Comprimir a tabela ORDER_ITEMS utilizando compressãoOLTP após 90 dias sem modificações.
ALTER TABLE ORDER_ITEMS ILM ADD POLICYROW STORE COMPRESS ADVANCEDGROUP AFTER 90 DAYS OF NO MODIFICATION;
DDL LOGGING
DDL LOGGING
/u01/app/oracle/diag/rdbms/orcl/orcl/log/ddl/log.xml
Direct SQL statement execution in RMAN
Pré 12c:
RMAN> SQL ‘SELECT sysdate FROM dual’;
12c:
RMAN> SELECT sysdate FROM dual;
Identity ColumnsCREATE TABLE tabela_teste (
id NUMBER GENERATED ALWAYS AS IDENTITY,
coluna1 VARCHAR2(30));
Identity Columns
CREATE TABLE tabela_teste (
id NUMBER GENERATED BY DEFAULT AS IDENTITY,
coluna1 VARCHAR2(30));
Identity ColumnsCREATE TABLE tabela_teste (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
coluna1 VARCHAR2(30));
SQLcl
Thank You
Recommended