Re: [pgbr-geral] Rodar script de gente grande
Mozart; Não entendi exatamente o que seu procedimento faz, porém tenho um problema semelhante. Faço diariamente cargas de arquivos de texto em 160 tabelas e que somam mais de 1.900.000 linhas. Se o seu problema é carregar dados, então posso compartilhar com você minha experiência. Após pesquisas na internet e testes com esta quantidade grande de informações lhe afirmo que as ferramentas visuais são mais lentas que os comandos rodados diretamente do console do seu banco. Para você ter idéia, a carga nestas 160 tabelas que somam mais de 1.900.000 linhas demorou apenas 1:54 ( um minuto e cinquenta e quatro *segundos* ). Eu uso o comando COPY alimentado por um arquivo com os dados somente; sem os INSERT. Para ter esta eficiência eu dropo a tabela, recrio-a, e faço o copy com o arquivo somente com os dados, após isto eu crio os índices; todo este procedimento está dentro do meu script. São tabelas de um mainframe IBM que eu transporto para o PostgreSQL diariamente; não tenho problemas ao dropar as tabelas, pois eu uso-as como cópias de segurança e não há nenhum sistema utilizando-as diretamente. Como cada caso é um caso, se seu problema é semelhante ao meu sugiro que você analise esta forma de carga de seus dados ( COPY tabelaSQL FROM '/home/minha_tabela.txt; ) ; para mim está funcionando perfeitamente. Ernesto Jorge Costa Martins Universidade Federal do Rio Grande - FURG Centro de Processamento de Dados 2008/12/11 Mozart Hasse mozart.ha...@usa.net Preâmbulo da pergunta: Tenho o problema frequente de rodar scripts monstruosamente grandes (um milhão de comandos SQL separados por ponto-e-vírgula) com frequência. O problema é que pode ocorrer um erro láá no meio dele e aí eu preciso retomar daquele ponto e só então continuar com os comandos subsequentes. Meus requisitos: 1. A estação roda Windows, conecta-se ao servidor que é necessariamente outra máquina e tem pouca memória. Não, eu não estou interessado em soluções que precisem de alguns gigas de RAM nem usem outro sistema operacional. 2. Recortar e colar um texto desse tamanho em um programa qualquer detona minha estação, assim como simplesmente mostrar este texto na tela. Quero um programa que leia sequencialmente cada comando do script a partir de um arquivo e descarte-o da memória assim que executar com sucesso. 3. Carregar um arquivo desse tamanho é demorado porque consome toda a memória da estação (a área de transferência do Windows consome toda a memória virtual com um texto desse tamanho). Quero um programa inteligente o bastante para colocar na memória apenas o necessário durante a execução. 4. QUANDO acontece um erro, eu quero retomar do ponto onde o erro ocorreu, e não recomeçar tudo porque estava no meio da mesma transação. Ou seja, quero ter a opção de rodar cada comandinho do script dentro de uma transação. 5. QUANDO acontecer um erro, eu também quero que ele PARE, dê COMMIT no que funcionou até esse ponto e nem tente rodar os comandos subsequentes. 6. Caso não seja possível abortar em caso de erro, eu queria poder olhar o resultado do script enquanto o programa manda os comandos para o banco, e abortar caso encontre algum aviso comprometedor. O problema é que, como o script é grande, o resultado do script também é grande e por si só já detona a memória da máquina. Eu não quero esperar ele rodar o script inteirinho para só depois abrir o arquivo de LOG e descobrir que ele não fez nada porque deu erro de sintaxe no segundo comando. Isso não tem necessariamente a ver com Postgres, apesar de ser muito bom saber se há alguma ferramenta que faça isso conectando com ele. Pois é, então finalmente a pergunta é: Alguém conhece algum programa que faça isso ou algo parecido?? Atenciosamente, Mozart Hasse ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Qualquer usuário pode executar o va ccum ?
2008/12/11 titofr t...@uel.br: Emers0n wrote: vacuum pode ser executado pelo owner ou por um superusuario nao existe revoke para vacuum Owner do banco ou da tabela ? O que está acontecendo aqui é o seguinte: o usuario user1 pode executar o comando Vaccum tabela1 em uma tabela que pertence a ele. Se for uma tabela pequena, não há problema o meu receio é o usuário executar esse comando numa tabela grande que demande recurso do servidor. Por isso a minha preocupação em bloquear a execução do vacuum para as tabelas pelos usuarios de conexão do banco owner da tabela e do banco ou superusuario como o titofr falou, vc pode colocar o postgres como owner para impedir que o usuario comum rode o vacuum porém não vejo problema em deixar o dono da tabela rodar vacuum caso esteja impactando no desempenho vc pode ajustar os parametros do vacuum no postgresql.conf ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Rodar script de gente grande
2008/12/11 Mozart Hasse mozart.ha...@usa.net: Preâmbulo da pergunta: Tenho o problema frequente de rodar scripts monstruosamente grandes (um milhão de comandos SQL separados por ponto-e-vírgula) com frequência. O problema é que pode ocorrer um erro láá no meio dele e aí eu preciso retomar daquele ponto e só então continuar com os comandos subsequentes. Meus requisitos: Meu caro Mozart, você escreveu um e-mail longo, mas não colocou as principais informações. Não disse como é o perfil da sua carga com milhões de instruções SQL. Não tenho como adivinhar que tipo de operação você está fazendo, se é uma operação do tipo fechamento de mês onde vários dados são totalizados e transferidos de uma tabela para outra, se é um cálculo mensal do tipo folha de pagamento ou se é uma carga de dados vindo de outra fonte via txt por exemplo. Seja como for, observe algumas coisas: - COPY é melhor que multiplos INSERTs, que é melhor que INSERTS c/ PREPARED STATEMENTs, que são melhores que INSERTs individuais. - INSERT é melhor que DELETE (escrevi um artigo sobre isso em: http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/) - Nenhum processo em lote deve ser executado via CLIENT/SERVER, rode tudo via PL dentro do banco que você vai ter uma performance absurdamente melhor; - Se você puder agendar sua rotina em lote para um horário mais calmo, pense em fazer uma configuração específica de desempenho para a carga, por exemplo diminuindo o número de conexões e aumentando a memória para uma conexão individual, - Após a carga, sempre rode um vacuum analize nas tabelas afetadas - Se tiver que fazer uma carga de dados em TXT com possíveis problemas... considere trazer tudo para uma tabela burra (uma tabela TEMPORÁRIA com um campo TEXT sem PK) para receber os dados inicialmente dentro do banco. Depois de carregar todos os dados na tabela burra, você poderá tratar os dados com SQL e mover os registros problemáticos para outra área e aí sim transferir os registros da sua tabela burra para os locais corretos. - Remova constraints e índices quando for fazer grandes cargas e deixe para reconstruí-los no final. - Use cursores se estiver estourando a sua memória! - Aprenda a utilizar COMMIT, ROLLBACK e SAVEPOINT corretamente e estimar de quantos em quantos registros realizar um COMMIT. - Aprenda a fazer o tratamento de erros em PL, Como você pode ver, grandes caras exigem muito planejamento, estudo, teste, etc. Não é trivial, mas os esforços costumam trazer resultados surpreendentes. Se precisar de ajuda profissional, acredito que temos algumas pessoas aqui na lista que poderão lhe prestar bons serviços nesta área. Espero ter ajudado. []s Fábio Telles -- blog: http://www.midstorm.org/~telles/ e-mail / jabber: fabio.tel...@gmail.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Alterar dono banco todo
Bom dia pessoal, Preciso de mais 1 ajuda, tenho 1 banco de dados com mais de 1000 tabelas (1039 pra ser exato) e preciso alterar o dono do banco e de todas as tabelas... tem alguma maneira prática de fazer isso sem fazer o dump do banco? Obrigado pela atenção. -- Lucas Paz ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
2008/12/12 Lucas Paz lucas...@gmail.com: Bom dia pessoal, Preciso de mais 1 ajuda, tenho 1 banco de dados com mais de 1000 tabelas (1039 pra ser exato) e preciso alterar o dono do banco e de todas as tabelas... tem alguma maneira prática de fazer isso sem fazer o dump do banco? Claro, você vai precisar de: http://www.postgresql.org/docs/8.3/static/sql-altertable.html e também de: http://www.postgresql.org/docs/8.3/static/infoschema-tables.html Com isso você deve chegar lá! []s Fábio Telles -- blog: http://www.midstorm.org/~telles/ e-mail / jabber: fabio.tel...@gmail.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] duvida na utilização de aspas sim ples
Bom dia Lista, pessoal estou fazendo um procedure mas surgiu um problema com a aspas simples, o problema esta em como utilizar elas no meio de uma sql que tem varias concatenações. XCRIATABELA :='CREATE TABLE '|| XTABELA ||' ('|| XNID ||' NUMERIC(6,0) DEFAULT nextval((*tb_remessa_seq::text*)::regclass) NOT NULL,'|| XNUMEROREMESSA ||' NUMERIC(6,0) DEFAULT nextval(('*||XSEQUENCIA||* '::text)::regclass),'|| XANO ||' NUMERIC(4,0),'|| XUSUARIOINCLUSAO ||' NUMERIC(6,0),'|| XDTINCLUSAO ||' TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT (*now*::text)::timestamp(6) without time zone,'|| XUSUARIOALTERACAO ||' NUMERIC(6,0),'|| XDTALTERACAO ||' TIMESTAMP WITHOUT TIME ZONE,'|| XSETOR ||' NUMERIC(6,0),'|| XCDUNIDADE ||' NUMERIC(6,0),'|| XORDEM ||' NUMERIC(2,0),'|| XDOCUMENTO ||' VARCHAR(50),'|| XASSUNTO ||' VARCHAR(450),'|| XDE ||' VARCHAR(150),'|| XPARA ||' VARCHAR(150),'|| XAC ||' VARCHAR(150) ) WITH OIDS'; EXECUTE XCRIATABELA; nas partes em vermelho teria que ter aspas simples, porem se as coloco da erro, dizendo que as sequencias não existem. obrigado Anderson ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
vc tem linux em maos? :) se tiver te mando um shell script :P On Fri, 2008-12-12 at 10:49 -0200, Fábio Telles Rodriguez wrote: 2008/12/12 Lucas Paz lucas...@gmail.com: Bom dia pessoal, Preciso de mais 1 ajuda, tenho 1 banco de dados com mais de 1000 tabelas (1039 pra ser exato) e preciso alterar o dono do banco e de todas as tabelas... tem alguma maneira prática de fazer isso sem fazer o dump do banco? Claro, você vai precisar de: http://www.postgresql.org/docs/8.3/static/sql-altertable.html e também de: http://www.postgresql.org/docs/8.3/static/infoschema-tables.html Com isso você deve chegar lá! []s Fábio Telles ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] duvida na utilização de aspas si mples
2008/12/12 Anderson jackvalant...@gmail.com Bom dia Lista, pessoal estou fazendo um procedure mas surgiu um problema com a aspas simples, o problema esta em como utilizar elas no meio de uma sql que tem varias concatenações. Use a função *quote_literal*. Deseja que o texto 'qualquer' esteja com as aspas simples, então basta usar : *quote_literal*('qualquer'); XCRIATABELA :='CREATE TABLE '|| XTABELA ||' ('|| XNID || ' NUMERIC(6,0) DEFAULT nextval(('||quote_literal('* tb_remessa_seq')||'::text*)::regclass) NOT NULL,'|| XNUMEROREMESSA ||' NUMERIC(6,0) DEFAULT nextval(('* ||quote_literal(XSEQUENCIA)||*'::text)::regclass),'|| XANO ||' NUMERIC(4,0),'|| XUSUARIOINCLUSAO ||' NUMERIC(6,0),'|| XDTINCLUSAO ||' TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT ('||quote_literal( *now*())||')::timestamp(6) without time zone,'|| XUSUARIOALTERACAO ||' NUMERIC(6,0),'|| XDTALTERACAO ||' TIMESTAMP WITHOUT TIME ZONE,'|| XSETOR ||' NUMERIC(6,0),'|| XCDUNIDADE ||' NUMERIC(6,0),'|| XORDEM ||' NUMERIC(2,0),'|| XDOCUMENTO ||' VARCHAR(50),'|| XASSUNTO ||' VARCHAR(450),'|| XDE ||' VARCHAR(150),'|| XPARA ||' VARCHAR(150),'|| XAC ||' VARCHAR(150) ) WITH OIDS'; EXECUTE XCRIATABELA; nas partes em vermelho teria que ter aspas simples, porem se as coloco da erro, dizendo que as sequencias não existem. obrigado Anderson ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- William Leite Araújo Mobile Solution Manager - QualiConsult Analista de Banco de Dados ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] duvida na utilização de aspas sim ples
Anderson escreveu: Bom dia Lista, pessoal estou fazendo um procedure mas surgiu um problema com a aspas simples, o problema esta em como utilizar elas no meio de uma sql que tem varias concatenaes. XCRIATABELA :='CREATE TABLE '|| XTABELA ||' ('|| XNID ||' NUMERIC(6,0) DEFAULT nextval((tb_remessa_seq::text)::regclass) NOT NULL,'|| XNUMEROREMESSA ||' NUMERIC(6,0) DEFAULT nextval(('||XSEQUENCIA||'::text)::regclass),'|| XANO ||' NUMERIC(4,0),'|| XUSUARIOINCLUSAO ||' NUMERIC(6,0),'|| XDTINCLUSAO ||' TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT (now::text)::timestamp(6) without time zone,'|| XUSUARIOALTERACAO ||' NUMERIC(6,0),'|| XDTALTERACAO ||' TIMESTAMP WITHOUT TIME ZONE,'|| XSETOR ||' NUMERIC(6,0),'|| XCDUNIDADE ||' NUMERIC(6,0),'|| XORDEM ||' NUMERIC(2,0),'|| XDOCUMENTO ||' VARCHAR(50),'|| XASSUNTO ||' VARCHAR(450),'|| XDE ||' VARCHAR(150),'|| XPARA ||' VARCHAR(150),'|| XAC ||' VARCHAR(150) ) WITH OIDS'; EXECUTE XCRIATABELA; nas partes em vermelho teria que ter aspas simples, porem se as coloco da erro, dizendo que as sequencias no existem. obrigado Anderson ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral Bom dia Anderson, teste dessa maneira... ... XNID ||' NUMERIC(6,0) DEFAULT nextval((''tb_remessa_seq''::text)::regclass) NOT NULL,'|| XNUMEROREMESSA ||' NUMERIC(6,0) DEFAULT nextval(('''||XSEQUENCIA||'''::text)::regclass),'|| ... ... XDTINCLUSAO ||' TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT (''now''::text)::timestamp(6) without time zone,'|| ... veja que no so aspas duplas mas sim duas aspas simples... Abrao!! -- Luiz Henrique Livrari Implantador de Sistemas Jr. MSI SOLUES - Unidade Ourinhos Av. Dr. Altino Arantes, 131 Sala 145 - 146 Centro - Ourinhos/SP - Brasil Fone/Fax: +55 (14) 3324-8181 www.msisolucoes.com.br ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] RES: Banco Multiempresa
Oi pessoal, To vendo essa conversa se estender, e quero dar minha opinião, pois tenho sistema multiempresa rodando. Quando vejo a discussão sobre as permissões no banco de dados, me pergunto por que o usuário terá a liberdade de operar em cima dele fora do sistema. Creio que somente o DBA devesse ter esse direito. Sendo assim, no sistema, ao iniciar, seta-se uma variável global com o código da empresa atual, e somente esses dados serão carregados/listados/alterados. E ninguém tem a senha de login no banco, exceto o DBA. Criar esquemas vai gerar um custo muito alto de manutenção desse banco, pra sincronizar metadados, mesmo que seja para CX2, como disseram. E separar em tabelas distintas também. Concordo plenamente com o Mozart. De: Adriano Espinoza de Oliveira [mailto:adrianoespin...@gmail.com] Enviada em: quinta-feira, 11 de dezembro de 2008 13:52 Para: Comunidade PostgreSQL Brasileira Assunto: Re: [pgbr-geral] Banco Multiempresa Mozart, concordo com você!!! Mas, como você mesmo, pode servir para alguem... No caso do Saulo, está na cara que trata-se de um caixa 2, e bla bla bla... APARENTEMENTE digo APARENTEMENTE uma esquartejada de leve não vai trazer problemas Adriano 2008/12/11 Mozart Hasse mozart.ha...@usa.net Bases separadas?! Para brincar até dá, mas... e se o teu banco tiver mais 800 tabelas?? O que é que se faz com as 2000 chaves estrangeiras e os 4000 índices?! Cria em todas as bases de filiais ?! Lindo, e aí é só configurar alguns arquivinhos super triviais do SLONY para sincronizar as míseras 200 tabelas de uso comum a todas as filiais. Vamos pensar *médio*. E se você quiser tirar um relatório gerencial das 30 filiais do mesmo *estado* ? (Brasil inteiro não, que eu propus pensar *médio*!) Quantos UNIONs você vai ter de fazer se a consulta de uma empresa só você já precisa de umas 8? Quanto tempo você acha que o planejador vai gastar só descobrindo se ele dá conta de rodar um comando desse tamanho? Agora o divertido mesmo vai ser atualizar a estrutura desse negócio. Que tal rodar o mesmo script ALTER TABLE nas 30 filiais? Acha que um scriptzinho criado via cut-paste ou macros mirabolantes para usar na linha de comando quebram teu galho? Bom, o interessante vai ser explicar para o cliente que ele vai precisar de um DBA toda a vez que quiser cadastrar uma filial nova. Fico imaginando quanto tempo o cliente vai gastar com DBAs só monitorando o SLONY para garantir que ele atualizou as tabelas comuns em todas essas bases e que todas as tabelas estão com a mesma estrutura. O legal mesmo vai ser alguém precisar rodar (ou precisar de algo equivalente) um UPDATE em todas as filiais de uma vez, dentro de uma só transação... Sinto muito, essa idéia de esquartejar bases até pode servir para alguém, mas no meu caso, na-na-ni-na-não. Mozart Hasse Sobre o assunto, eu *não* misturaria dados de empresas distintas em uma mesma tabela sem utilizar um controle de permissões a nível de registros (como os descritos acima) porque seria fácil, senão trivial, conseguir dados indevidos. Como alguns colegas sugeriram, eu optaria por utilizar esquemas para separar empresas e utilizaria a nomenclatura nomedomodulo_nomedoobjeto para designar os objetos (tabelas, funções, visões, etc). ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Rodar script de gente grande
Detalhando: o proprio psql do postgres faz isso coloque a seguinte linha no inicio do arquivo \set ON_ERROR_STOP psql dbname infile http://www.postgresql.org/docs/8.3/interactive/backup-dump.html na sessão 24.1.1. Restoring the dump o manual refere-se para restauração de dump, mas tb pode ser utilizado para o que vc quer fazer Sim, é mesmo. Alterar o arquivo texto (por mais simples que seja a alteração) é um passo bastante inconveniente, mas não deixa de ser uma opção. Não conhece algo um pouco mais amigável, com botões e cliques? Outra coisa: tem como o arquvo de saída conter APENAS os comandos que deram erro e as respectivas mensagens? Isso ajudaria bastante a melhorar o desepmenho e reduzir o volume de lixo que seria inevitavelmente jogado fora. E da onde vem esse monte de scripts?estão em arquivo texto, ou algum programa gera isso p/ vc? Tenho um programa que gera INSERTs e UPDATEs para cada registro de certas tabelas, e às vezes essas tabelas são bem grandes. Isso serve por exemplo para garantir que um certo conjunto de tabelas tenha exatamente os registros que eu quero, independente dos registros existentes (que o usuário pode criar sem eu me importar com eles). Mesmo que eu quisesse puramente garantir uma cópia da minha base, não posso simplesmente dar um TRUNCATE seguido de um monte de INSERTs porque essas tabelas são de consulta e têm inúmeras referências de outras tabelas. Remover e recriar *todas* essas chaves estrangeiras daria um trabalho monstruoso, levaria uma eternidade para reconstruir os índices, enquanto que comandos de INSERT e UPDATE podem ser feitos com a base no ar, aos poucos conforme a carga do servidor. Outra coisa que uso para gerar scripts enormes são meta-scripts (SELECTs que geram como saída texto de comandos SQL) para geração de índices e eventuais rotinas auxiliares. Os scripts de criação de bases vazias (para testes internos e novos clientes) também são bem grandes. Sugestões? Mozart Hasse ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Rodar script de gente grande
Bom, Não conheço, mas escrever um programa que roda um alter table de cada vez não parece ser muito complicado De fato, mas não quero reinventar a roda. Colocar as firulas que eu gostaria vai consumir muito mais tempo. Utilize copy ao invés de inserts, ele foi feito para isso! Ele foi feito para casos que nunca dão erro. Não me servem, quero mexer na estrutura também. Mozart ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Rodar script de gente grande
Fabio Henrique, Eu tambem rodo script enormes, nao grandes iguais ao seus, com 1 milhao de linhas, mas em torno de 100 mil linhas com varios inserts em cada linha. (...) Para rodar esses scripts eu utilizo o PGadmin que, com certeza, nao foi feito para rodar scripts deste tamanho. Concordo plenamente! Se eu nao me engano, ele faz justamente isso q vc qr, ele vai inserindo as linhas e dando commit ate onde der erro, nao precisando vc ter q rodar o script novamente. Uma outra alternativa seria para cada linha vc inserir um 'BEGIN;' no inicio e um 'COMMIT;' no final. Pelo que usei, não faz não. Quando tem um monte de comandos separados por ';', ele considera tudo parte da mesma transação, o que é um desastre nesse caso. Isso me obriga a rodar um pedaço de cada vez, porque: 1. Se *der* erro de integridade referencial, eu perdi o tempo que ele ficou rodando antes do erro (e o rollback que eu não pedi para ele fazer). Depois, tenho de achar o bendito comando dentro do script (nem sempre é fácil quando o script é enorme), rodar tudo até antes do comando que deu erro, apagar o trecho já executado, corrigir o comando e executar dali em diante. 2. Se *não der* erro de integridade referencial, preciso rodar um trechinho de cada vez para não estourar o limite de LOCKs do servidor (o chato é que ele leva um tempão para descobrir que o limite foi atingido). Não, eu não quero aumentar esse valor porque o valor padrão é perfeitamente aceitável para uso normal, e não quero ficar parando, reconfigurando e reiniciando serviço toda a vez que quiser rodar um inocente script numa estação. Valeu, Mozart Hasse ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
qual comando daria conta? 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com 2008/12/12 Lucas Paz lucas...@gmail.com: Opa só uso linux :P ... Gente... para criar um script quando um único comando SQL dá conta? []s 2008/12/12 joao junior joao.jun...@bra03034.conab.gov.br vc tem linux em maos? :) se tiver te mando um shell script :P On Fri, 2008-12-12 at 10:49 -0200, Fábio Telles Rodriguez wrote: 2008/12/12 Lucas Paz lucas...@gmail.com: Bom dia pessoal, Preciso de mais 1 ajuda, tenho 1 banco de dados com mais de 1000 tabelas (1039 pra ser exato) e preciso alterar o dono do banco e de todas as tabelas... tem alguma maneira prática de fazer isso sem fazer o dump do banco? Claro, você vai precisar de: http://www.postgresql.org/docs/8.3/static/sql-altertable.html e também de: http://www.postgresql.org/docs/8.3/static/infoschema-tables.html Com isso você deve chegar lá! []s Fábio Telles ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Lucas Paz ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- blog: http://www.midstorm.org/~telles/ e-mail http://www.midstorm.org/%7Etelles/e-mail / jabber: fabio.tel...@gmail.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Lucas Paz ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com: 2008/12/12 Lucas Paz lucas...@gmail.com: qual comando daria conta? 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com 2008/12/12 Lucas Paz lucas...@gmail.com: Opa só uso linux :P ... Gente... para criar um script quando um único comando SQL dá conta? Ok, ok... você não olhou os links que eu te passei, olhou? Mas se você estiver na versão 8.3 do PostgreSQL... pode user isto aqui também: http://www.postgresql.org/docs/8.3/static/sql-reassign-owned.html E antes que alguém se levante para me criticar sim, eu acredito que todos deveriam ler a documentação. Atenciosamente, Fábio Telles -- blog: http://www.midstorm.org/~telles/ e-mail / jabber: fabio.tel...@gmail.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com: 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com: 2008/12/12 Lucas Paz lucas...@gmail.com: qual comando daria conta? 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com 2008/12/12 Lucas Paz lucas...@gmail.com: Opa só uso linux :P ... Gente... para criar um script quando um único comando SQL dá conta? Ok, ok... você não olhou os links que eu te passei, olhou? Mas se você estiver na versão 8.3 do PostgreSQL... pode user isto aqui também: http://www.postgresql.org/docs/8.3/static/sql-reassign-owned.html Um pequeno deslize. Esta funcionalidade surgiu no 8.2 e não no 8.3. :-) -- blog: http://www.midstorm.org/~telles/ e-mail / jabber: fabio.tel...@gmail.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Rodar script de gente grande
Telles, Meu caro Mozart, você escreveu um e-mail longo, mas não colocou as principais informações. Obrigado por colaborar com base na informação disponível. Não tenho como adivinhar que tipo de operação você está fazendo, se é uma operação do tipo fechamento de mês onde vários dados são totalizados e transferidos de uma tabela para outra, se é um cálculo mensal do tipo folha de pagamento ou se é uma carga de dados vindo de outra fonte via txt por exemplo. Basta assumir o pior caso que é o que você aparentemente usou como base: tenho todas essas coisas e mais algumas. - COPY é melhor que multiplos INSERTs, que é melhor que INSERTS c/ PREPARED STATEMENTs, que são melhores que INSERTs individuais. - INSERT é melhor que DELETE (escrevi um artigo sobre isso em: http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/) - Após a carga, sempre rode um vacuum analize nas tabelas afetadas - Use cursores se estiver estourando a sua memória! ok - Nenhum processo em lote deve ser executado via CLIENT/SERVER, rode tudo via PL dentro do banco que você vai ter uma performance absurdamente melhor; Obrigado por informar, mesmo que viole meus requisitos. - Se você puder agendar sua rotina em lote para um horário mais calmo, pense em fazer uma configuração específica de desempenho para a carga, por exemplo diminuindo o número de conexões e aumentando a memória para uma conexão individual, Obrigado por informar, mesmo que viole meus requisitos. Não quero mexer no servidor para rodar um script inocente. Sim, eu me conformo com o desempenho possível dadas as limitações que indiquei. - Se tiver que fazer uma carga de dados em TXT com possíveis problemas... considere trazer tudo para uma tabela burra (uma tabela TEMPORÁRIA com um campo TEXT sem PK) para receber os dados inicialmente dentro do banco. Depois de carregar todos os dados na tabela burra, você poderá tratar os dados com SQL e mover os registros problemáticos para outra área e aí sim transferir os registros da sua tabela burra para os locais corretos. - Aprenda a fazer o tratamento de erros em PL, Sim, realmente, só que eu gostaria de uma solução mais simples e prática. Não quero montar um script ou um programa que monte um script fazendo isso para cada tabela quando se tratar de carga. Isso exige conhecimento da estrutura, chaves, tipos de dados e integridade referencial. No meu caso é muito esforço em qualificação e pré-processamento para um inocente script de carga, que por sinal eu gostaria muito de *não* mexer. - Remova constraints e índices quando for fazer grandes cargas e deixe para reconstruí-los no final. A lista de constraints é, no meu caso, imprevisível. O número de índices e constraints afetados é enorme, os passos extras necessários para tirar e por essas constraints e índices é muito inconveninente. O tempo que o servidor ficaria quase que totalmente inacessível reconstruindo-os é bastante indesejado. - Aprenda a utilizar COMMIT, ROLLBACK e SAVEPOINT corretamente e estimar de quantos em quantos registros realizar um COMMIT. Isso depende da configuração do servidor. Não quero depender disso. Obrigado pelas dicas, mesmo que não sejam bem o que eu estava procurando. Mozart Hasse ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Modelo de campeonatos de Futebol.
Olá pessoal. Alguém aí já passou pelo problema de modelar uma base de dados especialmente para controle de campeonatos de futebol ? Brasileirão, regionais, libertadores, mundial, copa do Brasil, Copa do Mundo, Campeonato Europeu, Campeonato Espanhol, etc obviamente, considerando todas as regras de negócio... rsrsrs. Detalhe: as estatísticas que serão necessárias é quase igual à da Globo... =/ Tô ferrado! rsrs. Qualquer sugestão é *MUITO* bem vinda. Sds, Eduardo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
Fabio, Acho que ou não expliquei direito ou não entendi direito o que vc quer dizer... Eu li o que vc me sugeriu! Alterar o dono do banco é fácil... o problema é alterar as 1093 tabelas. Aqui usamos uma aplicação de terceiro que usa o postgresql, e quando o banco foi criado foi com o dono postgres, depois se criou um usuario para o banco então 70% das tabelas estão como dono o postgres e o resto da com o usuario novo... o banco é o 8.1... então não tem como usar esse comando... alguma outra sugestão? 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com: 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com: 2008/12/12 Lucas Paz lucas...@gmail.com: qual comando daria conta? 2008/12/12 Fábio Telles Rodriguez fabio.tel...@gmail.com 2008/12/12 Lucas Paz lucas...@gmail.com: Opa só uso linux :P ... Gente... para criar um script quando um único comando SQL dá conta? Ok, ok... você não olhou os links que eu te passei, olhou? Mas se você estiver na versão 8.3 do PostgreSQL... pode user isto aqui também: http://www.postgresql.org/docs/8.3/static/sql-reassign-owned.html Um pequeno deslize. Esta funcionalidade surgiu no 8.2 e não no 8.3. :-) -- blog: http://www.midstorm.org/~telles/ e-mail http://www.midstorm.org/%7Etelles/e-mail / jabber: fabio.tel...@gmail.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Lucas Paz ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
2008/12/12 Lucas Paz lucas...@gmail.com: Fabio, Acho que ou não expliquei direito ou não entendi direito o que vc quer dizer... Eu li o que vc me sugeriu! Alterar o dono do banco é fácil... o problema é alterar as 1093 tabelas. Aqui usamos uma aplicação de terceiro que usa o postgresql, e quando o banco foi criado foi com o dono postgres, depois se criou um usuario para o banco então 70% das tabelas estão como dono o postgres e o resto da com o usuario novo... o banco é o 8.1... então não tem como usar esse comando... alguma outra sugestão? tem! crie uma pl (plpgsql, pra mais detalhes veja o manual...) que busque todas as tabelas do seu sistema e depois crie um sql dinamico do tipo alter table XX... mudando o owner da tabela. eu acho bem mais simples assim um aBraço! -- Atenciosamente, Sebastian Selau Webber Colombo ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Alterar dono banco todo
Lucas Paz escreveu: Fabio, Acho que ou não expliquei direito ou não entendi direito o que vc quer dizer... Eu li o que vc me sugeriu! Alterar o dono do banco é fácil... o problema é alterar as 1093 tabelas. Naa... ele te mandou o link pra documentação do schema, que é aonde estão armazenados os nomes das tuas tabelas: http://www.postgresql.org/docs/8.3/static/infoschema-tables.html Então, a partir da lista das tabelas, vc pode criar um SQL que faça ALTER TABLE em cada uma delas. Gotcha ? -- []´s, ACV ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] duvida na utilização de aspas sim ples
obrigado resolvi usando o quote_literal 2008/12/12 William Leite Araújo william.ara...@grupoquali.com.br 2008/12/12 Anderson jackvalant...@gmail.com Bom dia Lista, pessoal estou fazendo um procedure mas surgiu um problema com a aspas simples, o problema esta em como utilizar elas no meio de uma sql que tem varias concatenações. Use a função *quote_literal*. Deseja que o texto 'qualquer' esteja com as aspas simples, então basta usar : *quote_literal*('qualquer'); XCRIATABELA :='CREATE TABLE '|| XTABELA ||' ('|| XNID || ' NUMERIC(6,0) DEFAULT nextval(('||quote_literal('* tb_remessa_seq')||'::text*)::regclass) NOT NULL,'|| XNUMEROREMESSA ||' NUMERIC(6,0) DEFAULT nextval(('* ||quote_literal(XSEQUENCIA)||*'::text)::regclass),'|| XANO ||' NUMERIC(4,0),'|| XUSUARIOINCLUSAO ||' NUMERIC(6,0),'|| XDTINCLUSAO ||' TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT ('||quote_literal( *now*())||')::timestamp(6) without time zone,'|| XUSUARIOALTERACAO ||' NUMERIC(6,0),'|| XDTALTERACAO ||' TIMESTAMP WITHOUT TIME ZONE,'|| XSETOR ||' NUMERIC(6,0),'|| XCDUNIDADE ||' NUMERIC(6,0),'|| XORDEM ||' NUMERIC(2,0),'|| XDOCUMENTO ||' VARCHAR(50),'|| XASSUNTO ||' VARCHAR(450),'|| XDE ||' VARCHAR(150),'|| XPARA ||' VARCHAR(150),'|| XAC ||' VARCHAR(150) ) WITH OIDS'; EXECUTE XCRIATABELA; nas partes em vermelho teria que ter aspas simples, porem se as coloco da erro, dizendo que as sequencias não existem. obrigado Anderson ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- William Leite Araújo Mobile Solution Manager - QualiConsult Analista de Banco de Dados ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] SET CONSTRAINTS DEFERRED
2008/12/11 Rogério Grando rogeriogra...@planin.com.br: Ola pessoal; Estamos migrando da versão 7.4 para 8.2 mas estamos tendo vários obstáculos nessa migração e agora na reta final apareceu outro problema... anteriormente fazia-mos uma transação da seguinte forma. Temos 2 tabelas: pai e filho sendo que a tabela filho possui uma fk cascade no delete com a pai. Executo: DELETE pai WHERE co_pai = 1; INSERT INTO pai (co_pai) VALUES (2); UPDATE filho SET co_pai = 2; Na versão 7.4 funciona, na 8.2 não, li a documentação e vi que posso mudar a fk para DEFERRED e devo colocar BEGIN; e COMMIT; para que a FK seja validada no final da transação, mas para isso teria que alterar toda minha aplicação. Teria alguma configuração postgres.conf ou alguma outra forma de estar mudando esse comportamento para que seja = a do 7.4? Oi Sebastian, desculpe se não fui claro, mas o meu problema é que no momento em que excluo o registro da tabela pai já é excluído da tabela filho, portanto no momento que faço um update na tabela filho com o novo código do pai o registro filho ja não existe mais, quando eu executava isso na versão 7.4 a exclusão da fk era feita no final da transação acabava não fazendo nada pois o registro filho ja havia sido modificado com o novo código do pai. Não é mais fácil primeiro alterar o filho para depois excluir o pai?? -- Shander Lyrio Ola Shander Lyrio; Com certeza, mas o que me ocorre aqui é que encontramos em uma determinada parte do ERP executando dessa forma, então corrigimos essa funcionalidade, mas pode ocorrer em outra parte também, e como sempre o desenvolvimento não dispõe de muito tempo para varrer toda a aplicação eu tava pesando que houvesse alguma configuração que pudesse me ajudar. isso resolve seu problema --- DEFERRABLE NOT DEFERRABLE This controls whether the constraint can be deferred. A constraint that is not deferrable will be checked immediately after every command. Checking of constraints that are deferrable can be postponed until the end of the transaction (using the SET CONSTRAINTS command). NOT DEFERRABLE is the default. Only foreign key constraints currently accept this clause. All other constraint types are not deferrable. - referência: http://www.postgresql.org/docs/8.3/interactive/sql-createtable.html ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] [Bulk] Re: Rodar script de gente grande
Mozart Hasse wrote: Obrigado por informar, mesmo que viole meus requisitos. Não quero mexer no servidor para rodar um script inocente. Sim, eu me conformo com o desempenho possível dadas as limitações que indiquei. O script é inocente ou de gente grande??? -- Shander Lyrio ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral