Mostrando postagens com marcador Literatura. Mostrar todas as postagens
Mostrando postagens com marcador Literatura. Mostrar todas as postagens

segunda-feira, 22 de setembro de 2014

Escolhendo meu DBID

Para que a alteração de DBID seria útil?

Bom, pode ser pelo mero prazer de ter uma base com o DBID do seu gosto (1,2,3..24..666) ou pelo fato da licença da sua aplicação estar vinculada ao DBID do banco de modo que se ele for alterado a aplicação para de funcionar!

Antes de começar lembre-se que é de suma importância executar um backup FULL do database!

Verificando o dbid atual da base:

SQL> select dbid from v$database;
 
      DBID
----------
3464458105

Efetuando um shutdown limpo da base e na sequencia abrindo como READ ONLY:

SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup open read only;
ORACLE instance started.
 
Total System Global Area 1138368512 bytes
Fixed Size                  1364088 bytes
Variable Size             318771080 bytes
Database Buffers          788529152 bytes
Redo Buffers               29704192 bytes
Database mounted.
Database opened.

Agora basta executar o script abaixo que ele irá pedir o NOVO DBID da base e após você inserir ele irá fazer todo o trabalho. Baixe o script clicando AQUI.

SQL> set serveroutput on
SQL> declare
   v_chgdbid   binary_integer;
   v_chgdbname binary_integer;
   v_skipped   binary_integer;
   v_new_db_name varchar2(9);
   v_old_db_name varchar2(9);
   v_new_dbid    number;
   v_old_dbid    number;
   w_action      varchar2(255);


 begin
      w_action:='Recuperando DBID Atual.' ;
      select dbid, name, name into v_old_dbid, v_new_db_name, v_old_db_name  from v$database;

      select TO_NUMBER('&NOVO_DBID') into v_new_dbid from dual;

      w_action:='Executando a Procedure (dbms_backup_restore.nidbegin).';
      dbms_output.put_line('New NAME='||V_NEW_DB_NAME);
      dbms_output.put_line('Old NAME='||V_OLD_DB_NAME);
      dbms_output.put_line('New DBID='||V_NEW_DBID);
      dbms_output.put_line('Old DBID='||V_OLD_DBID);

      dbms_backup_restore.nidbegin(V_NEW_DB_NAME,V_OLD_DB_NAME,V_NEW_DBID,V_OLD_DBID,0,0,10);

      w_action:='Executando a Procedure (dbms_backup_restore.nidprocesscf).';
      dbms_backup_restore.nidprocesscf( v_chgdbid,v_chgdbname);

      dbms_output.put_line('ControlFile.......: ');
      dbms_output.put_line('  => Change Name..: '  ||to_char(v_chgdbname));
      dbms_output.put_line('  => Change DBID..: '  ||to_char(v_chgdbid));

      w_action := 'Alterando os Datafiles, procedure (dbms_backup_restore.nidprocessdf).';
      for i in (select file#,name from v$datafile)
      loop
         dbms_output.put_line('DataFile..........: '  ||i.name);
         dbms_output.put_line('  => Skipped......: '  ||to_char(v_skipped));
         dbms_output.put_line('  => Change Name..: '  ||to_char(v_chgdbname));
         dbms_output.put_line('  => Change DBID..: '  ||to_char(v_chgdbid));
         dbms_backup_restore.nidprocessdf(i.file#,0, v_skipped,v_chgdbid,v_chgdbname);
      end loop;

      w_action := 'Alterando os Tempfiles, procedure (dbms_backup_restore.nidprocessdf).';
      for i in (select file#,name from v$tempfile)
      loop
         dbms_output.put_line('TempFile..........: '  ||i.name);
         dbms_output.put_line('  => Skipped......: '  ||to_char(v_skipped));
         dbms_output.put_line('  => Change Name..: '  ||to_char(v_chgdbname));
         dbms_output.put_line('  => Change DBID..: '  ||to_char(v_chgdbid));
         dbms_backup_restore.nidprocessdf(i.file#,1,v_skipped,v_chgdbid,v_chgdbname);
      end loop;
   dbms_backup_restore.nidend;
 end;
 /
Enter value for novo_dbid: 1
old  16:      select TO_NUMBER('&NOVO_DBID') into v_new_dbid from dual;
new  16:      select TO_NUMBER('1') into v_new_dbid from dual;
New NAME=DBTRN
Old NAME=DBTRN
New DBID=1
Old DBID=3464458105
ControlFile.......:
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd02/oradata/dbtrn/system01.dbf
=> Skipped......:
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd02/oradata/dbtrn/sysaux01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd02/oradata/dbtrn/users01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd02/oradata/dbtrn/veys01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd02/oradata/dbtrn/FAROL01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd02/oradata/dbtrn/teste01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd02/oradata/dbtrn/teste02.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd03/oradata/dbtrn/system02.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /oraprd03/oradata/dbtrn/undotbs01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
TempFile..........: /oraprd02/oradata/dbtrn/temp01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
 
PL/SQL procedure successfully completed.

Terminado a execução do script podemos ver que todos os arquivos tiveram o DBID alterado para 1 e que nenhum foi pulado (SKIPPED). Efetuando novamente um shutdown e abrindo a base com OPEN RESETLOGS pois alteramos o controlfile!

SQL> startup mount
ORACLE instance started.
 
Total System Global Area 1138368512 bytes
Fixed Size                  1364088 bytes
Variable Size             318771080 bytes
Database Buffers          788529152 bytes
Redo Buffers               29704192 bytes
Database mounted.
SQL> alter database open resetlogs;
 
Database altered.

Verificando o novo DBID do banco de dados:

SQL> select dbid from v$database;
 
      DBID
----------
         1

No script também existe a variavel v_new_db_name que lhe mertite alterar junto com o DBID o DBNAME da base, basta ajustá-lo e voilá! tudo de uma só vez.

Referências:
Mais informações →

terça-feira, 25 de setembro de 2012

Monitorando operações de uma tabela atraves da DBA_TAB_MODIFICATIONS

Alguns dias atrás estava precisando monitorar uma tabela da aplicação do cliente para registrar a quantidade de operações DML que ela estava sofrendo.

Após algumas buscas encontrei a tabela do Oracle DBA_TAB_MODIFICATIONS que conforme documentação registra as modificações sofridas nas tabelas do banco de dados após a ultima coleta de estatisticas, ou seja, a cada nova coleta de estatistica sobre a tabela seus registros na DBA_TAB_MODIFICATIONS são descartados(zerados!).


SQL> desc DBA_TAB_MODIFICATIONS
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 TABLE_OWNER                                        VARCHAR2(30)
 TABLE_NAME                                         VARCHAR2(30)
 PARTITION_NAME                                     VARCHAR2(30)
 SUBPARTITION_NAME                                  VARCHAR2(30)
 INSERTS                                            NUMBER
 UPDATES                                            NUMBER
 DELETES                                            NUMBER
 TIMESTAMP                                          DATE
 TRUNCATED                                          VARCHAR2(3)
 DROP_SEGMENTS                                      NUMBER

De qualquer forma, minha necessidade era identificar as operações DML sofridas na tabela X no período de 1 hora. Como o Oracle não atualiza estas informações constantemente, podemos utilizar a procedure FLUSH_DATABASE_MONITORING para baixar as informações de monitoramento da memória para as tabelas de dicionário (*_TAB_MODIFICATIONS, *_TAB_STATISTICS e *_IND_STATISTICS).

SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
 
Procedimento PL/SQL concluido com sucesso.
 
SQL> select to_char(TIMESTAMP,'dd/mm/yyyy hh24:mi') HORARIO, UPDATES from DBA_TAB_MODIFICATIONS where TABLE_OWNER='PRODUCAO' and TABLE_NAME='X';
 
HORARIO             UPDATES
---------------- ----------
24/09/2012 10:00     127014

Observem que realizei um flush para atualizar as informações e posteriormente obter a quantidade de UPDATES realizados até o momento. Depois de 1 hora realizei o mesmo procedimento, logo, 318558 – 127014 = 191.544 UPDATES registrados!

SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
 
Procedimento PL/SQL concluido com sucesso.
 
HORARIO             UPDATES
---------------- ----------
24/09/2012 11:00     318558

Vamos fazer alguns testes para melhor evidenciar o monitoramento registrado pelo Oracle na DBA_TAB_MODIFICATIONS:

SQL> create table teste.teste (cod number);
 
Tabela criada.
 
SQL> select to_char(TIMESTAMP,'dd/mm/yyyy hh24:mi') HORARIO, INSERTS, UPDATES, DELETES from dba_tab_modifications where TABLE_OWNER='TESTE' and TABLE_NAME='TESTE';
 
n?o ha linhas selecionadas

Observem que ainda não temos nada coletado para a tabela TESTE! Vamos então adicionar um registro:

SQL> insert into teste.teste values (1);
 
1 linha criada.
 
SQL> commit;
 
Commit concluido.
 
SQL> select to_char(TIMESTAMP,'dd/mm/yyyy hh24:mi') HORARIO, INSERTS, UPDATES, DELETES from dba_tab_modifications where TABLE_OWNER='TESTE' and TABLE_NAME='TESTE';
 
n?o ha linhas selecionadas

Vamos baixar os registros de monitoramento da memória e realizar novamente a consulta:

SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
 
Procedimento PL/SQL concluido com sucesso.
 
SQL> select to_char(TIMESTAMP,'dd/mm/yyyy hh24:mi') HORARIO, INSERTS, UPDATES, DELETES from dba_tab_modifications where TABLE_OWNER='TESTE' and TABLE_NAME='TESTE';
 
HORARIO             INSERTS    UPDATES    DELETES
---------------- ---------- ---------- ----------
24/09/2012 12:02          1          0          0

Um teste com updates:

SQL> update teste.teste set cod=2 where cod=1;
 
1 linha atualizada.
 
SQL>  update teste.teste set cod=1 where cod=2;
 
1 linha atualizada.
 
SQL> commit;
 
Commit concluido.
 
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
 
Procedimento PL/SQL concluido com sucesso.
 
SQL> select to_char(TIMESTAMP,'dd/mm/yyyy hh24:mi') HORARIO, INSERTS, UPDATES, DELETES from dba_tab_modifications where TABLE_OWNER='TESTE' and TABLE_NAME='TESTE';
 
HORARIO             INSERTS    UPDATES    DELETES
---------------- ---------- ---------- ----------
24/09/2012 12:03          1          2          0
Agora se executarmos uma coleta de estatisticas na tabela, como já mencionado, todos os registros são zerados!

SQL> execute DBMS_STATS.GATHER_TABLE_STATS (ownname => 'TESTE',TABNAME =>'TESTE',estimate_percent => 100,method_opt => 'FOR ALL COLUMNS SIZE AUTO',degree => null,granularity => 'ALL', cascade => TRUE);
 
Procedimento PL/SQL concluido com sucesso.
 
SQL> select to_char(TIMESTAMP,'dd/mm/yyyy hh24:mi') HORARIO, INSERTS, UPDATES, DELETES from dba_tab_modifications where TABLE_OWNER='TESTE' and TABLE_NAME='TESTE';
 
n?o ha linhas selecionadas
Então fica a dica de como podemos monitorar algumas operações sobre uma tabela. Foi muito útil para mim e talvez seja para vocês!

OBS: Para a execução do DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO é necessário o privilégio de ANALYZE ANY 

Referências:

http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_4149.htm http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_stats.htm#i1036624
Mais informações →

sábado, 23 de junho de 2012

E-book Expert Oracle Database Architecture 2º Edição Gratuito

A empresa Red Gate esta disponibilizando gratuitamente mais um e-book para a comunidade Oracle, esta vez é o livro Expert Oracle Database Architecture 2º edição escrito por um dos maiores especialistas do mundo Oracle, Thomas Kyte.

O livro trata as versões 9i, 10g e 11g apresentando exemplos e conceitos bem detalhados de banco de dados, ideal para quem esta iniciando sua trajetória. A edição trata também as new features do Oracle 11g.


Mais informações →

domingo, 19 de fevereiro de 2012

Flashback Database 11gR2 – On & Off com instance OPEN

Hoje não veremos como utilizar o flashback database mais sim iremos compartilhar mais um conhecimento que muitos ainda não sabem, o flashback database é uma feature que surgiu na versão 10g e que acompanha as novas versões do Oracle, porém agora na versão 11gR2, diferentemente de seus antecessores que era necessário parar o banco para poder habilitar ou desabilitar o flashback, agora podemos realizar este procedimento com a base de dados aberta (OPEN). 

Mas para que isso é util? 

Imagine que você está prestes a realizar uma operação crítica no banco de dados e você quer ter a possibilidade de voltar atras caso ocorra problemas, simples, agora no 11gR2 podemos habilitar o flashback sem a necessidade de causar a indisponibilidade do banco de dados. 

Vejamos,

SQL> select * from v$version;
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
 
SQL> select log_mode,flashback_on from v$database;
 
LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   NO
 
SQL> select status from v$instance;
 
STATUS
------------
OPEN

Agora vamos habilitar e desabilitar o flashback database com a instance OPEN.

SQL> alter database flashback on;
 
Database altered.
 
SQL> select log_mode,flashback_on from v$database;
 
LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   YES
 
SQL> alter database flashback off;
 
Database altered.
 
SQL> select log_mode,flashback_on from v$database;
 
LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   NO
Mais informações →
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