Backup/Restore a dockerized PostgreSQL database

后端 未结 10 1824
[愿得一人]
[愿得一人] 2020-12-22 15:50

I\'m trying to backup/restore a PostgreSQL database as is explained on the Docker website, but the data is not restored.

The volumes used by the database image are:<

相关标签:
10条回答
  • 2020-12-22 16:01

    Backup Database

    generate sql:

    • docker exec -t your-db-container pg_dumpall -c -U your-db-user > dump_$(date +%Y-%m-%d_%H_%M_%S).sql

    to reduce the size of the sql you can generate a compress:

    • docker exec -t your-db-container pg_dumpall -c -U your-db-user | gzip > ./dump_$(date +"%Y-%m-%d_%H_%M_%S").gz

    Restore Database

    • cat your_dump.sql | docker exec -i your-db-container psql -U your-db-user -d your-db-name

    to restore a compressed sql:

    • gunzip < your_dump.sql.gz | docker exec -i your-db-container psql -U your-db-user -d your-db-name

    PD: this is a compilation of what worked for me, and what I got from here and elsewhere. I am beginning to make contributions, any feedback will be appreciated.

    0 讨论(0)
  • 2020-12-22 16:01

    I had this issue while trying to use a db_dump to restore a db. I normally use dbeaver to restore- however received a psql dump, so had to figure out a method to restore using the docker container.

    The methodology recommended by Forth and edited by Soviut worked for me:

    cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname

    (since this was a single db dump and not multiple db's i included the name)

    However, in order to get this to work, I had to also go into the virtualenv that the docker container and project were in. This eluded me for a bit before figuring it out- as I was receiving the following docker error.

    read unix @->/var/run/docker.sock: read: connection reset by peer

    This can be caused by the file /var/lib/docker/network/files/local-kv.db .I don't know the accuracy of this statement: but I believe I was seeing this as I do not user docker locally, so therefore did not have this file, which it was looking for, using Forth's answer.

    I then navigated to correct directory (with the project) activated the virtualenv and then ran the accepted answer. Boom, worked like a top. Hope this helps someone else out there!

    0 讨论(0)
  • 2020-12-22 16:04

    Okay, I've figured this out. Postgresql does not detect changes to the folder /var/lib/postgresql once it's launched, at least not the kind of changes I want it do detect.

    The first solution is to start a container with bash instead of starting the postgres server directly, restore the data, and then start the server manually.

    The second solution is to use a data container. I didn't get the point of it before, now I do. This data container allows to restore the data before starting the postgres container. Thus, when the postgres server starts, the data are already there.

    0 讨论(0)
  • 2020-12-22 16:06

    I think you can also use a postgres backup container which would backup your databases within a given time duration.

      pgbackups:
        container_name: Backup
        image: prodrigestivill/postgres-backup-local
        restart: always
        volumes:
          - ./backup:/backups
        links:
          - db:db
        depends_on:
          - db
        environment:
          - POSTGRES_HOST=db
          - POSTGRES_DB=${DB_NAME} 
          - POSTGRES_USER=${DB_USER}
          - POSTGRES_PASSWORD=${DB_PASSWORD}
          - POSTGRES_EXTRA_OPTS=-Z9 --schema=public --blobs
          - SCHEDULE=@every 0h30m00s
          - BACKUP_KEEP_DAYS=7
          - BACKUP_KEEP_WEEKS=4
          - BACKUP_KEEP_MONTHS=6
          - HEALTHCHECK_PORT=81
    
    0 讨论(0)
  • 2020-12-22 16:08

    cat db.dump | docker exec ... way didn't work for my dump (~2Gb). It took few hours and ended up with out-of-memory error.

    Instead, I cp'ed dump into container and pg_restore'ed it from within.

    Assuming that container id is CONTAINER_ID and db name is DB_NAME:

    # copy dump into container
    docker cp local/path/to/db.dump CONTAINER_ID:/db.dump
    
    # shell into container
    docker exec -it CONTAINER_ID bash
    
    # restore it from within
    pg_restore -U postgres -d DB_NAME --no-owner -1 /db.dump
    
    0 讨论(0)
  • 2020-12-22 16:13

    This is the command worked for me.

    cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}
    

    for example

    cat table_backup.sql | docker exec -i 03b366004090 psql -U postgres -d postgres
    

    Reference: Solution given by GMartinez-Sisti in this discussion. https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b

    0 讨论(0)
提交回复
热议问题