Como exportar / importar dados com dbexport / dbimport | IMartins
Como exportar / importar dados com dbexport / dbimport
Enviado por cesar em sex, 17/07/2009 - 10:54
Os comandos dbexport e dbimport são utilitários para exportação/importação completa de um banco de dados e são extremamente facil de trabalhar.
Eles possuem caracteristicas muito similares ao LOAD / UNLOAD / dbload , porém é praticamente um processo automatizado para todo o banco de dados.
Utilizando o Server-Specifed
Existem muitos meios de exportar/importar dados no Informix, mas o dbexport/dbimport são especialmente uteis para ocasiões em que:
O administrador não tem muito conhecimento do Informix.
A base de dados não é grande.
A base de dados não é utilizada 24x7.
É de interesse ter o backup em formato "texto puro" .
Migração entre versões de Informix de diferente arquiteturas (RISC-x86, HP-Linux, etc)
Migração de bases pequenas entre servidores.
Facilidade de manipular os dados e a estrutura (DDL) após exportado.
Para exportar um banco é simples, porém é preciso ter conhecimento de algumas informações:
É obrigatório acesso unico e exclusivo ao banco de dados para o usuário que irá exportar o banco.
Se houver algum usuário conectado no banco a exportação não irá ocorrer.
Para exportação dos formatos de data é utilizado as variáveis de ambiente DBDATE, GL_DATETIME e USE_DTENV.
A performance irá depender principalmente do I/O de disco onde os dados estão alocados e onde serão gerados.
Para melhorar performance pode-se utilizar recurso de paralelismo se definido a variável PDQPRIORITY entre outras configurações de conectividade.
Não é salvo: ultimo valor de campo SERIAL e modo de log do banco de dados
São exportados todas as informações, como: tabelas, indices, sequences, roles, grants, estatisticas, triggers, stored procedures e etc.
Configurações da Instancia (ONCONFIG) e dbspaces não são exportados pois não fazem parte do banco de dados, eles estão "acima" do banco.
Ao exportar uma base de dados o dbexport irá salvar todos os dados em um diretório, o nome deste diretório é o nome da base mais a extenção ".exp", durante a execução ele irá exibir o script dos objetos que estão sendo exportados.
A sintaxe básica do dbexport é:
dbexport -d [banco_de_dados] [-ss] [-si]
# -d [banco_de_dados] Nome da base de dados que será exportado
# -ss   Exporta no modo "Server-Specifc" onde inclui informações
#       como extents, locks, dbspaces, fragmentos, etc.
# -si   Utilizado apenas com o -ss, evita que seja incluido
#       informações de dbspaces para indices não fragmentados
Exemplo de uma exportação:
# Esta exportação é de um banco de dados de teste que contém tabelas com
# vários tipos de dados (TEXT, BYTE, CLOB, BLOB, etc).
# Removi a parte do script exibida para encurtar o exemplo.
# No final é gerado os comandos de update statistics
$ dbexport -d dbcim
{ DATABASE dbcim  delimiter | }
{ Encoded Optical BLOB descriptor }
grant dba to "ix_dbsa";
grant connect to "cmartins";
update statistics high for table t_tags (
cod_tag, nome)
resolution   0.50000 ;
dbexport completed
# Aqui está o diretório criado
$ ls -ld *exp
drwxr-x--- 2 informix informix 752 2009-07-16 15:36 dbcim.exp
# Veja os arquivos gerados.
# dbcim.sql - Script DDL da base de dados
# *.unl     - Dados exportados
# blob* / clob* - Dados BLOBs e CLOBs.
$ cd dbcim.exp
blob9368.73b    dbcim.sql       sysbl00103.unl  t_per00118.unl  t_res00126.unl  t_tag00117.unl
blob9368.767    sysbl00100.unl  sysbl00104.unl  t_res00121.unl  t_res00127.unl  t_tag00120.unl
btsfs00115.unl  sysbl00101.unl  sysbl00106.unl  t_res00122.unl  t_res00129.unl
clob9368.7bc    sysbl00102.unl  sysbl00112.unl  t_res00123.unl  t_res00130.unl
Ao visualizar o conteúdo do arquivo .sql você irá encontrar muitos comentários entre chaves "{}".
Não altere estes comentários a não ser que saiba o que está fazendo, pois eles são utilizados no momento da importação com o dbimport. Nestes comentários você irá encontrar várias informações, veja um exemplo abaixo.
{ TABLE "ix_dbsa".t_pergunta row size = 2018 number of columns = 7 index size = 14
{ unload file name = t_per00118.unl number of rows = 140 }
Se você quiser alterar o conteúdo de um arquivo de dados (*.unl) ou do arquivo de estrutura (*.sql) você pode, porém tem que saber o que está fazendo para manter a integridade de checagem que irá ocorrer durante o dbimport
No exemplo acima a geração foi a mais simples e padrão, onde o parâmetro -ss não foi utilizado. Quando este parâmetro é especificado muitas informações adicionais são incluidas, como:
Tipo de locks de cada tabela (linha ou pagina)
Tamanho de alocação dos extents
Local de armazenamento (dbspaces) de tabelas e indices
Local de armazenamento dos campos TEXT, BLOB
Grande parte destes parâmetros estão relacionados a configuração da Instancia, principalmente aos dbspaces existentes.
Observação: Nos scripts de tabelas que possuem campos do tipo CLOB e BLOB, sempre é gerado com o nome do dbspace onde foi alocado. Mesmo se não for especificado a opção -ss. Pessoalmente considero isto um BUG pois deveria ser exibido apenas se especificado a opção -ss.
O utilitário dbimport importa apenas dados gerados pelo dbexport e sua utlização é muito fácil.
Para utiliza-lo você precisará ter conhecimento do seguinte:
Onde o diretório com os dados está salvo (diretório .exp)
Qual será o tipo de log que será utilizado no banco de dados
Qual dbspace será criado o banco de dados
Se a geração dos dados foi utilizado o parâmetro -ss, se sim, garantir que os dbspaces necessários existem
A sintaxe básica do dbimport:
dbimport [banco_de_dados] [-d [dbspace]] [-l [buffered] | -ansi] [-i [diretorio]]
# [banco_de_dados] Nome do banco que será importado.
# -d [dbspace]     Nome do dbspace onde o banco será alocado, se não informado o padrão
#                  é o rootdbs.
# -l               Cria banco como unbuffered
# -l buffered      Cria banco como buffered
# -ansi            Cria banco como padrão ANSI
# -i [diretorio]   Caminho de onde se encontra o diretório com os dados, se não
#                  informado é utilizado o diretório atual.
Caso o banco de dados que você irá importar já exista, você tem duas soluções.
Renomear ou remover o banco de dados já existente.
Renomear o banco de dados que será importado, antes da importação.
Não irei falar sobre a solução 1 pois ela trata-se de outros recursos que nada tem haver com exportação/importação.
Sobre a solução 2, é bem facil aplica-la, abaixo fiz um exemplo onde renomeio o banco de dados antes de importa-lo e executo a importação.
# Para renomear um banco exportado pelo dbexport , deve-se primeiro
# renomear o diretório criado por ele.
$ mv dbcim.exp teste.exp
`dbcim.exp' -> `teste.exp'
$ cd teste.exp/
# Deve-se renomear o arquivo .sql que tem o nome do banco
$ mv dbcim.sql teste.sql
`dbcim.sql' -> `teste.sql'
# Para finalizar, editar este arquivo e renomar a primeira linha
# que é um comentário e possui o nome do banco de dados.
$ vi teste.sql
$ head -n2 teste.sql
{ DATABASE teste  delimiter | }
# Após isso, basta iniciar a execução.
# Neste exemplo carrego o banco chamado "teste", no dbspace "dados1"
# com o log como Buffered e informo que o local onde se encontra o
# diretório teste.exp é no /tmp
$ dbimport teste -d dados1 -l buffered -i /tmp
Entenda como o LOAD/UNLOAD e dbschema funcionam, pois assim você irá entender 90% do dbexport/dbimport
Leia este artigo com recomendações para carga de dados.
7141 leituras
Enviado por londonms em sex, 12/04/2013 - 10:14.
Realmente usar o dbexport/dbimport de um banco de dados grande é complicado, tentei restaurar (dbexport) um banco de 600 Gb e levou quase 55 horas. Agora usando o onbar -r a restauração levou 9 horas toda a instancia que tem 1.3 Tb.
RES : dbexport
Enviado por cesar em sab, 13/04/2013 - 22:50.
Olá londonms ,
Realmente , faz muita diferença usar o dbexport/dbimport, mas é preciso lembrar que ele não é bem uma ferramenta de backup pois os dados são carregados linha a linha , indices e objetos recriados do zero. No caso de backup com o onbar você está restaurando uma imagem de sua instancia, exatamente como ela estava no momento do backup, incluindo os indices pré existente.
Apenas para constar mais um exemplo, no meu trabalho o banco com 700GB restauramos com ontape lendo de fita LTO em 2h30 , mas isso pode variar muito do hardware pois o mesmo restore em outra maquina tem levado 4 horas.
Enviado por londonms em sex, 15/04/2011 - 12:35.
Estou acompanhando o EXPORT/IMPORT de um banco e este tutorial me ajudou a entender muito sobre este procedimento. Valeu por compartilhar.
importar uma base diferente
Enviado por Anônimo em seg, 24/10/2011 - 11:44.
importar uma base diferente da demo funciona na versão demo do ids 10?
RE: Importar uma base diferente
Enviado por cesar em qui, 26/04/2012 - 07:55.
Isso depende muito de onde a base foi exportada.
O dbexport/import são exclusivos do Informix, existe uma certa "arquitetura" para eles funcionarem corretamente.
Mas se a base foi exportada com dbexport ou vc preparou o os arquivos de modo que o dbimport entenda. Funcionaria sim.