How to solve privileges issues when restore PostgreSQL Database

前端 未结 10 1994
Happy的楠姐
Happy的楠姐 2020-12-12 16:19

I have dumped a clean, no owner backup for Postgres Database with the command

pg_dump sample_database -O -c -U

Later, when I restore the databas

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

    For me, I was setting up a database with pgAdmin and it seems setting the owner during database creation was not enough. I had to navigate down to the 'public' schema and set the owner there as well (was originally 'postgres').

    0 讨论(0)
  • 2020-12-12 16:42

    Try using the -L flag with pg_restore by specifying the file taken from pg_dump -Fc

    -L list-file --use-list=list-file

    Restore only those archive elements that are listed in list-file, and restore them in the order they appear in the file. Note that if filtering switches such as -n or -t are used with -L, they will further restrict the items restored.

    list-file is normally created by editing the output of a previous -l operation. Lines can be moved or removed, and can also be commented out by placing a semicolon (;) at the start of the line. See below for examples.

    https://www.postgresql.org/docs/9.5/app-pgrestore.html

    pg_dump -Fc -f pg.dump db_name
    pg_restore -l pg.dump | grep -v 'COMMENT - EXTENSION' > pg_restore.list
    pg_restore -L pg_restore.list pg.dump
    

    Here you can see the Inverse is true by outputting only the comment:

    pg_dump -Fc -f pg.dump db_name
    pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' > pg_restore_inverse.list
    pg_restore -L pg_restore_inverse.list pg.dump
    --
    -- PostgreSQL database dump
    --
    
    -- Dumped from database version 9.4.15
    -- Dumped by pg_dump version 9.5.14
    
    SET statement_timeout = 0;
    SET lock_timeout = 0;
    SET client_encoding = 'UTF8';
    SET standard_conforming_strings = on;
    SELECT pg_catalog.set_config('search_path', '', false);
    SET check_function_bodies = false;
    SET client_min_messages = warning;
    SET row_security = off;
    
    --
    -- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
    --
    
    COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
    
    
    --
    -- PostgreSQL database dump complete
    --
    
    0 讨论(0)
  • 2020-12-12 16:49

    Shorter answer: ignore it.

    This module is the part of Postgres that processes the SQL language. The error will often pop up as part of copying a remote database, such as with a 'heroku pg:pull'. It does not overwrite your SQL processor and warns you about that.

    0 讨论(0)
  • 2020-12-12 16:50

    To solve the issue you must assign the proper ownership permissions. Try the below which should resolve all permission related issues for specific users but as stated in the comments this should not be used in production:

    root@server:/var/log/postgresql# sudo -u postgres psql
    psql (8.4.4)
    Type "help" for help.
    
    postgres=# \du
                   List of roles
        Role name    | Attributes  | Member of
    -----------------+-------------+-----------
     <user-name>    | Superuser   | {}
                     : Create DB
     postgres       | Superuser   | {}
                     : Create role
                     : Create DB
    
    postgres=# alter role <user-name> superuser;
    ALTER ROLE
    postgres=#
    

    So connect to the database under a Superuser account sudo -u postgres psql and execute a ALTER ROLE <user-name> Superuser; statement.

    Keep in mind this is not the best solution on multi-site hosting server so take a look at assigning individual roles instead: https://www.postgresql.org/docs/current/static/sql-set-role.html and https://www.postgresql.org/docs/current/static/sql-alterrole.html.

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