2009/12/4 Marcelo Costa <[email protected]>:
>
>
> 2009/12/4 Tiago Adami <[email protected]>
>>
>> 2009/12/4 Marcelo Costa <[email protected]>:
>> > Olá
>> >
>> > 2009/12/4 Tiago Adami <[email protected]>
>> >>
>> >> Estou executando uma rotina de reprocessamento na minha máquina, que
>> >> roda Windows Vista Home Premium 32-bit e PostgreSQL 8.4.1. Com o mesmo
>> >> database em um servidor de produção rodando Ubuntu Linux 8.04 32-bit e
>> >> PostgreSQL 8.2.12, o erro não acontece.
>> >>
>> >> A rotina é na aplicação, executando mais de 50.000 comandos SQL dentro
>> >> da transação (distribuídos entre INSERTS, UPDATES, DELETES e SELECTS).
>> >> Chega um momento que o PostgreSQL simplesmente "abre as pernas". A
>> >> máquina fica impossível de ser utilizada, e logo em seguida a mensagem
>> >> de erro é retornada pela aplicação:
>> >>
>> >> [SQL Error]
>> >> Connectivity error:
>> >>
>> >> [SQL State]
>> >> 53200
>> >>
>> >> [Mensagem do driver ODBC]
>> >> ERROR: out of memory
>> >> Failed on request of size 88.;
>> >> Error while executing the query
>> >>
>> >> [Código SQL]
>> >> SELECT * FROM PCCMESD0 WHERE EMPFIL='0012' AND ITEM='414719' AND
>> >> DTMOVI='2009-11-27'
>> >>
>> >> O que poderia ser? Seria este algum bug da 8.4.1 ou um bom motivo para
>> >> usar Linux? ;)
>> >>
>> >
>> > Nunca é tarde...
>> >
>> > No entanto não deveria ocorrer isso. Você poderia enviar os logs do
>> > banco de
>> > dados quando esse problema ocorre ?
>> >
>>
>> Qual o nível de log seria suficiente para este caso? (DEBUG1, DEBUG2,
>> etc). No log consta apenas registros do tipo:
>>
>> "CurTransactionContext: 8192 total in 1 blocks; 8176 free (1 chunks); 16
>> used"
>>
>
> DEBUG3 e veja o que ele reporta
>
Mais um erro, provavelmente com a mesma causa:
[SQL Error]
Connectivity error:
[SQL State]
25P02
[Mensagem do driver ODBC]
ERRO: transação atual foi interrompida,comandos ignorados até o fim do
bloco de transação;
Error while executing the query
[Código SQL]
INSERT INTO PCITESDA(EMPFIL,ITEM,SLD_FIS,SLD_INV,SLD_RES) VALUES
('0002','338575',41,000,41,000,0,000)
O log não diz muita coisa no momento do erro:
--
MdSmgr: 8192 total in 1 blocks; 5440 free (0 chunks); 2752 used
LOCALLOCK hash: 24576 total in 2 blocks; 16168 free (4 chunks); 8408 used
Timezones: 79320 total in 2 blocks; 5968 free (0 chunks); 73352 used
ErrorContext: 398800 total in 4 blocks; 23496 free (25 chunks); 375304 used
2009-12-04 11:40:12 BRTERROR: out of memory
2009-12-04 11:40:12 BRTDETAIL: Failed on request of size 1496789.
2009-12-04 11:40:14 BRTERRO: transação atual foi interrompida,
comandos ignorados até o fim do bloco de transação
2009-12-04 11:40:14 BRTCOMANDO: INSERT INTO
PCITESDA(EMPFIL,ITEM,SLD_FIS,SLD_INV,SLD_RES) VALUES (E'0002'
,E'338575' ,'41'::float8 ,'41'::float8 ,'0'::float8 )
2009-12-04 11:40:14 BRTERRO: transação atual foi interrompida,
comandos ignorados até o fim do bloco de transação
2009-12-04 11:40:14 BRTCOMANDO: insert into pchissql (programa, opid,
sql, tmp_exec) values (E'SSPLUSAPP' , E'SSP' , TRIM(E'INSERT INTO
PCITESDA(EMPFIL,ITEM,SLD_FIS,SLD_INV,SLD_RES) VALUES
(?cEmpfil,?cItem,?nSLD_FIS,?nSLD_INV,?nSLD_RES)' ), '0'::float8 )
Consegui contornar a situação diminuindo o tamanho das transações, ou
seja, como existe um laço de repetição entre cerca 20.000 registros
estou abrindo uma transação no início do laço e comitando ao seu
final.
A pergunta que fica agora é a seguinte: há como aumentar a
disponibilidade de memória para cada transação? O que fica claro aqui
é que uma única transação excede o máximo de memória permitido...
(agora está explicado porque no linux mesmo na versão 8.2 isso não
acontece: no servidor há 2 GB de RAM, e como não possui mais nada
rodando além dos serviços essenciais e o PostgreSQL, sobra memória).
--
TIAGO J. ADAMI
http://www.adamiworks.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral