ENPO V - Está chegando…

outubro 24th, 2008 por Rodrigo Almeida

Olá,

Em Novembro terá a 5° Edição da ENPO (Encotro Nacional de Profissionais Oracle) em São Paulo, que irá ocorrer na faculdade FIAP (www.fiap.com.br), é sempre importante ressaltar que nesses eventos podemos criar e melhorar nosso network, assim como agregar mais informações sobre os produtos e mercado Oracle.

O evento irá contar com palestras e stands de parceiros voltados ao mercado Oracle. O GPO também estará para marcar presença e compartilhar conhecimentos Oracle para seus convidados.

O cronograma das palestras esse ano está abordando assuntos bem interessantes, que variam desde RAC (Real Application Cluster) , RMAN (Recovery Manager), BI (Bussiness Inteligence), SQL*PLUS, Oracle Spatial e a utilização de Expressões Regulares no 10g e 11g.

Esse ano vocês irão ter que me aturar um pouco, irei palestrar sobre RMAN - Vilão ou Héroi? Vamos falar sobre as funcionalidades, entender a arquitetura, como funciona os backups para bancos em ARCHIVELOG e NOARCHIVELOG, tipos de backup incrementais e recover, catálogo de recuperação, dicas do dia-a-dia, as técnicas que podemos aplicar como o TSPITR (Tablespace Point-In-Time Recover), Migration Platform, Duplicate DP e Transportable Tablespace.

Espero que o público da ENPO goste desse assunto, vou procurar abordar a maioria das funcionalidades do RMAN. E também teremos outros 5 palestras que realmente são sensacionais, como, Chiappa falando sobre SQL*PLUS, como sempre digo:

“DBA que é DBA, usa SQL*PLUS”

Irá nos fornecer informações de como dominar essa ferramenta, teremos também palestra sobre RAC comPaulo Shorr, que na ENPO do início do ano fez uma ótima apresentação sobre RAC com caso de estudo, teremos o Roberto Serson discutindo sobre a utilização de Expressões regulares no 10g e 11g, assim como outras palestras sobre Oracle Spatial, que é um produto fantástico e BI que é uma área que está crescendo cada vez mais, que está com um ótimo mercado.

Então, fica o convite para todos e se encontramos na 5º Edição da ENPO.

Abraços,

RMAN - Encontrando o DBID do banco de dados

outubro 23rd, 2008 por Rodrigo Almeida

Olá,

Uma dos maiores problemas de realizar uma recuperação completa ou uma restauração de um banco de dados para um novo servidor, é o problema de mencionar o DBID (Database Identifier - Identificação do banco de dados) para o catálogo do RMAN.

Pois, para conseguir uma restauração da base, é necessário mencionar o DBID ao catálogo de recuperação para conseguir associar o banco de dados no catálogo e posteriormente restaurar e recuperar seus backups sets.

Agora, vamos mencionar quais os meios que podemos encontrar o DBID de um banco de dados.

1. Dicionário de dados

Podemos realizar um simples select na view v$database para conseguir a informação, veja.

SQL> select dbid from v$database;
      DBID
----------
4263396950
1 linha selecionada.

2. RMAN - Inicío de sessão

O DBID também é informado quando você conecta ao RMAN, lembrando, que o DBID será informado se o banco de dados estiver em MOUNT ou OPEN, se apenas com NOMOUNT, não será informado, pois não irá ler o arquivo de controle, ou control file. Exemplo.

[oracle@PELSPOWMS2 ~]$ rman
Recovery Manager: Release 10.2.0.1.0 - Production on Thu Oct 23 17:15:23 2008
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
RMAN> connect target ‘rman/##########@wmssp.world’;
connected to target database: WMSSP (DBID=4263396950)
RMAN>

3. RMAN - Usando o comando List incarnation

Outro modo de se conseguir o DBID do banco de dados, é após logar-se no banco de dados target e estar conectado ao catálogo de recuperação, utilizar o comando LIST INCARNATION, exemplo:

RMAN> list incarnation;
List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
8451    8458    WMSSP    4263396950       PARENT  1          30/06/2005 19:09:40
8451    8452    WMSSP    4263396950       CURRENT 446075     27/02/2008 09:03:20
RMAN>

Uma dica muito importante é sempre manter uma planilha com todos os bancos de dados, senhas e seus respectivos DBID armazenados após as criação do banco de dados para não correr risco de não saber o DBID do banco de dados criado.

Abraços,

Rodrigo Almeida

O que é um Control file ?

outubro 15th, 2008 por Rodrigo Almeida

Olá,

Alguns profissionais iniciantes em Oracle, ainda tem muitas dúvidas sobre diversos conceitos de arquitetura do banco de dados Oracle, por isso, resolvi discutir sobre um ponto bem importante, O que é um Control file?

Tradução

Control file = Arquivo de Controle, tradução em português para a palavra que é muito utilizado na literatura Oracle brasileira.

Visão Geral

O arquivo de controle é um arquivo binário necessário para iniciar e operar com sucesso o banco de dados. O arquivo de controle é atualizado constantemente pelo Oracle durante sua utilização, onde fica disponível para escrita, apenas quando o banco de dados está aberto, ou seja, OPEN. Caso o arquivo de controle não esteja acessível por alguma razão, o banco de dados não irá funcionar corretamente, podendo trazer problemas ao iniciar a instância. Todo arquivo de controle é sempre associado somente com um único banco de dados, não pode existir um arquivo de controle que seja utilizado por mais de uma instância, até em ambientes de Real Application Cluster (RAC), existe um arquivo de controle para cada instância.

Contéudo

Um arquivo de controle possui diversas informações de um banco de dados que é requerida pela instância. Durante o processo de startup ou uma operação normal, somente o Oracle Server pode modificar as informações no arquivo de controle, deste modo, nenhum DBA ou usuário pode modificar seu contéudo.

As informações que o arquivo de controle possui são:

  • Nome do banco de dados 
  • Data de criação do banco de dados
  • Os nomes e localizações de cada datafile e redo log associados ao banco de dados
  • Informações sobre as tablespaces
  • Possíveis datafiles com status offline
  • O histórico de logs
  • Sobre os archives gerados
  • Backupsets e backup pieces, gerados pelo RMAN
  • Backups de datafiles e informações de redo log
  • Cópia de datafiles
  • O valor atual do número da sequência do log
  • Informações de checkpoint

