Meus passos:
- executar o final
pg_dumpall
em um servidorprod-server-old
- Desligar
prod-server-old
para sempre. - copie a saída para um servidor diferente (
prod-server-new
) - Restaure o db lá.
- Todo o tráfego vai para
prod-server-new
agora
Como posso evitar modificações no banco de dados durante pg_dumpall
(entre a etapa 1 e a etapa 2), para que as modificações durante esse período não possam ser perdidas?
No meu caso, é 100% OK ter um pequeno tempo de inatividade.
Existem vários bancos de dados no "cluster" (aliás, eu não gosto da palavra "cluster". Acho que a maioria das pessoas pensa que um "cluster" é um grupo de vários computadores, mas neste caso significa um servidor Postgres, que contém vários bancos de dados).
Minha pergunta foi marcada como possível duplicada para "Tornar o banco de dados Postgres temporariamente somente leitura (para executar instantâneos de volume)". Não acho que seja uma duplicata, pois no meu caso é diferente, pois não peço um estado temporário somente leitura.
Duas maneiras de fazer isso:
revogar o
connect
privilégio para opublic
grupo. Isso impedirá que todos, exceto os superusuários, se conectem. Em seguida, reinicie o servidor ou encerre todas as conexões e prossiga com o backup usando uma conta de superusuário.Coloque seu banco de dados em modo somente leitura:
Prossiga com
pg_dumpall
. Sem necessidade de reinicialização e sem tempo de inatividade.Claro, você deve repetir isso em todos os bancos de dados que deseja "bloquear". Se você tiver um número significativo de bancos de dados, você pode tornar todo o cluster somente leitura: defina
default_transaction_read_only = on;
em seu postgresql.conf e recarregue o serviço postgres.Observe que não testei nenhum desses comandos, prossiga por sua conta e risco.
Uma solução alternativa:
Altere a porta do PostgreSQL em
prod-server-old
. Dessa forma, é improvável que os clientes se conectem ao banco de dados durante opg_dumpall --port=OTHER_PORT
.Eu sou um administrador do SQL Server (não do Postgres), então não tenho 100% de certeza, mas se o tempo de inatividade não for um problema, você pode:
?
Usando acionadores:
Em seguida, para tornar o banco de dados somente leitura:
e para torná-lo editável novamente: