De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Primeiros Passos na Administração de Bancos de Dados com DB2

Colaboração: Rafael Moraes da Costa

Data de Publicação: 24 de novembro de 2010

O DB2 é um RDBMS ( Relational DataBase Management System ) ou SGBDR ( Sistema Gerenciador de Bancos de Dados Relacionais ) criado pela IBM em 1983, inicialmente utilizado apenas em MainFrames, hoje trabalha com as mais variadas plataformas, incluindo Linux e Windows®. Não vamos nos prolongar muito nas história e utilização do DB2 e iremos direto à prática. Este artigo visa auxiliar novos administradores de bancos de dados DB2 em tarefas simples como a criação de instâncias, bases de dados e também dicas sobre os principais problemas encontrados por um aspirante a DBA. Partiremos do princípio de que o DB2 já está instalado, seja qual for a versão. Ao final do artigo você encontrará um link que traz um passo a passo para a instalação da versão gratuita, DB2 Express-C.

Ao se deparar com um banco de dados DB2, uma das primeiras coisas que o administrador precisa fazer é saber qual versão está em produção naquele ambiente.

Mostrar versão atual instalada:

  $ db2level
  DB21085I  Instance "db2inst1" uses "64" bits and DB2 code release "SQL09072"
  with level identifier "08030107".
  Informational tokens are "DB2 v9.7.0.2", "s100514", "IP23089", and Fix Pack
  "2".
  Product is installed at "/opt/ibm/db2/V9.7.2".

Se o DB2 está sendo utilizado apenas para fins educacionais, é aconselhável criar uma base de dados de exemplo, que possibilitará a execução de queries e outros comandos SQL.

Criar Base de Exemplo:

  $ db2fs

Como já dito, bastante útil para fins de aprendizado, este comando abrirá o First Steps no seu browser, o que permitirá criar uma base de dados chamada SAMPLE.

O DB2 cria instâncias que gerenciam os bancos de dados, em um único servidor é possível que diversas instâncias coexistam, porém não existe interferência entre elas. É possível por exemplo, criar a base de dados "abcd" na "db2inst1" e uma base com o mesmo nome em "db2inst2".

Para listar todas as instâncias existentes:

  $ db2ilist
  db2inst1
  db2inst2

No DB2 cada instância está ligada a um usuário do sistema, até mesmo no momento da criação de uma nova instância é necessário declarar o usuário responsável por aquela instância. O usuário responsável pela instância não precisa ter necessariamente o nome da instância, contudo só é possível criar uma instância se existir um usuário com o nome da instância em questão. É claramente mais simples alinhar o usuário com o nome da instância para evitar desencontros de informação.

Criar nova instância:

  db2icrt -u < usuario> < instancia>
  # db2icrt -u ninst ninst
  DBI1070I  Program db2icrt completed successfully.

É possível que um usuário ainda sem experiência com o DB2 encontre alguns problemas ao criar uma instância, os erros normalmente estarão ligados ao nome de usuário e instância.

  # db2icrt -u dba instancia03
  DBI1101E  The user name instancia03 is invalid.
  
  Explanation:
  
  The given user name must be the login name of an existing user and cannot:
  1. be more than 8 characters long.
  2. start with "sql", "ibm" or "sys".
  3. start with a numeral or contain characters other than a-z, _, or 0-9.

Neste caso o usuário "dba" existe, assim como o usuário "instancia03" entretanto o nome da instância tem mais de 8 caracteres. Na saída do erro é possível visualizar outras possíveis causas de erros por nome. Nomes que iniciam com "sql", "ibm" e "sys" até mesmo nomes que começam com números ou contenham caracteres diferentes de "a-z", "_", ou "0-9". Novas instâncias só podem ser criadas pelo usuário root, portanto se o DB2 foi instalado com um usuário comum, existirá uma única instância.

Um usuário pode ter até 32 caracteres em um sistema Linux com libc6, mas para usá-lo com DB2 ele deve ter um máximo de 8 caracteres. Caso contrário será gerado um erro.

  # db2icrt -u instancia04 db2t1
  ERROR: The length of the fenced user name instancia04 is invalid. It must not be longer than 8

Conforme citado anteriormente, os erros são provenientes da falta de usuários, seja o usuário responsável pela instância ou o usuário que possui o mesmo nome da instância ( Caso já não seja o mesmo ):

  # db2icrt -u ninst2 ninst
  DBI1131E  The user ID ninst2 is invalid.
  
  Explanation:
  
  An attempt to access the given user ID failed. One of the following
  situations has occurred:
  *  This user ID does not exist on the system.
  *  The home directory of this user is not set up properly.
  *  One of the user attributes needed by DB2 is unset.
  *  The UID of this user is 0
  
  User response:
  
  Make sure a valid user ID with valid home directory, shell, primary
  group and secondary group has been used. Create a new user if necessary.
  
  
  DBI1079I  Output is saved in the log file /tmp/db2icrt.log.9942.
  
  Explanation:
  
  All processed and failed operations have been saved into this log file.
  
  User response:
  
  Do not modify this file in any way. This file is for IBM Technical
  Support reference.
  
  # db2icrt -u ninst ninst2
  DBI1131E  The user ID ninst2 is invalid.
  
  Explanation:
  
  An attempt to access the given user ID failed. One of the following
  situations has occurred:
  *  This user ID does not exist on the system.
  *  The home directory of this user is not set up properly.
  *  One of the user attributes needed by DB2 is unset.
  *  The UID of this user is 0
  
  User response:
  
  Make sure a valid user ID with valid home directory, shell, primary
  group and secondary group has been used. Create a new user if necessary.

Após a criação bem sucedida de uma instância, liste novamente para verificar a aparição na lista com "db2ilist". Para usar uma instância deve-se efetuar o login com o usuário responsável pela instância ou declarar a variável DB2INSTANCE com o nome da instância.

  # export DB2INSTANCE=db2inst2

Para verificar a instância atual:

  # db2 get instance
  The current database manager instance is:  db2inst3

Parar e iniciar uma instância:

Este conjunto de comandos é normalmente utilizado para que algumas mudanças realizadas na instância tenham efeito.

  # db2stop
  SQL1064N  DB2STOP processing was successful.
  
  #  db2start
  SQL1063N  DB2START processing was successful.

As instâncias são criadas com um conjunto de parâmetros pré-configurados, é possível visualizá-los através do comando:

  #db2 get dbm cfg
  
  Database Manager Configuration
  
  Node type = Database Server with local and remote clients
  
  Database manager configuration release level            = 0x0d00
  
  CPU speed (millisec/instruction)             (CPUSPEED) = 6,258561e-07
  
  Max number of concurrently active databases     (NUMDB) = 8
  Federated Database System Support           (FEDERATED) = NO
  Transaction processor monitor name        (TP_MON_NAME) =
  
  Default charge-back account           (DFT_ACCOUNT_STR) =
  
  Java Development Kit installation path       (JDK_PATH) = /home/ninst/sqllib/java/jdk64

A nova instância será usada para a criação de uma base de dados e algumas alterações.

Para tal logue com o usuário "ninst"

  # su - ninst

Inicie o Database Manager:

  $ db2start
  SQL1063N  DB2START processing was successful.

A criação de uma base de dados é simples, porém demora um pouco:

  $ db2 create database banco01
  DB20000I  The CREATE DATABASE command completed successfully.

Com a base de dados pronta, é posível verificar as bases de dados ativas:

  $ db2 list active databases
  Active Databases
  
  Database name                         = BANCO01
  Applications connected currently      = 1
  Database path                         = /home/ninst/ninst/NODE0000/SQL00001/

Assim como as instâncias as bases de dados são criadas com uma série de parâmetros pré-configurados;

Para visualizá-los é necessário conectar-se a base de dados em questão:

  $ db2 connect to banco01
  Database Connection Information
  
  Database server        = DB2/LINUXX8664 9.7.2
  SQL authorization ID   = NINST
  Local database alias   = BANCO01

Só então use o comando para listar:

  $ db2 get db cfg
  Database Configuration for Database
  
  Database configuration release level                    = 0x0d00
  Database release level                                  = 0x0d00
  
  Database territory                                      = BR
  Database code page                                      = 1208
  Database code set                                       = UTF-8
  Database country/region code                            = 55
  Database collating sequence                             = IDENTITY
  Alternate collating sequence              (ALT_COLLATE) =
  Number compatibility                                    = OFF
  Varchar2 compatibility                                  = OFF
  Date compatibility                                      = OFF
  Database page size                                      = 4096

Exclusão de Bases de Dados e Instâncias:

A exclusão de bases de dados e instâncias é tão simples quanto a criação.

  $ db2 drop db banco01
  SQL1035N  The database is currently in use.  SQLSTATE=57019

Repare que mais acima foi feito uma conexão a esta base de dados, sendo assim o DB2 acusa que está sendo usada e não exclui.

Listagem de aplicações conectadas:

  $ db2 list applications
  Auth Id  Application    Appl.      Application Id                                                 DB       # of
  Name           Handle                                                                    Name    Agents
  --------  ------ --------  ----------  ------ ------ ------ ------ ------ ------ ------ ------ ------ --------  -------- -----
  NINST    db2bp          17         *LOCAL.ninst.100928182533                                      BANCO01  1

Listará todas as aplicações conectadas e neste caso é a "db2bp" que se trata do processo que se conecta à base de dados.

Para finalizar a conexão usamos o comando:

  $ db2 force application all
  DB20000I  The FORCE APPLICATION command completed successfully.
  DB21024I  This command is asynchronous and may not be effective immediately.

Força a finalização das conexões de aplicativos. Mas não se assustem, ele não irá finalizar tudo e todos, usuários que estão criando bases de dados e aplicações do sistema não podem ser derrubados desta maneira. Apenas usuários inativos e processos ininterruptos.

Mais detalhes em "Usage Notes" http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0001939.htm

Agora a base de dados será excluída sem erros:

  $ db2 drop db banco01
  DB20000I  The DROP DATABASE command completed successfully.

Com a base excluída é hora de excluir a instância:

Pare a instância:

  $ db2stop
  SQL1064N  DB2STOP processing was successful.

Exclua a instância:

  # db2idrop ninst
  DBI1070I  Program db2idrop completed successfully.

Liste as instâncias:

  # db2ilist
  db2inst3

Como é possível ver, apenas a instância db2inst3 é listada, pois "ninst" foi removida.

O que foi abordado até aqui é apenas uma introdução à Administração de Bancos de Dados DB2, o futuro administrador já é capaz de criar e remover instâncias e bases de dados e também levantar algumas informações básicas sobre a pré-configuração de bases de dados e instâncias.

Mais Informações:

Rafael Moraes, é Analista de Suporte e Infraestrutura para sistemas Linux e também Instrutor em cursos preparatórios LPI. Possui as certificações LPIC-1, LPIC-2, ITIL Foundations e CISCO CCDA.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rafael Moraes da Costa