![](/img/trans.png)
[英]How do I install the pg_cron extension in Postgres 13 hosted in my Windows 10
[英]Postgres 13 pg_cron error on RDS that's hard to track down
我正在努力在 RDS 上設置pg_partman
和pg_cron
,但是當我的pg_cron
作業運行時,它們返回此錯誤:
ERROR: The protected role of rds_super doesn't provide permission to schedule a job.
從錯誤文本來看,我似乎在保存pg_cron
的目錄或資源中遺漏了一個簡單的權限問題,但我找不到問題的根源。 而且,它可能是別的東西。 大量的谷歌搜索、尋找來源和反復試驗都沒有讓我得到任何答案,我希望得到幫助。
作為背景,這是帶有pg_cron
1.3 的 Postgres 13.4。 這些是 RDS 上現在可用的最新版本。 我的目標是讓pg_cron
在該集群的各種數據庫中運行作業,但我已將問題示例簡化為postgres
的cron
模式。
RDS 定義了一個名為rds_superuser
的角色,該角色沒有登錄名,然后您可以將其授予其他用戶。 我們正在使用名為rds_super
的自定義角色,並且已經使用了多年。
當您在 RDS 上create extension pg_cron
時,默認情況下安裝到postgres
數據庫中,並創建一個名為cron
的新架構。 這一切都很好。 作為問題的“hello world”版本,這里有一個簡單的表格和任務,用於將每分鍾的當前時間插入到文本字段中。
DROP TABLE IF EXISTS cron.foo;
CREATE TABLE IF NOT EXISTS cron.foo (
bar text
);
GRANT INSERT ON TABLE cron.foo TO rds_super;
INSERT INTO cron.foo VALUES (now()::text);
select * from cron.foo;
-- Run every minute
SELECT cron.schedule('postgres.populate.foo','*/1 * * * *',
$$INSERT INTO cron.foo VALUES (now()::text) $$);
當直接作為rds_super
用戶連接時,裸語句INSERT INTO cron.foo VALUES (now()::text)
工作正常。 但是當它通過cron.job
定義的cron.job
執行時, cron.job_run_details
輸出有正確的代碼,預期的用戶,但失敗的結果是這個錯誤:
ERROR: The protected role of rds_super doesn't provide permission to schedule a job.
這是否為任何人敲響了警鍾? 我已經刪除,重新安裝,明確設置權限。 沒提升。
這可能會關閉,但我遇到了一些事情,看起來我需要提供對public
訪問。 我從 PG 9.4 或 9.5 開始,無法確保公眾的安全……並在任何地方剝奪了它的所有權利。 這里可能需要放回一些?
以下是我能想到的權限檢查。
select grantor,
grantee,
table_schema,
table_name,
string_agg (privilege_type, ',' order by privilege_type) as grants
from information_schema.role_table_grants
where table_catalog = 'postgres'
and table_schema = 'cron'
and grantee = 'rds_super'
group by 1,2,3,4
order by 1,2,3,4;
我給了用戶所有表的所有權限,只是為了看看是否可以解決問題。 沒有喜悅。
grantor grantee table_schema table_name grants
rds_super rds_super cron foo DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE
rds_super rds_super cron job_run_details_plus DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE
rds_superuser rds_super cron job DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE
rds_superuser rds_super cron job_run_details DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE
架構權限沒有明顯錯誤:
select pg_catalog.has_schema_privilege('rds_super', 'cron', 'CREATE') AS create,
pg_catalog.has_schema_privilege('rds_super', 'cron', 'USAGE') AS usage;
create usage
t t
同樣,當我檢查函數執行權限時,什么也沒有彈出:
select proname, proargnames
from pg_proc
where has_function_privilege('rds_super',oid,'execute')
and pronamespace::regnamespace::text = 'cron'
order by 1,2
proname proargnames
job_cache_invalidate
schedule {job_name,schedule,command}
schedule {schedule,command}
unschedule {job_id}
unschedule {job_name}
我不知道這是否是答案,但它似乎解決了我的問題。 劇透:以pg_cron scheduler
后台工作程序運行的用戶pg_cron scheduler
登錄。
我燒掉了所有東西並重新啟動,然后發現我的工作根本無法運行。 沒有錯誤,沒有結果。 我像這樣檢查了后台工作人員的狀態:
select application_name,
usename,
backend_type,
query,
state,
wait_event_type,
age(now(),backend_start) as backend_start_age,
age(now(),query_start) as query_start_age,
age(now(),state_change) state_change_age
from pg_stat_activity
where backend_type != 'client backend';
我注意到后台工作人員已經運行了一天多(它作為共享庫加載),並且似乎卡住了。 我重新啟動了服務器,並重新以dbadmin
身份登錄的所有內容,而不是我的自定義用戶。 在這種情況下,這是pg_cron scheduler
程序進程正在運行的用戶名。 我不記得dbadmin
是否是 RDS Postgres 軟件包的一部分,或者它是否是我多年前添加的內容。 RDS pg_cron
說明中沒有關於此的任何內容,所以也許只有我。 我需要稍微設置一下它的search_path
和權限,以使一切都按我需要的方式工作,但這很正常。
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html
至少在我的情況下,答案是以與pg_cron
后台線程相同的用戶身份運行作業。 我已經在原始問題的末尾發布了更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.