Para cada datafile ou redo log que é adicionado, renomeado, modificado ou excluído do banco de dados, o arquivo de controle é atualizado pelo Oracle Server para garantir a modificação da estrutura física da base. Essas modificações pode ser:

  • O Oracle pode identificar os datafiles e redo logs que foram abertos durante o processo de startup
  • Identificar os arquivos que são necessários ou disponíveis em caso de recuperação do banco de dados

Portanto, para cada modificação na estrutura física do banco de dados, podendo ser feito atráves do comando ALTER DATABASE, é altamente recomendado que seja feito um backup do seu arquivo de controle para evitar possíveis problemas no próximo processo de startup do banco de dados.

Como o arquivo de controle armazena informações sobre os checkpoints, a cada três segundos, o processo de plano de fundo (CKPT) registra as posições do redo log, essas posições serão utilizadas posteriormente  durante um processo de recuperação do banco de dados, onde o Oracle irá dizer se todas as entradas dos grupos de redo log serão necessárias para realizar tal recuperação.

Referência

Oracle Concepts 10g

Abraços,

Rodrigo Almeida

 

 

 

 

Entendendo a Marca d’água e fragmentação de tabelas

outubro 7th, 2008 por Rodrigo Almeida

Olá,

Uma dos principais conceitos sobre arquitetura física do Oracle, é a marca D’água, uma tradução de HWM  - High Water Mark, ele que indica o limite que uma tabela já ocupou de espaço físico no seu banco de dados. Mas, vamos um pouco mais a fundo.

O que é uma Marca D’água (HWM - High Water Mark)?

A marca d’água é o limite do número de blocos que uma tabela pode estar utilizando, resumindo para um conceito mais simples, toda vez que uma tabela recebe um INSERT (novos registros), essa marca na tabela aumenta dizendo ao Oracle Server a quantidade de blocos que a tabela está utilizando, automaticamente, a quantidade de blocos, multiplicado, pelo tamanho do db_block_size do banco de dados, diz o valor físico real que está sendo utilizado.

Mas, esse valor real não é o valor que o Oracle irá alocar, pois irá depender de alguns outros pontos, como:

  • Se a tabela está sendo gerenciada por sí própria ou pela tablespace.
  • Irá depender dos tamanhos dos extents, exemplo, INITIAL_EXTENT e NEXT_EXTENT.
  • Também, irá depender do tipo de gerenciamento, se é SEGMENT MANAGEMENT AUTO ou UNIFORM.
  • E a quantidade de blocos que um EXTENT pode suportar.

Vamos ver como funciona a marca d’água na prática, um alguns exemplos práticos.

Vou criar uma tabela simples, chamada TSTDBA.

SQL> create table TESTE (a varchar2(100) not null, b number(7) not null);
Tabela criada.

Agora, vamos analisar como está a estrutura para o Oracle, pois a tabela não possui nenhum valor e nenhuma estatística coletada.

SQL> select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE"
  2  from dba_tables
  3  where table_name = 'TSTDBA';
OWNER      TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS ANALYZE
---------- ------------------------------ ---------- ------------ ---------- -------------------
RODRIGO    TSTDBA

Até o momento, tudo sem surpresas para nós.

Então, vamos popular essa tabela com alguns registros, veja o exemplo.

SQL> l
  1  declare
  2     contador integer;
  3  begin
  4     contador := 1;
  5     while contador <= 1000 loop
  6             insert into TSTDBA values ('TESTE',contador);
  7             contador := contador + 1;
  8     end loop;
  9     commit;
 10* end;
SQL> /
Procedimento PL/SQL concluído com sucesso.
SQL> exec dbms_stats.gather_table_stats (ownname=>'RODRIGO',tabname=>'TSTDBA',estimate_percent=>null,method_opt=>'FOR ALL COLUMNS SIZE AUTO',degree=>6);
Procedimento PL/SQL concluído com sucesso.

Verifiquem que fiz um pequeno bloco PL/SQL para inserir dados em minha tabela, cerca de 1.000 registros. Após isso, preciso dizer ao Oracle, como a tabela está, seu volume e outras coisas mais, então, fiz um analyze na tabela para atualizar as informações estruturais dela no dicionário Oracle, ao fazer o analyze com o DBMS_STATS, o resultado do SELECT acima, agora é esse.

SQL> select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE"
  2  from dba_tables
  3  where table_name = 'TSTDBA';
OWNER      TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS ANALYZE
---------- ------------------------------ ---------- ------------ ---------- -------------------
RODRIGO    TSTDBA                                  5            0       1000 06-10-2008 19:42:08

Veja, a nossa tabela está utilizando 5 blocos, o db_block_size do meu banco de dados é de 8KB, então, resumidamente, ele deveria estar utilizando cerca de 40KB, certo?

SQL> select 8192*5 from dual;
    8192*5
----------
     40960

Mas, se consultar o seu tamanho na dba_segments temos:

SQL> select segment_name, sum(bytes)/1024 from dba_segments where segment_name = 'TSTDBA' group by segment_name;
SEGMENT_NAME                                                                      SUM(BYTES)/1024
--------------------------------------------------------------------------------- ---------------
TSTDBA                                                                                         64

O resultado para o tamanho da tabela TSTDBA é 64KB, porque, o INITIAL_EXTENT da tabela é de 64KB, e como os 1.000 registros ocuparam apenas 40KB, um único extent consegui suportar.

SQL> select initial_extent/1024, next_extent from dba_tables where table_name = 'TSTDBA';
INITIAL_EXTENT/1024 NEXT_EXTENT
------------------- -----------
                 64

Pois bem! Rodrigo, e o tal do HWM, até onde está entrando nisso?

Vamos começar a brincar agora, veja que após o analyze, minha tabela TSTDBA está utilizando 5 blocos de dados, certo? Teoricamente, se eu fizer um TRUNCATE TABLE, eu não vou mais utilizar nenhum bloco, e minha marca d’água deveria baixar, mas, acontece isso:

SQL> truncate table TSTDBA;
Tabela truncada.
SQL> select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE"
  2  from dba_tables
  3  where table_name = 'TSTDBA';
OWNER      TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS ANALYZE
---------- ------------------------------ ---------- ------------ ---------- -------------------
RODRIGO    TSTDBA                                  5            0       1000 06-10-2008 19:44:18

