Postgresql

從 EC2 上的 Postgres 轉儲/恢復 PostGIS DB 到 RDS 時遇到錯誤

  • November 14, 2017

我正在從 Postgres 9.4.10 和 PostGIS 2.1 上的手動管理數據庫遷移到 Postgres 9.4.9 和 PostGIS 2.1 上的 RDS 實例。

恢復似乎成功,但輸出給了我 27 個被忽略的錯誤。這是輸出:http: //developers.mapseed.org/posts/restore-output.txt

我應該擔心嗎?我所有的單元測試都通過了,但這是一個生產數據庫,所以我想確定一下。它們似乎是與權限相關的錯誤,但 mypg_dumppg_restorecommands 都是與postgres使用者一起執行的。雖然也許我錯過了一些東西。


逐步轉儲/恢復:

我的數據庫名為shareabouts_v2,所以在我的 RDS 實例上,我執行了一個create database shareabouts_v2and create extension postgis

然後我使用以下命令從目前數據庫創建了一個轉儲文件: pg_dump -f backup.dump -Fc -p 5432 -U postgres -h localhost shareabouts_v2

我使用以下命令將該轉儲文件恢復到我的 RDS 實例中:

pg_restore -v -U postgres -h <my-RDS-host> -p 5432 -d shareabouts_v2 --disable-triggers -e backup.dump

我關注了許多關於轉儲和恢復 PostGIS 數據的文章和最佳實踐

更新

在這個 SO 答案中也遇到了這些錯誤:https ://stackoverflow.com/a/22247401/1884158

更新

我能夠通過從轉儲文件中刪除函式聲明來“解決”錯誤,如下所述:https ://stackoverflow.com/questions/9715434/how-to-exclude-pl-pgsql-functions-in -出口/31043192#31043192

我基本上是這樣做的:

pg_restore -l -f out.txt backup.dump
# then edit out.txt to delete all of the function definitions and spatial_ref_system:
pg_restore -L out.txt -U my_user -h my_host -p 5432 -d my_db -e --single-transaction backup.dump

但我不確定這是否會導致其他問題。我會在繼續發布更多更新…

我設法通過做 3 件事來解決這些錯誤:

  1. 從數據庫轉儲中刪除所有已在 PostGIS 擴展中定義的定義

因為我在新數據庫上安裝了 PostGIS,所以所有函式、運算符族和運算符類定義都已包含在新數據庫中。spatial_ref_sys模式中的表也是如此public。所以我避免使用以下方法在我的數據庫轉儲中恢復它:

使用以下命令從我的轉儲文件創建目錄列表:pg_restore -l -f out.txt backup.dump

然後我out.txt對其進行了編輯以刪除函式定義。編輯該文件後,我使用以下更新導入了我的轉儲out.txt

pg_restore -v -L out.txt -x -U my-user -d my_db -e --single-transaction ms.pgis-dump

我在這裡發現了這種方法:https ://stackoverflow.com/questions/9715434/how-to-exclude-pl-pgsql-functions-in-export/31043192#31043192

  1. 我所有的數據庫表都是用postgres管理員使用者創建的,所以我將它們遷移到普通使用者。

首先,我創建了新使用者,然後將數據庫的所有者更新為新使用者:

create role my_user with password 'testuser' login;
grant postgres to my_user;
ALTER DATABASE my_db OWNER TO my_user;

然後我不得不遷移我所有的表、視圖和序列來獲得新使用者。

# Migrate tables:
for tbl in `psql -qAt -U my_user -h localhost -p 5432 -d my_db -c "select tablename from pg_tables where schemaname = 'public';" my_db` ; do  psql -U my_user -h localhost -p 5432 -c "alter table \"$tbl\" owner to my_user" -d my_db ; done
# views:
for tbl in `psql -qAt -U my_user -h localhost -p 5432 -d my_db -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';"` ; do  psql -U my_user -h localhost -p 5432 -d my_db -c "alter table \"$tbl\" owner to my_user"; done
# sequences:
for tbl in `psql -qAt -U my_user -h localhost -p 5432 -d my_db -c "select table_name from information_schema.views where table_schema = 'public';"` ; do  psql -U my_user -h localhost -p 5432 -d my_db -c "alter table \"$tbl\" owner to my_user" ; done

我在這裡找到了這些腳本:

https://stackoverflow.com/questions/1348126/modify-owner-on-all-tables-simultaneously-in-postgresql https://stackoverflow.com/questions/16959764/reassign-owned-by-for-1-specified-database?noredirect=1&lq=1

3.我不得不避免恢復使用者權限:

postgres在現有使用者上呼叫 REVOKE 命令時出錯。所以我在命令中添加了-x標誌,pg_restore以防止恢復管理員使用者的權限。

此處概述了詳細資訊:

https://stackoverflow.com/questions/37271402/pg-restore-error-role-xxx-does-not-exist

引用自:https://dba.stackexchange.com/questions/190696