GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Qual a diferença entre SID, DBNAME, DB_UNIQUE_NAME, INSTANCE_NAME e SERVICE_NAME?

Olá pessoal, hoje irei abordar uma tema simples, mas que vejo muita gente confundindo e não entendendo as diferenças dos parâmetros SID, DBNAME, DB_UNIQUE_NAME, INSTANCE_NAME e SERVICE_NAME. Primeiramente, vamos às definições:

SID: É o Site Identifier, ele é responsável por, a grosso modo, atrelar um nome único à uma SGA. É composto por SID+número Por exemplo, PRD (ambientes single instance) ou PRD1/PRD2/PRDn (para ambientes cluster)

DBNAME: É, de fato, o nome do database. Ele é o mesmo para todas as instancias em ambientes cluster

DB_UNIQUE_NAME: É o nome único do banco de dados, em resumo ele é usado para diferenciar banco de dados que usem Oracle Data Guard.

INSTANCE_NAME: Possui o mesmo valor que o SID, mas ele é um parâmetro do banco de dados, diferente do SID que é no nível do sistema operacional. O INSTANCE_NAME nada mais é do que a mescla do que está no nível do sistema operacional para o database.

SERVICE_NAMES: São os nomes dos services que a instancia aceita conexões pelo service em si.

Não, está parecendo groselha… Vamos à prática para entendermos de fato a diferença entre eles.

[oracle@liverpool ~ orcl12c]$echo $ORACLE_SID

orcl12c

SQL> show parameter instance_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      orcl12c

Ok, validamos que o SID possui o mesmo valor que o instance_name.

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      orcl12c

SQL> show parameter unique

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_unique_name                       string      orcl12c

O meu db_name e db_unique_name também possuem o mesmo valor do SID, isso ocorre pois esse database em questão é um single instance.

SQL> show parameter cluster_database

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cluster_database                     boolean     FALSE
cluster_database_instances           integer     1

Ok, vamos fazer um teste. Será que podemos ter um SID com um db_name diferente?

SQL> shut immediate;

Database closed.
Database dismounted.
ORACLE instance shut down.

[oracle@liverpool dbs orcl12c]$export ORACLE_SID=mynewsid
[oracle@liverpool dbs mynewsid]$s

SQL*Plus: Release 12.1.0.2.0 Production on Wed Jul 13 16:29:56 2016
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to an idle instance.

SQL> startup nomount
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/12.1.0.2/dbhome_1/dbs/initmynewsid.ora'

Opa, ele não encontrou nenhum pfile com o SID mynewsid, vamos resolver esse problema.

[oracle@liverpool dbs mynewsid]$cp initorcl12c.ora iniimynewsid.ora
[oracle@liverpool dbs mynewsid]$ls -ltr init*

-rwxrwxr-x. 1 oracle oinstall 2992 Feb  3  2012 init.ora
-rwxrwxr-x. 1 oracle oinstall 1193 Jan 20 23:29 initsetnew.ora
-rwxrwxr-x. 1 oracle oinstall 8410 Jul 13 16:28 initorcl12c.ora
-rwxr-xr-x. 1 oracle oinstall 8410 Jul 13 16:31 initmynewsid.ora

[oracle@liverpool dbs mynewsid]$s

SQL*Plus: Release 12.1.0.2.0 Production on Wed Jul 13 16:32:41 2016
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to an idle instance.

SQL> startup nomount
ORACLE instance started.

Total System Global Area  444596224 bytes
Fixed Size                  2925408 bytes
Variable Size             360713376 bytes
Database Buffers           75497472 bytes
Redo Buffers                5459968 bytes

Bom, ele iniciou a instancia, vamos ver quais valores ele está usando para os parâmetros utilizados.

SQL> show parameter name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      orcl12c
db_unique_name                       string      orcl12c
instance_name                        string      mynewsid
service_names                        string      orcl12c
O DB_NAME, DB_UNIQUE_NAME e SERVICE_NAMES continuam o mesmo.

SQL> alter database mount;

Database altered.

Ok, controlfile acessível.

SQL> alter database open;
Database altered.

Banco de dados aberto para read/write.

Beleza, podemos mudar o db_name?

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

SQL> startup mount
ORACLE instance started.

Total System Global Area  444596224 bytes
Fixed Size                  2925408 bytes
Variable Size             360713376 bytes
Database Buffers           75497472 bytes
Redo Buffers                5459968 bytes
Database mounted.

[oracle@liverpool dbs mynewsid]$ orapwd file=orapwmynewsid password=oracle entries=10 force=y ignorecase=n nosysdba=n 
[oracle@liverpool dbs mynewsid]$nid TARGET=sys/oracle@mynewsid dbname=newname

DBNEWID: Release 12.1.0.2.0 - Production on Wed Jul 13 16:54:53 2016
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
Connected to database ORCL12C (DBID=732044282)
Connected to server version 12.1.0

Control Files in database:
    /u01/app/oracle/oradata/orcl12c/control01.ctl
    /u01/app/oracle/fast_recovery_area/orcl12c/control02.ctl

Change database ID and database name ORCL12C to NEWNAME? (Y/[N]) => y
Proceeding with operation

Changing database ID from 732044282 to 2295274525
Changing database name from ORCL12C to NEWNAME
    Control File /u01/app/oracle/oradata/orcl12c/control01.ctl - modified
    Control File /u01/app/oracle/fast_recovery_area/orcl12c/control02.ctl - modified
    Datafile /u01/app/oracle/oradata/orcl12c/system01.db - dbid changed, wrote new name
    Datafile /u01/app/oracle/oradata/orcl12c/audit01.db - dbid changed, wrote new name
    Datafile /u01/app/oracle/oradata/orcl12c/sysaux01.db - dbid changed, wrote new name
    Datafile /u01/app/oracle/oradata/orcl12c/undotbs01.db - dbid changed, wrote new name
    Datafile /u01/app/oracle/oradata/orcl12c/indx01.db - dbid changed, wrote new name
    Datafile /u01/app/oracle/oradata/orcl12c/users01.db - dbid changed, wrote new name
    Datafile /u01/app/oracle/oradata/orcl12c/temp01.db - dbid changed, wrote new name
    Control File /u01/app/oracle/oradata/orcl12c/control01.ctl - dbid changed, wrote new name
    Control File /u01/app/oracle/fast_recovery_area/orcl12c/control02.ctl - dbid changed, wrote new name

    Instance shut down

Database name changed to NEWNAME.
Modify parameter file and generate a new password file before restarting.
Database ID for database NEWNAME changed to 2295274525.
All previous backups and archived redo logs for this database are unusable.
Database is not aware of previous backups and archived logs in Recovery Area.
Database has been shutdown, open database with RESETLOGS option.
Succesfully changed database name and ID.

DBNEWID - Completed succesfully.

Edite o dbanme no pfile criado anteriormente

[oracle@liverpool dbs mynewsid]$vi initmynewsid.ora
*.db_name='newname'

[oracle@liverpool dbs mynewsid]$s

SQL*Plus: Release 12.1.0.2.0 Production on Wed Jul 13 16:58:49 2016
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to an idle instance.

SQL> startup mount

ORACLE instance started.
Total System Global Area  444596224 bytes
Fixed Size                  2925408 bytes
Variable Size             360713376 bytes
Database Buffers           75497472 bytes
Redo Buffers                5459968 bytes

Database mounted.

SQL> alter database open resetlogs;
Database altered.

SQL> show parameter name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      newname
db_unique_name                       string      newname
instance_name                        string      mynewsid
service_names                        string      newname

Alterando pelo nid, o db_name agora é “newname” assim como o db_unique_name e o instance_name.

Ok, até agora já deu para entender que podemos ter um database name com um sid diferente.

E o db_unique_name e o service_names? Como eles ficam nessa história?

Vou mudar de servidor e vou usar outros dois que já possuem um Data Guard.

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      ORCLP
db_unique_name                       string      ORCLP
instance_name                        string      ORCLP

service_names                        string      ORCLP

SQL> select d.NAME, d.DATABASE_ROLE, d.DB_UNIQUE_NAME, i.instance_name, i.host_name from v$database d, v$instance i;

NAME      DATABASE_ROLE    DB_UNIQUE_NAME INSTANCE_NAME    HOST_NAME
--------- ---------------- -------------- ---------------- --------------------
ORCLP     PRIMARY          ORCLP          ORCLP            terra.localdomain

Tenho aqui uma instancia chamada ORCLP no servidor TERRA, até aqui nada fora do padrão. Vamos ver o como está o Data Guard no servidor LUA.

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      ORCLP
db_unique_name                       string      ORCLSTB
instance_name                        string      ORCLP
service_names                        string      ORCLSTB

SQL> select d.NAME, d.DATABASE_ROLE, d.DB_UNIQUE_NAME, i.instance_name, i.host_name from v$database d, v$instance i;

NAME      DATABASE_ROLE    DB_UNIQUE_NAME INSTANCE_NAME    HOST_NAME
--------- ---------------- -------------- ---------------- ---------------
ORCLP     PHYSICAL STANDBY ORCLSTB        ORCLP            lua.localdomain

Opa, aqui temos algo diferente no DB_UNIQUE_NAME.

Ao invés de ORCLP igual para todos os valores, o DB_UNIQUE_NAME está para ORCLSTB. Por que isso ocorre?

SQL> show parameter log_archive_config

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string      DG_CONFIG=(ORCLP, ORCLSTB, ORCLSTBL)

Se olharmos o valor do log_archive_config vemos que existem três DB_UNIQUE_NAMES, um para o ORCLP (meu PRIMARY), ORCLSTB (meu PHYSICAL STANDBY) e ORCLSTBL (meu LOGICAL STANDBY).

O log_archive_config é o parâmetro que diz quais databases fazem parte da configuração do Data Guard, nele é informado o DB_UNIQUE_NAME do database que faz parte do Data Guard, ou seja, o DB_UNIQUE_NAME é sempre diferente em ambientes que tenham um ou mais Data Guards pois todos os databases são iguais, o PHYSICAL e o LOGICAL nada mais são do que uma cópia do PRIMARY, isso faz com que o Oracle precisa de um identificador único par a diferencia-los, no caso o DB_UNIQUE_NAME.

Caso você não tenha fixado o conceito do Data Guard eu escrevi um artigo resumindo os principais conceitos dele aqui.

E o SERVICE_NAME? Como ele fica nessa história toda?

Ele é usado em ambientes cluster (Oracle RAC). O service_name é um parâmetro usado para controle de load balance, fail over e/ou em conjunto com o resource manager. Em suma, ele é um “alias” para a instância.

Nessa imagem temos um Cluster de quatro nós. Supondo que meu db_name seja PRD, minhas instancias serão PRD1, PRD2, PRD3 e PRD4. Algo que deve ser feito no Oracle RAC é o particionamento de serviços, no caso o service_name. Por exemplo, vamos supor que as instancias 1 e 2 seja o meu OLTP então eu posso criar um service name chamado PRODUCAO onde qualquer conexão usando esse service name irá apontar para o nó 1 ou o nó 2 ignorando o nó 3 e o 4 dependendo da configuração. O meu service name nos nós 1 e 2 apareceriam da seguinte forma, respectivamente:

SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      PRD1,PRODUCAO

SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      PRD2,PRODUCAO

O service_names sempre possui um ou mais valores, sendo o primeiro valor o próprio db_name.

Imaginado que no meu nó 3 e 4 executasse a malha batch poderíamos criar um service name como MALHA onde o valor do service_names seria:

SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      PRD3,MALHA

SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      PRD4,MALHA

Dessa forma o controle do load balance ocorre de verdade. Nos ambientes cluster você deve esquecer SIDs e usar SERVICE NAMES, se os seus usuários estão conectando ao Oracle RAC com SIDs no tnsnames deles de nada adianta pagar a licença do Oracle RAC, fique atento nisso, o service_name é uma configuração fundamental em ambientes cluster.

Espero ter ajudado, até logo !

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *