Para melhor visualização, recomendo resolução de no mínimo 1024 x 768 e navegador Mozilla Firefox


sábado, 4 de dezembro de 2010

DBNEWID - Alterando o nome de um banco de dados Oracle

Por Eduardo Legatti

Olá,

Neste artigo irei mostrar como alterar de forma simples e prática o nome de um banco de dados sem a necessidade de ter que recriar o arquivos de controle (control files). O utilitário nid (DBNEWID) disponível à partir do Oracle 9i fará este trabalho para nós. Imagine que temos um banco de dados chamado BD01 e que queremos alterar o seu nome para BD02. Vale a pena salientar que alterar também o DBID de um banco de dados pode vir a ser necessário quando precisamos registrá-lo em um catálogo de recuperação do RMAN no caso em que o banco de dados em questão tenha sido clonado de um banco de dados existente que já fora registrado no catálogo de recuperação. Portanto, não se pode ter dois bancos de dados com o mesmo DBID no catálogo de recuperação do RMAN.

Abaixo estão alguns dos parâmetros que poderemos utilizar com o utilitário nid (DBNEWID).

[oracle@localhost]$ nid

DBNEWID: Release 10.2.0.5.0 - Production on Sáb Dez 4 15:50:57 2010

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Palavra-Chave Descrição (Default)
-----------------------------------------------------------
TARGET Nome do Usuário/Senha (NENHUM)
DBNAME Novo nome do banco de dados (NENHUM)
LOGFILE Log de Saída (NENHUM)
REVERT Reverter alteração com falha NÃO
SETNAME Define um novo nome de banco de dados NÃO
APPEND Acrescenta ao log de saída NÃO
HELP Exibe essas mensagens NÃO

No mais, temos três formas de usar o utilitário DBNEWID com propósitos diferentes para o cenário que irei apresentar. Vamos supor que o nome atual do meu banco de dados seja BD01 e que eu queira alterar o nome para BD02:

-- Alterar apenas o DBID do banco de dados BD01 (sem alterar o nome do banco de dados)
nid TARGET=sys/password@BD01

-- Alterar apenas o nome do banco de dados de BD01 para BD02 (sem alterar o DBID)
-- A cláusula SETNAME abaixo é utilizada para indicar que queremos somente alterar

-- o nome do banco de dados.

nid TARGET=sys/password@BD01 DBNAME=BD02 SETNAME=YES

-- Alterar o DBID e também o nome do banco de dados de BD01 para BD02
nid TARGET=sys/password@BD01 DBNAME=BD02

Vamos então a um exemplo prático onde irei alterar não só o DBID, como também o nome do banco de dados de BD01 para BD02 em um ambiente Linux. Em todos os casos, é necessário que o banco de dados esteja no estado MOUNT e que após a finalização do processo, o banco de dados deverá ser aberto com a opção RESETLOGS.

[oracle@localhost]$ export ORACLE_SID=BD01
[oracle@localhost]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Sáb Dez 4 16:00:37 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Conectado a uma instância inativa.

SQL> startup mount
Instância ORACLE iniciada.

Total System Global Area 364904448 bytes
Fixed Size 2020832 bytes
Variable Size 117443104 bytes
Database Buffers 243269632 bytes
Redo Buffers 2170880 bytes
Banco de dados montado.
SQL> exit
Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.5.0
With the Partitioning, OLAP and Data Mining options

[oracle@localhost]$ nid TARGET=/ DBNAME=BD02

DBNEWID: Release 10.2.0.5.0 - Production on Sáb Dez 4 16:02:13 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Conectado ao banco de dados BD01 (DBID=1078369007)

Conectado ao servidor versão 10.2.0

Arquivos de Controle no banco de dados:
/u01/app/oracle/oradata/BD01/control01.ctl
/u01/app/oracle/oradata/BD01/control02.ctl
/u01/app/oracle/oradata/BD01/control03.ctl

Alterar o ID do banco de dados e o nome do banco de dados BD01 para BD02? (S/[N]) => y

Continuando com a operação
Alterando ID do banco de dados de 1078369007 para 3201047653
Alterando nome do banco de dados de BD01 para BD02
Arquivo de Controle /u01/app/oracle/oradata/BD01/control01.ctl - modificado
Arquivo de Controle /u01/app/oracle/oradata/BD01/control02.ctl - modificado
Arquivo de Controle /u01/app/oracle/oradata/BD01/control03.ctl - modificado
Arquivo de dados /u01/app/oracle/oradata/BD01/system01.dbf - dbid alterado, escreveu novo nome
Arquivo de dados /u01/app/oracle/oradata/BD01/undotbs01.dbf - dbid alterado, escreveu novo nome
Arquivo de dados /u01/app/oracle/oradata/BD01/sysaux01.dbf - dbid alterado, escreveu novo nome
Arquivo de dados /u01/app/oracle/oradata/BD01/users01.dbf - dbid alterado, escreveu novo nome
Arquivo de dados /u01/app/oracle/oradata/BD01/temp01.dbf - dbid alterado, escreveu novo nome
Arquivo de Controle /u01/app/oracle/oradata/BD01/control01.ctl - dbid alterado, escreveu novo nome
Arquivo de Controle /u01/app/oracle/oradata/BD01/control02.ctl - dbid alterado, escreveu novo nome
Arquivo de Controle /u01/app/oracle/oradata/BD01/control03.ctl - dbid alterado, escreveu novo nome
Instância desativada

Nome do banco de dados alterado para BD02.
Modifique o arquivo de parâmetros e gere um novo arquivo de senha antes de reiniciar.
ID do Banco de Dados BD02 alterado para 3201047653.
Todos os backups anteriores e redo logs arquivados para este banco de dados não podem ser utilizados.
O banco de dados não conhece backups anteriores e logs de arquivamento na Área de Recuperação.
Banco de dados foi desativado; abra o banco de dados com a opção RESETLOGS.
ID e nome do banco de dados alterados com sucesso.
DBNEWID - Concluído com sucesso.

Após a utilização do utilitário DBNEWID, irei alterar o nome do arquivo de inicialização spfile, subir a instância BD02 no estado NOMOUNT e alterar o parâmetro de inicialização "db_name" para BD02.

[oracle@localhost]$ cd $ORACLE_HOME/dbs
[oracle@localhost dbs]$ mv spfileBD01.ora spfileBD02.ora
[oracle@localhost dbs]$ export ORACLE_SID=BD02
[oracle@localhost dbs]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Sáb Dez 4 16:15:47 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Conectado a uma instância inativa.

SQL> startup nomount
Instância ORACLE iniciada.

Total System Global Area 364904448 bytes
Fixed Size 2020832 bytes
Variable Size 109054496 bytes
Database Buffers 251658240 bytes
Redo Buffers 2170880 bytes

SQL> alter system set db_name=BD02 scope=spfile;

Sistema alterado.

SQL> shutdown immediate
ORA-01507: banco de dados não montado

Instância ORACLE desativada.
SQL> exit
Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.5.0
With the Partitioning, OLAP and Data Mining options

Para finalizar irei remover todos os arquivos que referenciavam o banco de dados BD01, criar um novo arquivo de senha, subir a instância no estado MOUNT e abrir o banco de dados com a opção RESETLOGS.

[oracle@localhost dbs]$ orapwd file=orapwBD02 password=senha entries=10
[oracle@localhost dbs]$ rm *BD01*
[oracle@localhost dbs]$ ls -l *BD02*
-rw-rw---- 1 oracle oinstall 1552 Dez 4 16:15 hc_BD02.dat
-rw-r----- 1 oracle oinstall 2560 Dez 4 16:17 orapwBD02
-rw-r----- 1 oracle oinstall 3584 Dez 4 16:16 spfileBD02.ora

[oracle@localhost dbs]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Sáb Dez 4 16:28:27 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Conectado a uma instância inativa.

SQL> startup mount
Instância ORACLE iniciada.

Total System Global Area 364904448 bytes
Fixed Size 2020832 bytes
Variable Size 109054496 bytes
Database Buffers 251658240 bytes
Redo Buffers 2170880 bytes
Banco de dados montado.

SQL> alter database open resetlogs;

Banco de dados alterado.

SQL> select name,open_mode from v$database;

NAME OPEN_MODE
--------- ----------
BD02 READ WRITE

SQL> select instance_name,status from v$instance;

INSTANCE_NAME STATUS
---------------- ------------
BD02 OPEN

Google+

6 comentários:

David Ricardo disse...

Grande Legatti,

Bom, nem vou me prolongar muito nos elogios.

Gostei demais do artigo , é uma ferramenta extremamente Util para quem precisa executar esta tarefa, ha outros modos de faze-lo também, porém ao meu ver essa utilização é providencial. Parabens pela excelente didatica e pelo artigo.

Abraços!!!1
Sucesso!!!

Thiago disse...

Opah... Parabéns Legatti,

Precisei um dia alterar, e imagine eu alterando procurando pela palavra TESTEDB para TESTEDB2 hehe..

Muito bom!! parabéns.!!

Blog do emerson disse...

Massa.
Funciona pra o XE?

Eduardo Legatti disse...

Olá Emerson,

Nunca testei tal procedimento no Oracle XE, mas acredito que funcione em parte. Você poderá ter alguns problemas com o APEX, porque o nome "XE" deve estar internamente atrelado a arquivos de configuração, etc...
No mais, acredito que alguém já deva ter publicado algum tutorial para fazer isso funcioar 100% ;-).

Abraços e até mais.

Anônimo disse...

Olá, o procedimento foi perfeito. Mas gostaria de saber como fica o caminho físico dos arquivos, os mes ficaram no mesmo caminho do database original, por exemplo. Meu database original prod mudei pra hom. os datafiles continuam em /oracle/oradata/prod mas funcionando com a instância hom. Pode esclarecer se posso mudar o caminho??

Obrigada Jessica

Eduardo Legatti disse...

Olá Jessica,

O utilitário DBNEWID não faz qualquer alteração no caminho dos arquivos de banco de dados. O caminho original dos arquivos de banco de dados (data files, control files, redo log files) ficam intactos. Caso você queira mover os arquivos de banco de dados de "/oracle/oradata/prod" para "/oracle/oradata/hom", você terá que criar o diretório "hom" em "/oracle/oradata", e mover os arquivos manualmente. Lembre-se que esta tarefa envolve a execução de alguns procedimentos no banco de dados de forma a atualizar o spfile com a nova localização dos control files, além de atualizar os control files com a novas localizações dos data files e redo log files.

Abraços e até mais ...

Legatti

Postagens populares