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


terça-feira, 21 de novembro de 2017

Otimização: Cursor Sharing, Histogramas, Cursores - PARTE 1

Por Eduardo Legatti

Olá,

O objetivo deste artigo é demonstrar através de um exemplo prático como um histograma pode ajudar o otimizador do Oracle a encontrar um plano de execução melhor para instruções SQL que acessam tabelas que possuem registros distribuídos de forma não uniforme (skewed distribution) em uma ou mais colunas. Algumas variáveis podem influenciar como o Oracle enxerga uma instrução SQL, tais como o valor atual do parâmetro cursor_sharing, Configurações de NLS da sessão, se a instrução SQL utiliza literal ou bind variables, além de o otimizador fazer uso do Adaptive Cursosr Sharing de forma a avaliar se existe um plano de execução melhor de acordo com os valores das bind variables utilizadas. Essas variações serão tratadas em artigos futuros. Abaixo foi criada uma tabela T1 com cerca de 17 milhões de registros. É possível notar que a coluna ID possui 3 valores distintos (1, 2 e 3) e que os mesmos estão distribuídos de forma não uniforme. Vale a pena salientar que a coluna ID está indexada. Irei coletar estatísticas da tabela T1 sem coletar histogramas para as colunas conforme abaixo.

SQL> select id,count(*) from t1 group by id order by 1;

        ID   COUNT(*)
---------- ----------
         1   16777216
         2     262144
         3         64

SQL> exec dbms_stats.gather_table_stats(
 2   ownname=>'SCOTT',
 3   tabname=>'T1',
 4   cascade => true,
 5   METHOD_OPT => 'for all columns size 1');

Procedimento PL/SQL concluído com sucesso.

Abaixo, podemos ver que o parâmetro cursor_sharing está configurado para EXACT (default) o que significa que somente instruções SQL com textos idênticos serão compartilhadas para reutilização.

SQL> show parameter cursor_sharing;

NAME                         TYPE          VALUE
--------------------------- ------------- ---------------------
cursor_sharing              string        EXACT

Após coletar estatísticas da tabela (sem histogramas), irei executar três consultas abaixo. Vale a pena salientar que as instruções se diferenciam textualmente pelo valor da coluna ID que é passada na cláusula WHERE, ou seja, elas não são idênticas.

SQL> select count(object_name) from t1 where id=1;

COUNT(OBJECT_NAME)
------------------
          16777216

SQL> select count(object_name) from t1 where id=2;

COUNT(OBJECT_NAME)
------------------
            262144

SQL> select count(object_name) from t1 where id=3;

COUNT(OBJECT_NAME)
------------------
                64

Consultando a view dinâmica de desempenho V$SQLAREA que mostra os PARENT CURSORS de todas as instruções SQL executadas, podemos ver que cada instrução SQL possui um SQL_ID/HASH_VALUE diferentes, exatamente porque os literais passados na cláusula WHERE na coluna ID são diferentes. Podemos ver também que a coluna VERSION_COUNT mostra o valor 1  o que significa que cada PARENT CURSOR criou apenas um CHILD CURSOR para cada consulta. É importante lembrar que cada PARENT CURSOR (V$SQLAREA) deverá sempre ter no mínimo 1 CHILD CURSOR (V$SQL).

SQL> SELECT sql_id,
  2         hash_value,
  3         version_count,
  4         executions,
  5         parsing_schema_name,
  6         module,
  7         last_active_time,
  8         is_bind_sensitive,
  9         is_bind_aware,
 10         sql_profile,
 11         sql_text
 12    FROM V$SQLAREA
 13   WHERE     LOWER (SQL_TEXT) LIKE 'select count(object_name) from t1%'
 14         AND LOWER (SQL_TEXT) NOT LIKE '%HASH%';

SQL_ID           HASH_VALUE VERSION_COUNT EXECUTIONS PARSING_SC MODULE     LAST_ACTIVE_TIME    I I SQL_PROFIL SQL_TEXT
---------------- ---------- ------------- ---------- ---------- ---------- ------------------- - - ---------- --------------------------------------------
d6jg3h82uc7t1      94773025             1          1 SCOTT      SQL*Plus   17/11/2017 10:56:25 N N            select count(object_name) from t1 where id=3
84nk5292j0umb    1158703723             1          1 SCOTT      SQL*Plus   17/11/2017 10:55:18 N N            select count(object_name) from t1 where id=2
1wgjtthkcftxt     617047993             1          1 SCOTT      SQL*Plus   17/11/2017 10:55:15 N N            select count(object_name) from t1 where id=1

Consultando a view dinâmica de desempenho V$SQL que mostra os CHILD CURSORS de todas as instruções SQL executadas, podemos ver que o Oracle gerou o mesmo plano de execução (PLAN_HASH_VALUE) para as 3 consultas.

SQL> SELECT sql_id,
  2         hash_value,
  3         child_number,
  4         child_address,
  5         plan_hash_value,
  6         optimizer_mode,
  7         executions,
  8         parsing_schema_name,
  9         module,
 10         last_active_time,
 11         is_bind_sensitive,
 12         is_bind_aware,
 13         sql_profile,
 14         sql_text
 15    FROM V$SQL
 16   WHERE     LOWER (SQL_TEXT) LIKE 'select count(object_name) from t1%'
 17         AND LOWER (SQL_TEXT) NOT LIKE '%HASH%';

SQL_ID           HASH_VALUE CHILD_NUMBER CHILD_ADDRESS    PLAN_HASH_VALUE OPTIMIZER_ EXECUTIONS PARSING_SC MODULE     LAST_ACTIVE_TIME    I I SQL_PROFIL SQL_TEXT
---------------- ---------- ------------ ---------------- --------------- ---------- ---------- ---------- ---------- ------------------- - - ---------- --------------------------------------------
d6jg3h82uc7t1      94773025            0 0000000092188610      3724264953 ALL_ROWS            1 SCOTT      SQL*Plus   17/11/2017 10:56:25 N N            select count(object_name) from t1 where id=3
84nk5292j0umb    1158703723            0 000000009F85B2D8      3724264953 ALL_ROWS            1 SCOTT      SQL*Plus   17/11/2017 10:55:18 N N            select count(object_name) from t1 where id=2
1wgjtthkcftxt     617047993            0 00000000944BC930      3724264953 ALL_ROWS            1 SCOTT      SQL*Plus   17/11/2017 10:55:15 N N            select count(object_name) from t1 where id=1

Irei gerar um explain plan da consulta abaixo de forma que verificar qual plano de execução foi gerado para as consultas SQL.

SQL> explain plan for select count(object_name) from t1 where id=1;

Explicado.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3724264953

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |    10 | 55703   (1)| 00:11:09 |
|   1 |  SORT AGGREGATE    |      |     1 |    10 |            |          |
|*  2 |   TABLE ACCESS FULL| T1   |  5679K|    54M| 55703   (1)| 00:11:09 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("ID"=1)

14 linhas selecionadas.

Pelo plano de execução mostrado acima, podemos ver que o otimizador resolveu fazer um Full Table Scan na tabela T1. Para o valor de ID=1 está ótimo, porque este valor está em 98% dos registros da tabela. No entanto, esse plano de execução é horrível para os valores 2 e 3 que teria melhor performance se fizesse uso do índice criado na coluna ID. A questão é saber porque o Oracle não utilizou o índice? A resposta é porque o Oracle não sabe a distribuição dos valores na coluna ID. Por exemplo, ele não sabe que 98% dos valores são 1 e que os outros 2% são 1 e 2. Pelo resultado da consulta abaixo é possível perceber que o valor da coluna DENSITY é 33%, ou seja, o Oracle sabe que existem 3 valores distintos na coluna ID (NUM_DISTINCT=3), no entanto, ele enxerga de forma uniforme a distribuição dos valores na coluna, ou seja, cerca de 5,6 milhões de linhas para cada ID.

SQL> SELECT a.owner,
  2         a.table_name,
  3         a.column_name,
  4         a.data_type,
  5         a.num_distinct,
  6         a.density,
  7         a.histogram,
  8         a.num_buckets,
  9         a.last_analyzed,
 10         b.endpoint_number,
 11         b.endpoint_value
 12  FROM dba_tab_columns a, dba_tab_histograms b, dba_tab_col_statistics c
 13  WHERE a.owner = b.owner(+)
 14  AND a.table_name = b.table_name(+)
 15  AND a.column_name = b.column_name(+)
 16  AND b.owner = c.owner(+)
 17  AND b.table_name = c.table_name(+)
 18  AND b.column_name = c.column_name(+)
 19  AND a.owner='SCOTT'
 20  AND a.table_name='T1'
 21  AND a.column_name='ID';

OWNER        TABLE_NAME      COLUMN_NAME      DATA_TYPE  NUM_DISTINCT    DENSITY HISTOGRAM       NUM_BUCKETS LAST_ANALYZED       ENDPOINT_NUMBER ENDPOINT_VALUE
------------ --------------- ---------------- ---------- ------------ ---------- --------------- ----------- ------------------- --------------- --------------
SCOTT        T1              ID               NUMBER                3 ,333333333 NONE                      1 17/11/2017 10:41:12               1              3
SCOTT        T1              ID               NUMBER                3 ,333333333 NONE                      1 17/11/2017 10:41:12               0              1

Agora irei criar um histograma para a coluna ID de forma que o otimizador possa enxergar a não uniformidade dos valores armazenadas na coluna.

SQL> exec dbms_stats.gather_table_stats(
  2  ownname=>'SCOTT',
  3  tabname=>'T1',
  4  cascade => true,
  5  METHOD_OPT => 'for columns ID');

Procedimento PL/SQL concluído com sucesso.

SQL> SELECT a.owner,
  2         a.table_name,
  3         a.column_name,
  4         a.data_type,
  5         a.num_distinct,
  6         a.density,
  7         a.histogram,
  8         a.num_buckets,
  9         a.last_analyzed,
 10         b.endpoint_number,
 11         b.endpoint_value
 12  FROM dba_tab_columns a, dba_tab_histograms b, dba_tab_col_statistics c
 13  WHERE a.owner = b.owner(+)
 14  AND a.table_name = b.table_name(+)
 15  AND a.column_name = b.column_name(+)
 16  AND b.owner = c.owner(+)
 17  AND b.table_name = c.table_name(+)
 18  AND b.column_name = c.column_name(+)
 19  AND a.owner='SCOTT'
 20  AND a.table_name='T1'
 21  AND a.column_name='ID';

OWNER        TABLE_NAME      COLUMN_NAME      DATA_TYPE  NUM_DISTINCT    DENSITY HISTOGRAM       NUM_BUCKETS LAST_ANALYZED       ENDPOINT_NUMBER ENDPOINT_VALUE
------------ --------------- ---------------- ---------- ------------ ---------- --------------- ----------- ------------------- --------------- --------------
SCOTT        T1              ID               NUMBER                3 3,0206E-08 FREQUENCY                 3 17/11/2017 11:28:47            5262              1
SCOTT        T1              ID               NUMBER                3 3,0206E-08 FREQUENCY                 3 17/11/2017 11:28:47            5343              3
SCOTT        T1              ID               NUMBER                3 3,0206E-08 FREQUENCY                 3 17/11/2017 11:28:47            5342              2

Após executada a coleta de estatísticas incluindo a criação de histograma (FREQUENCY), irei executar novamente as 3 consultas SQL.

SQL> select count(object_name) from t1 where id=1;

COUNT(OBJECT_NAME)
------------------
          16777216

SQL> select count(object_name) from t1 where id=2;

COUNT(OBJECT_NAME)
------------------
            262144

SQL> select count(object_name) from t1 where id=3;

COUNT(OBJECT_NAME)
------------------
                64

Fazendo novamente a consulta na view V$SQL, é possível observar que o plano de execução (PLAN_HASH_VALUE) das consultas que utilizam os IDs 2 e 3 mudaram.

SQL> SELECT sql_id,
  2         hash_value,
  3         child_number,
  4         child_address,
  5         plan_hash_value,
  6         optimizer_mode,
  7         executions,
  8         parsing_schema_name,
  9         module,
 10         last_active_time,
 11         is_bind_sensitive,
 12         is_bind_aware,
 13         sql_profile,
 14         sql_text
 15    FROM V$SQL
 16   WHERE     LOWER (SQL_TEXT) LIKE 'select count(object_name) from t1%'
 17         AND LOWER (SQL_TEXT) NOT LIKE '%HASH%';

SQL_ID           HASH_VALUE CHILD_NUMBER CHILD_ADDRESS    PLAN_HASH_VALUE OPTIMIZER_ EXECUTIONS PARSING_SC MODULE     LAST_ACTIVE_TIME    I I SQL_PROFIL SQL_TEXT
---------------- ---------- ------------ ---------------- --------------- ---------- ---------- ---------- ---------- ------------------- - - ---------- --------------------------------------------
d6jg3h82uc7t1      94773025            0 000000009F8DED10      1284813898 ALL_ROWS            1 SCOTT      SQL*Plus   17/11/2017 11:40:25 N N            select count(object_name) from t1 where id=3
84nk5292j0umb    1158703723            0 0000000098978A30      1284813898 ALL_ROWS            1 SCOTT      SQL*Plus   17/11/2017 11:40:22 N N            select count(object_name) from t1 where id=2
1wgjtthkcftxt     617047993            0 000000009F8CA890      3724264953 ALL_ROWS            1 SCOTT      SQL*Plus   17/11/2017 11:40:14 N N            select count(object_name) from t1 where id=1

Para finalizar, irei gerar um novo explain plan da consulta que utiliza o ID=3 de forma a verificar qual plano de execução foi gerado pelo otimizador do Oracle.

SQL> explain plan for select count(object_name) from t1 where id=3;

Explicado.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
Plan hash value: 1284813898

------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |     1 |    10 |    52   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE              |           |     1 |    10 |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| T1        |  3189 | 31890 |    52   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | IDX_T1_ID |  3189 |       |     9   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("ID"=3)

15 linhas selecionadas.

Pronto. Pelo resultado acima podemos ver que o otimizador escolheu o acessar os dados através do índice IDX_T1_ID, ou seja, o histograma foi responsável por ajudar o otimizador a verificar que os valores da coluna ID não estavam com a distribuição uniforme e encontrou um plano de acesso mais performático para a instrução SQL com ID=3.


quinta-feira, 26 de outubro de 2017

Obtendo o tamanho dos segmentos por schemas de banco de dados: (Tabelas, Índices, LOBs)

Por Eduardo Legatti

Olá,

No artigo de Maio/2011 eu compartilhei uma instrução SQL que retorna o tamanho de todos os segmentos (Tabelas, Índices, LOBs, etc.) pertencentes a um um schema (o schema atual), através das views de dicionário de dados USER_*. O objetivo dessa instrução SQL é mostrar não só o tamanho de uma tabela como também o tamanho dos objetos dependentes dela como índices e LOBs. Agora irei compartilhar uma consulta SQL que utiliza as views DBA_* de forma a retornar o tamanho dos segmentos de tabelas, índices e LOBs por schema de banco de dados, conforme a seguir.
 
SQL> SELECT owner,
  2         data_mb,
  3         indx_mb,
  4         lob_mb,
  5         total_mb
  6      FROM (SELECT data.owner,
  7                   NVL(data_mb,0) data_mb,
  8                   NVL(indx_mb,0) indx_mb,
  9                   NVL(lob_mb,0) lob_mb,
 10                   NVL(data_mb,0) + NVL(indx_mb,0) + NVL(lob_mb,0) total_mb
 11              FROM (  SELECT owner,
 12                             ROUND(SUM(data_mb),2) data_mb
 13                        FROM (SELECT owner, data_mb
 14                                FROM (SELECT a.owner,
 15                                             b.bytes/1024/1024 AS data_mb
 16                                        FROM dba_tables a, dba_segments b
 17                                       WHERE a.owner = b.owner and a.table_name = b.segment_name))
 18                    GROUP BY owner) data,
 19                   (  SELECT a.owner,
 20                             ROUND(SUM(b.bytes/1024/1024),2) AS indx_mb
 21                        FROM dba_indexes a, dba_segments b
 22                       WHERE a.owner = b.owner and a.index_name = b.segment_name
 23                    GROUP BY a.owner) indx,
 24                   (  SELECT a.owner,
 25                             ROUND(SUM(b.bytes/1024/1024),2) AS lob_mb
 26                        FROM dba_lobs a, dba_segments b
 27                       WHERE a.owner = b.owner and a.segment_name = b.segment_name
 28                    GROUP BY a.owner) lob
 29             WHERE
 30             data.owner = indx.owner(+)
 31             AND data.owner = lob.owner(+))
 32  WHERE owner in ('SCHEMA01',
 33                  'SCHEMA02',
 34                  'SCHEMA03',
 35                  'SCHEMA04',
 36                  'SCHEMA05',
 37                  'SCHEMA06',
 38                  'SCHEMA07')
 39  ORDER BY owner;

OWNER                       DATA_MB    INDX_MB     LOB_MB   TOTAL_MB
------------------------ ---------- ---------- ---------- ----------
SCHEMA01                   16069.38   58428.25  174381.44  248879.07
SCHEMA02                      11618   43081.31    9064.94   63764.25
SCHEMA03                   93944.63     529311  206722.38  829978.01
SCHEMA04                       78.5     107.63      98.56     284.69
SCHEMA05                    2814.25     9761.5    14573.5   27149.25
SCHEMA06                    3211.88   13447.94     555.75   17215.57
SCHEMA07                    9777.44   41685.13  258100.44  309563.01

7 rows selected.

segunda-feira, 25 de setembro de 2017

Analisando o RMAN no que se refere à varredura dos arquivos de dados em backups incrementais

Por Eduardo Legatti


Olá,

Com o lançamento do recurso de backups incrementais  à partir do RMAN Oracle 9i, é possível ter uma economia grande de espaço no que se refere ao tamanhos dos backups já que um backup incremental é gerado à partir dos blocos alterados desde o último backup base, seja ele cumulativo ou diferencial.
 
Mas, independente do tipo de backup incremental realizado, seja ele cumulativo ou diferencial, uma maneira de melhorar o desempenho dos mesmos é ativar o rastreamento de alterações de blocos (Block Change Tracking). Em um backup incremental tradicional, o RMAN tem que inspecionar cada bloco do arquivo de dados no qual será feito o backup para verificar se o mesmo foi alterado desde o último backup efetuado. Dependendo do tamanho do banco de dados, isso poderá levar muito tempo. Portanto, habilitando o BCT o mesmo irá registrar em um arquivo especial os blocos que mudaram e, durante a realização do backup incremental NIVEL-1, apenas estes blocos serão lidos, ou seja, o RMAN não precisará varrer todos os blocos do arquivo de dados.

Vale a pena salientar que o BCT é uma feature do Oracle Enterprise Edition, ou seja, a versão Standard não possui este recurso.
 
Na imagem abaixo é possível observar backups incrementais NIVEL-0 ocorrendo nos dias 10/09 e 17/09. A linha azul mostra os dados lidos para os backup sets e a linha vermelha mostra esses mesmos dados  já com a compressão utilizada pelo RMAN. A linha verde mostra o tempo gasto na realização do backup. Nos dias de semana é possível perceber uma diminuição do tamanho e do tempo dos backups, pelo fato de estar sendo realizado o backup incremental NIVEL-1.


A imagem baixo mostra eventos de backups incrementais em um Oracle Standard Edition.O importante a se notar é a linha azul se mantém igual durante a execução dos backups, independente se o backup é do NIVEL-0 ou NIVEL-1.




Segue abaixo o gráfico mostrando os dados em uma janela de tempo menor.




Por fim, posso concluir que as informações de input_bytes e output_bytes mostradas pelo RMAN através da view  V$RMAN_BACKUP_JOB_DETAILS estão atreladas ao que o RMAN está lendo no momento da varredura dos arquivos de dados, e não dos blocos que apenas sofreram modificações como eu imaginava.

segunda-feira, 21 de agosto de 2017

Resolvendo o erro ORA-08104 com a procedure DBMS_REPAIR.ONLINE_INDEX_CLEAN ao criar um índice ONLINE

Por Eduardo Legatti

Olá,

Durante a criação de um índice ONLINE em um banco de dados Oracle, ocorreu um problema de conectividade fazendo com que o Oracle emitisse o erro ORA-08104 ao retomar a atividade de rebuild do índice. Não era possível dropar ou recriar o índice.

SQL> create index idx_emp_name on emp (emp_name) tablespace indx_tbs_01 online;

ORA-03113: end-of-file on communication channel

SQL> create index idx_emp_name on emp (emp_name) tablespace indx_tbs_01 online;
alter index idx_emp_name rebuild online
*
ERRO na linha 1:
ORA-08104: este objeto de índice 248352 está sendo construído ou reconstruído on-line

SQL> alter index idx_emp_name rebuild online;
alter index idx_emp_name rebuild online
*
ERRO na linha 1:
ORA-08104: este objeto de índice 248352 está sendo construído ou reconstruído on-line

Para resolver o problema, utilizei a procedure DBMS_REPAIR.ONLINE_INDEX_CLEAN encontrada no site psoug.org conforme demonstrado abaixo.


Segue abaixo a execução da procedure.

SQL> set timing on
SQL> DECLARE
  2   isClean BOOLEAN;
  3  BEGIN
  4    isClean := FALSE;
  5    WHILE isClean=FALSE
  6    LOOP
  7      isClean := dbms_repair.online_index_clean(
  8      dbms_repair.all_index_id, dbms_repair.lock_wait);
  9      dbms_lock.sleep(10);
 10    END LOOP;
 11  END;
 12  /

Procedimento PL/SQL concluído com sucesso.

Decorrido: 00:01:00.01

sql> create index idx_emp_name on emp (emp_name) tablespace indx_tbs_01 online;

Índice criado.

Decorrido: 00:00:03.08

No mais, este procedimento também está disponível no documento Session Was Killed During The Rebuild Of Index ORA-08104 [ID 375856.1] no My Oracle Support (Metalink).

sábado, 29 de julho de 2017

LogMiner - Analisando o conteúdo de um ARCHIVED REDO LOG através da package DBMS_LOGMNR

Por Eduardo Legatti

Olá,

Quando precisamos visualizar o conteúdo dos arquivos de redo log, utilizamos um recurso presente no banco de dados Oracle chamado LogMiner. O objetivo deste artigo é apresentar de forma simples como podemos visualizar o conteúdo de um ou mais arquivos de redo log arquivados através da package DBMS_LOGMNR.

Para facilitar a visualização física dos archived logs gerados, irei alterar o destino da criação dos mesmos conforme abaixo.

SQL> alter system set log_archive_dest_1='LOCATION=/oradata/archivelog';

System altered.

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /oradata/archivelog
Oldest online log sequence     49
Next log sequence to archive   51
Current log sequence           51

De acordo com a documentação, existem dois tipos de logs sumplementares (supplemental logging) que podem ser habilitados no banco de dados:

Database-Level Supplemental Logging

There are two types of database-level supplemental logging: minimal supplemental logging and identification key logging, as described in the following sections. Minimal supplemental logging does not impose significant overhead on the database generating the redo log files. However, enabling database-wide identification key logging can impose overhead on the database generating the redo log files. Oracle recommends that you at least enable minimal supplemental logging for LogMiner.

Minimal Supplemental Logging

Minimal supplemental logging logs the minimal amount of information needed for LogMiner to identify, group, and merge the redo operations associated with DML changes. It ensures that LogMiner (and any product building on LogMiner technology) has sufficient information to support chained rows and various storage arrangements, such as cluster tables and index-organized tables.

Por enquanto não existe nenhum tipo de log suplementar ativado para os arquivos de redo log conforme demonstrado abaixo.

SQL> select
  2  supplemental_log_data_min,
  3  supplemental_log_data_pk,
  4  supplemental_log_data_ui
  5  from v$database;

SUPPLEME SUP SUP
-------- --- ---
NO       NO  NO

O próximo passo é simular algumas operações no banco de dados conforme a seguir.

SQL> create table scott.emp (id number, data date);

Table created.

SQL> insert into scott.emp values (1,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into scott.emp values (2,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into scott.emp values (3,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into scott.emp values (4,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into scott.emp values (5,sysdate);

1 row created.

SQL> rollback;

Rollback complete.

SQL> insert into scott.emp values (6,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

A seguir irei habilitar o log suplementar mínimo (Minimal Supplemental Logging) que não causa nenhuma overhead e realizar mais algumas operações no banco de dados.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

SQL> select
  2  supplemental_log_data_min,
  3  supplemental_log_data_pk,
  4  supplemental_log_data_ui
  5  from v$database;

SUPPLEME SUP SUP
-------- --- ---
YES      NO  NO

SQL> insert into scott.emp values (7,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into scott.emp values (8,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

SQL> insert into scott.emp values (9,sysdate);

1 row created.

SQL> rollback;

Rollback complete.

SQL> insert into scott.emp values (10,sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

Após a execução dos comandos acima, os seguintes arquivos de redo log arquivados abaixo foram gerados.

[oracle@linux1 /]$ ls -lh /oradata/archivelog/
total 7,0M
-rw-r----- 1 oracle oinstall 2,9M Jul 29 12:55 1_51_804786092.dbf
-rw-r----- 1 oracle oinstall 1,9M Jul 29 13:26 1_52_804786092.dbf
-rw-r----- 1 oracle oinstall 1,0K Jul 29 13:26 1_53_804786092.dbf
-rw-r----- 1 oracle oinstall 2,2M Jul 29 14:16 1_54_804786092.dbf
-rw-r----- 1 oracle oinstall 111K Jul 29 14:24 1_55_804786092.dbf

SQL> select name,sequence#,first_time,next_time,completion_time
  2  from v$archived_log
  3  where name like '%1_5__804786092.dbf%';

NAME                                    SEQUENCE# FIRST_TIME          NEXT_TIME           COMPLETION_TIME
--------------------------------------- ---------- ------------------- ------------------- -------------------
/oradata/archivelog/1_51_804786092.dbf          51 29/07/2017 12:01:48 29/07/2017 12:55:52 29/07/2017 12:55:53
/oradata/archivelog/1_52_804786092.dbf          52 29/07/2017 12:55:52 29/07/2017 13:26:18 29/07/2017 13:26:19
/oradata/archivelog/1_53_804786092.dbf          53 29/07/2017 13:26:18 29/07/2017 13:26:26 29/07/2017 13:26:27
/oradata/archivelog/1_54_804786092.dbf          54 29/07/2017 13:26:26 29/07/2017 14:16:33 29/07/2017 14:16:33
/oradata/archivelog/1_55_804786092.dbf          55 29/07/2017 14:16:33 29/07/2017 14:24:57 29/07/2017 14:24:57

Como demonstrado acima, foi verificado que foram gerados arquivos de redo log arquivados da sequencia 51 à 55. Portanto, irei analisar o conteúdo dos mesmos com a package DBMS_LOGMNR conforme demonstrado abaixo.

SQL> BEGIN
  2   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/oradata/archivelog/1_51_804786092.dbf',OPTIONS => DBMS_LOGMNR.NEW);
  3   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/oradata/archivelog/1_52_804786092.dbf');
  4   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/oradata/archivelog/1_53_804786092.dbf');
  5   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/oradata/archivelog/1_54_804786092.dbf');
  6   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/oradata/archivelog/1_55_804786092.dbf');
  7   DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
  8  END;
  9  /

PL/SQL procedure successfully completed.

Depois de adicionar os arquivos de redo log arquivados acima, irei visualizar o conteúdo dos mesmos através da view V$LOGMNR_CONTENTS.

SQL> SELECT rbasqn,
  2         timestamp,
  3         operation,
  4         seg_owner,
  5         table_name,
  6         table_space,
  7         username,
  8         os_username,
  9         machine_name,
 10         session#,
 11         serial#,
 12         session_info,
 13         sql_redo,
 14         sql_undo
 15  FROM v$logmnr_contents
 16  WHERE seg_owner IN ('SCOTT')
 17  ORDER BY timestamp;

    RBASQN TIMESTAMP           OPERATION      SEG_OWNER    TABLE_NAME   TABLE_SPACE  USERNAME   OS_USERNAME   MACHINE_NAME        SESSION#    SERIAL# SESSION_INFO                                                                                                                                                                      SQL_REDO                                                                                                      SQL_UNDO
---------- ------------------- -------------- ------------ ------------ ------------ ---------- ------------- ------------------- ---------- ---------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------
        51 29/07/2017 12:11:31 DDL            SCOTT        EMP                       UNKNOWN    UNKNOWN       UNKNOWN                      0          0 UNKNOWN                                                                                                                                                                           create table scott.emp (id number, data date);
        51 29/07/2017 12:12:23 INSERT         SCOTT        EMP          USERS        UNKNOWN    UNKNOWN       UNKNOWN                      0          0 UNKNOWN                                                                                                                                                                           insert into "SCOTT"."EMP"("ID","DATA") values ('1',TO_DATE('19/07/2017 12:12:18', 'dd/mm/yyyy hh24:mi:ss'));  delete from "SCOTT"."EMP" where "ID" = '1' and "DATA" = TO_DATE('19/07/2017 12:12:18', 'dd/mm/yyyy hh24:mi:ss') and ROWID = 'AAADZtAAEAAAACcAAA';
        51 29/07/2017 12:35:19 DELETE         SCOTT        EMP          USERS        UNKNOWN    UNKNOWN       UNKNOWN                      0          0 UNKNOWN                                                                                                                                                                           delete from "SCOTT"."EMP" where ROWID = 'AAADZtAAEAAAACcAAE';
        54 29/07/2017 14:15:37 INSERT         SCOTT        EMP          USERS        SYS        oracle        linux1.localdomain          36         49 login_username=SYS client_info= OS_username=oracle Machine_name=linux1.localdomain OS_terminal=pts/0 OS_process_id=14479 OS_program_name=sqlplus@linux1.localdomain (TNS V1-V3)   insert into "SCOTT"."EMP"("ID","DATA") values ('7',TO_DATE('19/07/2017 14:15:34', 'dd/mm/yyyy hh24:mi:ss'));  delete from "SCOTT"."EMP" where "ID" = '7' and "DATA" = TO_DATE('19/07/2017 14:15:34', 'dd/mm/yyyy hh24:mi:ss') and ROWID = 'AAADZtAAEAAAACcAAF';
        54 29/07/2017 14:16:19 INSERT         SCOTT        EMP          USERS        SYS        oracle        linux1.localdomain          36         49 login_username=SYS client_info= OS_username=oracle Machine_name=linux1.localdomain OS_terminal=pts/0 OS_process_id=14479 OS_program_name=sqlplus@linux1.localdomain (TNS V1-V3)   insert into "SCOTT"."EMP"("ID","DATA") values ('8',TO_DATE('19/07/2017 14:16:19', 'dd/mm/yyyy hh24:mi:ss'));  delete from "SCOTT"."EMP" where "ID" = '8' and "DATA" = TO_DATE('19/07/2017 14:16:19', 'dd/mm/yyyy hh24:mi:ss') and ROWID = 'AAADZtAAEAAAACcAAG';
        55 29/07/2017 14:22:06 INSERT         SCOTT        EMP          USERS        SYS        oracle        linux1.localdomain          36         49 login_username=SYS client_info= OS_username=oracle Machine_name=linux1.localdomain OS_terminal=pts/0 OS_process_id=14479 OS_program_name=sqlplus@linux1.localdomain (TNS V1-V3)   insert into "SCOTT"."EMP"("ID","DATA") values ('9',TO_DATE('19/07/2017 14:22:04', 'dd/mm/yyyy hh24:mi:ss'));  delete from "SCOTT"."EMP" where "ID" = '9' and "DATA" = TO_DATE('19/07/2017 14:22:04', 'dd/mm/yyyy hh24:mi:ss') and ROWID = 'AAADZtAAEAAAACcAAH';
        55 29/07/2017 14:22:08 DELETE         SCOTT        EMP          USERS        SYS        oracle        linux1.localdomain          36         49 login_username=SYS client_info= OS_username=oracle Machine_name=linux1.localdomain OS_terminal=pts/0 OS_process_id=14479 OS_program_name=sqlplus@linux1.localdomain (TNS V1-V3)   delete from "SCOTT"."EMP" where ROWID = 'AAADZtAAEAAAACcAAH';
        55 29/07/2017 14:24:42 INSERT         SCOTT        EMP          USERS        SYS        oracle        linux1.localdomain          36         49 login_username=SYS client_info= OS_username=oracle Machine_name=linux1.localdomain OS_terminal=pts/0 OS_process_id=14479 OS_program_name=sqlplus@linux1.localdomain (TNS V1-V3)   insert into "SCOTT"."EMP"("ID","DATA") values ('10',TO_DATE('19/07/2017 14:24:41', 'dd/mm/yyyy hh24:mi:ss')); delete from "SCOTT"."EMP" where "ID" = '10' and "DATA" = TO_DATE('19/07/2017 14:24:41', 'dd/mm/yyyy hh24:mi:ss') and ROWID = 'AAADZtAAEAAAACcAAH';

8 linhas selecionadas.

Pelo resultado acima é possível perceber que as instruções realizadas antes de habilitar o log suplementar mínimo não estão completas ou ausentes e que somente após habilitar o log suplementar mínimo é que as informações e instruções SQL executadas foram logadas de forma mais completa.

Por fim, apra desabilitar o recurso LogMiner, basta apenas executar o comando abaixo.

SQL> exec DBMS_LOGMNR.END_LOGMNR();

PL/SQL procedure successfully completed.

terça-feira, 20 de junho de 2017

Abordando a instalação do Oracle em modo texto no Linux

Por Eduardo Legatti

Olá,

Instalações do software Oracle em sistemas Linux, em muitos casos são feitas utilizando a interface gráfica GNOME, KDE ou similares. Através do VNC, é possível acessar remotamente o servidor e realizar a instalação do Oracle. No entanto, não é todo servidor que possui a interface gráfica instalada, e nesse caso, a única solução é realizar a instalação utilizando o modo silencioso (silent) através de um arquivo de resposta (response file). Portanto, segue abaixo a instalação do Oracle 11g (11.2.0.4) e posteriormente a criação de um banco de dados através do DBCA também em modo texto.

Para a instalação do software Oracle, utilizarei o arquivo db_install.rsp criado após a descompactação dos arquivos de instalação abaixo. 
  • p13390677_112040_Linux-x86-64_1of7.zip
  • p13390677_112040_Linux-x86-64_2of7.zip
O sistema operacional utilizado é o Linux Centos 7.3 (x64).

[oracle@linux1 ~]$ cat /install/database/response/db_install.rsp
####################################################################
## Copyright(c) Oracle Corporation 1998,2013. All rights reserved.##
##                                                                ##
## Specify values for the variables listed below to customize     ##
## your installation.                                             ##
##                                                                ##
## Each variable is associated with a comment. The comment        ##
## can help to populate the variables with the appropriate        ##
## values.                                                        ##
##                                                                ##
## IMPORTANT NOTE: This file contains plain text passwords and    ##
## should be secured to have read permission only by oracle user  ##
## or db administrator who owns this installation.                ##
##                                                                ##
####################################################################

#------------------------------------------------------------------------------
# Do not change the following system generated value. 
#------------------------------------------------------------------------------
oracle.install.responseFileVersion=/install/database/response/db_install.rsp

#------------------------------------------------------------------------------
# Specify the installation option.
# It can be one of the following:
#   - INSTALL_DB_SWONLY
#   - INSTALL_DB_AND_CONFIG
#   - UPGRADE_DB
#-------------------------------------------------------------------------------
oracle.install.option=INSTALL_DB_SWONLY

#-------------------------------------------------------------------------------
# Specify the hostname of the system as set during the install. It can be used
# to force the installation to use an alternative hostname rather than using the
# first hostname found on the system. (e.g., for systems with multiple hostnames 
# and network interfaces)
#-------------------------------------------------------------------------------
ORACLE_HOSTNAME=Linux1

#-------------------------------------------------------------------------------
# Specify the Unix group to be set for the inventory directory.  
#-------------------------------------------------------------------------------
UNIX_GROUP_NAME=oinstall

#-------------------------------------------------------------------------------
# Specify the location which holds the inventory files.
# This is an optional parameter if installing on
# Windows based Operating System.
#-------------------------------------------------------------------------------
INVENTORY_LOCATION=/u01/app/oraInventory

#-------------------------------------------------------------------------------
# Specify the languages in which the components will be installed.             
# 
# en   : English                  ja   : Japanese                  
# fr   : French                   ko   : Korean                    
# ar   : Arabic                   es   : Latin American Spanish    
# bn   : Bengali                  lv   : Latvian                   
# pt_BR: Brazilian Portuguese     lt   : Lithuanian                
# bg   : Bulgarian                ms   : Malay                     
# fr_CA: Canadian French          es_MX: Mexican Spanish           
# ca   : Catalan                  no   : Norwegian                 
# hr   : Croatian                 pl   : Polish                    
# cs   : Czech                    pt   : Portuguese                
# da   : Danish                   ro   : Romanian                  
# nl   : Dutch                    ru   : Russian                   
# ar_EG: Egyptian                 zh_CN: Simplified Chinese        
# en_GB: English (Great Britain)  sk   : Slovak                    
# et   : Estonian                 sl   : Slovenian                 
# fi   : Finnish                  es_ES: Spanish                   
# de   : German                   sv   : Swedish                   
# el   : Greek                    th   : Thai                      
# iw   : Hebrew                   zh_TW: Traditional Chinese       
# hu   : Hungarian                tr   : Turkish                   
# is   : Icelandic                uk   : Ukrainian                 
# in   : Indonesian               vi   : Vietnamese                
# it   : Italian                                                   
#
# all_langs   : All languages
#
# Specify value as the following to select any of the languages.
# Example : SELECTED_LANGUAGES=en,fr,ja
#
# Specify value as the following to select all the languages.
# Example : SELECTED_LANGUAGES=all_langs  
#------------------------------------------------------------------------------
SELECTED_LANGUAGES=en,pt_BR

#------------------------------------------------------------------------------
# Specify the complete path of the Oracle Home.
#------------------------------------------------------------------------------
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1

#------------------------------------------------------------------------------
# Specify the complete path of the Oracle Base. 
#------------------------------------------------------------------------------
ORACLE_BASE=/u01/app/oracle

#------------------------------------------------------------------------------
# Specify the installation edition of the component.                        
#                                                             
# The value should contain only one of these choices.        
#   - EE     : Enterprise Edition                                
#   - SE     : Standard Edition                                  
#   - SEONE  : Standard Edition One
#   - PE     : Personal Edition (WINDOWS ONLY)
#------------------------------------------------------------------------------
oracle.install.db.InstallEdition=EE

#------------------------------------------------------------------------------
# This variable is used to enable or disable custom install and is considered
# only if InstallEdition is EE.
#
# true  : Components mentioned as part of 'optionalComponents' property
#         are considered for install.
# false : Value for 'optionalComponents' is not considered.
#------------------------------------------------------------------------------
oracle.install.db.EEOptionsSelection=true

#------------------------------------------------------------------------------
# This variable is considered only if 'EEOptionsSelection' is set to true. 
#
# Description: List of Enterprise Edition Options you would like to enable.
#
#              The following choices are available. You may specify any
#              combination of these choices.  The components you choose should
#              be specified in the form "internal-component-name:version"
#              Below is a list of components you may specify to enable.
#        
#              oracle.oraolap:11.2.0.4.0 - Oracle OLAP
#              oracle.rdbms.dm:11.2.0.4.0 - Oracle Data Mining
#              oracle.rdbms.dv:11.2.0.4.0 - Oracle Database Vault
#              oracle.rdbms.lbac:11.2.0.4.0 - Oracle Label Security
#              oracle.rdbms.partitioning:11.2.0.4.0 - Oracle Partitioning
#              oracle.rdbms.rat:11.2.0.4.0 - Oracle Real Application Testing
#------------------------------------------------------------------------------
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0

###############################################################################
#                                                                             #
# PRIVILEGED OPERATING SYSTEM GROUPS                                          #
# ------------------------------------------                                  #
# Provide values for the OS groups to which OSDBA and OSOPER privileges       #
# needs to be granted. If the install is being performed as a member of the   #  
# group "dba", then that will be used unless specified otherwise below.       #
#                                                                             #
# The value to be specified for OSDBA and OSOPER group is only for UNIX based #
# Operating System.                                                           #
#                                                                             #
###############################################################################

#------------------------------------------------------------------------------
# The DBA_GROUP is the OS group which is to be granted OSDBA privileges.
#------------------------------------------------------------------------------
oracle.install.db.DBA_GROUP=dba

#------------------------------------------------------------------------------
# The OPER_GROUP is the OS group which is to be granted OSOPER privileges.
# The value to be specified for OSOPER group is optional.
#------------------------------------------------------------------------------
oracle.install.db.OPER_GROUP=dba

#------------------------------------------------------------------------------
# Specify the cluster node names selected during the installation.
# Example : oracle.install.db.CLUSTER_NODES=node1,node2
#------------------------------------------------------------------------------
oracle.install.db.CLUSTER_NODES=

#------------------------------------------------------------------------------
# This variable is used to enable or disable RAC One Node install.
#
#   - true  : Value of RAC One Node service name is used.
#   - false : Value of RAC One Node service name is not used.
#
# If left blank, it will be assumed to be false
#------------------------------------------------------------------------------
oracle.install.db.isRACOneInstall=

#------------------------------------------------------------------------------
# Specify the name for RAC One Node Service. 
#------------------------------------------------------------------------------
oracle.install.db.racOneServiceName=

#------------------------------------------------------------------------------
# Specify the type of database to create.
# It can be one of the following:
#   - GENERAL_PURPOSE/TRANSACTION_PROCESSING             
#   - DATA_WAREHOUSE                                
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.type=

#------------------------------------------------------------------------------
# Specify the Starter Database Global Database Name. 
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.globalDBName=

#------------------------------------------------------------------------------
# Specify the Starter Database SID.
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.SID=

#------------------------------------------------------------------------------
# Specify the Starter Database character set.
#                                              
# It can be one of the following:
# AL32UTF8, WE8ISO8859P15, WE8MSWIN1252, EE8ISO8859P2,
# EE8MSWIN1250, NE8ISO8859P10, NEE8ISO8859P4, BLT8MSWIN1257,
# BLT8ISO8859P13, CL8ISO8859P5, CL8MSWIN1251, AR8ISO8859P6,
# AR8MSWIN1256, EL8ISO8859P7, EL8MSWIN1253, IW8ISO8859P8,
# IW8MSWIN1255, JA16EUC, JA16EUCTILDE, JA16SJIS, JA16SJISTILDE,
# KO16MSWIN949, ZHS16GBK, TH8TISASCII, ZHT32EUC, ZHT16MSWIN950,
# ZHT16HKSCS, WE8ISO8859P9, TR8MSWIN1254, VN8MSWIN1258
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.characterSet=

#------------------------------------------------------------------------------
# This variable should be set to true if Automatic Memory Management 
# in Database is desired.
# If Automatic Memory Management is not desired, and memory allocation
# is to be done manually, then set it to false.
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.memoryOption=true

#------------------------------------------------------------------------------
# Specify the total memory allocation for the database. Value(in MB) should be
# at least 256 MB, and should not exceed the total physical memory available 
# on the system.
# Example: oracle.install.db.config.starterdb.memoryLimit=512
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.memoryLimit=

#------------------------------------------------------------------------------
# This variable controls whether to load Example Schemas onto
# the starter database or not.
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.installExampleSchemas=false

#------------------------------------------------------------------------------
# This variable includes enabling audit settings, configuring password profiles
# and revoking some grants to public. These settings are provided by default. 
# These settings may also be disabled.    
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.enableSecuritySettings=true

###############################################################################
#                                                                             #
# Passwords can be supplied for the following four schemas in the             #
# starter database:                                                           #
#   SYS                                                                       #
#   SYSTEM                                                                    #
#   SYSMAN (used by Enterprise Manager)                                       #
#   DBSNMP (used by Enterprise Manager)                                       #
#                                                                             #
# Same password can be used for all accounts (not recommended)                #
# or different passwords for each account can be provided (recommended)       #
#                                                                             #
###############################################################################

#------------------------------------------------------------------------------
# This variable holds the password that is to be used for all schemas in the
# starter database.
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.password.ALL=

#-------------------------------------------------------------------------------
# Specify the SYS password for the starter database.
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.password.SYS=

#-------------------------------------------------------------------------------
# Specify the SYSTEM password for the starter database.
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.password.SYSTEM=

#-------------------------------------------------------------------------------
# Specify the SYSMAN password for the starter database.
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.password.SYSMAN=

#-------------------------------------------------------------------------------
# Specify the DBSNMP password for the starter database.
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.password.DBSNMP=

#-------------------------------------------------------------------------------
# Specify the management option to be selected for the starter database. 
# It can be one of the following:
#   - GRID_CONTROL
#   - DB_CONTROL
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.control=DB_CONTROL

#-------------------------------------------------------------------------------
# Specify the Management Service to use if Grid Control is selected to manage 
# the database.      
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=

###############################################################################
#                                                                             #
# SPECIFY BACKUP AND RECOVERY OPTIONS                                         #
# ------------------------------------                                        #
# Out-of-box backup and recovery options for the database can be mentioned    #
# using the entries below.                                                    # 
#                                                                             #
###############################################################################

#------------------------------------------------------------------------------
# This variable is to be set to false if automated backup is not required. Else 
# this can be set to true.
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.automatedBackup.enable=false

#------------------------------------------------------------------------------
# Regardless of the type of storage that is chosen for backup and recovery, if 
# automated backups are enabled, a job will be scheduled to run daily to backup 
# the database. This job will run as the operating system user that is 
# specified in this variable.
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.automatedBackup.osuid=

#-------------------------------------------------------------------------------
# Regardless of the type of storage that is chosen for backup and recovery, if 
# automated backups are enabled, a job will be scheduled to run daily to backup 
# the database. This job will run as the operating system user specified by the 
# above entry. The following entry stores the password for the above operating 
# system user.
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.automatedBackup.ospwd=

#-------------------------------------------------------------------------------
# Specify the type of storage to use for the database.
# It can be one of the following:
#   - FILE_SYSTEM_STORAGE
#   - ASM_STORAGE
#------------------------------------------------------------------------------
oracle.install.db.config.starterdb.storageType=

#-------------------------------------------------------------------------------
# Specify the database file location which is a directory for datafiles, control
# files, redo logs.         
#
# Applicable only when oracle.install.db.config.starterdb.storage=FILE_SYSTEM_STORAGE 
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=

#-------------------------------------------------------------------------------
# Specify the backup and recovery location.
#
# Applicable only when oracle.install.db.config.starterdb.storage=FILE_SYSTEM_STORAGE 
#-------------------------------------------------------------------------------
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=

#-------------------------------------------------------------------------------
# Specify the existing ASM disk groups to be used for storage.
#
# Applicable only when oracle.install.db.config.starterdb.storage=ASM_STORAGE
#-------------------------------------------------------------------------------
oracle.install.db.config.asm.diskGroup=

#-------------------------------------------------------------------------------
# Specify the password for ASMSNMP user of the ASM instance.                  
#
# Applicable only when oracle.install.db.config.starterdb.storage=ASM_STORAGE 
#-------------------------------------------------------------------------------
oracle.install.db.config.asm.ASMSNMPPassword=

#------------------------------------------------------------------------------
# Specify the My Oracle Support Account Username.
#
#  Example   : MYORACLESUPPORT_USERNAME=abc@oracle.com
#------------------------------------------------------------------------------
MYORACLESUPPORT_USERNAME=

#------------------------------------------------------------------------------
# Specify the My Oracle Support Account Username password.
#
# Example    : MYORACLESUPPORT_PASSWORD=password
#------------------------------------------------------------------------------
MYORACLESUPPORT_PASSWORD=

#------------------------------------------------------------------------------
# Specify whether to enable the user to set the password for
# My Oracle Support credentials. The value can be either true or false.
# If left blank it will be assumed to be false.
#
# Example    : SECURITY_UPDATES_VIA_MYORACLESUPPORT=true
#------------------------------------------------------------------------------
SECURITY_UPDATES_VIA_MYORACLESUPPORT=

#------------------------------------------------------------------------------
# Specify whether user doesn't want to configure Security Updates.
# The value for this variable should be true if you don't want to configure
# Security Updates, false otherwise. 
#
# The value can be either true or false. If left blank it will be assumed
# to be false.
#
# Example    : DECLINE_SECURITY_UPDATES=false
#------------------------------------------------------------------------------
DECLINE_SECURITY_UPDATES=true

#------------------------------------------------------------------------------
# Specify the Proxy server name. Length should be greater than zero.
#
# Example    : PROXY_HOST=proxy.domain.com 
#------------------------------------------------------------------------------
PROXY_HOST=

#------------------------------------------------------------------------------
# Specify the proxy port number. Should be Numeric and at least 2 chars.
#
# Example    : PROXY_PORT=25 
#------------------------------------------------------------------------------
PROXY_PORT=

#------------------------------------------------------------------------------
# Specify the proxy user name. Leave PROXY_USER and PROXY_PWD 
# blank if your proxy server requires no authentication.
#
# Example    : PROXY_USER=username 
#------------------------------------------------------------------------------
PROXY_USER=

#------------------------------------------------------------------------------
# Specify the proxy password. Leave PROXY_USER and PROXY_PWD  
# blank if your proxy server requires no authentication.
#
# Example    : PROXY_PWD=password 
#------------------------------------------------------------------------------
PROXY_PWD=

#------------------------------------------------------------------------------
# Specify the proxy realm. This value is used if auto-updates option is selected.
#
# Example    : PROXY_REALM=metalink 
#------------------------------------------------------------------------------
PROXY_REALM=

#------------------------------------------------------------------------------
# Specify the Oracle Support Hub URL. 
# 
# Example    : COLLECTOR_SUPPORTHUB_URL=https://orasupporthub.company.com:8080/
#------------------------------------------------------------------------------
COLLECTOR_SUPPORTHUB_URL=

#------------------------------------------------------------------------------
# Specify the auto-updates option. It can be one of the following:
#   - MYORACLESUPPORT_DOWNLOAD
#   - OFFLINE_UPDATES
#   - SKIP_UPDATES
#------------------------------------------------------------------------------
oracle.installer.autoupdates.option=SKIP_UPDATES
#------------------------------------------------------------------------------
# In case MYORACLESUPPORT_DOWNLOAD option is chosen, specify the location where
# the updates are to be downloaded.
# In case OFFLINE_UPDATES option is chosen, specify the location where the updates 
# are present.
#------------------------------------------------------------------------------
oracle.installer.autoupdates.downloadUpdatesLoc=
#------------------------------------------------------------------------------
# Specify the My Oracle Support Account Username which has the patches download privileges  
# to be used for software updates.
#  Example   : AUTOUPDATES_MYORACLESUPPORT_USERNAME=abc@oracle.com
#------------------------------------------------------------------------------
AUTOUPDATES_MYORACLESUPPORT_USERNAME=

#------------------------------------------------------------------------------
# Specify the My Oracle Support Account Username password which has the patches download privileges  
# to be used for software updates.
#
# Example    : AUTOUPDATES_MYORACLESUPPORT_PASSWORD=password
#------------------------------------------------------------------------------
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=

Uma vez informada as opções de instalação no arquivo db_install.rsp, irei iniciar a instalação conforme demonstrado abaixo.

[oracle@linux1 ~]$ cd /install/database
[oracle@linux1 ~]$ ./runInstaller -silent -responseFile /install/database/response/db_install.rsp -waitforcompletion -ignorePrereq -showProgress
Starting Oracle Universal Installer...

Checking Temp space: must be greater than 120 MB.   Actual 76999 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 3066 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2017-06-19_08-45-47AM. Please wait ...You can find the log of this install session at:
 /u01/app/oraInventory/logs/installActions2017-06-20_06-45-47AM.log

Prepare in progress.
..................................................   9% Done.

Prepare successful.

Copy files in progress.
..................................................   14% Done.
..................................................   20% Done.
..................................................   26% Done.
..................................................   31% Done.
..................................................   36% Done.
..................................................   44% Done.
..................................................   49% Done.
..................................................   54% Done.
..................................................   59% Done.
..................................................   64% Done.
..................................................   69% Done.
..................................................   74% Done.
..................................................   79% Done.
..................................................   84% Done.
....................
Copy files successful.

Link binaries in progress.
..........
Link binaries successful.

Setup files in progress.
..................................................   89% Done.
..................................................   94% Done.

Setup files successful.
The installation of Oracle Database 11g was successful.
Please check '/u01/app/oraInventory/logs/silentInstall2017-06-20_06-45-47AM.log' for more details.

Execute Root Scripts in progress.

As a root user, execute the following script(s):
        1. /u01/app/oraInventory/orainstRoot.sh
        2. /u01/app/oracle/product/11.2.0/dbhome_1/root.sh


..................................................   100% Done.

Execute Root Scripts successful.

Após a instalação, será necessário executar os scripts shell a seguir com o usuário root.

[root@linux1 ~]# /u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.

[root@linux1 ~]# /u01/app/oracle/product/11.2.0/dbhome_1/root.sh
Check /u01/app/oracle/product/11.2.0/dbhome_1/install/root_linux1_2017-06-20_06-59-50.log for the output of root script

Como já demonstrado no artigo de Outubro/2011, o próximo passo é criar um banco de dados utilizando o utilitário DBCA em modo texto. Neste caso irei editar clonar o template New_Database.dbt com o nome de New_Database2.dbt e editá-lo conforme abaixo. Vale a pena salientar que dentro do template irei criar uma variável com nome de {ORADATA} que será usada para o destino dos arquivos do banco de dados BD01. Obs: Para fins estéticos, abaixo eu substituí os caracteres maior/menor por colchetes.

[oracle@linux1 ~]$ cat /u01/app/oracle/product/11.2.0/dbhome_1/assistants/dbca/templates/New_Database2.dbt
[DatabaseTemplate name="New Database" description="" version="11.2.0.0.0"]
   [CommonAttributes]
      [option name="OMS" value="false"/]
      [option name="JSERVER" value="false"/]
      [option name="SPATIAL" value="false"/]
      [option name="IMEDIA" value="false"/]
      [option name="ORACLE_TEXT" value="false"]
         [tablespace id="SYSAUX"/]
      [/option]
      [option name="XDB_PROTOCOLS" value="false"]
         [tablespace id="SYSAUX"/]
      [/option]
      [option name="CWMLITE" value="false"]
         [tablespace id="SYSAUX"/]
      [/option]
      [option name="EM_REPOSITORY" value="false"]
         [tablespace id="SYSAUX"/]
      [/option]
      [option name="SAMPLE_SCHEMA" value="false"/]
      [option name="APEX" value="false"/]
      [option name="OWB" value="false"/]
      [option name="DV" value="false"/]
   [/CommonAttributes]
   [Variables/]
   [CustomScripts Execute="false"/]
   [InitParamAttributes]
      [InitParams]
         [initParam name="db_block_size" value="8" unit="KB"/]
         [initParam name="memory_target" value="250" unit="MB"/]
         [initParam name="open_cursors" value="300"/]
         [initParam name="undo_tablespace" value="UNDOTBS1"/]
         [initParam name="control_files" value="("{ORADATA}/oradata/{DB_UNIQUE_NAME}/control01.ctl", "{ORADATA}/oradata/{DB_UNIQUE_NAME}/control02.ctl", "{ORADATA}/oradata/{DB_UNIQUE_NAME}/control03.ctl")"/]

         [initParam name="compatible" value="11.2.0.0.0"/]
         [initParam name="processes" value="150"/]
         [initParam name="audit_file_dest" value="{ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump"/]
         [initParam name="audit_trail" value="db"/]
         [initParam name="diagnostic_dest" value="{ORACLE_BASE}"/]
         [initParam name="remote_login_passwordfile" value="EXCLUSIVE"/]
         [initParam name="dispatchers" value="(PROTOCOL=TCP) (SERVICE={SID}XDB)"/]
         [initParam name="db_recovery_file_dest" value="{ORACLE_BASE}/fast_recovery_area"/]
         [initParam name="db_recovery_file_dest_size" value="" unit="MB"/]
      [/InitParams]
      [MiscParams]
         [databaseType]OLTP[/databaseType]
         [maxUserConn]20[/maxUserConn]
         [percentageMemTOSGA]40[/percentageMemTOSGA]
         [customSGA]true[/customSGA]
         [archiveLogMode]false[/archiveLogMode]
         [initParamFileName]{ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/pfile/init.ora[/initParamFileName]
      [/MiscParams]
      [SPfile useSPFile="true"]{ORACLE_HOME}/dbs/spfile{SID}.ora[/SPfile]
   [/InitParamAttributes]
   [StorageAttributes]
      [ControlfileAttributes id="Controlfile"]
         [maxDatafiles]100[/maxDatafiles]
         [maxLogfiles]16[/maxLogfiles]
         [maxLogMembers]3[/maxLogMembers]
         [maxLogHistory]1[/maxLogHistory]
         [maxInstances]8[/maxInstances]
         [image name="control01.ctl" filepath="{ORADATA}/oradata/{DB_UNIQUE_NAME}/"/]
         [image name="control02.ctl" filepath="{ORADATA}/oradata/{DB_UNIQUE_NAME}/"/]
         [image name="control03.ctl" filepath="{ORADATA}/oradata/{DB_UNIQUE_NAME}/"/]

      [/ControlfileAttributes]
      [DatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/sysaux01.dbf"]
         [tablespace]SYSAUX[/tablespace]
         [temporary]false[/temporary]
         [online]true[/online]
         [status]0[/status]
         [size unit="MB"]600[/size]
         [reuse]true[/reuse]
         [autoExtend]true[/autoExtend]
         [increment unit="KB"]10240[/increment]
         [maxSize unit="MB"]-1[/maxSize]
      [/DatafileAttributes]
      [DatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/users01.dbf"]
         [tablespace]USERS[/tablespace]
         [temporary]false[/temporary]
         [online]true[/online]
         [status]0[/status]
         [size unit="MB"]5[/size]
         [reuse]true[/reuse]
         [autoExtend]true[/autoExtend]
         [increment unit="KB"]1280[/increment]
         [maxSize unit="MB"]-1[/maxSize]
      [/DatafileAttributes]
      [DatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/system01.dbf"]
         [tablespace]SYSTEM[/tablespace]
         [temporary]false[/temporary]
         [online]true[/online]
         [status]0[/status]
         [size unit="MB"]700[/size]
         [reuse]true[/reuse]
         [autoExtend]true[/autoExtend]
         [increment unit="KB"]10240[/increment]
         [maxSize unit="MB"]-1[/maxSize]
      [/DatafileAttributes]
      [DatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/temp01.dbf"]
         [tablespace]TEMP[/tablespace]
         [temporary]false[/temporary]
         [online]true[/online]
         [status]0[/status]
         [size unit="MB"]20[/size]
         [reuse]true[/reuse]
         [autoExtend]true[/autoExtend]
         [increment unit="KB"]640[/increment]
         [maxSize unit="MB"]-1[/maxSize]
      [/DatafileAttributes]
      [DatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/undotbs01.dbf"]
         [tablespace]UNDOTBS1[/tablespace]
         [temporary]false[/temporary]
         [online]true[/online]
         [status]0[/status]
         [size unit="MB"]200[/size]
         [reuse]true[/reuse]
         [autoExtend]true[/autoExtend]
         [increment unit="KB"]5120[/increment]
         [maxSize unit="MB"]-1[/maxSize]
      [/DatafileAttributes]
      [TablespaceAttributes id="SYSAUX"]
         [online]true[/online]
         [offlineMode]1[/offlineMode]
         [readOnly]false[/readOnly]
         [temporary]false[/temporary]
         [defaultTemp]false[/defaultTemp]
         [undo]false[/undo]
         [local]true[/local]
         [blockSize]-1[/blockSize]
         [allocation]1[/allocation]
         [uniAllocSize unit="KB"]-1[/uniAllocSize]
         [initSize unit="KB"]64[/initSize]
         [increment unit="KB"]64[/increment]
         [incrementPercent]50[/incrementPercent]
         [minExtends]1[/minExtends]
         [maxExtends]4096[/maxExtends]
         [minExtendsSize unit="KB"]64[/minExtendsSize]
         [logging]true[/logging]
         [recoverable]false[/recoverable]
         [maxFreeSpace]0[/maxFreeSpace]
         [bigfile]false[/bigfile]
         [datafilesList]
            [TablespaceDatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/sysaux01.dbf"]
               [id]-1[/id]
            [/TablespaceDatafileAttributes]
         [/datafilesList]
      [/TablespaceAttributes]
      [TablespaceAttributes id="USERS"]
         [online]true[/online]
         [offlineMode]1[/offlineMode]
         [readOnly]false[/readOnly]
         [temporary]false[/temporary]
         [defaultTemp]false[/defaultTemp]
         [undo]false[/undo]
         [local]true[/local]
         [blockSize]-1[/blockSize]
         [allocation]1[/allocation]
         [uniAllocSize unit="KB"]-1[/uniAllocSize]
         [initSize unit="KB"]128[/initSize]
         [increment unit="KB"]128[/increment]
         [incrementPercent]0[/incrementPercent]
         [minExtends]1[/minExtends]
         [maxExtends]4096[/maxExtends]
         [minExtendsSize unit="KB"]128[/minExtendsSize]
         [logging]true[/logging]
         [recoverable]false[/recoverable]
         [maxFreeSpace]0[/maxFreeSpace]
         [bigfile]false[/bigfile]
         [datafilesList]
            [TablespaceDatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/users01.dbf"]
               [id]-1[/id]
            [/TablespaceDatafileAttributes]
         [/datafilesList]
      [/TablespaceAttributes]
      [TablespaceAttributes id="SYSTEM"]
         [online]true[/online]
         [offlineMode]1[/offlineMode]
         [readOnly]false[/readOnly]
         [temporary]false[/temporary]
         [defaultTemp]false[/defaultTemp]
         [undo]false[/undo]
         [local]true[/local]
         [blockSize]-1[/blockSize]
         [allocation]3[/allocation]
         [uniAllocSize unit="KB"]-1[/uniAllocSize]
         [initSize unit="KB"]64[/initSize]
         [increment unit="KB"]64[/increment]
         [incrementPercent]50[/incrementPercent]
         [minExtends]1[/minExtends]
         [maxExtends]-1[/maxExtends]
         [minExtendsSize unit="KB"]64[/minExtendsSize]
         [logging]true[/logging]
         [recoverable]false[/recoverable]
         [maxFreeSpace]0[/maxFreeSpace]
         [bigfile]false[/bigfile]
         [datafilesList]
            [TablespaceDatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/system01.dbf"]
               [id]-1[/id]
            [/TablespaceDatafileAttributes]
         [/datafilesList]
      [/TablespaceAttributes]
      [TablespaceAttributes id="TEMP"]
         [online]true[/online]
         [offlineMode]1[/offlineMode]
         [readOnly]false[/readOnly]
         [temporary]true[/temporary]
         [defaultTemp]true[/defaultTemp]
         [undo]false[/undo]
         [local]true[/local]
         [blockSize]-1[/blockSize]
         [allocation]1[/allocation]
         [uniAllocSize unit="KB"]-1[/uniAllocSize]
         [initSize unit="KB"]64[/initSize]
         [increment unit="KB"]64[/increment]
         [incrementPercent]0[/incrementPercent]
         [minExtends]1[/minExtends]
         [maxExtends]0[/maxExtends]
         [minExtendsSize unit="KB"]64[/minExtendsSize]
         [logging]true[/logging]
         [recoverable]false[/recoverable]
         [maxFreeSpace]0[/maxFreeSpace]
         [bigfile]false[/bigfile]
         [datafilesList]
            [TablespaceDatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/temp01.dbf"]
               [id]-1[/id]
            [/TablespaceDatafileAttributes]
         [/datafilesList]
      [/TablespaceAttributes]
      [TablespaceAttributes id="UNDOTBS1"]
         [online]true[/online]
         [offlineMode]1[/offlineMode]
         [readOnly]false[/readOnly]
         [temporary]false[/temporary]
         [defaultTemp]false[/defaultTemp]
         [undo]true[/undo]
         [local]true[/local]
         [blockSize]-1[/blockSize]
         [allocation]1[/allocation]
         [uniAllocSize unit="KB"]-1[/uniAllocSize]
         [initSize unit="KB"]512[/initSize]
         [increment unit="KB"]512[/increment]
         [incrementPercent]50[/incrementPercent]
         [minExtends]8[/minExtends]
         [maxExtends]4096[/maxExtends]
         [minExtendsSize unit="KB"]512[/minExtendsSize]
         [logging]true[/logging]
         [recoverable]false[/recoverable]
         [maxFreeSpace]0[/maxFreeSpace]
         [bigfile]false[/bigfile]
         [datafilesList]
            [TablespaceDatafileAttributes id="{ORADATA}/oradata/{DB_UNIQUE_NAME}/undotbs01.dbf"]
               [id]-1[/id]
            [/TablespaceDatafileAttributes]
         [/datafilesList]
      [/TablespaceAttributes]
      [RedoLogGroupAttributes id="1"]
         [reuse]false[/reuse]
         [fileSize unit="KB"]51200[/fileSize]
         [Thread]1[/Thread]
         [member ordinal="0" memberName="redo01.log" filepath="{ORADATA}/oradata/{DB_UNIQUE_NAME}/"/]
      [/RedoLogGroupAttributes]
      [RedoLogGroupAttributes id="2"]
         [reuse]false[/reuse]
         [fileSize unit="KB"]51200[/fileSize]
         [Thread]1[/Thread]
         [member ordinal="0" memberName="redo02.log" filepath="{ORADATA}/oradata/{DB_UNIQUE_NAME}/"/]
      [/RedoLogGroupAttributes]
      [RedoLogGroupAttributes id="3"]
         [reuse]false[/reuse]
         [fileSize unit="KB"]51200[/fileSize]
         [Thread]1[/Thread]
         [member ordinal="0" memberName="redo03.log" filepath="{ORADATA}/oradata/{DB_UNIQUE_NAME}/"/]
      [/RedoLogGroupAttributes]
   [/StorageAttributes]
[/DatabaseTemplate]

Uma vez configurado o arquivo de resposta do DBCA, realizarei a seguir a criação do banco de dados BD01.

[oracle@linux1 ~]$ dbca -silent 
                        -createDatabase
                        -templateName New_Database2.dbt
                        -gdbName BD01
                        -sysPassword manager
                        -systemPassword manager
                        -characterset WE8MSWIN1252
                        -nationalCharacterSet AL16UTF16
                        -emConfiguration NONE
                        -databaseType OLTP
                        -variables ORADATA=/data/
Creating and starting Oracle instance
2% complete
3% complete
5% complete
12% complete
Creating database files
13% complete
25% complete
Creating data dictionary views
28% complete
32% complete
36% complete
37% complete
38% complete
39% complete
40% complete
41% complete
42% complete
43% complete
44% complete
45% complete
46% complete
47% complete
48% complete
55% complete
59% complete
62% complete
63% complete
66% complete
Completing Database Creation
70% complete
73% complete
77% complete
88% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/BD01/BD01.log" for further details.

Como último passo, basta apenas iniciar o processo do LISTENER conforme a seguir.

[oracle@linux1 ~]$ lsnrctl start

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 20-JUN-2017 07:06:39

Copyright (c) 1991, 2011, Oracle.  All rights reserved.

Starting /u01/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Log messages written to /u01/app/oracle/diag/tnslsnr/linux1/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=linux1)(PORT=1521)))

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                20-JUN-2017 07:06:40
Uptime                    0 days 0 hr. 0 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Log File         /u01/app/oracle/diag/tnslsnr/linux1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=linux1)(PORT=1521)))
The listener supports no services
The command completed successfully

Postagens populares