quinta-feira, 18 de janeiro de 2018

Azure - 4k - Sector Size - DB STARTUP FAIL

Recentemente estive "lutando" com um problema ao realizar um duplicate para montar um physical standby na Azure.

Durante o duplicate recebia erros: ORA-03113: end-of-file on communication channel

Ivenstigando, cheguei em um problema de I/O dentro do ASM, que gerava erros ORA-00600 kfk_submit_lib_ioq

Então tentei criar um banco de testes via DBCA e recebi o erro abaixo:




Depois de muito pesquisar, cheguei no erro abaixo:

Bug 16870214 : DB STARTUP FAILS WITH ORA-17510 IF SPFILE IS IN 4K SECTOR SIZE DISKGROUP


Existe uma recomendação de criar o DISKGROUP que estão os REDO LOGS com sector size de 4k para discos premium ssd na azure.

http://dbaharrison.blogspot.com.br/2017/03/oracle-asm-in-azure-with-premium-ssd.html


Verificando essa VM, vi que os diskgroups estavam todos com sector size de 4k:



Baixei e apliquei o seguinte patch:

p16870214_112040_Linux-x86-64.zip



Para resolver o erro 126 no Opatch, faltava um chmod 755 na GCC.


Após isso, o banco foi criado com sucesso:



terça-feira, 2 de janeiro de 2018

Utilizando o Oracle Database 12.2 no Docker


Neste artigo irei demostrar como instalar o Docker no Mac OS Sierra e criar um banco de dados Oracle versão 12c release 2.

O que é o Docker?

Docker é uma plataforma Open Source escrita em Go, que é uma linguagem de programação de alto desempenho desenvolvida dentro do Google, a qual facilita a criação e administração de ambientes isolados. Foi criado por uma empresa chamada Dotcloud que hoje é somente Docker.

Com o Docker, podemos criar e implantar ambientes rapidamente. O Docker cria pacotes de software em unidades padronizadas chamadas de contêineres, que têm tudo o que o software precisa para ser executado, inclusive bibliotecas, ferramentas de sistema, etc. Ele possibilita o empacotamento de uma aplicação ou ambiente inteiro dentro de um único container.

O Docker é uma VM?

Não, containers nos permitem compartilhar binários, bibliotecas e criar ambientes uniformes e mais versáteis.




Primeiramente, é necessário realizar o download e instalação do Docker.

Neste artigo iremos utilizar o Docker Community Edition (CE), que é ideal para desenvolvedores e pequenas equipes.

O Download pode ser realizado no site abaixo:


Após o download, basta executar o arquivo Docker.dmg e será exibida a imagem abaixo:


Após clicar em Docker.app e arrastar até o ícone Applications, o Docker estará instalado.

Para executar o Docker, bastar ir até a pasta Applications e executar o arquivo Docker.app:



Ao iniciar o Docker pela primeira vez, será exibida a tela de boas vindas e também será solicitado um usuário com privilégios para realizar as configurações no Mac OS Sierra:





Após informar as credenciais, será exibida a tela abaixo indicando que o Docker está sendo inicializado:



Após a inicialização será exibida a mensagem abaixo:



No Menu do Mac Os Sierra podemos verificar que o Docker está em execução:


Para realizar a instalação do banco de dados Oracle deve-se entrar no GitHub e realizar o download do arquivo docker-images-master.zip:




O próximo passo é realizar o download do Oracle Database 12c Release 2 para Linux x86-64:






Neste ponto você deverá possuir os 2 arquivos abaixo em um diretório:

· docker-images-master.zip
· linuxx64_12201_database.zip




O próximo passo é extrair o arquivo docker-images-master.zip:



  
Após isso, copie o arquivo linuxx64_12201_database.zip para o diretório docker-images-master/OracleDatabase/dockerfiles/12.2.0.1:


Agora iremos criar um Docker image utilizando o arquivo buildDockerImage.sh, que pode ser baixado em:



A sintaxe utilizada para gerar a imagem é a seguinte:

./buildDockerImage.sh -v 12.2.0.1 –e




Podemos notar que o instalador irá acessar a internet e baixar o oraclelinux:7-slim, bem como irá utilizar o YUM para atualizar os pacotes:


Atualização dos pacotes:



Instalação do software banco de dados:



Execução automática do orainstRoot.sh e root.sh:



Final da instalação:



Ao final, possuímos o Oracle Linux e o software do banco de dados Oracle 12.2.0.1:


Para realizar a criação do banco de dados, utilizamos o comando abaixo:

docker run --name oracle12_2 -p 1521:1521 -p 5500:5500 -v /Users/alexzaballa/Downloads/Docker/oradata:/opt/oracle/oradata oracle/database:12.2.0.1-ee




Final da criação do banco de dados:


Como podemos observar não informamos nenhuma senha. Com isso, uma senha será gerada automaticamente:



É possível redefinir estas senhas com o script abaixo:

docker exec oracle12_2 ./setPassword.sh MinhaNovaSenha



Para verificar se o banco de dados está rodando podemos utilizar o comando abaixo:

docker ps -a


Finalmente podemos realizar a conexão via SQLDeveloper:




Realizando a parada do banco de dados:

docker stop oracle12_2



docker logs oracle12_2



Inicializando o banco de dados:

docker start oracle12_2


docker logs oracle12_2



Referências:

terça-feira, 10 de outubro de 2017

ODC Appreciation Day: Dois novos recursos do Oracle Data Pump 12c


This article is part of series that used to be called OTN Appreciation Day. Now, it is Oracle Developer Community Appreciation Day.


The ODC Appreciation Day was proposed by Tim Hall and you can find more information here:

https://oracle-base.com/blog/2017/09/25/odc-appreciation-day-2017-thanksodc/


Change Table Compression at Import


Em versões anteriores ao 12c, o Data Pump sempre realizava as importações utilizando as mesmas configurações de compressão que estavam presentes no processo de exportação. No 12c, ele foi aprimorado para permitir que você especifique um método de compressão no momento da importação, independentemente do método de compressão usado quando os dados foram exportados. Com isso, você pode comprimir ou descomprimir a tabela durante a importação.
Isto é possível devido à introdução de um novo parâmetro da cláusula TRANSFORM, chamado TABLE_COMPRESSION_CLAUSE.
Alguns valores permitidos:
  • NONE : Se for omitido, a tabela assume as características da tablespace.
  • NOCOMPRESS : Desativa a compressão da tabela.
  • COMPRESS : Habilita a compressão básica.
  • ROW STORE COMPRESS BASIC : O mesmo que o COMPRESS.
  • ROW STORE COMPRESS ADVANCED :  Habilita a compressão avançada, conhecida como OLTP compression.
  • COLUMN STORE COMPRESS FOR QUERY : Hybrid Columnar Compression (HCC) disponível no Exadata, ZFS storage appliances e Pillar Axiom Storage Systems.
  • COLUMN STORE COMPRESS FOR ARCHIVE : Hybrid Columnar Compression (HCC) disponível no Exadata, ZFS storage appliances e Pillar Axiom Storage Systems.
*Opções que contenham espaços em branco devem ser colocadas entre aspas simples ou duplas.
Iremos confirmar se a tabela de origem está com a compressão desativada:
[oracle@oracle01 ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Fri Aug 8 11:26:52 2014
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
 
SQL> select owner,table_name,compression from dba_Tables where owner='HR' and table_name = 'EMPLOYEES';

OWNER                TABLE_NAME           COMPRESS
-------------------- -------------------- --------
HR                   EMPLOYEES            DISABLED 


Criando o diretório no banco de dados para realizar o export:
SQL> create directory dir_teste as '/tmp/zaballa';
 
Directory created.

Exportando a tabela que será usada para o import com transform=table_compression_clause:compress:
[oracle@oracle01 ~]$ expdp alex_zaballa dumpfile=hr_employees.dmp directory=dir_teste tables=hr.employees
 
Export: Release 12.1.0.2.0 - Production on Fri Aug 8 11:33:05 2014
 
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
Password:
 
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
Starting "ALEX_ZABALLA"."SYS_EXPORT_TABLE_01": 
alex_zaballa/******** dumpfile=hr_employees.dmp directory=dir_teste tables=hr.employees
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 64 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type TABLE_EXPORT/TABLE/COMMENT
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/TRIGGER
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
. . exported "HR"."EMPLOYEES"                            17.08 KB     107 rows
Master table "ALEX_ZABALLA"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for ALEX_ZABALLA.SYS_EXPORT_TABLE_01 is:
  /tmp/zaballa/hr_employees.dmp
Job "ALEX_ZABALLA"."SYS_EXPORT_TABLE_01" successfully completed at Fri Aug 8 11:33:40 2014 elapsed 0 00:00:32

Importando a tabela e habilitando a compressão:
[oracle@oracle01 ~]$ impdp alex_zaballa directory=dir_teste dumpfile=hr_employees.dmp remap_schema=hr:alex_zaballa 
transform=table_compression_clause:compress
 
Import: Release 12.1.0.2.0 - Production on Fri Aug 8 12:07:48 2014
 
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
Password:
 
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
Master table "ALEX_ZABALLA"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "ALEX_ZABALLA"."SYS_IMPORT_FULL_01":  alex_zaballa/******** directory=dir_teste dumpfile=hr_employees.dmp 
remap_schema=hr:alex_zaballa transform=table_compression_clause:compress
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "ALEX_ZABALLA"."EMPLOYEES"                  17.08 KB     107 rows
Processing object type TABLE_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type TABLE_EXPORT/TABLE/COMMENT
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/TRIGGER
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Job "ALEX_ZABALLA"."SYS_IMPORT_FULL_01" successfully completed at Fri Aug 8 12:08:23 2014 elapsed 0 00:00:32

Podemos verificar que agora a tabela está com a compressão ativada:
SQL> select owner,table_name,compression from dba_Tables where owner='ALEX_ZABALLA' and table_name = 'EMPLOYEES';
 
OWNER                 TABLE_NAME           COMPRESS
-------------------- -------------------- --------
ALEX_ZABALLA          EMPLOYEES            ENABLED 


Change Table LOB Storage at Import


No 12c, podemos especificar o método de armazenamento de LOBs que será usado no Data Pump durante o processo de importação, independente de como foi realizado o export. Isto fornece um método simples que permite aos usuários migrar facilmente de BasicFile LOBs para SecureFile LOBs.
Isto é possível devido à introdução de um novo parâmetro da cláusula TRANSFORM, chamado LOB_STORAGE.
Alguns valores permitidos:
  • SECUREFILE : Os LOBS serão armazenados como SecureFiles.
  • BASICFILE : Os LOBS serão armazenados como BasicFiles.
  • DEFAULT : O armazenamento do LOB é determinado pelo banco de dados.
  • NO_CHANGE : O processo de importação irá utilizar as configurações criadas durante o processo de exportação.
Iremos criar uma tabela com um LOB do tipo BASICFILE:
SQL> CREATE TABLE HR.TABELA_TESTE
(coluna1 number(10),
coluna2  clob)
LOB (coluna2) STORE as BASICFILE TABLESPACE EXAMPLE;
 
Table created.


Iremos confirmar se o LOB da tabela de origem está como BASICFILE:
[oracle@oracle01 ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.2.0 Production on Fri Aug 8 12:38:25 2014
 
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
 
 
SQL> select owner,table_name,tablespace_name,securefile from dba_lobs where 
owner='HR' and table_name='TABELA_TESTE';
 
OWNER                TABLE_NAME         TABLESPACE_NAME     SEC
-------------------- ------------------ ------------------- ---
HR                   TABELA_TESTE       EXAMPLE             NO 

Exportando a tabela que será usada para o import com transform=lob_storage:securefile:
[oracle@oracle01 ~]$ expdp alex_zaballa dumpfile=hr_tabela_teste.dmp directory=dir_teste tables=hr.tabela_teste
 
Export: Release 12.1.0.2.0 - Production on Fri Aug 8 12:33:03 2014
 
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
Password:
 
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
Starting "ALEX_ZABALLA"."SYS_EXPORT_TABLE_01":  alex_zaballa/******** dumpfile=hr_tabela_teste.dmp 
directory=dir_teste tables=hr.tabela_teste
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 0 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
. . exported "HR"."TABELA_TESTE"                             0 KB       0 rows
Master table "ALEX_ZABALLA"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for ALEX_ZABALLA.SYS_EXPORT_TABLE_01 is:
  /tmp/zaballa/hr_tabela_teste.dmp
Job "ALEX_ZABALLA"."SYS_EXPORT_TABLE_01" successfully completed at Fri Aug 8 12:33:51 2014 elapsed 0 00:00:43


Importando a tabela e habilitando o armazenamento do LOB em SECUREFILE:
[oracle@oracle01 ~]$ impdp alex_zaballa directory=dir_teste dumpfile=hr_tabela_teste.dmp 
remap_schema=hr:alex_zaballa transform=lob_storage:securefile
 
Import: Release 12.1.0.2.0 - Production on Fri Aug 8 12:41:09 2014
 
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
Password:
 
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
Master table "ALEX_ZABALLA"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "ALEX_ZABALLA"."SYS_IMPORT_FULL_01":  alex_zaballa/******** directory=dir_teste 
dumpfile=hr_tabela_teste.dmp remap_schema=hr:alex_zaballa transform=lob_storage:securefile
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "ALEX_ZABALLA"."TABELA_TESTE"                   0 KB       0 rows
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Job "ALEX_ZABALLA"."SYS_IMPORT_FULL_01" successfully completed at Fri Aug 8 12:41:36 2014 elapsed 0 00:00:22


Podemos verificar que agora o LOB da tabela está armazenado como SECUREFILE:
SQL> select owner,table_name,tablespace_name,securefile from dba_lobs where 
owner='ALEX_ZABALLA' and table_name='TABELA_TESTE';
 
OWNER                TABLE_NAME          TABLESPACE_NAME      SEC
-------------------- ------------------- -------------------- ---
ALEX_ZABALLA         TABELA_TESTE        EXAMPLE              YES 

terça-feira, 1 de agosto de 2017

How to force a sql_id to use a plan_hash_value using SQL Baselines

Olá pessoal,

Hoje pela manhã um cliente me ligou dizendo que estava com uma carga anormal no banco de dados.

Após verificar, vi que o SQL ID b6hd1bvsg59wr era responsável por 80% da carga do banco.

A primeira coisa foi verificar se ocorreu alguma mudança no plano de execução e quando ocorreu:



Usando o SQL abaixo, verifiquei que o novo plano foi criado no dia 31/7 às 16:45hrs:


O tempo médio de execuçao do PLAN_HASH_VALUE 2669208802 é de 63 segundos:


Enquanto o plano antigo era de apenas 4s.

Como as estatísticas estavam atualizadas, minha idéia inicial foi utilizar um SQL PLAN BASELINE e fixar o melhor plano de execução até ter tempo de otimizar e analisar melhor o SQL em questão.

Para fazer isso, segue o script utilizado:

BEGIN
  DBMS_SQLTUNE.DROP_SQLSET(
    sqlset_name => 'MySTS');
END;
/

BEGIN
  DBMS_SQLTUNE.CREATE_SQLSET(
    sqlset_name => 'MySTS',
    description => 'SQL Tuning Set SQL I_ID b6hd1bvsg59wr');
END;
/

DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P)
    FROM TABLE(
       dbms_sqltune.select_workload_repository(begin_snap=>13089, end_snap=>13090,basic_filter=>'sql_id = ''b6hd1bvsg59wr''',attribute_list=>'ALL')
              ) p;
     DBMS_SQLTUNE.LOAD_SQLSET( sqlset_name=> 'MySTS', populate_cursor=>cur);
  CLOSE cur;
END;
/

DECLARE
my_plans pls_integer;
BEGIN
  my_plans := DBMS_SPM.LOAD_PLANS_FROM_SQLSET(
    sqlset_name => 'MySTS', 
    basic_filter=>'plan_hash_value = ''368739152'''
    );
END;

SELECT * FROM dba_sql_plan_baselines order by created desc;


Após isso é necessário fazer o FLUSH do plano antigo da shared pool em todos nós do RAC:

select inst_id,ADDRESS, HASH_VALUE from gV$SQLAREA where SQL_ID like 'b6hd1bvsg59wr%';

exec dbms_shared_pool.purge('0000001C39C45688, 4042434455','C');
exec dbms_shared_pool.purge('0000001D0F7769C0, 4042434455','C');


quarta-feira, 26 de julho de 2017

ENQ: JS - WDW OP

Olá pessoal,

Um cliente reclamou que alguns relatórios não haviam sido gerados na madrugada.

Ao verificar o banco, vi que nenhum sheduler job havia sido disparado durante a noite.

O banco estava com diversos eventos "ENQ: JS - WDW OP"

Achei no My Oracle Support a seguinte nota: Jobs are not being executed by DBMS_SCHEDULER, CJQ WAITING FOR 'ENQ: JS - WDW OP' (Doc ID 564957.1)

Porém fala que afeta apenas a versão 10g: "Oracle Database - Enterprise Edition - Version 10.2.0.1 to 10.2.0.3"

Resolvi seguir mesmo assim o procedimento: "Kill the CJQ0 process at the operating system level."

ps -aef |grep -i CJQ0
kill -9 PID

Problema resolvido :)

quinta-feira, 22 de junho de 2017

GUOB TECH DAY 2017 - LAD OTN TOUR - BRASIL - Cupom de Desconto

Aproveite o cupom de desconto de 15% sobre o valor da inscrição. 
Código do Cupom: EU_VOU_GUOB
Valido até 23/06 para as primeiras 30 inscrições pagas.

https://guobtechday2017.eventize.com.br/index.php?pagina=1



terça-feira, 13 de junho de 2017

Oracle Code São Paulo - 2017 - I'm speaking


   O Oracle Code é um evento gratuito para que desenvolvedores tenham acesso e aprendam sobre as últimas tecnologias, práticas e tendências de desenvolvimento. Assista a palestras e ouça novidades de especialistas e líderes do mercado em keynotes e sessões especializadas de conteúdo, e pratique o que há de mais inovador em workshops! Experimente a tecnologia de desenvolvimento na nuvem da Oracle no Code Lounge e participe de demonstrações e experimentações ao vivo.

Minha sessão será às 14:10hrs:


**Apesar de possuir o mesmo título de uma palestra que fiz no DBA BRASIL 1.0 e no GUOB de 2016, essa é a versão 2 e foi completamente reestruturada.


Inscreva-se: https://developer.oracle.com/code/sao-paulo