Eu escrevi um script para atualizar o PostgreSQL de 8.2.1 para 9.2.1 em uma distribuição Linux From Scratch:
- Iniciar o
pg
serviço - Aspire todos os bancos de dados (não tenho certeza se isso é necessário)
- Backup com
pg_dumpall
- Pare o
pg
serviço - Afaste o diretório onde os dados estão armazenados (
/var/pg
; é uma configuração simples de servidor único) - Instale o PostgreSQL 9.2.1
initdb
- Iniciar o servidor
- Restaurar os dados despejados
reindexdb
todos os bancos de dados- Recrie a
referential_constraints
visualização - Aspire todos os bancos de dados (AFAIK necessário após esta atualização)
Infelizmente, a reindexação falha em cerca de um terço das execuções, mesmo ao usar uma máquina virtual que eu reinicio entre as tentativas. O código:
PGOPTIONS='--client-min-messages=warning' psql \
--no-psqlrc \
--variable=ON_ERROR_STOP=1 \
--quiet \
--log-file="$restore_log" \
--single-transaction \
--username postgres \
--file="$sql_backup"
[error checking which stops the script if the import failed]
for database in $(databases); do
reindexdb --username postgres $database
[error checking which stops the script if the reindex failed]
done
O log de restauração não mostra nenhum erro no final. As últimas linhas da reindexdb
saída (anônimas para poder publicá-lo):
NOTICE: table "myschema.mytable" was reindexed
reindexdb: reindexing of database "myschema" failed: ERROR: could not open relation with OID 16738
/var/log/pg/postmasterlog
conteúdo durante a atualização:
Após uma reinicialização da VM, descobri que o OID pertence a uma tabela cujo backup foi feito e restaurado corretamente. Poderia ser um problema que a reindexdb
etapa seja executada imediatamente após psql
o processamento do arquivo de backup?
Edit: Isso está ficando ainda pior - Desta vez, encontrei outro problema que não tinha visto antes:
reindexdb: reindexing of database "myschema" failed: ERROR: deadlock detected
DETAIL: Process 3883 waits for AccessExclusiveLock on relation 17684 of database 16385; blocked by process 3980.
Process 3980 waits for RowExclusiveLock on relation 16513 of database 16385; blocked by process 3883.
Em /var/log/messages
:
Process 3980: UPDATE tablename SET [...]
Parece que o problema é um cron job que estava tentando atualizar o banco de dados durante a reindexação.