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 !