A minha tabela continua com se estivesse com 5 blocos, o que isso pode nos prejudicar:

  • Esse exemplo é bem simples, mas para tabelas com milhares de registros, poderá influenciar os FULL-TABLES SCANS.
  • Ao realizar um INSERT convencional, ou seja, sem o hint /* + APPEND */, ele irá procurar por bocos livres e irá consumir CPU e demorar um tempo para sua execução.
  • Se minha marca d’água estiver muito alta, ou seja, estiver armazenando um alto valor de blocos utilizados, e você sabe, que ele não está utilizando tudo isso, você terá uma alocação de EXTENTS desnecessários no banco de dados, e isso irá ocupar espaço desnecessários.

 Caso eu quisesse diminuir o tamanho do meu segmento de tabela, eu não iria conseguir, pois além da marca d’água é inferior aos meus 64KB, pois bem, tente realizar um insert agora de 2.000.000 de registros e vamos ver o que acontece.

 SQL> declare
  2     contador integer;
  3  begin
  4     contador := 1;
  5     while contador <= 2000000 loop
  6             insert into TSTDBA values ('TESTE',contador);
  7             contador := contador + 1;
  8     end loop;
  9     commit;
 10  end;
 11  /
Procedimento PL/SQL concluído com sucesso.
SQL> exec dbms_stats.gather_table_stats (ownname=>'RODRIGO',tabname=>'TSTDBA',estimate_percent=>null,method_opt=>'FOR ALL COLUMNS SIZE AUTO',degree=>6);
Procedimento PL/SQL concluído com sucesso.
SQL> select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE"
  2  from dba_tables
  3  where table_name = 'TSTDBA';
OWNER      TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS ANALYZE
---------- ------------------------------ ---------- ------------ ---------- -------------------
RODRIGO    TSTDBA                               4654            0    2000000 06-10-2008 22:37:24
SQL> show parameters db_block_size
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192
SQL> select (8192*4654)/1024/1024 as "Tamanho" from dual;
   Tamanho
----------
 36,359375
SQL> select segment_name, sum(bytes)/1024/1024 from dba_segments where segment_name = 'TSTDBA' group by segment_name;
SEGMENT_NAME                                                                      SUM(BYTES)/1024/1024
--------------------------------------------------------------------------------- --------------------
TSTDBA                                                                                              37

Se quizer analisar melhor como ficou a distribuição, veja a dba_extents, abaixo vou mostrar apenas um pequeno resumo da quantidade de extents alocados e seus respectivo tamanho.

SQL> select segment_name, count(extent_id), sum(bytes)/1024/1024
  2  from dba_extents
  3  where segment_name = 'TSTDBA'
  4  group by segment_name;
SEGMENT_NAME         COUNT(EXTENT_ID) SUM(BYTES)/1024/1024
-------------------- ---------------- --------------------
TSTDBA                             52                   37

Bom, vimos que agora temos um valor legal de extents alocados, e mesmo após o TRUNCATE continuo com uma alocação de extents, que totaliza os 37MB da tabela, então, minha marca d’água está posicionado no 51° extent, que seria o limite do numeros de blocos alcançados.

Conseguimos entender como funciona a marca d’água, o que isso pode nos causar?

A chamada fragmentação de tabela, além da marca d’água elevar o número de extents no dicionário, prejudicando muitas vezes os planos de execução e os table full scans, vamos ter também perca de espaço físico para a tablespace, espaço que não poderam ser alocados por outro segmento. Vamos a uma demostração prática de como funciona a fragmentação.

SQL> select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE"
  2  from dba_tables
  3  where table_name = 'TSTDBA';
OWNER      TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS ANALYZE
---------- ------------------------------ ---------- ------------ ---------- -------------------
RODRIGO    TSTDBA                               4654            0    2000000 06-10-2008 22:37:24
SQL> select segment_name, count(extent_id), sum(bytes)/1024/1024
  2  from dba_extents
  3  where segment_name = 'TSTDBA'
  4  group by segment_name;
SEGMENT_NAME         COUNT(EXTENT_ID) SUM(BYTES)/1024/1024
-------------------- ---------------- --------------------
TSTDBA                             52                   37

A minha tabela TSTDBA continua com seus 2.000.000 de registros, após o analyze acima, vimos que está a atual estrutura da tabela, e se realizarmos diversos DELETES em grandes quantidades, o que poderemos ter?

SQL> delete from TSTDBA where b between 10000 and 20000;
10001 linhas deletadas.
SQL> delete from TSTDBA where b between 50000 and 200000;
150001 linhas deletadas.
SQL> delete from TSTDBA where b between 400000 and 700000;
300001 linhas deletadas.
SQL> delete from TSTDBA where b between 1000000 and 1300000;
300001 linhas deletadas.
SQL> commit;
Commit concluído.
SQL> select segment_name, count(extent_id), sum(bytes)/1024/1024
  2  from dba_extents
  3  where segment_name = 'TSTDBA'
  4  group by segment_name;
SEGMENT_NAME         COUNT(EXTENT_ID) SUM(BYTES)/1024/1024
-------------------- ---------------- --------------------
TSTDBA                             52                   37

Vamos passar um analyze para validar toda a estrutura da tabela.

SQL> exec dbms_stats.gather_table_stats (ownname=>'RODRIGO',tabname=>'TSTDBA',estimate_percent=>null,method_opt=>'FOR ALL COLUMNS SIZE AUTO',degree=>6);
Procedimento PL/SQL concluído com sucesso.

Veja o resultado para os novos valores.

SQL> select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE"
  2  from dba_tables
  3  where table_name = 'TSTDBA';
OWNER      TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS ANALYZE
---------- ------------------------------ ---------- ------------ ---------- -------------------
RODRIGO    TSTDBA                               4654            0    1239996 06-10-2008 23:09:01

A quantidade de extents não alterou depois de apagarmos diversos registros, isso causa a conhecida fragmentação do segmento, mesmo que após calcularmos a quantidade de registro exato da tabela.

SQL> select segment_name, count(extent_id), sum(bytes)/1024/1024
  2  from dba_extents
  3  where segment_name = 'TSTDBA'
  4  group by segment_name;
SEGMENT_NAME         COUNT(EXTENT_ID) SUM(BYTES)/1024/1024
-------------------- ---------------- --------------------
TSTDBA                             52                   37

Para resolvermos esse problema de fragmentação, bastamos reconstruir o mapa binário da tabela, para isso, apenas use um MOVE sem mencionar a tablespace que resolve nosso problema.

SQL> alter table TSTDBA move;
Tabela alterada.
SQL> select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE"
  2  from dba_tables
  3  where table_name = 'TSTDBA';
OWNER      TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS ANALYZE
---------- ------------------------------ ---------- ------------ ---------- -------------------
RODRIGO    TSTDBA                               4654            0    1239996 06-10-2008 23:09:01
SQL> select segment_name, count(extent_id), sum(bytes)/1024/1024
  2  from dba_extents
  3  where segment_name = 'TSTDBA'
  4  group by segment_name;
SEGMENT_NAME         COUNT(EXTENT_ID) SUM(BYTES)/1024/1024
-------------------- ---------------- --------------------
TSTDBA                             38                   23

PRONTO! Veja que após nosso “rebuild” na tabela, liberamos cerca de 15MB para a tablespace, fazendo apenas uma reconstrução dos extents da tabela.

Existem muitos outros conceitos envolvidos sobre a alocação de extents, sem mencionar os freelists, gerenciamento das tablespaces e diferenças entre os segmentos de tabela e índice, tudo isso foi apenas um modo de ilustrar os problemas que podem causar perda de performance em nossos ambientes.

Existe uma matéria que escrevi para a iMasters algum tempo atrás que explica com um pouco mais de detalhes como funciona a arquitetura de armazenamento lógico do banco de dados Oracle, o artigo Arquitetura de armazenamento lógico, que sanar algumas dúvidas.

A idéia principal do post foi iniciar desde o conceito de HWM (High Water Mark) até sua fragmentação, passando por várias fases, para fornecer um melhor entendimento de como a arquitetura Oracle funciona.

Abraços,

Rodrigo Almeida

 

My Oracle Support - O nosso velho Metalink de cara nova

setembro 30th, 2008 por Rodrigo Almeida

Olá,

