标签: postgresql

如何通过 pg_dump 估计要转储的 PostgreSQL 数据库的大小

与有关 MySQL 的问题类似- 我需要在转储之前找出转储文件的大小,但对于 PostgreSQL 数据库。我在文档中找不到对此的任何引用

postgresql postgresql-9.3

8
推荐指数
1
解决办法
7500
查看次数

FATAL 53300:剩余连接槽保留用于非复制超级用户连接

我有一个在远程托管 VM 服务器 (Windows Server 2019) 上运行的 PostgreSQL 12.1 数据库系统(我将其称为 PGSQL)。几个月前我们升级了服务器操作系统和 PGSQL。从那时起,一切都或多或少地正常运行,直到今天早上,我开始在几乎每个连接到此 PGSQL 实例的内部应用程序中收到上述数据库错误。

为了检查连接,我运行了SELECT * FROM pg_stat_activity;,它返回了 103 行。我的postgresql.conf文件有max_connections = 100,所以这是有道理的,但没有意义的是,在这 103 个连接中,其中 90 多个连接被idle列为DISCARD ALL. 所有这些都显示为由同一非超级用户帐户从服务器自己的内部地址执行。但是,一些连接显示query_start一个月或更长时间前的日期值。

现在,不幸的是,我们现有的许多应用程序都是使用硬编码凭据构建的(我对继承的这些应用程序的代码有很多“清理”工作要做),并且通常是从指向的快捷方式执行的到托管 PGSQL 数据库的服务器上的“应用程序”共享,因此所有这些看起来都不是特别“可疑”。我试图简单地终止使用前一个查询中的值SELECT pg_cancel_backend(<pid>);之一的进程pid,但重新查询pg_stat_activity仍然在结果集中显示相同的记录(据我所知,所有值似乎完全相同)。

也许我没有使用正确的函数来终止这些“挂起”的进程或其他东西,但我无法弄清楚如何单独清除这些连接。因为我需要让我们的生产环境恢复到可用状态,所以我最终只是停止并重新启动服务器上的 PGSQL 服务,这确实清除了所有旧的DISCARD ALL语句,但我很好奇是否可以采取一些措施来防止这种积压的“挂”报表日后出现。

我的问题是,我怎样才能防止这种情况再次发生?需要注意的一件事是,在将 PGSQL 服务器升级到 v12.1 之前,我们运行了 v9.4 多年,并且从未遇到过此问题。我想知道是否有较新版本的 PGSQL 固有的问题,或者甚至可能是在 Windows Server 2019 环境中运行 PGSQL 的问题导致了此行为。


编辑

为了参考和整理,以下信息来自评论:

我没有任何服务器端用于管理连接池(我在有关PgBouncer的其他问题中看到了一些参考资料,但还没有机会查看它是否对我们的环境有帮助)。我的大多数应用程序都通过Npgsql …

postgresql max-connections postgresql-12

8
推荐指数
1
解决办法
2万
查看次数

docker 中 postgres 数据库的 /dev/shm 大小建议

我们在 docker 容器中有 postgresql 11.7 数据库。

我们遇到了一个问题"pq: could not resize shared memory segment "/PostgreSQL.XXX" to XXX bytes: No space left on device"如下所述。

解决方案有所帮助,我们不再有问题了。但是我们应该为 Postgres 的 docker 容器的 shm_size 设置哪个大小呢?

有什么推荐吗?我们如何计算 shm_size 的“最佳大小”?

postgresql docker

8
推荐指数
1
解决办法
1万
查看次数

pg_restore --clean 不起作用,因为级联下降

DB-B我正在使用数据库 ( ) 的副本( DB-A),我通过每天运行来保持最新状态:

pg_restore -U postgres -d someDB --clean -j 2 -L WhatToImportList admin.dump
Run Code Online (Sandbox Code Playgroud)

但我开始注意到DB-B表中存在重复记录。经过进一步调查,似乎--clean没有将表删除,DB-B因为它需要对 my 中DB-B但不在 origin 中的其他表和视图进行级联删除DB-A

  1. 是否可以强制导入数据而不进行级联删除?我想保留所有自定义表格、视图和函数!
  2. DB-A如果不是,那么什么是一个好的复制策略,我可以从中导入数据,DB-B但保留分析所需的所有函数、视图和表DB-B

谢谢。

编辑:可能的解决方法:截断每个表,然后导入它们...但我必须在脚本中包含每个表。

Edit2:为了帮助未来的读者,这样可以生成所有必须截断的表的列表:

SELECT 'TRUNCATE ' || table_name || ';'
  FROM information_schema.tables
 WHERE table_schema='my_schema'
   AND table_type='BASE TABLE';
Run Code Online (Sandbox Code Playgroud)

postgresql pg-restore

8
推荐指数
0
解决办法
2810
查看次数

如何列出 PostgreSQL 上每个用户/角色的所有授权

我已经在 Postgres CLI 上运行了这些语句(我使用的是 PostgreSQL v13.1):

CREATE ROLE blog_user;
GRANT blog_user TO current_user;
Run Code Online (Sandbox Code Playgroud)

我创建了一个函数

CREATE FUNCTION SIGNUP(username TEXT, email TEXT, password TEXT)
RETURNS jwt_token AS
$$
DECLARE
  token_information jwt_token;
