quarta-feira, 3 de maio de 2023

Oracle 23c: Novos recursos

Recentemente, a Oracle liberou a versão gratuita do Oracle Database 23c conhecida como Oracle Database 23c Free - Developer Release que permite aos desenvolvedores terem acesso antecipado há novos recursos e funcionalidades do banco de dados mais avançadas do mundo. A versão do desenvolvedor precede o lançamento planejado do Oracle Database 23c, o próximo lançamento de suporte de longo prazo (long term release).

Inúmeros novos recursos e aprimoramentos estão disponíveis em comparação à versão anterior. Abaixo destaco alguns dos recursos que, particularmente, acho mais relevantes.


Consulta de expressão sem a cláusula FROM

A tabela DUAL não é mais necessária para selecionar uma ou mais expressões.


SQL> select sysdate;

SYSDATE
---------
01-MAY-23

SQL> select sysdate from dual;

SYSDATE
---------
01-MAY-23


Suporte a sintaxe IF [NOT] EXISTS

A criação, modificação e exclusão de objetos agora suporta os modificadores de sintaxe IF EXISTS e IF NOT EXISTS. Isso permite que seja controlado se um erro deve ser apresentado quando determinado objeto existir ou não.


SQL> drop table t1_exemplo;
drop table t1_exemplo
           *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> drop table IF EXISTS t1_exemplo;

Table dropped.

SQL> create table t1_exemplo (x number, y varchar2(100));

Table created.

SQL> create table t1_exemplo (x number, y varchar2(100));
create table t1_exemplo (x number, y varchar2(100))
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object

SQL> create table IF NOT EXISTS t1_exemplo (x number, y varchar2(100));

Table created.

Agrupamento de coluna por alias ou posição 

Agora é possível usar alias de coluna ou posição de item nas consultas com cláusulas GROUP BY, GROUP BY CUBE, GROUP BY ROLLUP e GROUP BY GROUPING SETS, além da cláusula HAVING oferecer suporte a alias de coluna.


SQL> SELECT y,
  2         count(*) qtd
  3  FROM t1_exemplo
  4  GROUP BY y
  5  HAVING qtd > 1;

Y                 QTD
---------- ----------
AAA                 2
Anteriormente a consulta retornaria a mensagem de erro ORA-00904: invalid identifier. 

Se o parâmetro group_by_position_enabled for definido como true, também será possível agrupar por um número de posição em vez de um alias de expressão:


SQL> alter session set group_by_position_enabled = true;

Session altered.

SQL> SELECT y,
  2         count(*) qtd
  3  FROM t1_exemplo
  4  GROUP BY 1;

Y                 QTD
---------- ----------
AAA                 2
BBB                 1
CCC                 1


Construtores de valor de tabela 

Permite a inserção de vários registros de uma única vez (table value constructor):


SQL> INSERT INTO t1_exemplo
  2  VALUES (1, 'AAA'),
  3         (2, 'AAA'),
  4         (3, 'BBB'),
  5         (4, 'CCC');

4 rows created.
Similar para instruções SELECT:


SQL> SELECT *
  2  FROM (
  3        VALUES (1, 'registro 1'),
  4               (2, 'registro 2'),
  5               (3, 'registro 3'),
  6               (4, 'registro 4'))
  7   tmp (x, y);

         X Y
---------- ----------
         1 registro 1
         2 registro 2
         3 registro 3
         4 registro 4

Permissões a nível de schema


Os privilégios de schema simplificam a concessão onde um usuário ou função precisa de privilégios em todos os objetos de um schema.


-- Sequences
grant select any sequence on schema user1 to user2;
grant select any sequence on schema user1 to user1_role;

-- Tables, views, materialized views
grant select any table on schema user1 to user2;
grant insert any table on schema user1 to user2;
grant update any table on schema user1 to user2;
grant delete any table on schema user1 to user2;
grant select any table on schema user1 to user1_role;
grant insert any table on schema user1 to user1_role;
grant update any table on schema user1 to user1_role;
grant delete any table on schema user1 to user1_role;

-- Procedures, functions and packages
grant execute any procedure on schema user1 to user2;
grant execute any procedure on schema user1 to user1_role;


Role de banco de dados para desenvolvedores


