Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save pogermano/e552015b98c99ddddbbae935a2fbf4b3 to your computer and use it in GitHub Desktop.

Select an option

Save pogermano/e552015b98c99ddddbbae935a2fbf4b3 to your computer and use it in GitHub Desktop.

Revisions

  1. pogermano revised this gist Mar 4, 2025. 1 changed file with 46 additions and 99 deletions.
    145 changes: 46 additions & 99 deletions Backup e Restauração do PostgreSQL no Docker.md
    Original file line number Diff line number Diff line change
    @@ -1,47 +1,41 @@
    # Atualizando PostgreSQL de 14 para 17 no Docker Swarm
    # Migração do PostgreSQL 14 para 17 no Docker Swarm

    ## 1. Problema
    ## Problema
    Ao atualizar o PostgreSQL do Docker Swarm da versão 14 para 17, ocorreu o erro:

    Ao tentar atualizar o PostgreSQL 14 para a versão 17 no Docker Swarm, ocorreram problemas devido à incompatibilidade do diretório de dados. Além disso, a rede `traefik_public` não permitia anexação manual ao criar o container diretamente com `docker run`.

    ## 2. Solução

    A solução envolve os seguintes passos:
    1. **Fazer backup de todos os bancos de dados**
    2. **Criar um novo serviço PostgreSQL 17**
    3. **Restaurar o backup no PostgreSQL 17**

    ---
    ```
    FATAL: database files are incompatible with server
    DETAIL: The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 17.0.
    ```

    ## 3. Backup do PostgreSQL 14
    O problema ocorre porque o diretório de dados de uma versão anterior não pode ser usado diretamente em uma versão mais recente.

    ### 3.1 Criar um backup completo
    ## Solução

    Execute o seguinte comando para criar um backup de todos os bancos de dados no PostgreSQL 14:
    ### 1️⃣ Fazer backup do PostgreSQL 14
    Antes de iniciar a migração, é fundamental realizar um backup completo dos bancos de dados.

    ```bash
    docker exec -it <container_postgres_14> pg_dumpall -U postgres > backup_full.sql
    docker exec -it <CONTAINER_ID_POSTGRES14> pg_dumpall -U postgres > backup_full.sql
    docker cp <CONTAINER_ID_POSTGRES14>:/backup_full.sql ./backup_full.sql
    ```

    Copie o backup para o host:
    Se o backup estiver vazio, verifique se o usuário `postgres` tem as permissões corretas.

    ### 2️⃣ Criar um novo volume para o PostgreSQL 17
    Como o volume antigo contém dados da versão 14, devemos criar um novo volume para evitar conflitos.

    ```bash
    docker cp <container_postgres_14>:/backup_full.sql ./backup_full.sql
    docker volume create postgres_data_17
    ```

    Verifique o tamanho do arquivo:

    Verifique se o volume foi criado:
    ```bash
    ls -lh backup_full.sql
    docker volume ls
    ```

    Se o arquivo estiver vazio, algo deu errado.

    ---

    ## 4. Criando o PostgreSQL 17 no Docker Swarm

    Crie um novo serviço para o PostgreSQL 17 usando o Portainer ou um arquivo `docker-compose.yml`. Se estiver usando Swarm, utilize o seguinte script:
    ### 3️⃣ Subir o PostgreSQL 17
    Atualize seu `docker-compose.yml`:

    ```yaml
    version: "3.8"
    @@ -57,7 +51,7 @@ services:
    ports:
    - 5432:5432
    volumes:
    - postgres_data:/var/lib/postgresql/data
    - postgres_data_17:/var/lib/postgresql/data
    deploy:
    mode: replicated
    replicas: 1
    @@ -70,105 +64,58 @@ services:
    memory: 1024M

    volumes:
    postgres_data:
    postgres_data_17:
    external: true
    name: postgres_data
    name: postgres_data_17

    networks:
    traefik_public:
    external: true
    name: traefik_public
    ```
    Se necessário, crie a rede antes de subir o serviço:
    Agora, suba o serviço com:
    ```bash
    docker network create --driver overlay traefik_public
    docker stack deploy -c docker-compose.yml postgres_stack
    ```

    Implante o serviço:

    Se estiver usando `docker run` diretamente:
    ```bash
    docker stack deploy -c docker-compose.yml postgres
    docker run -d \
    --name postgres17 \
    -e POSTGRES_USER=postgres \
    -e POSTGRES_PASSWORD=123 \
    -v postgres_data_17:/var/lib/postgresql/data \
    --network=traefik_public \
    postgres:17
    ```

    Verifique se o serviço está rodando:

    ```bash
    docker service ls
    ```

    Se o container não iniciar, verifique os logs:

    ```bash
    docker logs <container_id>
    ```

    ---

    ## 5. Restaurando o Backup no PostgreSQL 17

    Agora, copie o backup para o container do PostgreSQL 17:

    ### 4️⃣ Restaurar o backup no PostgreSQL 17
    Com o novo container em execução, copie o backup para dentro dele:
    ```bash
    docker cp backup_full.sql <container_postgres_17>:/backup_full.sql
    docker cp backup_full.sql <CONTAINER_ID_POSTGRES17>:/backup_full.sql
    ```

    Acesse o container:

    ```bash
    docker exec -it <container_postgres_17> bash
    docker exec -it <CONTAINER_ID_POSTGRES17> bash
    ```

    Dentro do container, restaure o backup:

    ```bash
    psql -U postgres -f /backup_full.sql
    ```

    Saia do container e verifique se os bancos de dados foram restaurados:

    ### 5️⃣ Verificar se a restauração foi bem-sucedida
    Saia do container e conecte-se ao banco para verificar se os dados foram restaurados:
    ```bash
    docker exec -it <container_postgres_17> psql -U postgres -c "\l"
    docker exec -it <CONTAINER_ID_POSTGRES17> psql -U postgres
    ```

    Se tudo estiver correto, o PostgreSQL 17 estará rodando com os dados restaurados.

    ---

    ## 6. Automatizando o Backup Diário

    Para evitar perda de dados no futuro, adicione um serviço de backup automático ao `docker-compose.yml`:

    ```yaml
    postgres_backup:
    image: postgres:17
    networks:
    - traefik_public
    environment:
    - PGPASSWORD=123
    volumes:
    - postgres_backup:/backup
    command: >
    sh -c "while true; do
    pg_dump -h postgres -U postgres -d n8n > /backup/backup-$(date +%F_%H-%M-%S).sql;
    sleep 86400;
    done"
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    volumes:
    postgres_backup:
    external: false
    Liste os bancos de dados para conferir:
    ```sql
    \l
    ```

    ---
    ## 7. Conclusão
    Agora, o PostgreSQL 17 está rodando corretamente no Docker Swarm, com os dados do PostgreSQL 14 restaurados e backup automatizado. Isso garante a integridade dos dados e facilita futuras atualizações.
    Se tudo estiver correto, a migração foi concluída com sucesso! 🎉

  2. pogermano revised this gist Mar 4, 2025. 1 changed file with 103 additions and 90 deletions.
    193 changes: 103 additions & 90 deletions Backup e Restauração do PostgreSQL no Docker.md
    Original file line number Diff line number Diff line change
    @@ -1,161 +1,174 @@
    # Guia Completo para Backup e Restauração do PostgreSQL no Docker Swarm
    # Atualizando PostgreSQL de 14 para 17 no Docker Swarm

    ## 1. Introdução
    Este guia cobre a configuração de volumes para o PostgreSQL no Docker Swarm, a criação de backups e a solução de erros comuns.
    ## 1. Problema

    Ao tentar atualizar o PostgreSQL 14 para a versão 17 no Docker Swarm, ocorreram problemas devido à incompatibilidade do diretório de dados. Além disso, a rede `traefik_public` não permitia anexação manual ao criar o container diretamente com `docker run`.

    ## 2. Solução

    A solução envolve os seguintes passos:
    1. **Fazer backup de todos os bancos de dados**
    2. **Criar um novo serviço PostgreSQL 17**
    3. **Restaurar o backup no PostgreSQL 17**

    ---

    ## 2. Configuração do Volume no Docker Swarm
    O problema da perda de dados no PostgreSQL após um restart provavelmente está relacionado à configuração do volume no Docker Swarm. Para garantir a persistência dos dados, defina corretamente o volume no `docker-compose.yml`:
    ## 3. Backup do PostgreSQL 14

    ### 3.1 Criar um backup completo

    Execute o seguinte comando para criar um backup de todos os bancos de dados no PostgreSQL 14:

    ```bash
    docker exec -it <container_postgres_14> pg_dumpall -U postgres > backup_full.sql
    ```

    Copie o backup para o host:

    ```bash
    docker cp <container_postgres_14>:/backup_full.sql ./backup_full.sql
    ```

    Verifique o tamanho do arquivo:

    ```bash
    ls -lh backup_full.sql
    ```

    Se o arquivo estiver vazio, algo deu errado.

    ---

    ## 4. Criando o PostgreSQL 17 no Docker Swarm

    Crie um novo serviço para o PostgreSQL 17 usando o Portainer ou um arquivo `docker-compose.yml`. Se estiver usando Swarm, utilize o seguinte script:

    ```yaml
    version: '3.8'
    version: "3.8"

    services:
    postgres:
    image: postgres:17
    networks:
    - traefik_public
    image: pgvector/pgvector:pg17
    environment:
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: 123
    POSTGRES_DB: n8n
    volumes:
    - postgres_data:/var/lib/postgresql/data
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    postgres_backup:
    image: postgres:17
    - POSTGRES_PASSWORD=123
    - TZ=America/Sao_Paulo
    networks:
    - traefik_public
    environment:
    - PGPASSWORD=123
    ports:
    - 5432:5432
    volumes:
    - postgres_backup:/backup
    command: >
    sh -c "while true; do
    pg_dump -h postgres -U postgres -d n8n > /backup/backup-$(date +%F_%H-%M-%S).sql;
    sleep 86400;
    done"
    - postgres_data:/var/lib/postgresql/data
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    networks:
    traefik_public:
    external: true
    resources:
    limits:
    cpus: "0.5"
    memory: 1024M

    volumes:
    postgres_data:
    external: true
    name: postgres_data
    postgres_backup:
    external: false
    ```

    ---
    networks:
    traefik_public:
    external: true
    name: traefik_public
    ```
    ## 3. Backup do Banco de Dados
    Para fazer backup do PostgreSQL manualmente:
    Se necessário, crie a rede antes de subir o serviço:
    ```bash
    docker exec -it <ID_DO_CONTAINER_POSTGRES> pg_dumpall -U postgres > backup_full.sql
    docker network create --driver overlay traefik_public
    ```

    Se quiser copiar o backup para a máquina host:
    Implante o serviço:

    ```bash
    docker cp <ID_DO_CONTAINER_POSTGRES>:/backup_full.sql ./backup_full.sql
    docker stack deploy -c docker-compose.yml postgres
    ```

    Para verificar o tamanho do backup:
    Verifique se o serviço está rodando:

    ```bash
    ls -lh backup_full.sql
    docker service ls
    ```

    Se o arquivo estiver vazio, tente rodar o backup diretamente dentro do container:
    Se o container não iniciar, verifique os logs:

    ```bash
    docker exec -it <ID_DO_CONTAINER_POSTGRES> bash
    pg_dumpall -U postgres > /backup/backup_full.sql
    exit
    docker cp <ID_DO_CONTAINER_POSTGRES>:/backup/backup_full.sql ./backup_full.sql
    docker logs <container_id>
    ```

    ---

    ## 4. Restauração do Backup
    Para restaurar um backup em um PostgreSQL novo:

    ```bash
    docker exec -i <ID_DO_CONTAINER_POSTGRES> psql -U postgres < backup_full.sql
    ```
    ## 5. Restaurando o Backup no PostgreSQL 17

    Se o volume antigo ainda contiver dados incompatíveis, remova o volume antes de reiniciar o serviço:
    Agora, copie o backup para o container do PostgreSQL 17:

    ```bash
    docker volume rm postgres_data
    docker cp backup_full.sql <container_postgres_17>:/backup_full.sql
    ```

    E recrie os serviços:
    Acesse o container:

    ```bash
    docker stack deploy -c docker-compose.yml meu_stack
    docker exec -it <container_postgres_17> bash
    ```

    ---
    Dentro do container, restaure o backup:

    ## 5. Solução de Erros Comuns

    ### 5.1. Erro de Incompatibilidade de Versão
    Se ao iniciar o container aparecer o erro:

    ```
    FATAL: database files are incompatible with server
    DETAIL: The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 17.0.
    ```bash
    psql -U postgres -f /backup_full.sql
    ```

    Isso indica que os dados do PostgreSQL 14 ainda estão armazenados no volume `postgres_data`, mas o serviço foi atualizado para a versão 17. Para resolver:

    1. **Fazer backup dos dados antigos**
    Saia do container e verifique se os bancos de dados foram restaurados:

    ```bash
    docker exec -it <ID_DO_CONTAINER_POSTGRES_14> pg_dumpall -U postgres > backup_full.sql
    docker exec -it <container_postgres_17> psql -U postgres -c "\l"
    ```

    2. **Remover o volume antigo**
    Se tudo estiver correto, o PostgreSQL 17 estará rodando com os dados restaurados.

    ```bash
    docker volume rm postgres_data
    ```
    ---

    3. **Recriar o serviço com o PostgreSQL 17**
    ## 6. Automatizando o Backup Diário

    ```bash
    docker stack deploy -c docker-compose.yml meu_stack
    ```
    Para evitar perda de dados no futuro, adicione um serviço de backup automático ao `docker-compose.yml`:

    4. **Restaurar os dados**
    ```yaml
    postgres_backup:
    image: postgres:17
    networks:
    - traefik_public
    environment:
    - PGPASSWORD=123
    volumes:
    - postgres_backup:/backup
    command: >
    sh -c "while true; do
    pg_dump -h postgres -U postgres -d n8n > /backup/backup-$(date +%F_%H-%M-%S).sql;
    sleep 86400;
    done"
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    ```bash
    docker exec -i <ID_DO_CONTAINER_POSTGRES_17> psql -U postgres < backup_full.sql
    volumes:
    postgres_backup:
    external: false
    ```
    ---
    ## 6. Conclusão
    Este guia detalha as melhores práticas para garantir que os dados do PostgreSQL sejam persistentes no Docker Swarm, evitando perdas após reinicializações e garantindo backups confiáveis. Se precisar de mais suporte, verifique os logs do container:
    ## 7. Conclusão
    ```bash
    docker logs <ID_DO_CONTAINER_POSTGRES>
    ```
    Agora, o PostgreSQL 17 está rodando corretamente no Docker Swarm, com os dados do PostgreSQL 14 restaurados e backup automatizado. Isso garante a integridade dos dados e facilita futuras atualizações.
  3. pogermano revised this gist Mar 2, 2025. 1 changed file with 24 additions and 1 deletion.
    25 changes: 24 additions & 1 deletion Backup e Restauração do PostgreSQL no Docker.md
    Original file line number Diff line number Diff line change
    @@ -9,6 +9,26 @@ Este guia cobre a configuração de volumes para o PostgreSQL no Docker Swarm, a
    O problema da perda de dados no PostgreSQL após um restart provavelmente está relacionado à configuração do volume no Docker Swarm. Para garantir a persistência dos dados, defina corretamente o volume no `docker-compose.yml`:

    ```yaml
    version: '3.8'

    services:
    postgres:
    image: postgres:17
    networks:
    - traefik_public
    environment:
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: 123
    POSTGRES_DB: n8n
    volumes:
    - postgres_data:/var/lib/postgresql/data
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    postgres_backup:
    image: postgres:17
    networks:
    @@ -29,13 +49,16 @@ O problema da perda de dados no PostgreSQL após um restart provavelmente está
    constraints:
    - node.role == manager

    networks:
    traefik_public:
    external: true

    volumes:
    postgres_data:
    external: true
    name: postgres_data
    postgres_backup:
    external: false

    ```
    ---
  4. pogermano revised this gist Mar 2, 2025. 1 changed file with 1 addition and 24 deletions.
    25 changes: 1 addition & 24 deletions Backup e Restauração do PostgreSQL no Docker.md
    Original file line number Diff line number Diff line change
    @@ -9,26 +9,6 @@ Este guia cobre a configuração de volumes para o PostgreSQL no Docker Swarm, a
    O problema da perda de dados no PostgreSQL após um restart provavelmente está relacionado à configuração do volume no Docker Swarm. Para garantir a persistência dos dados, defina corretamente o volume no `docker-compose.yml`:

    ```yaml
    version: '3.8'

    services:
    postgres:
    image: postgres:17
    networks:
    - traefik_public
    environment:
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: 123
    POSTGRES_DB: n8n
    volumes:
    - postgres_data:/var/lib/postgresql/data
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    postgres_backup:
    image: postgres:17
    networks:
    @@ -49,16 +29,13 @@ services:
    constraints:
    - node.role == manager

    networks:
    traefik_public:
    external: true

    volumes:
    postgres_data:
    external: true
    name: postgres_data
    postgres_backup:
    external: false

    ```

    ---
  5. pogermano revised this gist Mar 2, 2025. 1 changed file with 124 additions and 53 deletions.
    177 changes: 124 additions & 53 deletions Backup e Restauração do PostgreSQL no Docker.md
    Original file line number Diff line number Diff line change
    @@ -1,90 +1,161 @@
    # **Backup e Restauração do PostgreSQL no Docker**
    # Guia Completo para Backup e Restauração do PostgreSQL no Docker Swarm

    Este documento apresenta os passos para realizar o backup e a restauração de um banco de dados PostgreSQL rodando em um container Docker. Também inclui soluções para problemas comuns.
    ## 1. Introdução
    Este guia cobre a configuração de volumes para o PostgreSQL no Docker Swarm, a criação de backups e a solução de erros comuns.

    ---

    ## **1. Verificar se o PostgreSQL está rodando**
    ## 2. Configuração do Volume no Docker Swarm
    O problema da perda de dados no PostgreSQL após um restart provavelmente está relacionado à configuração do volume no Docker Swarm. Para garantir a persistência dos dados, defina corretamente o volume no `docker-compose.yml`:

    ```yaml
    version: '3.8'

    services:
    postgres:
    image: postgres:17
    networks:
    - traefik_public
    environment:
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: 123
    POSTGRES_DB: n8n
    volumes:
    - postgres_data:/var/lib/postgresql/data
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    postgres_backup:
    image: postgres:17
    networks:
    - traefik_public
    environment:
    - PGPASSWORD=123
    volumes:
    - postgres_backup:/backup
    command: >
    sh -c "while true; do
    pg_dump -h postgres -U postgres -d n8n > /backup/backup-$(date +%F_%H-%M-%S).sql;
    sleep 86400;
    done"
    deploy:
    mode: replicated
    replicas: 1
    placement:
    constraints:
    - node.role == manager

    networks:
    traefik_public:
    external: true

    volumes:
    postgres_data:
    external: true
    name: postgres_data
    postgres_backup:
    external: false
    ```
    ---
    Antes de iniciar o backup, verifique se o PostgreSQL está ativo dentro do container:
    ```sh
    # Substitua <container_id> pelo ID ou nome do container
    ## 3. Backup do Banco de Dados
    Para fazer backup do PostgreSQL manualmente:
    docker exec -it <container_id> pg_isready -U postgres
    ```bash
    docker exec -it <ID_DO_CONTAINER_POSTGRES> pg_dumpall -U postgres > backup_full.sql
    ```
    Se o resultado for algo como:

    Se quiser copiar o backup para a máquina host:

    ```bash
    docker cp <ID_DO_CONTAINER_POSTGRES>:/backup_full.sql ./backup_full.sql
    ```
    /var/run/postgresql:5432 - accepting connections

    Para verificar o tamanho do backup:

    ```bash
    ls -lh backup_full.sql
    ```
    O banco está funcionando corretamente.

    Caso o banco não esteja rodando, reinicie o container:
    ```sh
    docker restart <container_id>
    Se o arquivo estiver vazio, tente rodar o backup diretamente dentro do container:

    ```bash
    docker exec -it <ID_DO_CONTAINER_POSTGRES> bash
    pg_dumpall -U postgres > /backup/backup_full.sql
    exit
    docker cp <ID_DO_CONTAINER_POSTGRES>:/backup/backup_full.sql ./backup_full.sql
    ```

    ---

    ## **2. Realizar o Backup**
    ## 4. Restauração do Backup
    Para restaurar um backup em um PostgreSQL novo:

    ### **Opção 1: Gerar o backup diretamente no host (Pode falhar!)**
    ```sh
    docker exec -it <container_id> pg_dumpall -U postgres > backup_full.sql
    ```bash
    docker exec -i <ID_DO_CONTAINER_POSTGRES> psql -U postgres < backup_full.sql
    ```
    **Problema comum:** O arquivo `backup_full.sql` pode ficar com **0 bytes**.

    #### **Alternativa 1: Gerar o backup dentro do container**
    ```sh
    docker exec -it <container_id> bash
    pg_dumpall -U postgres > /backup_full.sql
    exit
    ```
    Se o volume antigo ainda contiver dados incompatíveis, remova o volume antes de reiniciar o serviço:

    Agora, copie o backup para sua máquina local:
    ```sh
    docker cp <container_id>:/backup_full.sql ./backup_full.sql
    ```bash
    docker volume rm postgres_data
    ```
    Verifique se o arquivo tem conteúdo:
    ```sh
    ls -lh backup_full.sql
    cat backup_full.sql | head -n 20

    E recrie os serviços:

    ```bash
    docker stack deploy -c docker-compose.yml meu_stack
    ```
    Se o arquivo estiver com **0 bytes**, tente refazer o processo garantindo que o PostgreSQL esteja rodando corretamente.

    ---

    ## **3. Restaurar o Backup**
    ## 5. Solução de Erros Comuns

    ### 5.1. Erro de Incompatibilidade de Versão
    Se ao iniciar o container aparecer o erro:

    Antes de restaurar, garanta que o banco de dados está vazio ou exclua os dados antigos:
    ```sh
    docker exec -it <container_id> psql -U postgres -c "DROP DATABASE IF EXISTS nome_do_banco;"
    docker exec -it <container_id> psql -U postgres -c "CREATE DATABASE nome_do_banco;"
    ```
    FATAL: database files are incompatible with server
    DETAIL: The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 17.0.
    ```

    Isso indica que os dados do PostgreSQL 14 ainda estão armazenados no volume `postgres_data`, mas o serviço foi atualizado para a versão 17. Para resolver:

    1. **Fazer backup dos dados antigos**

    Agora, restaure o backup:
    ```sh
    docker exec -i <container_id> psql -U postgres -d nome_do_banco < backup_full.sql
    ```bash
    docker exec -it <ID_DO_CONTAINER_POSTGRES_14> pg_dumpall -U postgres > backup_full.sql
    ```

    Caso o PostgreSQL esteja recusando conexão, verifique as configurações de autenticação no arquivo `pg_hba.conf` e `postgresql.conf`.
    2. **Remover o volume antigo**

    ---
    ```bash
    docker volume rm postgres_data
    ```

    ## **4. Solução para Problemas Comuns**
    3. **Recriar o serviço com o PostgreSQL 17**

    ### **Erro: "PostgreSQL Database directory appears to contain a database; Skipping initialization"**
    Isso ocorre se você está tentando rodar uma versão diferente do PostgreSQL sem migrar os dados corretamente. Solução:
    ```sh
    mv /var/lib/postgresql/data /var/lib/postgresql/data_old
    mkdir /var/lib/postgresql/data
    chown -R postgres:postgres /var/lib/postgresql/data
    ```bash
    docker stack deploy -c docker-compose.yml meu_stack
    ```
    Depois, inicialize o banco novamente e importe os dados do backup.

    ### **Erro: "database files are incompatible with server"**
    O banco de dados foi criado em uma versão diferente. Para corrigir, você precisa restaurar o backup em um PostgreSQL da mesma versão original, depois fazer um dump e importar na nova versão.
    4. **Restaurar os dados**

    ```bash
    docker exec -i <ID_DO_CONTAINER_POSTGRES_17> psql -U postgres < backup_full.sql
    ```

    ---

    Este guia deve ajudar a garantir um backup e restauração bem-sucedidos. 🚀
    ## 6. Conclusão
    Este guia detalha as melhores práticas para garantir que os dados do PostgreSQL sejam persistentes no Docker Swarm, evitando perdas após reinicializações e garantindo backups confiáveis. Se precisar de mais suporte, verifique os logs do container:

    ```bash
    docker logs <ID_DO_CONTAINER_POSTGRES>
    ```

  6. pogermano created this gist Mar 2, 2025.
    90 changes: 90 additions & 0 deletions Backup e Restauração do PostgreSQL no Docker.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,90 @@
    # **Backup e Restauração do PostgreSQL no Docker**

    Este documento apresenta os passos para realizar o backup e a restauração de um banco de dados PostgreSQL rodando em um container Docker. Também inclui soluções para problemas comuns.

    ---

    ## **1. Verificar se o PostgreSQL está rodando**

    Antes de iniciar o backup, verifique se o PostgreSQL está ativo dentro do container:
    ```sh
    # Substitua <container_id> pelo ID ou nome do container

    docker exec -it <container_id> pg_isready -U postgres
    ```
    Se o resultado for algo como:
    ```
    /var/run/postgresql:5432 - accepting connections
    ```
    O banco está funcionando corretamente.

    Caso o banco não esteja rodando, reinicie o container:
    ```sh
    docker restart <container_id>
    ```

    ---

    ## **2. Realizar o Backup**

    ### **Opção 1: Gerar o backup diretamente no host (Pode falhar!)**
    ```sh
    docker exec -it <container_id> pg_dumpall -U postgres > backup_full.sql
    ```
    **Problema comum:** O arquivo `backup_full.sql` pode ficar com **0 bytes**.

    #### **Alternativa 1: Gerar o backup dentro do container**
    ```sh
    docker exec -it <container_id> bash
    pg_dumpall -U postgres > /backup_full.sql
    exit
    ```

    Agora, copie o backup para sua máquina local:
    ```sh
    docker cp <container_id>:/backup_full.sql ./backup_full.sql
    ```
    Verifique se o arquivo tem conteúdo:
    ```sh
    ls -lh backup_full.sql
    cat backup_full.sql | head -n 20
    ```
    Se o arquivo estiver com **0 bytes**, tente refazer o processo garantindo que o PostgreSQL esteja rodando corretamente.

    ---

    ## **3. Restaurar o Backup**

    Antes de restaurar, garanta que o banco de dados está vazio ou exclua os dados antigos:
    ```sh
    docker exec -it <container_id> psql -U postgres -c "DROP DATABASE IF EXISTS nome_do_banco;"
    docker exec -it <container_id> psql -U postgres -c "CREATE DATABASE nome_do_banco;"
    ```

    Agora, restaure o backup:
    ```sh
    docker exec -i <container_id> psql -U postgres -d nome_do_banco < backup_full.sql
    ```

    Caso o PostgreSQL esteja recusando conexão, verifique as configurações de autenticação no arquivo `pg_hba.conf` e `postgresql.conf`.

    ---

    ## **4. Solução para Problemas Comuns**

    ### **Erro: "PostgreSQL Database directory appears to contain a database; Skipping initialization"**
    Isso ocorre se você está tentando rodar uma versão diferente do PostgreSQL sem migrar os dados corretamente. Solução:
    ```sh
    mv /var/lib/postgresql/data /var/lib/postgresql/data_old
    mkdir /var/lib/postgresql/data
    chown -R postgres:postgres /var/lib/postgresql/data
    ```
    Depois, inicialize o banco novamente e importe os dados do backup.

    ### **Erro: "database files are incompatible with server"**
    O banco de dados foi criado em uma versão diferente. Para corrigir, você precisa restaurar o backup em um PostgreSQL da mesma versão original, depois fazer um dump e importar na nova versão.

    ---

    Este guia deve ajudar a garantir um backup e restauração bem-sucedidos. 🚀