pg_dump无法导出特定cron schema问题求助
pg_dump导出特定schema时仅输出基础配置语句(无CREATE SCHEMA)的问题
问题详情
使用pg_dump 15.3版本导出Docker部署的TimescaleDB(镜像timescale/timescaledb-ha:pg15.3-ts2.11.0-all)数据库:
- 执行命令
pg_dump --schema-only --schema foo -d foodb -U postgres -Fp可正常导出,包含CREATE SCHEMA foo;语句; - 执行命令
pg_dump --schema-only --schema cron -d foodb -U postgres -Fp时,仅输出基础配置语句:
SET statement_timeout = 0; SET lock_timeout = 0; SET idle_in_transaction_session_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 xmloption = content; SET client_min_messages = warning; SET row_security = off; -- -- PostgreSQL database dump complete --
无schema不存在的提示,通过SELECT a.* FROM information_schema.schemata a where schema_name in ('foo','cron');查询确认两个schema除名称外其他信息一致。
原因分析与解决方法
1. 检查cron schema的所有权与权限
TimescaleDB镜像中默认存在的cron schema由timescaledb的cron扩展创建,其所有权可能不属于postgres用户(比如默认是tsdbadmin)。pg_dump默认仅导出当前连接用户拥有的对象,若postgres不是该schema所有者且无足够权限,会导致仅输出基础配置而不导出schema定义。
执行SQL检查所有权:
SELECT n.nspname AS schema_name, pg_get_userbyid(n.nspowner) AS owner FROM pg_namespace n WHERE n.nspname = 'cron';
若所有者不是postgres,可赋予权限:
GRANT USAGE, CREATE ON SCHEMA cron TO postgres;
或修改schema所有者:
ALTER SCHEMA cron OWNER TO postgres;
2. 验证cron schema的实际内容
虽然information_schema.schemata显示schema存在,但如果该schema下无任何对象(表、函数等),且当前用户不是所有者,pg_dump在--schema-only模式下可能不会输出CREATE SCHEMA语句。检查schema下的对象:
SELECT * FROM pg_catalog.pg_tables WHERE schemaname = 'cron'; SELECT * FROM pg_catalog.pg_proc WHERE pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'cron');
如果是TimescaleDB的cron扩展,该schema下通常有job等表,若为空可能是扩展未正确初始化,可重新启用:
CREATE EXTENSION IF NOT EXISTS timescaledb_cron;
内容的提问来源于stack exchange,提问作者user2465039
相关产品推荐
相关产品推荐

