Exportando / Importando dados com onunload / onload

Versão para impressãoEnviar para amigoVersão PDF

A exportação e importação de dados com o onunload e onload é pouco popular no Informix.
Porém nunca despreze sua utilidade!
Estes comandos exportam / importam os dados do banco para um arquivo ou fita em formato binário, ou seja, eles realizam um "dump" das paginas de dados.

Você pode estar se perguntando, qual a utilidade deles se possuímos outras ferramentas como dbexport/dbimport, unload/load , dbload, HPL e External Tables ? Segue abaixo alguns dos motivos para utilizar o onunload/onload:

  • Evita a necessidade de lidar com comandos SQL/DDL
  • Por trabalhar em formato binário ele não faz conversão do dado binário para formato texto, então consequentemente tem menos processamento.
  • Permite que você altere o dono (owner) de um objeto.
  • Permite que você "refaça" os extents de suas tabelas. Isso é util em situações que a quantidade de extents estão chegando (ou já chegaram) no seu limite.
    Obs: A partir da versão 11.50 xC4 é possível reorganizar uma tablea (refazer os extents) "on-fly", sem necessidade de travar a tabela, veja no manual por "table repack"
  • Pode ser utilizado como backup (com suas devidas precauções).
  • Utiliza-lo para exportar dados entre servidores de forma mais rápida

As características deste modo de exportação/importação:

  • Sua performance é basicamente limitada ao I/O de disco da origem e destino dos dados.
  • A exportação / importação entre servidores pode ser feita desde que seja mesma arquitetura, versão de sistema operacional e versão de banco de dados
  • A exportação pode ser de uma tabela ou de todo banco de dados.
  • A exportação de uma tabela sempre irá incluir os dados dos indices e constraints que faz parte dela.
  • Na importação é obrigatório importar todos os dados contido no arquivo (indices , constraints)
  • Se uma tabela/indice é fragmentada, a mesma regra será mantida na importação, mantendo também o nome dos dbspaces utilizados na fragmentação.
  • É possível renomear os dbspaces das fragmentações de tabela/indices
  • É possível renomear o nome da tabela
  • É possível renomear o nome do indice
  • É possível renomear o dono/owner da tabela
  • Não é possível alterar o pagesize utilizado por uma tabela.
  • O ultimo valor de campos SERIAL não são salvos
  • Grants, triggers, synonyms e views não são exportados / importados.
  • Ao carregar uma tabela o banco de dados que será carregado não pode estar com LOG ativo.
  • Não pode existir uma tabela/banco com o mesmo nome da que será carregada
  • Nao é possível exportar tabelas com indices/constraints desabilitados.
    Em testes práticos, ao exportar uma tabela com um indice desabilitado (DISABLED), os dados da tabela foram gerados, porém o onunload foi abortado com erro ao tentar exportar o indice.
    Ao tentar exportar de volta o arquivo, mesmo sem os dados dos indices, ocorre erro no final do processo abortando e cancelando o onload

# Sintaxe básica dos comandos:
# onunload -t [arquivo] -s [tamanho_kb] [banco]:[tabela]
# onload -t [arq] -s [tam_kb] -d [dbspace_destino] [banco_destino]:[novo_owner].[nova_tabela]

# Exportando uma tabela
$ touch fs_full.dat
$ onunload -s 0 -t fs_full.dat myfs_db:fs_full
Please mount tape and press Return to continue ...
Please label this as tape number 1 in the tape sequence.
$ ls -oh fs_full.dat
-rw-r----- 1 informix 340M 2009-08-17 16:30 fs_full.dat

# Tentativa de importar uma tabela gerada com pagesize de 4 KBytes
# em um dbspace com pagesize de 8 KBytes
$ onload -s 0 -t fs_full.dat  teste2:fs_full2  -d dados3
Please mount tape and press Return to continue ...
pagesize of the target dbspace does not match with the pagesize of the
partition on tape.
ISAM error: Tape might contain a corrupt page (or) if you are executing onload
command specify the correct DBspace name using the -d argument.


# Abaixo segue exemplo da utilização do onunload/onload para refazer
# os extents de uma tabela.

# Aqui a tabela é criada. Observe que foi criado um indice
# que por padrão será deatached. Devido o modo que
# iremos carregar os dados nesta tabela ela irá ficar com
# vários extents.
$ dbaccess -e teste2 fs.sql 
Database selected.
create table "cmartins".fs_full
  (
    diretorio nchar(300),
    nome_arquivo nchar(100) not null constraint "cmartins".n113_25,
    path_nome_arquivo nchar(400),
    link_destino nchar(400),
    permissao_octal smallint,
    permissao_str nchar(10),
    filesystem_armazenado nchar(10),
    tipo1 nchar(1),
    tipo2 nchar(1),
    owner_user nchar(15) not null constraint "cmartins".n113_26,
    owner_group nchar(15) not null constraint "cmartins".n113_27,
    owner_uid integer not null constraint "cmartins".n113_28,
    owner_gid integer not null constraint "cmartins".n113_29,
    tamanho_bytes bigint,
    inode bigint,
    flag_xyz char(1)
        default '1',
    ultimo_acesso datetime year to fraction(3),
    ultima_mod_status datetime year to fraction(3),
    ultima_mod_dados datetime year to fraction(3),
    device_number integer
  ) extent size 16 next size 16 lock mode row;
Table created.
revoke all on "cmartins".fs_full from "public" as "cmartins";
Permission revoked.
create index ix_dir on fs_full (diretorio) ;
Index created.
Database closed.

# Aqui a tabela é carregada com os dados
# Neste ponto além dos dados da tabela o indice também é
# automaticamente carregado.
$ echo 'load from file.unl insert into fs_full' | dbaccess -e teste2
Database selected.
load from file.unl insert into fs_full
260474 row(s) loaded.
Database closed.

# Após a carga, com o comando "oncheck" identificamos os extents
# gerado para a tabela e para o indice.
$ oncheck -pt teste2:fs_full
TBLspace Report for teste2:cmartins.fs_full
    Physical Address               8:618
    Creation date                  08/18/2009 14:32:57
 ...
    Number of extents              98 
 ...
    Pagesize (k)                   4
    First extent size              4
    Next extent size               256
    Number of pages allocated      86860
    Number of pages used           86847
    Number of data pages           86825
    Number of rows                 260474
    Partition partnum              8388670
    Partition lockid               8388670

    Extents
         Logical Page     Physical Page        Size Physical Pages
                    0            8:1350           4          8
                    4            8:1366          92        184
                   96            8:1558         164        328
                  260            8:1894         120        240
                  380            8:2142          32         64
                  412            8:2214         120        240
                  532            8:2462          48         96
                  580            8:2566          40         80
                  620            8:2654          16         32
                  636            8:2694          16         32
                  652            8:2734          12         24
                  664            8:2766          24         48
                  688            8:2822          28         56
...
                  Index ix_dir fragment partition dados3 in DBspace dados3

    Physical Address               8:620
    ...
    Number of extents              97 
    ...
    Pagesize (k)                   4
    First extent size              4
    Next extent size               256
    Number of pages allocated      4288
    Number of pages used           4263
    Number of data pages           0
    Number of rows                 0
    Partition partnum              8388671
    Partition lockid               8388670

    Extents
         Logical Page     Physical Page        Size Physical Pages
                    0            8:1358           4          8
                    4            8:1550           4          8
                    8            8:1886           4          8
...


# Outro meio de visualizar como os dados ficaram alocados (extents)
$ oncheck -pe dados3
DBspace Usage Report: dados3              Owner: informix  Created: 08/18/2009
 Chunk Pathname                             Pagesize(k)  Size(p)  Used(p)  Free(p)
     8 /ifmxdados/dados3.ch1                          4   112500    91823    20677
 Description                                                   Offset(p)  Size(p)
 ------------------------------------------------------------- -------- --------
 RESERVED PAGES                                                       0        2
 CHUNK FREELIST PAGE                                                  2        1
 dados3:'informix'.TBLSpace                                           3       50
 teste2:'informix'.systables                                         53        4
 teste2:'informix'.syscolumns                                        57       12
 teste2:'informix'.sysindices                                        69       32
...
 teste2:'cmartins'.fs_full                                          675        4
 teste2:'informix'.ix_dir                                           679        4
 teste2:'cmartins'.fs_full                                          683       92
 teste2:'informix'.ix_dir                                           775        4
 teste2:'cmartins'.fs_full                                          779      164
 teste2:'informix'.ix_dir                                           943        4
 teste2:'cmartins'.fs_full                                          947      120
 teste2:'informix'.ix_dir                                          1067        4
 teste2:'cmartins'.fs_full                                         1071       32
 teste2:'informix'.ix_dir                                          1103        4
...

# Agora descarregamos as paginas da tabela/indice para um arquivo.
$ touch fs_full.dat
$ onunload -t fs_full.dat -s 0 teste2:fs_full
Please mount tape and press Return to continue ...
Please label this as tape number 1 in the tape sequence.
$ ls -oh fs_full.dat
-rw-r----- 1 informix 356M 2009-08-18 14:44 fs_full.dat

# Excluimos a tabela para recarrega-la posteriormente
$ echo 'drop table fs_full'  | dbaccess teste2
Database selected.
Table dropped.
Database closed.

# Recarregamos a tabela, sem alterar o nome e localização dela
$ onload -t fs_full.dat -s 0 -d dados3  teste2:fs_full
Please mount tape and press Return to continue ...
The load has successfully completed.

# Agora verificando novamente os extents, podemos ver que que ela foi 
# "reorganizada" em um unico extent, onde o mesmo valeu para o indice.
$ oncheck -pt teste2:fs_full
TBLspace Report for teste2:informix.fs_full

    Physical Address               8:618
    Creation date                  08/18/2009 14:46:30
    ...
    Number of extents              1 
    ...
    Pagesize (k)                   4
    First extent size              4
    Next extent size               256
    Number of pages allocated      87044
    Number of pages used           86847
    Number of data pages           86825
    Number of rows                 260474
    Partition partnum              8388670
    Partition lockid               8388670
    Extents
         Logical Page     Physical Page        Size Physical Pages
                    0            8:1350       87044     174088

                  Index ix_dir fragment partition dados3 in DBspace dados3
    Physical Address               8:620
    ...
    Number of extents              1
    ...
    Pagesize (k)                   4
    First extent size              4
    Next extent size               256
    Number of pages allocated      4356
    Number of pages used           4263
    Number of data pages           0
    Number of rows                 0
    Partition partnum              8388671
    Partition lockid               8388670
    Extents
         Logical Page     Physical Page        Size Physical Pages
                    0          8:175438        4356       8712

BUG: uma tabela renomeada na importação do onload , manteve na sua estrutura interna (oncheck -pe) o nome original. Mas o acesso pelo DML e DDL funcionaram sem problemas.

1
Média: 1 (1 vote)
Sua avaliação: Nenhum

Comentar

O conteúdo deste campo é privado não será exibido ao público.
  • Endereços de páginas de internet e emails viram links automaticamente.
  • Você pode usar tags BBCode no texto.
  • Tags HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>

Mais informações sobre as opções de formatação

CAPTCHA
Este teste é para bloquear programas automatizados e previnir spams
CAPTCHA de Imagem
Digite o texto exibido na imagem.