從 EC2 上的 Postgres 轉儲/恢復 PostGIS DB 到 RDS 時遇到錯誤
我正在從 Postgres 9.4.10 和 PostGIS 2.1 上的手動管理數據庫遷移到 Postgres 9.4.9 和 PostGIS 2.1 上的 RDS 實例。
恢復似乎成功,但輸出給了我 27 個被忽略的錯誤。這是輸出:http: //developers.mapseed.org/posts/restore-output.txt
我應該擔心嗎?我所有的單元測試都通過了,但這是一個生產數據庫,所以我想確定一下。它們似乎是與權限相關的錯誤,但 my
pg_dump
和pg_restore
commands 都是與postgres
使用者一起執行的。雖然也許我錯過了一些東西。逐步轉儲/恢復:
我的數據庫名為
shareabouts_v2
,所以在我的 RDS 實例上,我執行了一個create database shareabouts_v2
andcreate 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 件事來解決這些錯誤:
- 從數據庫轉儲中刪除所有已在 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
- 我所有的數據庫表都是用
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