Skip to main content

Command Palette

Search for a command to run...

Escolhendo o DBID

Updated
5 min read
Escolhendo o DBID

Alguns ERP’s têm o seu licenciamento vinculado ao DBID do banco Oracle, até aí tudo bem, até o dia em que o banco precisa ser migrado. Se for via Data Guard, tranquilo, mas há meios de upgrade, por exemplo, que podem mudar o DBID, e depois da migração isso vira um “problema”, principalmente em ERP’s que têm dezenas de arquivos com esse número de DBID para vincular o licenciamento, então é melhor trocar o DBID. Não vou entrar no mérito se é certo ou não, mas às vezes é o que temos que fazer.

Recordo-me de que a primeira vez que vi esse procedimento foi há 12 anos no blog oraclehome.com.br, inclusive, se você está iniciando a carreira no Oracle, sugiro ler todos os artigos que têm lá. E nesse mesmo artigo fui encaminhado para um artigo da Pythian em 2009, ou seja, não espere encontrar uma nota aqui, isso aqui é literalmente pergaminho do Oracle rs.

Não faça isso em produção sem validar 500 vezes na sua base de homologação/testes.

Avisos dados, vamos lá.

Primeiro, você tem que colocar a sua base em estado MOUNT.

Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.5.0.24.07

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 FREEPDB1                       READ WRITE NO
SQL> select dbid from v$database ; 

      DBID
----------
1452480138

SQL> shut immediate ; 
Database closed.
Database dismounted.
ORACLE instance shut down.

O shutdown tem que ser immediate, não rode esse procedimento com shutdown abort.

Como podemos ver, o DBID até o momento é 1452480138.

Agora vamos iniciar o banco em MOUNT.

SQL> startup mount ; 
ORACLE instance started.

Total System Global Area 1603726640 bytes
Fixed Size                  5360944 bytes
Variable Size             436207616 bytes
Database Buffers         1157627904 bytes
Redo Buffers                4530176 bytes
Database mounted.
SQL> 
SQL> 
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       MOUNTED
         3 FREEPDB1                       MOUNTED

Pronto, startup feito em mount. Agora vamos para mágica.

O script abaixo que devemos executar:

set serveroutput on

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;
/

Ao executar, ele vai pedir para digitar o DBID que você quer setar:

Terminal rodando o script:

SQL> set serveroutput on

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;
/SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53  
Enter value for novo_dbid: 777777
old  15:      select TO_NUMBER('&NOVO_DBID') into v_new_dbid from dual;
new  15:      select TO_NUMBER('777777') into v_new_dbid from dual;
New NAME=FREE
Old NAME=FREE
New DBID=777777
Old DBID=1452480138
ControlFile.......:
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/system01.dbf
=> Skipped......:
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/pdbseed/system01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/sysaux01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/pdbseed/sysaux01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/users01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/pdbseed/undotbs01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/undotbs01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/FREEPDB1/system01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/FREEPDB1/sysaux01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/FREEPDB1/undotbs01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
DataFile..........: /opt/oracle/oradata/FREE/FREEPDB1/users01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
TempFile..........: /opt/oracle/oradata/FREE/temp01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
TempFile..........: /opt/oracle/oradata/FREE/pdbseed/temp01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1
TempFile..........: /opt/oracle/oradata/FREE/FREEPDB1/temp01.dbf
=> Skipped......: 0
=> Change Name..: 0
=> Change DBID..: 1

PL/SQL procedure successfully completed.

Após concluir, abra o banco com OPEN RESETLOGS.

SQL> alter database open resetlogs ; 

Database altered.

Status do banco:

SQL> alter database open resetlogs ; 

Database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 FREEPDB1                       READ WRITE NO
SQL> select dbid from v$database ; 

      DBID
----------
    777777

Pronto, agora o banco esta com o DBID de sua escolha.

Espero que este artigo possa te ajudar em migrações futuras. Qualquer coisa, só chamar no linkedin 🙂

PS: Em caso de DB produção, faça backup full imediatamente após a alteração.

Créditos:

Artigo no oraclehome.com.br escrito por Anderson Graf. (2014)

Artigo da Pythian (2009)

173 views