A role DB_DEVELOPER_ROLE fornece ao desenvolvedor todos os privilégios necessários para projetar, implementar, depurar e implantar aplicativos em bancos de dados Oracle.


SQL> grant db_developer_role to user1;

Grant succeeded.

SQL> conn user1/user1@freepdb1
Connected.

SQL> select * from session_privs order by privilege;

PRIVILEGE
----------------------------------------
CREATE ANALYTIC VIEW
CREATE ATTRIBUTE DIMENSION
CREATE CUBE
CREATE CUBE BUILD PROCESS
CREATE CUBE DIMENSION
CREATE DIMENSION
CREATE DOMAIN
CREATE HIERARCHY
CREATE JOB
CREATE MATERIALIZED VIEW
CREATE MINING MODEL

PRIVILEGE
----------------------------------------
CREATE MLE
CREATE PROCEDURE
CREATE SEQUENCE
CREATE SESSION
CREATE SYNONYM
CREATE TABLE
CREATE TRIGGER
CREATE TYPE
CREATE VIEW
DEBUG CONNECT SESSION
EXECUTE DYNAMIC MLE

PRIVILEGE
----------------------------------------
FORCE TRANSACTION
ON COMMIT REFRESH

24 rows selected.

Número de colunas por tabela e visão aumentados para 4096


MAX_COLUMNS, novo parâmetro de inicialização introduzido na versão 23c. Se ajustado para EXTENDED permite que as tabelas e visões do banco de dados tenham como limite 4096 colunas em vez de 1000. Além do ajuste no parâmetro MAX_COLUMNS é preciso que o parâmetro compatible esteja configurado como 23.0.0


SQL> alter session set container=FREEPDB1;

SQL> alter system set max_columns=EXTENDED scope=spfile;

System altered.

SQL> shutdown immediate;
Pluggable Database closed.

SQL> startup;
Pluggable Database opened.

SQL> show parameter compatible

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      23.0.0

SQL> show parameter max_columns

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_columns                          string      EXTENDED



declare
  l_col_count number := 4096;
  l_str       clob;
begin
  execute immediate 'drop table if exists t1_exemplo purge';
  
  l_str := 'create table t1_exemplo (';
  for i in 1 .. l_col_count loop
    l_str := l_str || 'col' || to_char(i) || ' number, ';
  end loop;
  l_str := substr(l_str, 1, length(l_str)-2);
  l_str := l_str || ')';
  
  execute immediate l_str;
end;
/

PL/SQL procedure successfully completed.


SQL> select count(*) from dba_tab_columns where table_name='T1_EXEMPLO';

  COUNT(*)
----------
      4096
Outros recursos e melhorias podem ser acessados através do documento:

https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/introduction.html
Mais informações →

sexta-feira, 12 de novembro de 2021

No ADR base is set

O ADRCI (Automatic Diagnostic Repository Command Interpreter), é uma ferramenta de linha de comando introduzida na versão 11g do Oracle database cujo propósito é gerenciar os dados de diagnóstico armazenados no ADR (Automatic Diagnostic Repository)

O ADR é um repositório de arquivos de diagnóstico de banco de dados, tais como traces, dumps, o alert log, health monitor reports, etc


Recentemente ao utilizar a ferramenta me deparei com a mensagem "No ADR base is set" e ao executar o comando "show homes" a mensagem "No ADR homes are set"

[oracle@oda1 ~]$ adrci

ADRCI: Release 19.0.0.0.0 - Production on Wed Nov 10 10:33:37 2021

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

No ADR base is set
adrci> show homes
No ADR homes are set
adrci>

Isso ocorre devido ao arquivo $ORACLE_HOME/log/diag/adrci_dir.mif estar danificado ou ausente. neste caso, ausente e procedi com a criação do diretório/arquivo direcionando o $ORACLE_BASE para dentro do arquivo conforme exemplo abaixo:

[oracle@oda1 ~]$ ls -l $ORACLE_HOME/log/diag/adrci_dir.mif
ls: cannot access /u01/app/odaorahome/oracle/product/19.0.0.0/dbhome_1/log/diag/adrci_dir.mif: No such file or directory
[oracle@oda1 ~]$ mkdir -p $ORACLE_HOME/log/diag
[oracle@oda1 ~]$ echo $ORACLE_BASE
/u01/app/odaorabase/oracle
[oracle@oda1 ~]$ printf "%s" "$ORACLE_BASE" > $ORACLE_HOME/log/diag/adrci_dir.mif
[oracle@oda1 ~]$

Feito os ajustes, basta entrar novamente no ADRCI para que já esteja funcional perante o ADR informado.

[oracle@oda1 ~]$ adrci

ADRCI: Release 19.0.0.0.0 - Production on Wed Nov 10 10:36:58 2021

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/u01/app/odaorabase/oracle"
adrci> show homes
ADR Homes:
diag/rdbms/cbdprd1/CBDPRD1
diag/asm/user_root/host_1679024932_110
diag/clients/user_oracle/host_1679024932_110
diag/asmtool/user_root/host_1679024932_110
adrci>
Mais informações →

sexta-feira, 25 de junho de 2021

Consultando dados de uma partição


Algo que ainda não havia usado nem ao menos lido sobre.. mas fica a dica de como consultar dados de partições específicas.

select [columns] from [table] partition ([partition])

SQL> select partition_name from dba_tab_partitions where table_name='AUD$UNIFIED';

PARTITION_NAME
--------------------------------------------------------------------------------
AUD_UNIFIED_P0
SYS_P49826
SYS_P50746
SYS_P51806
SYS_P53186
SYS_P54526
SYS_P56266

7 rows selected.

SQL> select count(*) from AUDSYS.AUD$UNIFIED partition (SYS_P54526);

  COUNT(*)
----------
      2904

SQL> select count(*) from AUDSYS.AUD$UNIFIED partition (SYS_P56266);

  COUNT(*)
----------
      8997

SQL> select count(*) from AUDSYS.AUD$UNIFIED partition (SYS_P56266) where OS_USER='apache';

  COUNT(*)
----------
       142
Mais informações →

sexta-feira, 4 de junho de 2021

Recuperando credenciais de administrador no weblogic

 


Dica para quem esqueceu as credenciais de acesso ao Weblogic.

Capture as informações criptografadas a partir do arquivo boot.properties localizado no $USERDOMAIN_HOME/servers/AdminServer/security/


[root@wls ~]# export USERDOMAIN_HOME=/u01/Oracle/Middleware/Oracle_Home/user_projects/domains/app_domain
[root@wls ~]# cd $USERDOMAIN_HOME/servers/AdminServer/security/
[root@wls security]# cat boot.properties
# Generated by Configuration Wizard on Mon Jun 27 07:42:49 BRT 2016
username={AES}zoDTpzXJwBoWCPwqbTuoBhQiR8bIneBw1nnumM2XkAU=
password={AES}MRuZtj19v4RBzFCb4gX5IM+qItLDVAaP1IC13WvTitA=

Carregue as as variáveis de ambiente do domínio:

[root@wls security]# . $USERDOMAIN_HOME/bin/setDomainEnv.sh
Crie um arquivo chamado recoverpassword.java, por exemplo, contendo o seguinte comando:

[root@wls app_domain]# cat recoverpassword.java
public class recoverpassword {
 public static void main(String[] args)
 {
  System.out.println(
  new weblogic.security.internal.encryption.ClearOrEncryptedService(
  weblogic.security.internal.SerializedSystemIni.getEncryptionService(args[0]
   )).decrypt(args[1]));
  }
}
Chame a classe java criada passando a string criptografada do arquivo boot.properties como parâmetro:

[root@wls app_domain]# java -cp $CLASSPATH:. recoverpassword $DOMAIN_HOME {AES}zoDTpzXJwBoWCPwqbTuoBhQiR8bIneBw1nnumM2XkAU=
weblogic
[root@wls app_domain]# java -cp $CLASSPATH:. recoverpassword $DOMAIN_HOME {AES}MRuZtj19v4RBzFCb4gX5IM+qItLDVAaP1IC13WvTitA=
Passw0rd
A saída do comando trará em texto simples o nome de usuário e senha do administrador do Weblogic.

Mesmo que existam vários ambientes com as mesmas credenciais, o retorno do arquivo boot.properties pode conter textos criptografados diferentes, pois ao criptografar e descriptografar o weblogic usa a chave cifrada armazenada no arquivo "security/SerializedSystemIni.dat". Portanto, sendo a chave de cifra diferente, é possível obter um texto criptografado diferente até para a mesma entrada.
Mais informações →

domingo, 24 de janeiro de 2021

VM Guest lenta e com elevado percentual de CPU roubada (steal)

Acompanhando a performance de algumas máquinas virtualizadas em um ODA X7-2 HA foi observado durante o período alto percentual de CPU steal (%st) que mostra a porcentagem de tempo gasto (roubado)  em esperas involuntárias da CPU enquanto o hypervisor está atendendo outro processador virtual.

Para dar ênfase ao problema e posteriormente demonstrar a mudança de comportamento junto aos ajustes em uma VM com 8 vCPU, forcei a utilização de CPU disparando comandos "yes" em nohup onde dentro de alguns segundos o percentual de CPU roubada já atingiu 68%

[root@vm04 ~]# cat /proc/cpuinfo | egrep 'processor' | wc -l
8
[root@vm04 ~]#
[root@vm04 ~]# yes > /dev/null &
[1] 26080
[root@vm04 ~]# yes > /dev/null &
[2] 26135
[root@vm04 ~]# yes > /dev/null &
[3] 26137
[root@vm04 ~]# yes > /dev/null &
[4] 26138
[root@vm04 ~]#














Tratando-se de um Oracle engineered systems, busquei como referência o MOS (My Oracle Support) onde encontrei a Doc ID 1928868.1 falando exatamente sobre este comportamento destacando em seu título "Guest VM Running Slow and is not Able to Use All the CPUs Assigned to it on ODA"

Este comportamento ocorre devido ao parâmetro CPU_CAP estar definido como 100 que independente da quantidade de CPUs associados a máquina virtual ela utilizará apenas 1 CPU.

Cancelando o stress de CPU na VM

[root@vm04 ~]# pkill yes
[1]   Terminated              yes > /dev/null
[2]-  Terminated              yes > /dev/null
[3]-  Terminated              yes > /dev/null
[4]+  Terminated              yes > /dev/null

No dom0 confirme o valor do CPU CAP e ajuste dinamicamente seu valor para 0. 

[root@dom0 ~]# xm sched-credit
Name                                ID Weight  Cap
Domain-0                             0  65535    0
oakDom1                              1    256    0
vm03                                 3    256  100
vm04                                 4    256  100


[root@dom0 ~]# xm sched-credit -d vm04 -c 0
[root@dom0 ~]# xm sched-credit
Name                                ID Weight  Cap
Domain-0                             0  65535    0
oakDom1                              1    256    0
vm03                                 3    256  100
vm04                                 4    256    0
[root@dom0 ~]#

Ao ser criado uma VM, o valor padrão para o parâmetro é 100%. Esse valor é então convertido em um limite de utilização da CPU no arquivo vm.cfg para a máquina virtual. 

O valor definido no arquivo vm.cfg limita a quantidade de CPU que um convidado (VM Guest) pode consumir. Se o Processor Cap for definido como 100% no Oracle VM, o valor definido em vm.cfg será 0, o que significa que não há limite para a utilização da CPU.

Retornando a VM vou proceder com um novo teste forçando a utilização das CPUs da mesma forma que a anterior

[root@vm04 ~]# yes > /dev/null &
[1] 31926
[root@vm04 ~]# yes > /dev/null &
[2] 31928
[root@vm04 ~]# yes > /dev/null &
[3] 31929
[root@vm04 ~]# yes > /dev/null &
[4] 31976

Com alguns segundos já foi perceptível que o percentual de CPU roubada não sofria oscilações, estava de forma constante em 0%















Comparando o antes e depois do ajuste

















Referência:

Guest VM Running Slow and is not Able to Use All the CPUs Assigned to it on ODA (Doc ID 1928868.1)

Mais informações →

quarta-feira, 29 de julho de 2020

sábado, 18 de julho de 2020

Postagens mais antigas Página inicial

Translate

# Suporte

# ACE Program

#Oracle

#Oracle
Disclaimer: The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.

#Blog reconhecido

#ARTICULISTA

Marcadores

Postagens populares