簡體   English   中英

Postgresql - 備份數據庫並恢復不同的所有者?

[英]Postgresql - backup database and restore on different owner?

我使用以下命令在不同服務器上的數據庫上進行了備份,並且該數據庫的角色與我需要的不同:

pg_dump -Fc db_name -f db_name.dump

然后我將備份復制到需要恢復數據庫的另一台服務器,但沒有用於該數據庫的所有者。 假設數據庫有所有者owner1 ,但在不同的服務器上我只有owner2 ,我需要恢復該數據庫並更改所有者。

還原時我在另一台服務器上所做的事情:

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --role=owner2 -d db_name db_name.dump

但是當恢復運行時,我得到這些錯誤:

pg_restore: [archiver (db)] could not execute query: ERROR:  role "owner1" does not exist

如何指定它以便它更改所有者? 還是不可能?

您應該使用--no-owner選項,這會阻止pg_restore嘗試將對象的所有權設置為原始所有者。 相反,對象將由--role指定的用戶擁有

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --no-owner --role=owner2 -d db_name db_name.dump

pg_restore 文檔

上面的答案很有幫助,但最終並沒有讓我 100% 了解我的情況,所以我想我會為與我自己有類似情況的人分享上面的迭代。

在我的場景中,我可能有具有不同名稱和不同所有者的登台和生產數據庫。 我可能需要遷移臨時數據庫以替換生產數據庫,但名稱和所有者不同。

或者我可能需要恢復每日備份,但出於某種原因更改了名稱或所有者。

我們的權限相當簡單,因為每個應用程序都有自己的數據庫/用戶,因此這不會幫助具有復雜用戶/角色/權限設置的人。

我嘗試使用從模板創建方法來復制數據庫,但是如果源數據庫上的任何用戶/連接處於活動狀態,這將失敗,因此這不適用於實時源數據庫。

使用基本的--no-owner還原,還原/新數據庫上的數據庫/表所有者是執行命令的用戶(例如 postgres)...因此您將有一個額外的步驟來修復所有數據庫權限。 由於我們為每個數據庫設置了一個特定於應用程序的用戶,因此我們可以使事情變得更容易。

我希望我的應用程序特定用戶擁有數據庫/表,即使他們首先沒有創建數據庫的權限。

基本思想是:

  • 使用--no-owner--no-privileges轉儲源數據庫
    • --clean不應該是必要的,因為我們將恢復到一個新的/空的數據庫。
  • 如果目標數據庫已經存在,則刪除它。
  • 重新創建目標數據庫(空),將所有者設置為我們的目標用戶(已經存在,如果不需要創建)。
  • 作為目標用戶將轉儲恢復到空目標
    • --no-owner --no-privileges確保目標用戶擁有一切,並且沒有所有權/權限從我們制作的轉儲中繼承。
    • --no-privileges--no-owner在這里是多余的,因為我們在轉儲時已經將它們排除在外。 因此,如果您對轉儲的制作方式有信心,則可能不需要以下示例中的一些冗余標志。

請注意,我正在放棄任何權限/所有權,因為每個數據庫都有一個用戶作為具有完全權限的數據庫所有者。 如果您有更復雜的權限結構,這可能不合適。 或者也許您使用單個用戶進行還原,然后讓您的服務器配置系統將任何缺少的角色/權限添加到還原的數據庫。

例子

設置一些變量...

DB_NAME_SRC="app_staging"
DB_NAME_TARGET="app_production"
DB_TARGET_OWNER="app_production_user"
DUMP_FILE="/tmp/$DB_NAME_SRC"

然后做備份/恢復

# backup clean/no-owner
sudo -i -u postgres pg_dump --format custom --clean --no-owner --no-privileges "$DB_NAME_SRC" > "$DUMP_FILE"

# THE FOLLOWING HAPPENS ON THE PG box where you want to restore

# drop target if exists - doesn't work for db with active users/connections
sudo -i -u postgres dropdb   -U postgres --if-exists  "$DB_NAME_TARGET"

# recreate target db, specifying owner to be the target user/role
# DB_TARGET_OWNER must already exist in postgres or you need to create it
sudo -i -u postgres createdb -U postgres --owner "$DB_TARGET_OWNER" -T template0 "$DB_NAME_TARGET"

# do the restore to the target db as the target user so any created objects will be owned by our target user.
sudo -i -u postgres pg_restore --host localhost --port 5432 --username "$DB_TARGET_OWNER" --password --dbname "$DB_NAME_TARGET" --no-owner --no-privileges "$DUMP_FILE"

# now in this simple case I don't need an additional step of fixing all the owners/permissions because the db and everything in it will be owned by the target user.

請注意,在恢復部分中,我使用密碼而不是本地連接通過網絡連接,因此我不必將 postgres 本地用戶身份驗證從對等更改為密碼。 無論如何,我的 db 應用程序特定用戶都不是本地用戶。

如果你正在尋找heroku。 首先創建一個沒有所有者的 sql 轉儲文件。 然后將其加載到heroku。

pg_dump -O target_db -f mydb.sql
heroku pg:psql < mydb.sql

-O 在這里用於無所有者。

使用 .sql 文件而不是 .dump 文件來恢復是個好主意。 (.dump 文件需要在下載的 url 上上傳)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM