Re: [pgbr-geral] Rodar script de gente grande
Mozart Hasse wrote: Tenho centenas de scripts, muitos deles pequenos, outros enormes, porém todos são *simples*, e, portanto, considero-os *inocentes* por não fazerem nada além de singelos comandos SQL. Algum outro script para o PostGreSql pode enviar outro tipo de comando que não SQL?? Entretanto, alguns deles são, além de simples e singelos, radicalmente extensos pela quantidade de registros que precisam conferir, inserir, corrigir ou excluir de maneira *independente*. Este tamanho faz com que não possam ser rodados decentemente nas ferramentas costumeiramente usadas para rodar scripts, e o fato de seu *tamanho* Acredito que por DBA's as ferramentas costumeiramente utilizadas para rodar scripts seja psql e eu utilizo aqui para qualquer tamanho de scripts e problemas de velocidade resolvo com transações e o comando copy. (assim como o número de registros e a estrutura das tabelas que eles manipulam) exigir tratamento especial me faz julgar adequado classificá-los como scripts de gente grande. Então estamos falando simplesmente de scripts grandes e não scripts complexos. Acha pequeno porque tem maior? Azar o seu. Acha simplório porque usa comandos mais incomuns, menos documentados e que teoricamente trazem maior desempenho? Boa sorte para você e tomara que não precise gastar o dia inteiro criando-os, ou que pelo menos faça seu cliente engolir esse custo todo por causa de alguns segundos ou mesmo um par de horas de diferença na execução final ou na disponibilidade do servidor. Quanto é que você está me pagando para engolir sua arrogânica e seus xiliques?? Que tal se ater ao tema e deixar para explodir seus hormonios juvenis em alguém que tenha obrigação de aturar seu mal humor. Se sua esposa/namorada está dormindo de calça jeans queira por favor não trazer isto para a lista. Aqui se discute PostGreSql e creio que não temos psicólogos entre nós. Quanto a quem não gostou da minha lista de requisitos: Estou buscando resultados objetivos, corretamente representados pela minha lista de requisitos, lista essa que não tenho nenhuma necessidade ou interesse de justificar, porque sei perfeitamente que temos rumos diferentes, objetivos diferentes, quadro de pessoal com qualificações diferentes, clientes com visões radicalmente diferentes da utilidade e necessidade de DBAs especializados em Postgres e, se muito, de vez em quando, em alguns casos, um banco de dados em comum. Em suma: a lista de motivos que me leva a cada requisito é bastante específica e não tem absolutamente nada a ver com Postgres. PostGreSql é um excelente SGDB mas não faz mágica assim como nenhum outro SGDB o faz. Que tal tentar abrir sua cabeça para novas idéias? A quem pensa que conhece meu problema melhor do que eu e pode mudar meus requisitos e necessidades pelo que postei... Poupem o tempo da lista e o meu também. Mais uma prova de que está falando besteira e que escreveu este e-mail com o intuito apenas de criar polêmica. Requisitos não se mudam pela experiência do DBA. Cabe ao DBA inteligente criar uma solução melhor (talvez sem scripts) para resolver o problema de forma mais rápida e não explodir sua agonia por não conseguir fazer em uma lista de discussão. Se não tem como criar uma solução melhor, chegue para o cliente e diga: Sinto muito não dá para fazer!, agora tenha certeza disso após ter tentado várias alternativas ao invés de massificar toda a sua esperança em scripts imensos. Não vai ser muito bom se seu cliente não encontrar outro DBA que faça o mesmo serviço, mais rápido com uma solução diferente. Sinto muito, prefiro guardar minhas idéias porque tu és arrogante d+ para aceitar que podem existir soluções melhores do que (a sua) scripts imensos. Boa sorte com sua imensa lista de requisitos (que meio que duvido sejam dos clientes) e com sua imutável solução pobre. Abraços, -- Shander Lyrio ___ 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
Boa tarde Mozart, Você já deu uma olhada no PgLoader?? http://pgfoundry.org/projects/pgloader/ Sei que você está trabalhando com INSERTs no seu script e o PgLoader trabalha com COPY mas ainda assim acho que vale a pena dar uma olhada... Abraço!! -- Luiz Henrique Livrari Implantador de Sistemas Jr. MSI SOLUÇÕES - 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
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] 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
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] 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
Re: [pgbr-geral] Rodar script de gente grande
2008/12/11 Mozart Hasse [EMAIL PROTECTED]: 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 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 ___ 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
E da onde vem esse monte de scripts?estão em arquivo texto, ou algum programa gera isso p/ vc? Adriano 2008/12/11 Mozart Hasse [EMAIL PROTECTED] 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] Rodar script de gente grande
2008/12/11 Mozart Hasse [EMAIL PROTECTED]: 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. Não conheço, mas escrever um programa que roda um alter table de cada vez não parece ser muito complicado -- 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] Rodar script de gente grande
Utilize copy ao invés de inserts, ele foi feito para isso! On Thu, 2008-12-11 at 15:36 -0200, Sebastian SWC wrote: 2008/12/11 Mozart Hasse [EMAIL PROTECTED]: 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. Não conheço, mas escrever um programa que roda um alter table de cada vez não parece ser muito complicado ___ 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
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. Eu sei os problemas que vc deve estar tendo pois trabalhar com arquivo texto desse tamanho não é a coisa mais facil... Para rodar esses scripts eu utilizo o PGadmin que, com certeza, nao foi feito para rodar scripts deste tamanho. 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. Espero ter ajudado, pelo menos em uma parte do seus problemas... Fabio Henrique Mozart Hasse escreveu: 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 ___ Yahoo! Mail - Sempre a melhor opção para você! Experimente já e veja as novidades. http://br.yahoo.com/mailbeta/tudonovo/ ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral