quarta-feira, 10 de janeiro de 2018

Migrando tabelas gigantes para tabelas particionadas no Tibero


Uma das preocupações comuns durante a migração de dados é em relação a tabelas com grande volume de dados, que não estão particionadas.
Esta é a principal causa de grandes janelas de migração, principalmente quando existem tipos LOB nas tabelas de origem.
Não importa qual o motivo destas tabelas de origem não estarem particionadas.
O fato é que se estivessem particionadas, o processo de migração das partições antigas, poderiam ser realizados antecipadamente.
Deixando para o dia “D”, somente a tarefa de migrar a partição atual, minimizando a janela de migração final drasticamente.
Evidente que isso não se aplica para todos os tipos de particionamento,

Neste exemplo, demonstraremos como realizar esta tarefa para o Tibero usando o particionamento por range de datas, que é muito comum.

Para este exemplo usaremos a ferramenta "table_migrator" do Tibero (Não é uma ferramenta oficial do produto! Mas pode utilizada, Download: table_migrator_6_170201)

Para maiores informações sobre esta ferramenta acesse: Tibero Migration Utility Guide

Esta ferramenta permite a utilização de "filtros", onde direcionaremos os dados para suas respectivas partições de destino durante a migração.

Faremos uma migração de uma tabela não particionada do Oracle para uma tabela particionada no Tibero.

➔ Criando a tabela de origem: (ORACLE)

CREATE TABLE LUIZ.TESTE(ID NUMBER(5,0) PRIMARY KEY, NAME VARCHAR2(100), AGE NUMBER(3,0), DOC CLOB, STARTDATE DATE);

➔ Inserindo dados:

DECLARE
D  NUMBER(2,0);
M  NUMBER(2,0);
Y  NUMBER(4,0);
DT DATE;
BEGIN
FOR N IN 1..1000 LOOP
D  := DBMS_RANDOM.VALUE(1, 28);
M  := DBMS_RANDOM.VALUE(1, 12);
Y  := DBMS_RANDOM.VALUE(2010, 2017);
DT := TO_DATE(D || '/' || M || '/' || Y, 'DD/MM/YYYY');
INSERT INTO LUIZ.TESTE VALUES (N, DBMS_RANDOM.STRING('U', 100), DBMS_RANDOM.VALUE(21,85), DBMS_RANDOM.STRING('U', 1000), DT);
END LOOP;
COMMIT;
END;

➔ Verificação:

SELECT COUNT(*) FROM LUIZ.TESTE;
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2010' AND STARTDATE < '01/01/2011';
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2011' AND STARTDATE < '01/01/2012';
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2012' AND STARTDATE < '01/01/2013';
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2013' AND STARTDATE < '01/01/2014';
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2014' AND STARTDATE < '01/01/2015';
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2015' AND STARTDATE < '01/01/2016';
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2016' AND STARTDATE < '01/01/2017';
SELECT COUNT(*) FROM LUIZ.TESTE WHERE STARTDATE >= '01/01/2017' AND STARTDATE < '01/01/2018';

  COUNT(*)
----------
      1000

  COUNT(*)
----------
        79

  COUNT(*)
----------
       134

  COUNT(*)
----------
       138

  COUNT(*)
----------
       135

  COUNT(*)
----------
       137

  COUNT(*)
----------
       145

  COUNT(*)
----------
       158

  COUNT(*)
----------
        74

➔ TESTE 001: (TIBERO)

Testando a migração full de todos os registros da base de origem.

Resultado esperado:

Todos os registros alocados nas devidas partições de acordo com o critério de data.

CREATE TABLE LUIZ.TESTE(ID NUMBER(5,0) PRIMARY KEY, NAME VARCHAR2(100), AGE NUMBER(3,0), DOC CLOB, STARTDATE DATE)
PARTITION BY RANGE (STARTDATE)
(
PARTITION YEAR_2010 VALUES LESS THAN (TO_DATE('01/01/2011', 'DD/MM/YYYY')),
PARTITION YEAR_2011 VALUES LESS THAN (TO_DATE('01/01/2012', 'DD/MM/YYYY')),
PARTITION YEAR_2012 VALUES LESS THAN (TO_DATE('01/01/2013', 'DD/MM/YYYY')),
PARTITION YEAR_2013 VALUES LESS THAN (TO_DATE('01/01/2014', 'DD/MM/YYYY')),
PARTITION YEAR_2014 VALUES LESS THAN (TO_DATE('01/01/2015', 'DD/MM/YYYY')),
PARTITION YEAR_2015 VALUES LESS THAN (TO_DATE('01/01/2016', 'DD/MM/YYYY')),
PARTITION YEAR_2016 VALUES LESS THAN (TO_DATE('01/01/2017', 'DD/MM/YYYY')),
PARTITION YEAR_2017 VALUES LESS THAN (TO_DATE('01/01/2018', 'DD/MM/YYYY'))
);

SELECT * FROM DBA_PART_TABLES;

OWNER TABLE_NAME PARTITIONING_TYPE SUBPARTITIONING_TYPE PARTITION_COUNT DEF_SUBPARTITION_COUNT PARTITIONING_KEY_COUNT SUBPARTITIONING_KEY_COUNT DEF_TABLESPACE_NAME DEF_PCT_FREE DEF_INI_TRANS DEF_NEXT_EXTENT DEF_MAX_EXTENTS DEF_BUFFER_POOL MAX_TRANS INITIAL_EXTENT MIN_EXTENT INTERVAL
LUIZ TESTE RANGE NONE 8 0 1 0 USR 10 2 16 4,294,967,295 DEFAULT 163 131,072 65,536 <NULL>

SELECT * FROM DBA_TAB_PARTITIONS;

OWNER TABLE_NAME COMPOSITE PARTITION_NAME SUBPARTITION_COUNT BOUND PARTITION_NO TABLESPACE_NAME PCT_FREE INI_TRANS NEXT_EXTENT MAX_EXTENTS COMPRESSION BUFFER_POOL NUM_ROWS BLOCKS LAST_ANALYZED LOGGING
LUIZ TESTE NO YEAR_2010 0 TO_DATE('01/01/2011', 'DD/MM/YYYY') 1 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES
LUIZ TESTE NO YEAR_2011 0 TO_DATE('01/01/2012', 'DD/MM/YYYY') 2 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES
LUIZ TESTE NO YEAR_2012 0 TO_DATE('01/01/2013', 'DD/MM/YYYY') 3 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES
LUIZ TESTE NO YEAR_2013 0 TO_DATE('01/01/2014', 'DD/MM/YYYY') 4 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES
LUIZ TESTE NO YEAR_2014 0 TO_DATE('01/01/2015', 'DD/MM/YYYY') 5 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES
LUIZ TESTE NO YEAR_2015 0 TO_DATE('01/01/2016', 'DD/MM/YYYY') 6 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES
LUIZ TESTE NO YEAR_2016 0 TO_DATE('01/01/2017', 'DD/MM/YYYY') 7 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES
LUIZ TESTE NO YEAR_2017 0 TO_DATE('01/01/2018', 'DD/MM/YYYY') 8 USR 10 2 131,072 4,294,967,295 NO DEFAULT 0 0 <NULL> YES

./migrator.sh \
SOURCE_TYPE=ORACLE \
SOURCE_DRIVER=oracle.jdbc.OracleDriver \
SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl \
SOURCE_USER=SYSTEM \
SOURCE_PASSWORD=manager \
SOURCE_LOGIN_AS=NORMAL \
SOURCE_SCHEMA=LUIZ \
SOURCE_TABLE=TESTE \
TARGET_TYPE=DEFAULT \
TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver \
TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero \
TARGET_USER=SYS \
TARGET_PASSWORD=tibero \
TARGET_SCHEMA=LUIZ \
TARGET_TABLE=TESTE \
SELECT_FETCH_SIZE=16384 \
INSERT_PARALLEL=Y \
INSERT_THREAD_COUNT=4 \
INSERT_BATCH=Y \
INSERT_METHOD=CPL

> SOURCE_TYPE=ORACLE \
> SOURCE_DRIVER=oracle.jdbc.OracleDriver \
> SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl \
> SOURCE_USER=SYSTEM \
> SOURCE_PASSWORD=manager \
> SOURCE_LOGIN_AS=NORMAL \
> SOURCE_SCHEMA=LUIZ \
> SOURCE_TABLE=TESTE \
> TARGET_TYPE=DEFAULT \
> TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver \
> TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero \
> TARGET_USER=SYS \
> TARGET_PASSWORD=tibero \
> TARGET_SCHEMA=LUIZ \
> TARGET_TABLE=TESTE \
> SELECT_FETCH_SIZE=16384 \
> INSERT_PARALLEL=Y \
> INSERT_THREAD_COUNT=4 \
> INSERT_BATCH=Y \
> INSERT_METHOD=CPL
=== Parameters ===
PROPERTY_FILE=migrator.properties
SOURCE_TYPE=ORACLE
SOURCE_DRIVER=oracle.jdbc.OracleDriver
SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl
SOURCE_USER=SYSTEM
SOURCE_PASSWORD=************
SOURCE_LOGIN_AS=NORMAL
SOURCE_SCHEMA=LUIZ
SOURCE_TABLE=TESTE
TARGET_TYPE=DEFAULT
TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver
TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero
TARGET_USER=SYS
TARGET_PASSWORD=************
TARGET_SCHEMA=LUIZ
TARGET_TABLE=TESTE
SELECT_FETCH_SIZE=16384
SELECT_AS_BYTE=N
INSERT_METHOD=CPL
INSERT_BATCH=Y
INSERT_PARALLEL=Y
INSERT_THREAD_COUNT=4
INSERT_ZERO_LENGTH_STRING_AS_NULL=Y

==================
[E0]1511231254712 - STARTED
[L0]1511231255081 Loader started
[L1]1511231255109 Loader started
[L2]1511231255133 Loader started
[L3]1511231255145 Loader started
[L3] 32
[L2] 32
[L0] 32
[L1] 32
[L2] 64
[L3] 64
[L1] 64
[L0] 64
[L3] 96
[L1] 96
[L2] 96
[L0] 96
[L3] 128
[L2] 128
[L1] 128
[L0] 128
[L3] 160
[L1] 160
[L2] 160
[L3] 192
[E0]1511231255806 - TOTAL Extracted ROWS: 1000
[L2] 192
[L0] 160
[L1] 192
[L3] 224
[L2] 224
[L0] 192
[L1] 224
[L3] 256
[L2] 256
[L0] 224
[L1] 256
[L1]1511231255948 TOTAL Loaded ROWS: 256
Loader finished
[L3]1511231255979 TOTAL Loaded ROWS: 262
Loader finished
[L0]1511231255979 TOTAL Loaded ROWS: 225
Loader finished
[L2]1511231255979 TOTAL Loaded ROWS: 257
Loader finished
Loading is ended.
Elapsed Time (milliseconds) : 2460
ADD BATCH : 1435
EXECUTE BATCH : 1491

SELECT COUNT(*) FROM LUIZ.TESTE;
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2010);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2011);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2012);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2013);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2014);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2015);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2016);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2017);

  COUNT(*)
----------
      1000

1 row selected.

SQL>
  COUNT(*)
----------
        79

1 row selected.

SQL>
  COUNT(*)
----------
       134

1 row selected.

SQL>
  COUNT(*)
----------
       138

1 row selected.

SQL>
  COUNT(*)
----------
       135

1 row selected.

SQL>
  COUNT(*)
----------
       137

1 row selected.

SQL>
  COUNT(*)
----------
       145

1 row selected.

SQL>
  COUNT(*)
----------
       158

1 row selected.

SQL>
  COUNT(*)
----------
        74

➔ TESTE 002:

Testando a migração full de todos os registros da base de origem antes de 2017.
Migrar depois os registros de 2017.

Resultado esperado:

Todos os registros alocados nas devidas partições de acordo com o critério de data.

TRUNCATE TABLE LUIZ.TESTE;

Table 'LUIZ.TESTE' truncated.

SELECT * FROM  LUIZ.TESTE;

0 row selected.

Migração 001:

./migrator.sh \
SOURCE_TYPE=ORACLE \
SOURCE_DRIVER=oracle.jdbc.OracleDriver \
SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl \
SOURCE_USER=SYSTEM \
SOURCE_PASSWORD=manager \
SOURCE_LOGIN_AS=NORMAL \
SOURCE_SCHEMA=LUIZ \
SOURCE_TABLE=TESTE \
TARGET_TYPE=DEFAULT \
TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver \
TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero \
TARGET_USER=SYS \
TARGET_PASSWORD=tibero \
TARGET_SCHEMA=LUIZ \
TARGET_TABLE=TESTE \
SELECT_CONDITION="STARTDATE < TO_DATE('01/01/2017', 'DD/MM/YYYY')" \
SELECT_FETCH_SIZE=16384 \
INSERT_PARALLEL=Y \
INSERT_THREAD_COUNT=4 \
INSERT_BATCH=Y \
INSERT_METHOD=CPL

[tiberotst@rick-ln table_migrator]$ ./migrator.sh \
> SOURCE_TYPE=ORACLE \
> SOURCE_DRIVER=oracle.jdbc.OracleDriver \
> SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl \
> SOURCE_USER=SYSTEM \
> SOURCE_PASSWORD=manager \
> SOURCE_LOGIN_AS=NORMAL \
> SOURCE_SCHEMA=LUIZ \
> SOURCE_TABLE=TESTE \
> TARGET_TYPE=DEFAULT \
> TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver \
> TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero \
> TARGET_USER=SYS \
> TARGET_PASSWORD=tibero \
> TARGET_SCHEMA=LUIZ \
> TARGET_TABLE=TESTE \
> SELECT_CONDITION="STARTDATE < TO_DATE('01/01/2017', 'DD/MM/YYYY')" \
> SELECT_FETCH_SIZE=16384 \
> INSERT_PARALLEL=Y \
> INSERT_THREAD_COUNT=4 \
> INSERT_BATCH=Y \
> INSERT_METHOD=CPL
=== Parameters ===
PROPERTY_FILE=migrator.properties
SOURCE_TYPE=ORACLE
SOURCE_DRIVER=oracle.jdbc.OracleDriver
SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl
SOURCE_USER=SYSTEM
SOURCE_PASSWORD=************
SOURCE_LOGIN_AS=NORMAL
SOURCE_SCHEMA=LUIZ
SOURCE_TABLE=TESTE
TARGET_TYPE=DEFAULT
TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver
TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero
TARGET_USER=SYS
TARGET_PASSWORD=************
TARGET_SCHEMA=LUIZ
TARGET_TABLE=TESTE
SELECT_CONDITION=STARTDATE < TO_DATE('01/01/2017', 'DD/MM/YYYY')
SELECT_FETCH_SIZE=16384
SELECT_AS_BYTE=N
INSERT_METHOD=CPL
INSERT_BATCH=Y
INSERT_PARALLEL=Y
INSERT_THREAD_COUNT=4
INSERT_ZERO_LENGTH_STRING_AS_NULL=Y

==================
[E0]1511233256441 - STARTED
[E0]1511233256843 - TOTAL Extracted ROWS: 926
[L0]1511233256850 Loader started
[L1]1511233256869 Loader started
[L2]1511233256899 Loader started
[L3]1511233256908 Loader started
[L0] 32
[L3] 32
[L1] 32
[L2] 32
[L0] 64
[L3] 64
[L2] 64
[L1] 64
[L3] 96
[L2] 96
[L0] 96
[L1] 96
[L3] 128
[L0] 128
[L2] 128
[L1] 128
[L3] 160
[L0] 160
[L2] 160
[L1] 160
[L0] 192
[L3] 192
[L2] 192
[L1] 192
[L0] 224
[L2] 224
[L3] 224
[L3]1511233257331 TOTAL Loaded ROWS: 224
Loader finished
[L1] 224
[L1]1511233257331 TOTAL Loaded ROWS: 224
Loader finished
[L2]1511233257335 TOTAL Loaded ROWS: 232
Loader finished
[L0]1511233257339 TOTAL Loaded ROWS: 246
Loader finished
Loading is ended.
Elapsed Time (milliseconds) : 1866
ADD BATCH : 526
EXECUTE BATCH : 984

SELECT COUNT(*) FROM LUIZ.TESTE;
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2010);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2011);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2012);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2013);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2014);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2015);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2016);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2017);

  COUNT(*)
----------
       926

1 row selected.

SQL>
  COUNT(*)
----------
        79

1 row selected.

SQL>
  COUNT(*)
----------
       134

1 row selected.

SQL>
  COUNT(*)
----------
       138

1 row selected.

SQL>
  COUNT(*)
----------
       135

1 row selected.

SQL>
  COUNT(*)
----------
       137

1 row selected.

SQL>
  COUNT(*)
----------
       145

1 row selected.

SQL>
  COUNT(*)
----------
       158

1 row selected.

SQL>
  COUNT(*)
----------
         0

1 row selected.

Migração 002:

./migrator.sh \
SOURCE_TYPE=ORACLE \
SOURCE_DRIVER=oracle.jdbc.OracleDriver \
SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl \
SOURCE_USER=SYSTEM \
SOURCE_PASSWORD=manager \
SOURCE_LOGIN_AS=NORMAL \
SOURCE_SCHEMA=LUIZ \
SOURCE_TABLE=TESTE \
TARGET_TYPE=DEFAULT \
TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver \
TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero \
TARGET_USER=SYS \
TARGET_PASSWORD=tibero \
TARGET_SCHEMA=LUIZ \
TARGET_TABLE=TESTE \
SELECT_CONDITION="STARTDATE >= TO_DATE('01/01/2017', 'DD/MM/YYYY')" \
SELECT_FETCH_SIZE=16384 \
INSERT_PARALLEL=Y \
INSERT_THREAD_COUNT=4 \
INSERT_BATCH=Y \
INSERT_METHOD=CPL

[tiberotst@rick-ln table_migrator]$ ./migrator.sh \
> SOURCE_TYPE=ORACLE \
> SOURCE_DRIVER=oracle.jdbc.OracleDriver \
> SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl \
> SOURCE_USER=SYSTEM \
> SOURCE_PASSWORD=manager \
> SOURCE_LOGIN_AS=NORMAL \
> SOURCE_SCHEMA=LUIZ \
> SOURCE_TABLE=TESTE \
> TARGET_TYPE=DEFAULT \
> TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver \
> TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero \
> TARGET_USER=SYS \
> TARGET_PASSWORD=tibero \
> TARGET_SCHEMA=LUIZ \
> TARGET_TABLE=TESTE \
> SELECT_CONDITION="STARTDATE >= TO_DATE('01/01/2017', 'DD/MM/YYYY')" \
> SELECT_FETCH_SIZE=16384 \
> INSERT_PARALLEL=Y \
> INSERT_THREAD_COUNT=4 \
> INSERT_BATCH=Y \
> INSERT_METHOD=CPL
=== Parameters ===
PROPERTY_FILE=migrator.properties
SOURCE_TYPE=ORACLE
SOURCE_DRIVER=oracle.jdbc.OracleDriver
SOURCE_URL=jdbc:oracle:thin:@100.100.100.100:1521:orcl
SOURCE_USER=SYSTEM
SOURCE_PASSWORD=************
SOURCE_LOGIN_AS=NORMAL
SOURCE_SCHEMA=LUIZ
SOURCE_TABLE=TESTE
TARGET_TYPE=DEFAULT
TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver
TARGET_URL=jdbc:tibero:thin:@100.100.100.100:8629:tibero
TARGET_USER=SYS
TARGET_PASSWORD=************
TARGET_SCHEMA=LUIZ
TARGET_TABLE=TESTE
SELECT_CONDITION=STARTDATE >= TO_DATE('01/01/2017', 'DD/MM/YYYY')
SELECT_FETCH_SIZE=16384
SELECT_AS_BYTE=N
INSERT_METHOD=CPL
INSERT_BATCH=Y
INSERT_PARALLEL=Y
INSERT_THREAD_COUNT=4
INSERT_ZERO_LENGTH_STRING_AS_NULL=Y

==================
[E0]1511233413132 - STARTED
[E0]1511233413319 - TOTAL Extracted ROWS: 74
[L0]1511233413424 Loader started
[L1]1511233413432 Loader started
[L2]1511233413462 Loader started
[L1]1511233413492 TOTAL Loaded ROWS: 12
Loader finished
[L3]1511233413494 Loader started
[L3]1511233413494 TOTAL Loaded ROWS: 0
Loader finished
[L0] 32
[L0]1511233413508 TOTAL Loaded ROWS: 32
Loader finished
[L2]1511233413511 TOTAL Loaded ROWS: 30
Loader finished
Loading is ended.
Elapsed Time (milliseconds) : 1448
ADD BATCH : 80
EXECUTE BATCH : 28

SELECT COUNT(*) FROM LUIZ.TESTE;
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2010);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2011);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2012);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2013);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2014);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2015);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2016);
SELECT COUNT(*) FROM LUIZ.TESTE PARTITION(YEAR_2017);

  COUNT(*)
----------
      1000

1 row selected.

SQL>
  COUNT(*)
----------
        79

1 row selected.

SQL>
  COUNT(*)
----------
       134

1 row selected.

SQL>
  COUNT(*)
----------
       138

1 row selected.

SQL>
  COUNT(*)
----------
       135

1 row selected.

SQL>
  COUNT(*)
----------
       137

1 row selected.

SQL>
  COUNT(*)
----------
       145

1 row selected.

SQL>
  COUNT(*)
----------
       158

1 row selected.

SQL>
  COUNT(*)
----------
        74

1 row selected.

terça-feira, 9 de janeiro de 2018

Vídeo informando como instalar o Tibero 6 no Linux

Este vídeo demonstra como instalar o Tibero 6 no Linux usando o método manual de instalação. Para detalhes de como instalar o Tibero 6 automaticamente no Linux, favor consultar o manual de instalação.


Vídeo informando como instalar o Tibero 6 no Windows

Este vídeo demonstra como instalar o Tibero 6 no Windows usando o método automático de instalação. Para detalhes de como instalar o Tibero 6 manualmente no Windows, favor consultar o manual de instalação.


Vídeo informando como instalar os pré-requisitos do Tibero 6

Este vídeo demonstra como instalar / configurar os pré-requisitos para a instalação do Tibero 6.


Vídeo informando como fazer o download do Tibero 6


Este vídeo demonstra como realizar o download do Tibero 6.



quinta-feira, 19 de outubro de 2017

Tibero 6 disponível no AWS Marketplace

O Tibero 6 foi lançado na plataforma AWS. Pode ser localizado com o título: "Tibero CE Cloud Edition - RHEL".

O Tibero CE (Cloud Edition) é uma versão exclusiva do Tibero 6, um SGBD relacional padrão, que oferece uma arquitetura preparada em nuvem, eficiente em termos de recursos e confiável, para pedidos de processamento de dados de alto volume usando sessões em grande escala. Um sistema de gerenciamento de banco de dados relacional representativo, o Tibero CE oferece um desenvolvimento fácil e flexível com foco na conformidade e compatibilidade de padrões SQL.

Confira os detalhes Aqui.

quinta-feira, 12 de outubro de 2017

Como criar um ambiente de Alta Disponibilidade usando TAC

Bom pessoal, como estamos recebendo bastante solicitações de como criar um ambiente de HA (High Availability) no Tibero usando TAC (Tibero Active Cluster), tecnologia similar ao Oracle RAC, resolvi criar este tutorial para ajudar. Não vou entrar em questões sobre como preparar a infraestrutura para isso neste momento. Para referência, estou usando um ambiente virtual usando VirtuaBox, Com 2 VMs Linux instaladas e com um disco compartilhado entre elas, configurado no virtualizador mesmo.
Espero poder passar para vocês o quanto é simples a configuração de um TAC no Tibero. Alguns "experts" no Brasil já conseguiram finalizar esta tarefa em aproximadamente 10 a 15 minutos. É claro que toda a preparação de infraestrutura já havia sido feita anteriormente. Mesmo assim, a tarefa de criação do TAC é muito simples, permitindo estas finalizações bem rápidas para quem é expert no assunto.

NOTA: Este exemplo baseia-se na versão 6 Fixset 6 do Tibero.

Antes de iniciar, é importante a leitura completa dos manuais do Tibero sobre estes assuntos. Assim como a instalação e configuração dos pré-requisitos de instalação do Tibero.

Para configurar um ambiente de alta disponibilidade, muitas informações são necessárias previamente. Planejamento é fundamental, portanto, elaboramos um mapa de uma situação hipotética para ajudar a configurar o ambiente de forma apropriada. Esta prática é recomendada, pois as variáveis ficam claras no momento de atribuir os valores corretos nos processos de configuração do ambiente.

Para este exercício, algumas etapas anteriores são necessárias, como a criação de VMs com Linux e todo o setup delas. Não é o foco deste tutorial informar como criar este ambiente de infraestrutura. Se alguém tiver alguma dúvida neste sentido, ou qualquer outra dúvida, por favor utilize os comentários deste post.

Termos utilizados neste material:

TAS ou AS (Tibero Active Storage): Responsável pela virtualização de discos, "logic shared cluster file system" entre as instâncias do TAC, entre outras funções.

TAC (Tibero Active Cluster): É a principal tecnologia do Tibero que fornece alta disponibilidade e escalabilidade compartilhando um banco de dados em comum. Funções como load balance e failover são nativas desta tecnologia.

TCM ou CM (Tibero Cluster Manager): Responsável por gerenciar as funções de cluster entre as instâncias do Tibero em um ambiente de alta disponibilidade.
VIP (Virtual IP): Tecnologia que permite a transição de IPs entre os nodes do TAC em caso de falha de algum node, tornando a operação transparente.

Diagrama em blocos genérico de um ambiente de alta disponibilidade usando o Tibero:
(Créditos da imagem para: Franco Rizzo - TmaxSoft USA)


Desenho do esquema da solução usada neste exemplo:


Script de implementação:

⇨ TAS + TAC:

- Instalação e configuração do TAS:

- VM1:

      - Configurar as variáveis de ambiente:

[root@tac1-training ~]# su - tibero

[tibero@tac1-training ~]$ vi .bash_profile
##############################################################
# TIBERO TAS:
##############################################################
export TB_HOME=/home/tibero/tibero6
export TB_SID=tas1
export CM_SID=cm1
export CM_HOME=/home/tibero/tibero6
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
tibero@tac1-training ~]$ source .bash_profile

  - Instalar o Tibero:

[tibero@tac1-training ~]$ tar -xzvf /home/install/tibero6-bin-FS06-linux64-142998-opt-20170420182339.tar.gz
[tibero@tac1-training ~]$ cp /home/install/tac1-training.tibero.license.xml tibero6/license/license.xml
  - Configurar o arquivo de parâmetros de inicialização do Tibero:

[tibero@tac1-training ~]$ cd tibero6/config/
[tibero@tac1-training config]$ sh gen_tip.sh

[tibero@tac1-training config]$ vi tas1.tip
DB_NAME=tas
LISTENER_PORT=9620
MAX_SESSION_COUNT=20
MEMORY_TARGET=2G
TOTAL_SHM_SIZE=1G
INSTANCE_TYPE=AS
AS_DISKSTRING="/db/tibero/devs/disk*"
CLUSTER_DATABASE=Y
LOCAL_CLUSTER_ADDR=100.100.100.10
LOCAL_CLUSTER_PORT=20000
CM_PORT=48629
THREAD=0

[tibero@tac1-training config]$ vi cm1.tip
CM_NAME=cm1
CM_UI_PORT=48629
CM_RESOURCE_FILE="/home/tibero/tibero6/config/cm1.rsc"
CM_HEARTBEAT_EXPIRE=60
CM_WATCHDOG_EXPIRE=55

      - Configurar os parâmetros de conexão do client:

[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tas1=
((INSTANCE=(HOST=100.100.100.10)
(PORT=9620)
(DB_NAME=tas)
  )
)

  - Criar e iniciar o Disk Space do TAS:

[tibero@tac1-training config]$ tbboot nomount
[tibero@tac1-training config]$ tbsql sys/tibero@tas1
SQL>
CREATE DISKSPACE ds0 NORMAL REDUNDANCY
FAILGROUP fg1 DISK
'/db/tibero/devs/disk101' NAME disk101
FAILGROUP fg2 DISK
'/db/tibero/devs/disk201' NAME disk201
ATTRIBUTE 'AU_SIZE'='4M';

- Instalação e configuração do TAC:

- VM1:

[tibero@tac1-training config]$ cd $TB_HOME

[tibero@tac1-training tibero6]$ vi tas1.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tas1; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH
  - Adicionar os recursos do TAC:

[tibero@tac1-training tibero6]$ tbcm -b
[tibero@tac1-training tibero6]$ tbcm -s
-  Adicionar o recurso de rede privada:

[tibero@tac1-training tibero6]$ cmrctl add network --nettype private --ipaddr 100.100.100.10  --portno 18629 --name net1
  - Adicionar o recurso de rede pública:

[tibero@tac1-training tibero6]$ cmrctl add network --nettype public --ifname enp0s3 --name pub1

  - Adicionar o recurso de cluster:

[tibero@tac1-training tibero6]$ cmrctl add cluster --incnet net1 --pubnet pub1 --cfile "+/db/tibero/devs/disk*" --name cls1
[tibero@tac1-training tibero6]$ cmrctl start cluster --name cls1

  - Adicionar o recurso de serviço do TAS:

[tibero@tac1-training tibero6]$ cmrctl add service --name tas --type as --cname cls1
  - Adicionar o recurso do TAS:

[tibero@tac1-training tibero6]$ cmrctl add as --name tas1 --svcname tas --dbhome $CM_HOME --envfile /home/tibero/tibero6/tas1.profile

  - Iniciar a instância do TAS:

[tibero@tac1-training tibero6]$ cmrctl start as --name tas1
  - Conectar na instância em execução e adicionar a THREAD para o start up do TAS no node 2:

[tibero@tac1-training tibero6]$ tbsql sys/tibero@tas1

SQL>
ALTER DISKSPACE ds0 ADD THREAD 1;
  - Adicionar o recurso de serviço do TAC:

cmrctl add service --name tac --cname cls1
  - Criar um arquivo de profile requerido pelo CM para o node 1:

[tibero@tac1-training tibero6]$ vi tac1.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tac1; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH

  - Criar o arquivo de parâmetros de inicialização do Tibero para o TAC1:

[tibero@tac1-training tibero6]$ vi config/tac1.tip
DB_NAME=tac
LISTENER_PORT=8629
CONTROL_FILES="+DS0/tac/c1.ctl"
DB_CREATE_FILE_DEST="+DS0/tac"
LOG_ARCHIVE_DEST="+DS0/tac/archive"
MAX_SESSION_COUNT=20
TOTAL_SHM_SIZE=1G
MEMORY_TARGET=2G
USE_ACTIVE_STORAGE=Y
AS_PORT=9620
LOCAL_CLUSTER_ADDR=100.100.100.10
CM_PORT=48629
LOCAL_CLUSTER_PORT=21000
CLUSTER_DATABASE=Y
THREAD=0
UNDO_TABLESPACE=UNDO0
  - Adicionar o recurso de Database:

[tibero@tac1-training tibero6]$ cmrctl add db --name tac1 --svcname tac --dbhome $CM_HOME --envfile /home/tibero/tibero6/tac1.profile

  - Iniciar a instância do Database em NOMOUNT mode:

[tibero@tac1-training tibero6]$ cmrctl start db --name tac1 --option "-t nomount"
      - Configurar os parâmetros de conexão do client:

[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tac1=
((INSTANCE=(HOST=100.100.100.10)
(PORT=8629)
(DB_NAME=tac)
  )
)

  - Criar o Database:

[tibero@tac1-training tibero6]$ tbsql sys/tibero@tac1
SQL>
  CREATE DATABASE "tac"
USER sys IDENTIFIED BY tibero
MAXINSTANCES 8
MAXDATAFILES 256
CHARACTER SET WE8MSWIN1252
LOGFILE
      GROUP 0 '+DS0/tac/log001.log' SIZE 100M,
GROUP 1 '+DS0/tac/log011.log' SIZE 100M,
GROUP 2 '+DS0/tac/log021.log' SIZE 100M
MAXLOGFILES 255
MAXLOGMEMBERS 8
NOARCHIVELOG
DATAFILE '+DS0/tac/system001.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M
    DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '+DS0/tac/temp001.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M EXTENT MANAGEMENT LOCAL AUTOALLOCATE
UNDO TABLESPACE UNDO0 DATAFILE '+DS0/tac/undo001.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

  - Iniciar a instância do Database em NORMAL mode:

[tibero@tac1-training tibero6]$ cmrctl start db --name tac1
  - Criar o UNDO TABLESPACE para o segundo node do TAC:

[tibero@tac1-training tibero6]$ tbsql sys/tibero@tac1

SQL>
  CREATE UNDO TABLESPACE UNDO1 DATAFILE '+DS0/tac/undo002.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
  - Adicionar os REDO LOGS para o segundo node do TAC:

SQL>
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 3 '+DS0/tac/log031.log' size 100M;
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 4 '+DS0/tac/log041.log' size 100M;
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 5 '+DS0/tac/log051.log' size 100M;

  - Adicionar a THREAD pública para o segundo node do TAC:

SQL>
ALTER DATABASE ENABLE PUBLIC THREAD 1;
  - Criar o dicionário de dados do sistema:

[tibero@tac1-training tibero6]$ . ./tac1.profile
[tibero@tac1-training tibero6]$ sh $TB_HOME/scripts/system.sh -p1 tibero -p2 syscat -a1 Y -a2 Y -a3 Y -a4 Y

- Instalação e configuração do TAS:

- VM2:

      - Configurar as variáveis de ambiente:

[root@tac2-training ~]# su - tibero

[tibero@tac2-training ~]$ vi .bash_profile
##############################################################
# TIBERO TAS:
##############################################################
export TB_HOME=/home/tibero/tibero6
export TB_SID=tas2
export CM_SID=cm2
export CM_HOME=/home/tibero/tibero6
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
[tibero@tac1-training ~]$ source .bash_profile

      - Instalar o Tibero:

[tibero@tac2-training ~]$ tar -xzvf /home/install/tibero6-bin-FS06-linux64-142998-opt-20170420182339.tar.gz
[tibero@tac2-training ~]$ cp /home/install/tac2-training.tibero.license.xml tibero6/license/license.xml
      - Configurar o arquivo de parâmetros de inicialização do Tibero:

[tibero@tac2-training ~]$ cd tibero6/config/
[tibero@tac2-training config]$ sh gen_tip.sh

[tibero@tac2-training config]$ vi tas2.tip
DB_NAME=tas
LISTENER_PORT=9620
MAX_SESSION_COUNT=20
MEMORY_TARGET=2G
TOTAL_SHM_SIZE=1G
INSTANCE_TYPE=AS
AS_DISKSTRING="/db/tibero/devs/disk*"
CLUSTER_DATABASE=Y
LOCAL_CLUSTER_ADDR=100.100.100.20
LOCAL_CLUSTER_PORT=20000
CM_PORT=48629
THREAD=1

[tibero@tac2-training config]$ vi cm2.tip
CM_NAME=cm2
CM_UI_PORT=48629
CM_RESOURCE_FILE="/home/tibero/tibero6/config/cm2.rsc"
CM_HEARTBEAT_EXPIRE=60
CM_WATCHDOG_EXPIRE=55
      - Configurar os parâmetros de conexão do client:

[tibero@tac2-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tas2=
((INSTANCE=(HOST=100.100.100.20)
(PORT=9620)
(DB_NAME=tas)
)
)

  - Instalação e configuração do TAC:

    - VM2:

[tibero@tac2-training config]$ cd $TB_HOME

[tibero@tac2-training tibero6]$ vi tas2.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tas2; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH
      - Adicionar os recursos do TAC:

[tibero@tac2-training tibero6]$ tbcm -b
[tibero@tac2-training tibero6]$ tbcm -s
      - Adicionar o recurso de rede privada:

[tibero@tac2-training tibero6]$ cmrctl add network --nettype private --ipaddr 100.100.100.20  --portno 18629 --name net1
       - Adicionar o recurso de rede pública:

[tibero@tac2-training tibero6]$ cmrctl add network --nettype public --ifname enp0s3 --name pub1

      - Adicionar o recurso de cluster:

[tibero@tac2-training tibero6]$ cmrctl add cluster --incnet net1 --pubnet pub1 --cfile "+/db/tibero/devs/disk*" --name cls1
[tibero@tac2-training tibero6]$ cmrctl start cluster --name cls1

      - Adicionar o recurso do TAS:

[tibero@tac2-training tibero6]$ cmrctl add as --name tas2 --svcname tas --dbhome $CM_HOME --envfile /home/tibero/tibero6/tas2.profile

      - Iniciar a instância do TAS:

[tibero@tac2-training tibero6]$ cmrctl start as --name tas2
      - Criar um arquivo de profile requerido pelo CM para o node 2:

[tibero@tac2-training tibero6]$ vi tac2.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tac2; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH

      - Criar o arquivo de parâmetros de inicialização do Tibero para o TAC2:

[tibero@tac2-training tibero6]$ vi config/tac2.tip
DB_NAME=tac
LISTENER_PORT=8629
CONTROL_FILES="+DS0/tac/c1.ctl"
DB_CREATE_FILE_DEST="+DS0/tac"
LOG_ARCHIVE_DEST="+DS0/tac/archive"
MAX_SESSION_COUNT=20
TOTAL_SHM_SIZE=1G
MEMORY_TARGET=2G
USE_ACTIVE_STORAGE=Y
AS_PORT=9620
LOCAL_CLUSTER_ADDR=100.100.100.20
CM_PORT=48629
LOCAL_CLUSTER_PORT=21000
CLUSTER_DATABASE=Y
THREAD=1
UNDO_TABLESPACE=UNDO1
#SERVER_SIDE_LOAD_BALANCE=LONG

      - Adicionar o recurso de Database:

[tibero@tac2-training tibero6]$ cmrctl add db --name tac2 --svcname tac --dbhome $CM_HOME --envfile /home/tibero/tibero6/tac2.profile

      - Iniciar a instância do Database:

[tibero@tac2-training tibero6]$ cmrctl start db --name tac2
      - Configurar os parâmetros de conexão do client:

[tibero@tac2-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tac2=
  ((INSTANCE=(HOST=100.100.100.20)
(PORT=8629)
(DB_NAME=tac)
)
)

⇨ Exercícios de loadbalance e failover "SEM VIP":

  - Configurar os parâmetros de conexão do client:

  - VM1:

[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tac=
((INSTANCE=(HOST=100.100.100.10)
(PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.20)
(PORT=8629)
(DB_NAME=tac))
(LOAD_BALANCE=Y)
(USE_FAILOVER=Y)
)
  - VM2:

[tibero@tac2-training ~]$ vi tibero6/client/config/tbdsn.tbr
tac=
((INSTANCE=(HOST=100.100.100.20)
  (PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.10)
(PORT=8629)
(DB_NAME=tac))
(LOAD_BALANCE=Y)
(USE_FAILOVER=Y)
)
  - Teste #001: Com as duas VMs no ar, criar usuário, tabela e inserir dados para testar o HA:

  - VM1:

[tibero@tac1-training ~]$ tbsql sys/tibero@tac

SQL>
  create user TESTE identified by tibero;
grant dba to teste;
conn teste/tibero@tac
create table T1(id number);
insert into T1 values (12345);

  - VM2:

[tibero@tac2-training ~]$ tbsql sys/tibero@tac

SQL>
  select * from T1;
  - VM1:

SQL>
commit;
  - VM2:

SQL>
select * from T1;
ID
  ----------
12345

  - Teste #002: Com as duas VMs no ar, conectar/desconectar algumas vezes para verificar o loadbalance:

- VM1:

[tibero@tac1-training ~]$ tbsql sys/tibero@tac

SQL>
  col INSTANCE_NAME format a10
  col HOST_NAME format a20
  select INSTANCE_NAME, HOST_NAME, THREAD# from v$instance;
  INSTANCE_N HOST_NAME               THREAD#
  ---------- -------------------- ----------
  tac1       tac1-training                 0

[tibero@tac1-training ~]$ tbsql sys/tibero@tac

SQL>
  col INSTANCE_NAME format a10
col HOST_NAME format a20
select INSTANCE_NAME, HOST_NAME, THREAD# from v$instance;
INSTANCE_N HOST_NAME               THREAD#
---------- -------------------- ----------
tac2       tac2-training                 1
  - Teste #003: Com as duas VMs no ar, simular a queda de um nó, para verificar o failover:

    - VM1:

[tibero@tac1-training ~]$ tbsql sys/tibero@tac
SQL>
  col INSTANCE_NAME format a10
col HOST_NAME format a20
select INSTANCE_NAME, HOST_NAME, THREAD# from v$instance;
INSTANCE_N HOST_NAME               THREAD#
---------- -------------------- ----------
tac2       tac2-training                 1

    - VM2:

- Verificado que a conexão foi para a VM2, derrube este nó:

[tibero@tac2-training ~]$ cmrctl stop db --name tac2 --option immediate
- VM1:

- Execute o comando novamente, duas vezes, para verificar o failover:

SQL> /
TBR-2139: Connection to server was interrupted but the fail-over successfully reconnected.

SQL> /
INSTANCE_N HOST_NAME               THREAD#
---------- -------------------- ----------
tac1       tac1-training                 0

⇨ VIP:

To add VIP, "tbcm" must be started using the ROOT privileges, and the "pubnet" attribute must be set for the service specified in "svcname".

  - Stop all nodes:

  - VM1:

[tibero@tac606tac1 tibero6]$ cmrctl stop service --name tac
[tibero@tac606tac1 tibero6]$ cmrctl stop service --name tas
[tibero@tac606tac1 tibero6]$ tbcm -d

  - VM2:

[tibero@tac606tac2 tibero6]$ tbcm -d

  - Configure o VIP:

  - VM1:

  - Configurar os parâmetros de conexão do client:

[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
vip=
((INSTANCE=(HOST=100.100.100.11)
(PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.21)
(PORT=8629)
(DB_NAME=tac))
 (LOAD_BALANCE=Y)
 (USE_FAILOVER=Y)
)
  - Log in as ROOT:

[tibero@tac1-training ~]$ su - root

      - Configure as variáveis de ambiente:

[root@tac1-training ~]# vi .bash_profile
####################################################################
# TIBERO CM:
####################################################################
export TB_HOME=/home/tibero/tibero6
export CM_SID=cm1
export CM_HOME=/home/tibero/tibero6
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
[root@tac1-training ~]# source .bash_profile

      - Inicie o CM como ROOT:

[root@tac1-training ~]# tbcm -b
CM Guard daemon started up.
import resources from '/home/tibero/tibero6/config/cm1.rsc'...
TBCM 6.1.1 (Build 139624)
TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Tibero cluster manager started up.
Local node name is (cm1:48629).

      - Voltar para o contexto de normal user e verificar o status do CM, note que a informação "ROOT ON" é exibida na linha: "CM MODE":
[root@tac1-training ~]# exit

[tibero@tac1-training ~]$ tbcm -s
CM information
===========================================================
CM NAME             : cm1
CM UI PORT          : 48629
RESOURCE FILE PATH  : /home/tibero/tibero6/config/cm1.rsc
CM MODE             : GUARD ON, FENCE OFF, ROOT ON
LOG LEVEL           : 2
CM BLOCK SIZE       : 512
===========================================================
      - Verificar o status do CLUSTER, note que a informação "(ROOT)" é exibida na linha: "Status" e que a letra "R" aparece na coluna "Mst":

[tibero@tac1-training ~]$ cmrctl show cluster --name cls1
Cluster Resource Info
===============================================================
Cluster name      : cls1
Status            : UP         (ROOT)
Master node       : (1) cm1
Last NID          : 1
Local node        : (1) cm1
Storage type      : Active Storage
AS Diskstring     : /dev/sd*
No. of cls files  : 3
  (1) +0
  (2) +1
  (3) +2
===============================================================
|                          NODE LIST                          |
|-------------------------------------------------------------|
| NID   Name          IP/PORT       Status Schd Mst  FHB  NHB |
| --- -------- -------------------- ------ ---- --- ---- ---- |
|   1      cm1 100.100.100.10/18629     UP    Y R M [ LOCAL ] |
===============================================================
|                   CLUSTER RESOURCE STATUS                   |
|-------------------------------------------------------------|
|       NAME         TYPE    STATUS    NODE        MISC.      |
| ---------------- -------- -------- -------- --------------- |
|                        SERVICE: tas                         |
|             tas1       AS     DOWN      cm1                 |
|                        SERVICE: tac                         |
|             tac1       DB     DOWN      cm1                 |
===============================================================

      - Inicie o serviço do TAS:

[tibero@tac1-training ~]$ cmrctl start service --name tas

      - Inicie o serviço do TAC:

[tibero@tac1-training ~]$ cmrctl start service --name tac

      - Adicione o recurso VIP para o node 1 do TAC:
[tibero@tac1-training ~]$ cmrctl add vip --name vip1 --node cm1 --svcname tac --ipaddr 172.30.248.241/255.255.255.0
Resource add success! (vip, vip1)

  - VM2:

  - Configurar os parâmetros de conexão do client:

[tibero@tac2-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
vip=
((INSTANCE=(HOST=100.100.100.11)
(PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.21)
(PORT=8629)
(DB_NAME=tac))
 (LOAD_BALANCE=Y)
 (USE_FAILOVER=Y)
)
  - Log in as ROOT:

[tibero@tac2-training ~]$ su - root

      - Configure as variáveis de ambiente:

[root@tac2-training ~]# vi .bash_profile
##################################################################### TIBERO CM:
####################################################################
export TB_HOME=/home/tibero/tibero6
export CM_SID=cm2
export CM_HOME=/home/tibero/tibero6
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
[root@tac2-training ~]# source .bash_profile

      - Inicie o CM como ROOT:

[root@tac2-training ~]# tbcm -b
CM Guard daemon started up.
import resources from '/home/tibero/tibero6/config/cm1.rsc'...
TBCM 6.1.1 (Build 139624)
TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Tibero cluster manager started up.
Local node name is (cm1:48629).
[root@tac2-training ~]# exit

      - Voltar para o contexto de normal user e iniciar o recurso do TAS da VM2:

[tibero@tac2-training ~]$ cmrctl start as --name tas2

      - Iniciar o recurso do TAC da VM2:

[tibero@tac2-training ~]$ cmrctl start db --name tac2
[tibero@tac2-training ~]$ cmrctl add vip --name vip2 --node cm2 --svcname tac --ipaddr 192.168.15.146/255.255.255.0

  - VM1:

      - Verifique o status do  TAC na VM1 e na VM2 usando apenas a VM1 para isso:

[tibero@tac1-training ~]$ cmrctl show ; cmrctl show --remote cm2@cls1

⇨ Exercícios de loadbalance e failover "COM VIP":

- Refazer os testes #001, #002 e #003 anteriores.