标签: postgresql

如何通过 psql \i 命令将参数传递给 sql 脚本

psql\i命令能够执行给定的 SQL 脚本,但我需要一种将参数传递给脚本的方法。

示例:假设您有这个简单的脚本

select * from :table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

我试过了

my_db=> \i my-script.sql -v table="core.product"
Run Code Online (Sandbox Code Playgroud)

但出现这个错误

psql:my-script.sql:1: ERROR:  syntax error at or near ":"
LINE 1: select * from :table LIMIT 1;
                      ^
\i: extra argument "-v" ignored
\i: extra argument "table="core.product"" ignored

Run Code Online (Sandbox Code Playgroud)

我知道在终端上运行它会起作用,但我已经在 psql 中了。

psql -v table="core.product" -f my-script.sql
Run Code Online (Sandbox Code Playgroud)

postgresql sql-injection psql

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

带约束的 Postgres 自定义类型

我想知道是否可以(和/或可取)创建对值进行约束的自定义类型。假设我有一个高度/宽度/长度的自定义类型:

CREATE TYPE dimensions AS (w float, h float, l float);

我想确保我的宽度都不大于 10(例如)。

这样的事情可能吗,或者我会更好地在使用这种类型的每个表上创建检查约束吗?我希望能够在单个位置(即类型本身)添加/编辑约束。

谢谢!

postgresql datatypes postgresql-12

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

PostgreSQL 否认表所有权发生变化

我正在尝试更改我已经是所有者的表的所有权。我也是数据库的所有者,并且拥有 PUBLIC 模式的 CREATE 和 USAGE 权限。我收到以下错误消息:

ts_d=> ALTER TABLE table1 OWNER TO user2;
ERROR:  permission denied for schema public
Run Code Online (Sandbox Code Playgroud)

如何在不以超级用户身份登录的情况下更改所有权?

postgresql permissions

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

使用复制服务器升级Postgres主要版本

我计划将我的数据库从 Postgres 10 升级到 Posgres 14。为了减少停机时间,我计划使用复制来实现同样的目的。计划(简而言之)是:

  1. 使用转储数据pg_dumpall
  2. 终止在复制上运行的 Postgres 服务
  3. 设置新的 Postgres 14 服务
  4. 从步骤 1 中创建的转储中恢复数据
  5. 设置与主数据库的逻辑复制以使数据保持最新
  6. 将复制设置为主复制,应用程序开始连接到复制。
  7. 终止在旧主服务器上运行的 Postgres 服务,并将其也升级到 14。
  8. 在新主(旧复制)和新复制之间设置流式复制。

对此我有几个问题:

  1. 是否建议进行转储并恢复,或者让逻辑复制从头开始处理完整的复制(DDL 除外)?就可能需要的时间而言,哪个是更好的选择?我们有接近 650GB 的数据。我认为转储已被压缩,但我相信恢复它们(在同一台机器上)仍然需要时间。
  2. 我是否需要进行一些设置以确保复制从转储点之后开始,或者是否会得到处理?
  3. 我发现逻辑复制的一个限制是它不复制序列。为此,我相信,在切换之前 - 我可以将序列增加一个非常大的数字以确保不存在冲突?
  4. 我还看到了一个pglogical可以用于设置的扩展。尽管如此,我还没有深入挖掘。根据您的经验,它是否具有任何额外的优势\是否会使设置更容易?
  5. 尽管我认为这取决于不同的参数,但在主数据库和主数据库同步之前,完成如此大大小的数据库的恢复\复制通常需要多长时间?

postgresql replication upgrade pg-logical

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

选择 Distinct 和 Inner Join 带来重复的值

我在使用内部联接从两个表中获取唯一值时遇到问题。

\n
SELECT distinct cast (opd.order_number as integer), p.payment_id ,\n    pt.transaction_status, \n    opd.installments_number, \n    pt.amount, \n    pt.origin_amount,\n    p.payment_capture_type,\n    opd.brand,\n    pt.created_date, \n    d."name" \nFROM payment p \nINNER JOIN payment_transaction pt ON pt.payment_id = p.payment_id\ninner join "domain" d on d.domain_id = p.domain_id \nINNER JOIN attempted_online_payment_data opd ON p.payment_id = CAST ( opd.order_number AS INTEGER )\nWHERE \np.created_date >= \'2021-11-01\' and status = 1\n
Run Code Online (Sandbox Code Playgroud)\n

这是我正在使用的查询,我想要一个 payment_id\xc2\xb4s 的唯一值列表,但是当我这样做时,由于某种原因它会带来两个相同的 payment_id。

\n

在此输入图像描述

\n

如何为每个 payment_id 获取唯一的行?

\n

postgresql join query distinct

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

哪个更快:pg_catalog 或 information_schema?

pg_catalog我了解和之间的高级差异information_schema

但在许多情况下,工具可以选择使用其中任何一个。我想知道是否存在性能原因导致我们应该选择其中之一。其中之一的查询预计会更快吗?它们在锁方面的工作方式相同吗?

postgresql information-schema pg-catalog

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

PostgreSQL 中是否可能有一些数据库处于 PITR 策略下,而其他数据库则不然?

我有一个 PostgreSQL 服务器,其中包含许多数据库。随着时间的推移,这个数字在 20 到 30 之间变化。

其中一些数据库包含我们希望获得最佳保护的真实生产信息。所以我为他们激活了PITR(wal log backup)。

但其他一些只包含不可变的信息或可以以较少成本重建的信息。对于这些,我们根本不想进行备份,或者每天一个 pg_dump 之类的东西就足够了。

我遇到的问题是,激活 PITR Postgres 后正在保存所有数据库的日志。而且有些第二类数据库的修改率非常大,导致日志占用了巨大的空间。

我希望仅对某些表空间激活 PITR(例如)。这将使我能够将数据库放置在正确的表空间中,以获得我们需要的保护级别。

但我一直无法找到实现这一目标的方法。

有关于该设置的经验吗?

谢谢!

postgresql

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

VACUUM FULL 失败后回收空间

我犯了一个小错误,我的 VACUUM FULL 最终填满了实例的磁盘。我设法释放足够的空间来重新启动 postgres,但恐怕不足以运行 VACUUM FULL 来完成。

有什么方法可以释放失败的 VACUUM FULL 运行所使用的空间吗?

PS:这是我使用的选项VACUUM (FULL, VERBOSE, ANALYZE, INDEX_CLEANUP)

postgresql vacuum

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

UPSERT 上的 UPDATE 语句不增加值

我有以下查询:

INSERT INTO ReservationCounter (student_id, reservation_count) VALUES (1, 1)
ON CONFLICT (student_id) DO
UPDATE SET reservation_count=excluded.reservation_count+1;
Run Code Online (Sandbox Code Playgroud)

当没有冲突时就INSERTS成功了。

然而,当存在冲突时,该UPDATE语句实际上并不用增量更新值。

当我第一次在冲突时运行它时,它会按预期返回 2,但是当我再次运行它时,我希望它会增加 2 到 3(因为reservation_count=excluded.reservation_count+1)。它没有这样做,它再次返回 2;让我相信那reservation_count总是 1。

我究竟做错了什么?

postgresql upsert

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

Amazon RDS 不支持扩展“plpythonu”

我正在尝试安装支持在 postgresql 中编写 python 的扩展“plpython3u”。

CREATE EXTENSION plpython3u;

错误:

SQL 错误 [22023]:错误:Amazon RDS 不支持扩展“plpythonu”详细信息:安装扩展“plpythonu”失败,因为它不在 Amazon RDS 支持的扩展列表中。
提示:Amazon RDS 允许具有 rds_superuser 角色的用户安装支持的扩展。请参阅:SHOW rds.extensions;

你能推荐一个解决方案吗?

我们正在运行以下版本的 postgresql:

x86_64-pc-linux-gnu 上的 PostgreSQL 12.7,由 gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12) 编译,64 位

postgresql plpython

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