BEGIN
....
END;
$$ LANGUAGE PLPGSQL VOLATILE SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)

最后我授予了权限:

GRANT EXECUTE ON FUNCTION SIGNUP(username TEXT, email TEXT, password TEXT) TO anonymous;
Run Code Online (Sandbox Code Playgroud)

我希望列出我的架构/数据库中每个用户/角色的所有授权。\du\du+显示基本信息,其中不包含最近授予(执行函数)的信息。

postgresql permissions

8
推荐指数
1
解决办法
3万
查看次数

如何设置每个用户的语句超时?

我在 Postgres 中有多个用户。我想为不同的用户设置不同的语句超时。
例如:访客 5 分钟,管理员 10 分钟。

在 Postgres 11.11 中可以吗?

postgresql configuration users query-timeout postgresql-11

8
推荐指数
1
解决办法
2万
查看次数

尽管使用“冲突时不执行任何操作”,为什么串行主键仍会递增?

我在 PostgreSQL 13 中有下表:

表名:新表

field       type 
-----       ----    
Seq         bigserial   
code        varchar     
Run Code Online (Sandbox Code Playgroud)

Seq是主键(自增)
Code是唯一键索引

Insert Into newtable (Code) Values ('001') On Conflict(Code) Do Nothing   --> Seq value is 1
Insert Into newtable (Code) Values ('001') On Conflict(Code) Do Nothing
Insert Into newtable (Code) Values ('001') On Conflict(Code) Do Nothing

Insert Into newtable (Code) Values ('002') On Conflict(Code) Do Nothing   --> Seq value is 4
Run Code Online (Sandbox Code Playgroud)

为什么是序列4?有什么方法可以仅在成功插入时增加价值?

postgresql sequence upsert postgresql-13

8
推荐指数
2
解决办法
7236
查看次数

INSERT ON 冲突不做任何事效率(PostgreSQL)

在 Postgres 中,如果超过 99.9% 的时间记录存在并且没有执行任何操作,则执行 \xe2\x80\x9cINSERT\xe2\x80\xa6 ON CONFLICT DO NOTHING\xe2\x80\x9d 是否效率低下?

\n

例如让\xe2\x80\x99s 说我有一个节点进程,它获取映射到行的 100k 记录,其中 99,980 条已经存在。我可以:

\n
    \n
  • 将它们全部插入,但对唯一性约束违规不执行任何操作
  • \n
  • 插入不存在的查询
  • \n
  • 全选,对\xe2\x80\x9cclient\xe2\x80\x9d这边做去重,然后只插入新的20个
  • \n
\n

第一种方法是最简单的,但我想知道它对于 Postgres 来说是否效率太低。我读到它在这样的 \xe2\x80\x9cdo Nothing\xe2\x80\x9d 情况下增加序列号,但是如果我跳过使用序列并使用我的唯一字段作为主(字符串)键,那可以吗? ?

\n

postgresql postgresql-performance

8
推荐指数
1
解决办法
4201
查看次数

PostgreSQL“提供”PHP 是什么意思?

在https://www.enterprisedb.com/downloads/postgres-postgresql-downloads上:

PostgreSQL 可在所有主要操作系统上运行,包括 Linux、UNIX(AIX、BSD、HP-UX、macOS、Solaris)和 Windows。它提供以下编程语言:PL/pgSQL、PL/SQL、Java、Python、Ruby、C/C+、PHP、Perl、Tcl、Scheme。Postgres 还提供以下库接口:OCI、libpq、JDBC、ODBC、.NET、Perl、Python、Ruby、C/C+、PHP、Lisp、Scheme 和 Qt。

我使用 PHP 和 PostgreSQL。我使用 PHP 扩展发送和接收数据pg_*,该扩展使用 libpq。我这样做已经有二十年了。

在列出“库接口”之前,PostgreSQL“提供”PHP 是什么意思?在“库接口”列表中,它再次令人困惑地列出了 PHP...

我错过了一些基本的东西吗?PostgreSQL 是否允许我将 PHP 语法混合到 SQL 查询或类似的疯狂的东西中?

postgresql php

8
推荐指数
1
解决办法
1095
查看次数

通过 PK 获取特定单行 id 的查询时间非常慢

EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS)  
SELECT * 
FROM contract  
WHERE contract.id = 33129;
Run Code Online (Sandbox Code Playgroud)
EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS)  
SELECT * 
FROM contract  
WHERE contract.id = 33129;
Run Code Online (Sandbox Code Playgroud)
EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS)  
SELECT * 
FROM contract  
WHERE contract.id = 33128;
Run Code Online (Sandbox Code Playgroud)
Index Scan using contract_pkey on public.contract  (cost=0.29..8.31 rows=1 width=305) (actual time=0.121..30.386 rows=1 loops=1)
  Output: id, network, address, platform_id, sync_marker, props, sync_marker_alt, interface, ingested_at, data
  Index Cond: (contract.id = 33129)
  Buffers: shared hit=325
Planning Time: 0.098 ms
Execution Time: 30.412 ms
Run Code Online (Sandbox Code Playgroud)

请注意查询时间的巨大差异。分析输出中的唯一提示似乎是共享命中。 …

postgresql performance query-performance

8
推荐指数
1
解决办法
1006
查看次数