Responder a este comentário
Exportando / Importando dados com onunload / onload
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.
- 607 leituras