Semana passada o nosso velho e bom amigo Metalink ficou de cara nova, e também com um apelido novo, chamado agora de My Oracle Support (Site: http://metalink.oracle.com), criado boa parte em Flash (Actions Scripts FORTES!) e com novas funcionalidades integradas ao SCM (Software Configuration Manager), apresentou uma cara bem bonita e uma razoável navegação.

Abaixo mostro um pequeno screenshot da nova tela inicial do Metalink, ou My Orale Support.

Nova cara do Metalink

Ao acessar o metalink, algumas novidades apareceram como: Dashboard, Community, Reports e Collector. O mais bacana das opções é o Dashboard, que sumariza todas as informações da sua conta em uma única tela, tais informações como seus SR (Service Request - ou TAR), informações sobre suas bases que estão coletando informação pelo OCM (Oracle Configuration Manager), inventário e Projects . O screenshot mostra a tela de dashboards.

Tela inicial do usuário

O metalink sempre foi o canal para entrar em contato com o suporte da Oracle, para aqueles problemas difíceis de se resolver, a qualidade do suporte não mudou muita coisa, continua o mesmo (Quem usa sabe!), porém ao abrir um SR (ou TAR), você pode ter mais integração com o suporte e informação disponível da sua conta em um pequeno boxtext, como apresentado abaixo.

Tela de chamados

 

O My Oracle Support está com bons recursos, entre eles, podemos destacar:

MapView

Ao abrir um SR, você já pode mencionar em qual banco de dados está o problema, atribuindo as informações que estão armazenadas no repositório da Oracle ao SR. Essas informações são retiradas dos relatórios de RDA ou pelos coletores do SCM.

PowerView

Um recurso do My Oracle Support que permite filtrar informações por região do aplicativo, customizando as informações que acordo com o seu interesse. As regiões podem ser Knowledge base, Projects, System, System Health e Service Request.

System Health

Um monitor que analisa a saúde de seus bancos de dados e aplicativos, como Application Server e EBS (E-Bussiness Suite), monitora informações de segurança, patch e recomendações. Ótimo para equipes que querem atuar com pró-atividade.

Web Seminars

Dentro da região Knowledge, existe a opção Tools and Training >  Training (Web Seminars). Uma ótima sacada da Oracle para seus profissionais. A intenção é fornecer seminários e treinamentos gratuitos para seus produtos de suporte, como RDA, SCM, E-Bussiness Diagnostics entre outros. Dessa forma, trabalhar de acordo com os padrões Oracle e entender todas as ferramentas e seus respectivos fluxos de chamado.

Esses são apenas alguns itens que gostei de comentar sobre a nova ferramente da Oracle de suporte, para quem já é assinante Metalink, vale a pena dar uma navegada no site e descobrir muito mais coisas. O site em sí ainda é meio lento, mesmo para quem usa conexão DSL ou dedicada está bom, mas, para quem não gostou mesmo do site e ainda prefere a versão antiga, em todas as páginas existe o Link para Classic Metalink.

Abraços,

Rodrigo Almeida

 

Script: Resize Seguro

setembro 29th, 2008 por Rodrigo Almeida

Olá,

Segue o script utilizado no post “Diminuindo físicamente um banco de dados Oracle” para consulta.

Resize_seguro

SQL> get c:\DBA\scripts\resize_seguro.sql 
  1  select file_name,
  2        ceil( (nvl(hwm,1)*8192)/1024/1024 ) smallest,
  3        ceil( blocks*8192/1024/1024) currsize,
  4        ceil( blocks*8192/1024/1024) -
  5        ceil( (nvl(hwm,1)*8192)/1024/1024 ) savings,
  6        ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) smallest_safe,
  7        ceil( blocks*8192/1024/1024) -
  8        ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) savings_safe
  9  from dba_data_files a,
 10      ( select file_id, max(block_id+blocks-1) hwm
 11          from dba_extents
 12         group by file_id ) b
 13  where a.file_id = b.file_id(+)
 14   and ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) < ceil( blocks*8192/1024/1024)
 15   and ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) > 100
 16  order by 4 desc;
 17  select 'alter database datafile ''' || file_name || ''' resize ' ||
 18        ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 )  || 'm;' cmd
 19  from dba_data_files a,
 20      ( select file_id, max(block_id+blocks-1) hwm
 21          from dba_extents
 22         group by file_id ) b
 23  where a.file_id = b.file_id(+)
 24   and ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) < ceil( blocks*8192/1024/1024)
 25   and ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) > 100

O resultado será igual ao abaixo:

SQL> @resize_seguro
FILE_NAME                                                      SMALLEST   CURRSIZE    SAVINGS SMALLEST_SAFE SAVINGS_SAFE
------------------------------------------------------------ ---------- ---------- ---------- ------------- ------------
/u02/app/oracle/oradata/finp/sysaux01.dbf                           191       2000       1809        229            1771
/u02/app/oracle/oradata/finp/system01.dbf                           264       2000       1736        316            1684
CMD
------------------------------------------------------------------------------------------------------------------------
alter database datafile '/u02/app/oracle/oradata/finp/system01.dbf' resize 316m;
alter database datafile '/u02/app/oracle/oradata/finp/sysaux01.dbf' resize 229m;

Todos as colunas foram comentadas no POST que foi utilizado o script, para melhor o entendimento do resultado gerado.

Abraços,

 Rodrigo Almeida

 

Diminuindo físicamente um banco de dados Oracle

setembro 29th, 2008 por Rodrigo Almeida

Olá,

Vou mostrar uma tática bem legal de diminuir um banco de dados Oracle físicamente, sem mexer em extents (por shrink table), rebuild de índices ou realizar desfragmentação de segmentos (por Export\Import Utility) no banco de dados.

O principal ponto que iremos atacar será os espaços livres desnecessários alocados na tablespace, que consomem espaços em disco preciosos no sistema operacional, toda essa tarefa será guiada atráves da marca d’água (HWM - High Water Mark) dos datafiles onde podemos realizar um RESIZE no datafile para um valor menor sem a perda de dados.

Lembrete

Essa tarefa envolve alguns conceitos de Oracle, como os de Marca D’água, ou HWM - High Water Mark, esse tema eu vou abordar em outro post para melhor entendimento. OK!

Para iniciarmos os trabalhos, vamos analisar o tamanho do nosso banco de dados e quanto ele está ocupando em disco, abaixo, vou fazer dois SELECTS que passa essas informações para nós e depois um print da quantidade em disco utilizado e livre no sistema operacional.

SQL> select sum(bytes)/1024/1024 as "TamanhoFisico(MB)" from dba_data_files;
TamanhoFisico(MB)
-----------------
            76000
SQL> col "FileSystem" format a12
SQL> l
  1  select substr(file_name,1,4) as "FileSystem", sum(bytes)/1024/1024 as "Tamanho(MB)"
  2  from dba_data_files
  3  group by rollup(substr(file_name,1,4))
  4* order by substr(file_name,1,4)
SQL> /
FileSystem   Tamanho(MB)
------------ -----------
/u01               25800
/u02               50200
                   76000

Percebemos, que no meu banco de dados, tenho quase 26GB de datafiles no FileSystem /u01 e mais 50GB no FileSystem /u02, totalizando os 76GB que é o tamanho total do meu banco de dados. O importante é saber o que esse valor representa na minha máquina, em questão de consumo e escabilidade, veja o que a máquina ainda pode oferecer.

[oracle@pelspos18 ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             9.9G  3.2G  6.3G  34% /
/dev/sda1             190M   13M  168M   8% /boot
none                  2.0G     0  2.0G   0% /dev/shm
/dev/sda5             2.0G   36M  1.9G   2% /tmp
/dev/sda6             114G   51G   58G  48% /u01
/dev/sdb1             134G   50G   78G  40% /u02

Para o FileSystem /u01, representa 48% de utilização, já para o FileSystem /u02, representa 40% de utilização. Claro, que tudo isso, irá depender de como o aplicativo e banco de dados se comporta, se é um banco de dados com crescimento acentuado diário, mensal ou semestral, tudo isso influência. Mas, no exemplo que estou utilizando, o banco de dados tem um crescimento em média de 3GB por mês, então, está adequado.

Mas, eu preciso liberar mais espaço em disco para fazer alguns backups em disco, exports e etc. Então, vou diminuir meu banco de dados físicamente de forma segura, como eu disse no início do post.

Para fazer isso, preciso da mais algumas informações como, Tamanho Físico e Livre das tablespace, que pode ser pego facilmente pelos SELECTS abaixo. 

SQL> select tablespace_name, sum(bytes)/1024/1024 as "TAMANHO(MB)"
  2  from dba_data_files
  3  group by tablespace_name
  4  order by sum(bytes);
TABLESPACE_NAME      TAMANHO(MB)
-------------------- -----------
FIN_CPAG                     400
FIN_CEXT_IDX                 800
USERS                        800
TOOLS                       1500
SYSAUX                      2000
SYSTEM                      2000
FIN_CORP                    3500
FIN_CORP_IDX                5000
FIN_CPAG_IDX                8000
UNDOTBS                    10000
FIN_CREC_IDX               12000
FIN_CREC                   30000
12 linhas selecionadas.

Bom, as tablespaces SYSTEM e SYSAUX não é novidade para ninguem, então, elas vou deixar-las de fora da atividade, para não ocorrer nenhum tipo de problema. Vou apenas pensar nas demais, inclusive na de UNDO. Perceba que esse é apenas um SELECT para ver o tamanho total das tablespaces, agora, quero saber quanto cada uma tem livre, para poder direcionar os RESIZES. Abaixo segue o tamanho livre por tablespace.

SQL> select tablespace_name, sum(bytes)/1024/1024 as "TAMANHO(MB)"
  2  from dba_free_space
  3  group by tablespace_name
  4  order by sum(bytes);
TABLESPACE_NAME      TAMANHO(MB)
-------------------- -----------
FIN_CREC_IDX              2,1875
FIN_CPAG                398,5625
USERS                   642,5625
FIN_CEXT_IDX            799,5625
TOOLS                  1495,3125
SYSTEM                 1738,8125
SYSAUX                  1869,125
FIN_CORP_IDX           2456,4375
FIN_CORP               3259,6875
FIN_CPAG_IDX            5289,375
FIN_CREC                8625,125
UNDOTBS                 9865,375
12 linhas selecionadas.

Apenas mudei a view do primeiro SELECT, de dba_data_files para dba_free_space. Com isso, podemos ver quem tem mais espaço livre e saber quem precisa, existe tablespace com 8GB livres, e outros com 2,3 e 5G livres, só nisso, deixando apenas 10% livre, podemos economizar 12GB em disco. E ainda sem pensar no UNDO.

 Agora, vamos executar um SELECT que irá analisar a marca d’água dos datafiles e verificar se existe a possibilidade de realizar um RESIZE para um valor menor, com isso, liberar espaço em disco no sistema operacional. Esse SELECT precisa de uma atenção especial, pois, é necessário informar o tamanho do db_block_size do seu banco de dados para efetuar corretamente os cálculos.

Para saber o tamanho do seu db_block_size, basta fazer o seguinte procedimento.

NO SQLPLUS, faça:

SQL> show parameters db_block_size
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192

Se preferir, poderá ver na v$parameter, como no exemplo.

SQL> col name format a15
SQL> col value format a15
SQL> select name, value from v$parameter where name = 'db_block_size';
NAME            VALUE
--------------- ---------------
db_block_size   8192

Agora, o momento esperado, o SELECT para realizar a operação de resize, veja.

SQL> l
  1  select 'alter database datafile ''' || file_name || ''' resize ' ||
  2        ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 )  || 'm;' cmd
  3  from dba_data_files a,
  4      ( select file_id, max(block_id+blocks-1) hwm
  5          from dba_extents
  6         group by file_id ) b
  7  where a.file_id = b.file_id(+)
  8   and ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) < ceil( blocks*8192/1024/1024)
  9*  and ceil( (nvl(hwm,1)*8192*1.2)/1024/1024 ) > 100

Lembrete

Veja que onde está 8192 no script acima, é referente ao tamanho do db_block_size do seu banco de dados, esse valor então poder ser  2048, 4096, 8192, 16384 e 32768.

O script acima irá gerar um resultado sobre espaço livre, tamanho atual, espaço que pode ser salvo, total de espaço que pode ser liberado por datafile do seu banco de dados, tudo isso gerado pelos cálculos sobre a marca d’água de cada datafile. Se atentem pois ele está pegando todas as tablespaces do banco de dados e isso para nós não é necessário, podemos excluir a tablespace SYSTEM e SYSAUX.

FILE_NAME                                                      SMALLEST   CURRSIZE    SAVINGS SMALLEST_SAFE SAVINGS_SAFE
------------------------------------------------------------ ---------- ---------- ---------- ------------- ------------
/u02/app/oracle/oradata/finp/fin_corp01.dbf                         125       2000       1875        149            1851
/u02/app/oracle/oradata/finp/sysaux01.dbf                           191       2000       1809        229            1771
/u02/app/oracle/oradata/finp/system01.dbf                           264       2000       1736        316            1684
/u02/app/oracle/oradata/finp/fin_corp02.dbf                         117       1500       1383        140            1360
/u01/app/oracle/oradata/finp/fin_cpag_idx04.DBF                     643       2000       1357        771            1229
/u01/app/oracle/oradata/finp/fin_cpag_idx03.dbf                     651       2000       1349        781            1219
/u01/app/oracle/oradata/finp/fin_cpag_idx02.dbf                     692       2000       1308        830            1170
/u01/app/oracle/oradata/finp/fin_cpag_idx01.dbf                     728       2000       1272        873            1127
/u01/app/oracle/oradata/finp/fin_corp_idx02.dbf                     847       2000       1153          1016          984
/u01/app/oracle/oradata/finp/fin_corp_idx01.dbf                     897       2000       1103          1076          924
/u02/app/oracle/oradata/finp/fin_crec09.dbf                        1284       2000        716          1540          460
/u02/app/oracle/oradata/finp/fin_crec08.dbf                        1288       2000        712          1545          455
/u02/app/oracle/oradata/finp/fin_crec07.dbf                        1304       2000        696          1564          436
/u02/app/oracle/oradata/finp/fin_crec06.dbf                        1314       2000        686          1576          424
/u02/app/oracle/oradata/finp/fin_crec05.dbf                        1331       2000        669          1597          403
/u02/app/oracle/oradata/finp/fin_crec04.dbf                        1334       2000        666          1600          400
/u02/app/oracle/oradata/finp/fin_crec01.dbf                        1351       2000        649          1622          378
/u02/app/oracle/oradata/finp/fin_crec02.dbf                        1351       2000        649          1621          379
/u02/app/oracle/oradata/finp/fin_crec03.dbf                        1351       2000        649          1621          379
/u02/app/oracle/oradata/finp/users01.dbf                            158        800        642        189             611
/u02/app/oracle/oradata/finp/fin_crec15.dbf                        1427       2000        573          1712          288
/u02/app/oracle/oradata/finp/fin_crec14.dbf                        1547       2000        453          1856          144
/u02/app/oracle/oradata/finp/fin_crec13.dbf                        1549       2000        451          1858          142
/u02/app/oracle/oradata/finp/fin_crec12.dbf                        1551       2000        449          1861          139
/u02/app/oracle/oradata/finp/fin_crec11.dbf                        1603       2000        397          1923           77
/u01/app/oracle/oradata/finp/fin_corp_idx03.dbf                     802       1000        198        962              38
26 linhas selecionadas.
CMD
--------------------------------------------------------------------------------------------------------------------------
alter database datafile '/u02/app/oracle/oradata/finp/system01.dbf' resize 316m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec11.dbf' resize 1923m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec02.dbf' resize 1621m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec07.dbf' resize 1564m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_corp02.dbf' resize 140m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec05.dbf' resize 1597m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec06.dbf' resize 1576m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec03.dbf' resize 1621m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec08.dbf' resize 1545m;
alter database datafile '/u01/app/oracle/oradata/finp/fin_corp_idx01.dbf' resize 1076m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec01.dbf' resize 1622m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec09.dbf' resize 1540m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec12.dbf' resize 1861m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec14.dbf' resize 1856m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec15.dbf' resize 1712m;
alter database datafile '/u01/app/oracle/oradata/finp/fin_cpag_idx01.dbf' resize 873m;
alter database datafile '/u01/app/oracle/oradata/finp/fin_cpag_idx04.DBF' resize 771m;
alter database datafile '/u02/app/oracle/oradata/finp/sysaux01.dbf' resize 229m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec13.dbf' resize 1858m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_crec04.dbf' resize 1600m;
alter database datafile '/u01/app/oracle/oradata/finp/fin_cpag_idx02.dbf' resize 830m;
alter database datafile '/u02/app/oracle/oradata/finp/fin_corp01.dbf' resize 149m;
alter database datafile '/u02/app/oracle/oradata/finp/users01.dbf' resize 189m;
alter database datafile '/u01/app/oracle/oradata/finp/fin_corp_idx02.dbf' resize 1016m;
alter database datafile '/u01/app/oracle/oradata/finp/fin_corp_idx03.dbf' resize 962m;
alter database datafile '/u01/app/oracle/oradata/finp/fin_cpag_idx03.dbf' resize 781m;
26 linhas selecionadas.

Uma coisa boa que essse script já fornece o comando de DDL para redimensionar o datafile da tablespace sem a perda de dados. Basta executar.

Após a execução dos scripts, vamos analisar os resultados gerados. Primeiramente, vamos ver agora o tamanho total e o espaço livre das tablespaces, depois verificar como ficou o espaço em disco no sistema operacional e saber o quanto ganhamos com isso.

Espaço total das tablespace

SQL> l
  1  select tablespace_name, sum(bytes)/1024/1024 as "TAMANHO(MB)"
  2  from dba_data_files
  3  group by tablespace_name
  4* order by sum(bytes)
SQL> /
TABLESPACE_NAME      TAMANHO(MB)
-------------------- -----------
USERS                        189
FIN_CORP                     289
FIN_CPAG                     400
FIN_CEXT_IDX                 800
TOOLS                       1500
SYSAUX                      2000
SYSTEM                      2000
FIN_CORP_IDX                3054
FIN_CPAG_IDX                3255
UNDOTBS                    10000
FIN_CREC_IDX               12000
FIN_CREC                   25496
12 linhas selecionadas.

Espaço livre nas tablespace

SQL> l
  1  select tablespace_name, sum(bytes)/1024/1024 as "TAMANHO(MB)"
  2  from dba_free_space
  3  group by tablespace_name
  4* order by sum(bytes)
SQL> /
TABLESPACE_NAME      TAMANHO(MB)
-------------------- -----------
FIN_CREC_IDX              2,1875
USERS                    31,5625
FIN_CORP                 48,6875
FIN_CPAG                398,5625
FIN_CORP_IDX            510,4375
FIN_CPAG_IDX             544,375
FIN_CEXT_IDX            799,5625
TOOLS                  1495,3125
SYSTEM                 1737,3125
SYSAUX                    1811,5
FIN_CREC                4121,125
UNDOTBS                9797,4375
12 linhas selecionadas.

Espaço no sistema operacional

[oracle@pelspos18 u01]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             9.9G  3.2G  6.3G  34% /
/dev/sda1             190M   13M  168M   8% /boot
none                  2.0G     0  2.0G   0% /dev/shm
/dev/sda5             2.0G   36M  1.9G   2% /tmp
/dev/sda6             114G   45G   64G  42% /u01
/dev/sdb1             134G   42G   86G  33% /u02

Conclusões

Perceba que algumas tablespace permaneceram do mesmo tamanho e algumas tiveram mais que 10% do seu tamanho reduzido, o melhor que podemos notar no sistema operacional que o FileSystem /u02 que antes tinha 78GB disponível, agora tem 86GB, uma diferença de 8GB, para o FileSystem /u01 que atens tinha 58GB disponível, agora tem 64GB, uma diferença de 6GB, que somando com o valor anterior, podemos reutilizar 14GB de espaço no sistema operacional.

O tamanho do nosso banco de dados fisicamente, também diminuiu, foi para 62GB. Antes era de 76GB, 14GB a menos, justamente o que nós não utilizamos mais.

O que pode nos ajudar a redução física do banco de dados?

Pode nos ajudar em N tarefas, como:

  • Não deixar o banco de dados travar por problemas de ARCHIVE ERROR;
  • Reaproveitamente de espaço em disco;
  • Diminuição de arquivos de backup gerados pelo RMAN em nível 0;
  • Ajuda na escabilidade do servidor;

Acho que isso já são boas razões para se pensar em fazer uma diminuição física do seu banco de dados.

Abraços,

 Rodrigo Almeida

 

Treinamento DBA ATG R12

setembro 21st, 2008 por Rodrigo Almeida

Olá,

Uma das profissões mais cobiçadas no mercado Oracle, é o DBA ATG, onde o profissional é preparado para trabalhar com o banco de dados, Application Server e o ERP E-Bussiness Suite, todas da própria Oracle Corporation.

Nesse post, vou dar uma dica de centro de treinamento para se tornar um profissional DBA ATG, que é uma grande promessa, abaixo segue as informações sobre o centro, o curso e seu contéudo.

Centro de Treinamento

O curso é realizado pela Capitani (www.capitani.com.br), um centro de treinamento oficial da Oracle University, localizado na Avenida Fagundes Filho, 252, perto do metrô São judas, permitindo fácil locomoção aos profissionais.

Curso

Este curso fornece noções básicas sobre a arquitetura, o banco de dados e o sistema de arquivos utilizados nos Aplicativos Oracle Release 12. Conceito de arquitetura multicamadas, utilizada para fornecer acesso aos usuários conectados à Internet ou intranet, e o relacionamento entre os Aplicativos Oracle e o banco de dados Oracle.

A estrutura do sistema de arquivos utilizada para armazenar os arquivos de produto, arquivos de ambiente e arquivos adicionais dos Aplicativos Oracle necessários para suportar vários idiomas na Release 12. Além disso, usar o recurso Rapid Install para executar instalações em um ou em vários nós, o recurso AD Administration e outros utilitários do AD, para fazer a manutenção dos Aplicativos Oracle, o AutoPatch para automatizar a implementação de patches para os Aplicativos Oracle, e o Rapid Clone para clonar um sistema de Aplicativos Oracle

Custo

O custo do curso sai em torno de R$ 4.000, com duração de 40 Horas.

Contato

Quem desejar mais informações sobre o curso de DBA ATG, poderá entrar em contato com:

Larissa Godoy | 11 3542-3552

E muito bem! Boa sorte nos estudos. o DBA ATG será uma grande tendência no mercado, ainda mais se grandes empresas continuarem a colocar o ERP da Oracle em seus estabelecimentos. Uma coisa que me levou a compartilhar essa informação, que atualmente, existe muita pouca informação sobre ATG e principalmente, centros de treinamento que fornece esse tipo de curso. Por isso que segue a dica.

Abraços,

 Rodrigo Almeida

Usuários padrões do Oracle Database

setembro 14th, 2008 por Rodrigo Almeida

Olá,

Uma das grandes dúvidas que muitos iniciantes tem quando quando começa a trabalhar com Oracle, é saber qual a função de cada usuário padrão do Oracle Server e também como se proteger deles.

Muitos DBAs, não deixam a conta de usuários padrões travada “Locked”, com isso, qualquer outro que conheça um usuário padrão e saiba a senha dele inicial, poderá acessar seu banco de dados com privilégios de DBA e fazer o que bem entender no banco de dados. E isso é ruim para nós.

Abaixo, vou mostrar uma lista com esses usuários, sua função e sua senha padrão.

Username : CTXSYS

Password : CTXSYS

Descrição : Usuário proprietário do produto Oracle Text.

Username : SYS

Password : change_on_install

Descrição : Usuário utilizado para realizar todas as tarefas de administração do banco de dados e proprietário do dicionário do banco de dados.

Username : SYSTEM

Password : manager

Descrição : Usuário de administração do banco de dados. Funciona como se fosse um gerente.

Username : SYSMAN

Password : change_on_install

Descrição : Usuário administrativo para realizar as tarefas pelo Oracle Enterprise Manager

Username : SI_INFORMTN_SCHEMA

Password : si_informtn_schema

Descrição : Essa conta armazena informações das views do SQL/MM, utilizado pelo Oracle InterMedia.

Username : OUTLN

Password : outln

Descrição : Utilizado para o recurso de OUTLINE VIEW, ou seja, o Oracle permite que você armazena informações de plano de execução para suas instruções SQL, esse owner que é o responsável por armazenar essas informações.

Username : ORDSYS

Password : ordsys

Descrição : Usuário administrativo do Oracle InterMedia.

Username : ORDPLUGINS

Password : ordplugins

Descrição : Usuário para os plugins de outras aplicações que utiliza o InterMedia.

Username : OLAPSYS

Password : manager

Descrição : Usuário utilizado para criar a estrutura do metadata OLAP.

Username : DMSYS

Password : dmsys

Descrição : Usuário administrativo do Data Mining.

Username : MDSYS

Password : mdsys

Descrição : Usuário administrativo para Oracle Spatial e Locator do InterMedia.

Username : MDDATA

Password : mddata

Descrição : Usuário utilizado pelo Oracle Spatial para armazenar dados do Geocoder e rotas.

Username : DBSNMP

Password : dbsnmp

Descrição : Usuário utilizado pelo Agent Management do Oracle Enterprise Manager e gerenciar o banco de dados.

Agora que você conhece os principais owners que estão presentes na instalação do Oracle Database, cabe a você bloquear os usuários que não utiliza para aumentar a segurança do banco de dados, por exemplo, tenho um banco de dados que trabalhar somente com os componentes padrão do PL/SQL e SQL. Então, em minha base não é necessário eu ter owners como CTXSYS, DBSNMP, MDDATA, MDSYS, OLAPSYS, ORDPLUGINS, então eu posso bloquear sem problemas, pois meu banco de dados não utiliza tais produtos como Data Mining, OLAP, Spatial e InterMedia.

De onde vêm muitos desses usuários?

Caso, você tenha feito a instalação de um banco de dados pelo DBCA (DataBase Create Assistent), e escolheu pela instalação padrão (DEFAULT - ou NEXT, NEXT e FINISH), ele irá instalar esses usuários, principalmente se está instalando a versão Enterprise.

Se escolher a opção INSTALL ADVANCED, terá a oportunidade de escolher quais produtos serão instalados no seu banco de dados e esses usuários não serão criados.

Bom, agora basta a você conhecer mais um pouco sobre esses usuários e proteger seu banco de dados já que eles podem se tornar um acesso fácil a usuários “mal-educados” que tem em qualquer empresa.

Abraços,

 Rodrigo Almeida

FRM-10256 - E lá vai o DBA

setembro 12th, 2008 por Rodrigo Almeida

Olá,

Recentemente, estou participando de uma migração de um banco de dados, Oracle 8i para Oracle 10g, da plataforma 32-bits para 64-bits e uma aplicação Forms/Reports 6i (Oracle Developer 6i), e se deparamos com um problema de Security após a criação e importação dos owners para o novo banco de dados.

Quando mandei o desenvolvedor conectar a aplicação no novo banco de dados, para fins de testes, conectividade e possíveis problemas do 10g (Pois é uma migração do 8i, e a aplicação está toda em REGRA), o Forms nos emitia um erro estranho, como mostra abaixo:

FRM-10256: User is not authorized to run Form Builder Menu.

Logo de início, pensei que poderia ser problemas no owner da aplicação (no banco de dados), ou o menu da aplicação, que utiliza outro owner para validar e construir o menu. Fiz todos os checks necessários, como:

  • Analisar o “STATUS ACCOUNT” de todos os owners no banco de dados, que pode ser feito pela view dba_users
  • Olhar qual perfil de banco de dados os owners estão usando, todos estavam com DEFAULT para início.
  • Analisar com a base de produção, objetos inválidos, views e qualquer outro objeto que tenha relação com a construção dos menus, e também nada.

Então, resolvi junto com o desenvolvedor, pesquisar sobre o assunto e esse erro específico, e encontramos a seguinte solução pelo Metalink.

Visão Geral

A segurança do Oracle Forms é baseada em roles (papéis) no banco de dados Oracle. Essas roles são um método de permitir o acesso as informações do banco de dados para os usuários, portanto, se nenhum usuário não tem acesso a qualquer coisa, essas roles podem ajudar a facilitar o acesso.

Desde que os usuários tenham essas roles definidas pelo DBA ou Administrador de aplicação, os módulos de MENU e ITENS DO MENU terão um controle de acesso feito internamento pelo menu da aplicação.

Solução

Para resolver esse problema, o DBA, conectado no banco de dados com o usuário SYS, deve executar um script de segurança que vêm junto com o Developer 6i, que é o script abaixo:

Para ambiente Windows

%ORACLE_HOME%\tools\dbtab\forms60\frm60sec.sql

Para ambiente Linux\Unix

$ORACLE_HOME/forms60/admin/sql/frm60sec.sql

Esse script é pertecente ao ORACLE_HOME do Developer 6i, não confunda com o ORACLE_HOME do banco de dados. Execute ele com o usuário SYS e seus problemas vão terminar.

Abaixo, segue o contéudo do script, caso, estejam com esse problema e não conseguem acessar o servidor de aplicação por motivo de segurança da empresa ou qualquer outro motivo.

FRM60sec.sql

create or replace view FRM50_ENABLED_ROLES as
select urp.granted_role role,
sum(distinct decode(rrp.granted_role,
'ORAFORMS$OSC',2,
'ORAFORMS$BGM',4,
'ORAFORMS$DBG',1,0)) flag
from sys.user_role_privs urp, role_role_privs rrp
where urp.granted_role = rrp.role (+)
and urp.granted_role not like 'ORAFORMS$%'
group by urp.granted_role;

create public synonym FRM50_ENABLED_ROLES for system.FRM50_ENABLED_ROLES;

create role ORAFORMS$OSC;
create role ORAFORMS$DBG;
create role ORAFORMS$BGM;

PRONTO! Acho que agora vai resolver a vida, caso tenha problemas, dê os grants de SELECT do SYNONYM para os usuários que precisa acessar a aplicação.

Abraços,

Rodrigo Almeida