我注意到,对于 PostgreSQL 中的表(或视图或物化视图),pg_depend 中有一行将表的 pg_class 行与其模式的 pg_namespace 行链接起来。
但是,我想知道是否存在这样的情况:pg_depend 中的一行可以将 pg_class 行链接到它不在其中的模式的 pg_namespace 行。
这是在如何在不顺序扫描 pg_class 的情况下列出模式中的表?的上下文中,我试图找到一个有效的查询来查找模式中的表,我想知道我是否必须处理这种情况。
我注意到,对于 PostgreSQL 中的表(或视图或物化视图),pg_depend 中有一行将表的 pg_class 行与其模式的 pg_namespace 行链接起来。
但是,我想知道是否存在这样的情况:pg_depend 中的一行可以将 pg_class 行链接到它不在其中的模式的 pg_namespace 行。
这是在如何在不顺序扫描 pg_class 的情况下列出模式中的表?的上下文中,我试图找到一个有效的查询来查找模式中的表,我想知道我是否必须处理这种情况。
PostgreSQL 有一个用于表、函数、视图、规则等的“ OR REPLACE
”变体(如“ CREATE OR REPLACE ____
”),但是它没有用于类型的变体。
我可以去提交错误报告,但我想这是维护人员的故意决定。我的问题是:为什么?
换句话说,类型有何不同使得它们不需要OR REPLACE
(即使表、函数等需要)?
PS 我刚刚发现它确实有一个DROP TYPE IF EXISTS
... 这让我更加困惑。它似乎真的CREATE TYPE
被挑出来不获得IF EXISTS
,我只是不明白为什么。
在 PostgreSQL 中,我想列出模式中的表。我有以下针对公共模式执行此操作的查询,例如:
SELECT
relname
FROM
pg_class
WHERE
relnamespace = 'public'::regnamespace
AND relkind = 'r';
但是,在我的系统上,这需要大约 400-500 毫秒(有时可能需要更长时间)。我怀疑这是因为 pg_class 有超过 500 万行,大小接近 5GB。
查看查询的解释分析,我看到了以下内容:
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Gather (cost=1000.00..356932.33 rows=14 width=64) (actual time=2.190..418.126 rows=120 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on pg_class (cost=0.00..355930.92 rows=6 width=64) (actual time=5.318..375.222 rows=40 loops=3)
Filter: ((relnamespace = '2200'::oid) AND (relkind = 'r'::"char"))
Rows Removed by Filter: 1792453
Planning Time: 0.070 ms
Execution Time: 418.162 ms
我发现它对 pg_class 进行了顺序扫描。查看 pg_class 上的索引,这并不奇怪 - relnamespace 列上没有索引(至少,没有以 relnamespace 作为其第一列的索引)。
那么,在尝试查找模式中的表时,如何避免对 pg_class 进行顺序扫描?这可能吗?
Postgresql 17 添加了一项新功能来制作增量备份。我想使用它来制作每日增量备份,但是我很难找到一种好的自动化方法,因为内置程序pg_basebackup --incremental
始终需要上次增量备份的路径。提供路径对于正常操作来说很容易,但是,我不想为所有可能出错的情况实现错误处理。
我还研究过 barman,它支持增量块级备份,但我不需要将它与 WAL 归档(我无法关闭它)配对,而且似乎我仍然需要手动触发备份。pgBackRest 似乎根本不支持这些备份。
也许有比使用内置增量备份更好的替代方案,但它似乎几乎完全符合我的要求:
是否有缺少的工具可以解决我的问题?
也许这是一个非常基本的问题,但我想确定一下。我正在使用蓝绿部署升级 RDS 集群。我按照 AWS 指南检查了集群,并看到了一堆活动连接。
psql -d postgres -c “SELECT * FROM pg_stat_activity WHERE (now() - pg_stat_activity.query_start) > interval ‘2 minutes’”
显示有 60 个活跃查询。
在我们的第一个升级步骤之一中,我们必须重新启动实例以进行参数组更改。我想知道这样做是否会丢弃所有这些活动连接。其中大多数是idle
,并且几乎所有都是SELECT
语句,而不是 DDL 或INSERT/UPDATE
查询。我担心如果不丢弃连接,它会以某种方式影响复制过程。
当您在系统上安装了“旧”版本和“新”版本时,使用 pg_upgrade 非常简单。我尝试找到一种使用 pg_upgrade 和 docker 容器的方法。这有点复杂,因为您需要“旧数据目录”、“旧绑定目录”和“新数据目录”以及要从其升级和升级到的“旧”和“新”postgres 版本的“新绑定目录”。由于“新”版本 docker 容器中不存在“旧目录”,因此您必须将它们挂载到“新”容器中。
但是由于 pg_upgrade 似乎不仅需要“旧”的 bindir 和 datadir,还需要旧版本的“旧”库(postgres 所依赖的),因此您还必须将它们挂载到新版本的容器中。
所以我最终运行了一个“旧版本容器”,将 bindir、datadir 和 lib dir 复制到本地 docker 主机并将它们挂载到“新版本容器”中
当来自 postgres-12 时,这意味着将 /usr/lib/ 的内容复制到本地 docker 主机并将它们重新安装到“新版本容器”
所以我把‘old-libdir’挂载到/12-bindir/,然后
ldd /12-bindir/postgres
找出 postgres 所依赖的库。将“old-libs”复制到“new-version-container”中的 /usr/lib 后,可以找到所有依赖项,并且我能够使用 pg_upgrade 并实际升级数据库(即从 postgres-12-alpine 升级到 postgres:15.10-bookworm)
所以.. 它成功了.. 所以.. 真正的问题是:因为它有效.. 我应该这样做吗?还是我错过了什么?我是不是在做一些愚蠢或傻事?我很高兴收到每一个提示和意见
我有一个 PostgreSQL 16 数据库设置,其配置如下:
-- DB Version: 16
-- OS Type: linux
-- DB Type: oltp
-- Total Memory (RAM): 64 GB
-- CPUs num: 32
-- Connections num: 200
-- Data Storage: ssd
show effective_cache_size; --48 GB
show effective_io_concurrency; --200
show huge_pages; --try
show maintenance_work_mem; --4GB
show max_connections; --200
show max_parallel_maintenance_workers; --4
show max_parallel_workers; --32
show max_parallel_workers_per_gather; --4
show max_wal_size; --8GB
show max_worker_processes; --32
show min_wal_size; --2GB
show parallel_setup_cost; --0.1
show random_page_cost; --1.1
show shared_buffers; --16GB
show wal_buffers; --16MB
show work_mem; --256MB
我正在运行一个CREATE TABLE
包含多个连接的查询。有时查询会并行运行,但有时不会。我想确保查询并行运行,或者至少增加它在该特定事务会话中并行运行的机会。如果分配的并行工作器比平时少,那也没关系,因为如果没有并行工作器,查询会非常慢。
下面的配置在一段时间内对我来说效果最好,但它导致了类似于此问题的错误。
ALTER SYSTEM SET maintenance_work_mem = '8GB';
ALTER SYSTEM SET work_mem = '2GB';
ALTER SYSTEM SET effective_io_concurrency = '400';
ALTER SYSTEM SET max_parallel_workers_per_gather = '16';
ALTER SYSTEM SET wal_buffers = '1GB';
我附加了一个选择查询计划以供参考:查询计划。
我想最大化 CPU 利用率(目前低于 10%)和 RAM 利用率(目前低于 30%)。
我知道这force_parallel_mode
已被弃用。如何在 PostgreSQL 中实现查询的一致并行执行?
我知道这是一种“精确”的数据类型,尽可能准确地表示数字,以便不会出现诸如或数据类型numeric
之类的浮点错误。float
real
但是呢numeric(p,s)
?由于固定比例,它必须近似于一个数字,但它是否存在浮点不准确性,或者它是“安全的”?我找不到有关它的任何信息。也许这是显而易见的,但我想更好地理解这方面。
我付出了很多努力来理解 pg_dump 和 pg_restore 的过程,但仍然有几个关键的事情我不明白。我的目标是将模式从具有许多角色的生产数据库复制到我的本地复制,在那里我只需要使用 postgres 管理员用户。
我使用这个语法转储 myschema
pg_dump -h "pgprod" -p "5432" -d prod_db -U "myuser" -Fc -C --verbose --schema "myschema" -f .\test.backup
恢复
pg_restore -U postgres -h localhost -p 5432 -d localdb -C -v --no-acl --role=postgres test.backup
但我不知道如何忽略 prod_db 中存在的任何形式的角色。我也尝试了标志 –no-owner,结果相同。我完全卡在这一步,因为我不明白为什么会发生这种情况。运行 postgres 16
pg_restore: error: could not execute query: ERROR: role "user1" does not exist
Command was: ALTER TABLE public."mytable" OWNER TO user1;
我们在主机本地通过以下命令从 PostgreSQL v10 转储了一个 SQL 文件:
pg_dump \
"postgres://db_user:db_pass@localhost:5432/database" \
--file "pgsql-dump-v10.sql" \
--format=p --no-owner --no-privileges
我们将dump文件复制到另外一个v16的PostgreSQL中,在本地调用以下命令导入数据:
psql \
"postgresql://db_user:db_pass@localhost/database" \
--file pgsql-dump-v10.sql
并且,它会收到以下错误消息:
psql:/xxx/pgsql-dump-v10.sql:30: 错误:必须是扩展 plpgsql 的所有者
罪魁祸首是第 30 行,pssql-dump-v10.sql
如下所示:
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
该错误似乎并不严重,因此我们pg_dump
在 PostgreSQL v16 实例上调用相同的命令,并将两个转储进行比较,如下面的屏幕截图所示。
另外,在 PostgreSQL v16 上运行时pgsql-dump-v16.sql
,它没有任何错误。
虽然不是关键问题,但我们希望解决设置扩展注释时的错误。并且,我们非常感谢任何提示和建议。
此外,如果错误实际上的影响比我们所看到的更大,也请提醒我们。我们正在为生产操作做准备。
谢谢。