标签: postgresql

使用 postgres_fdw 从一个只读副本连接到另一个

我在 AWS 中有两个 postgres 数据库服务器,A 和 B。这些数据库有不同的表。这两个数据库也有自己的只读副本。

我的目标是一个简单的解决方案,用于从 A 副本到 B 副本进行跨数据库连接。从 master 查询不是一种选择,因为此功能适用于我团队中的分析师,而不是应用程序。

我按照说明通过执行 CREATE SERVER、CREATE USER MAPPING 和 CREATE FOREIGN TABLEs在 A 的 master 上设置 postgres_fdw ,并且我能够轻松地从 A master 查询到 B 副本。但是,这些服务器和外部表定义没有复制到 A 副本。我无法在副本上运行这些创建命令,因为它是只读的。

是否可以使用 postgres_fdw 从 A 副本到 B 副本?如果没有,这个问题还有其他解决方案吗?

postgresql replication read-only-database

5
推荐指数
1
解决办法
814
查看次数

通过合并聚合范围

目前还没有任何集合函数范围类型PostgreSQL中。

如何使用合并操作聚合范围?

此解决方案有效,但看起来并不理想:

CREATE TEMPORARY TABLE test_ranges (r int4range);
INSERT INTO test_ranges VALUES ('[4, 8)'), ('[12, 45)'), (NULL);

SELECT int4range(min(lower(r)), max(upper(r))) FROM test_ranges;
=> '[4,45)'
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate range-types

5
推荐指数
1
解决办法
804
查看次数

INSERT INTO table FROM SELECT * with nextval() 规范

我需要复制同一个表中的记录只更改一个字段。我的表有默认生成的序列entry_id_seq,但是我不确定id列是 SERIAL(如何检查?)。

\d tab 只返回这个

      Column      |              Type              |            Modifiers            
 -----------------+--------------------------------+------------------------
       id         |             integer            |            not null
...
Indexes:
"tab_entry_pkey" PRIMARY KEY, btree (id)
Run Code Online (Sandbox Code Playgroud)

所以问题是:当我尝试以简化的方式复制记录时:

insert into tab_entry select * from tab_entry where id = 3052;
Run Code Online (Sandbox Code Playgroud)

它抛出错误

ERROR:  duplicate key value violates unique constraint "tab_entry_pkey"
DETAIL:  Key (id)=(3052) already exists.
Run Code Online (Sandbox Code Playgroud)

默认情况下,默认序列不会生成下一个值。是否有任何简洁的语法允许在没有完整表规范的情况下插入和更改单个字段FROM tab(col1, col2, col3, ..., col N)

该表有很多字段,所以我不想把它们都写出来,因为这会影响代码的可读性。我想要这样的东西,但这种语法不起作用

insert into tab_entry(id, *) select nextval('seq'), * from tab_entry where id = 3052;
Run Code Online (Sandbox Code Playgroud)

SELECT …

postgresql primary-key insert sequence

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

AWS RDS Postgres 逻辑复制

我正在使用 AWS RDS Postgres 和 RDS 的逻辑复制支持

编辑:注意,这与 PostgreSQL 10 中的逻辑复制功能不同。它是基于相同底层逻辑解码功能的 AWS RDS 功能。

我正在复制 Postgres -> Postgres 。基本上将许多数据库合并为一个数据库。

我遇到的问题是,在一段时间内数据库中没有活动磁盘被填满时。我想控制 WAL 可以使用多少存储空间。我调整了 wal_segments 以保留。仍然磁盘正在填满。我可以设置任何参数来控制磁盘使用,而不是对表进行一些虚拟更新。当前参数是

wal_keep_segments =4 
wal_max_size =128 
wal_min_size 16 
Run Code Online (Sandbox Code Playgroud)

穆拉利

postgresql replication aws amazon-rds

5
推荐指数
0
解决办法
3957
查看次数

为公共模式创建的扩展在数据库中不可用

所以,我创建了citext扩展schema public,我可以看到它在那里,但是它在该模式的数据库中不可用。数据库public也在其中,因为它是从postgres用户创建的,并且在创建时没有指定架构。这是包含更多数据的屏幕截图: 在此处输入图片说明

所以,您可以看到扩展程序在那里,但是一旦我连接到数据库,它就不再可用,我基本上必须将它安装在数据库中。任何想法如何使其最初也可用于数据库?

PgSQL v9.6

postgresql psql postgresql-extensions

5
推荐指数
1
解决办法
3392
查看次数

是否可以在子查询中“删除”?

是否可以将 aDELETE作为 a 的子查询运行SELECT?例如:

SELECT * FROM posts where title = (DELETE FROM posts returning 'whoops');
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到syntax error at or near "FROM",指向FROMDELETE,所以这似乎不可能,但也许我只是以某种方式做错了。

上下文:我试图了解某些 SQL 注入攻击可能造成的损害。在这种情况下,整个查询将在没有变量绑定的准备好的语句中运行。这意味着攻击者无法运行多个顶级语句,但我正在尝试评估子查询可能造成的损害。

编辑:我应该说,查询代码正在做类似的事情:

 query_parameter = blindly_read_from_user_input()

 # this is just interpolated into a string
 db_query = "SELECT * FROM posts WHERE title = '#{query_parameter}'"

 connection.prepare("query_name", db_query)
 connection.exec_prepared("query_name")
Run Code Online (Sandbox Code Playgroud)

所以:

  • 它使用的是准备好的语句,这意味着攻击者无法运行多个顶级查询
  • 它没有使用绑定参数

我正在尝试查看是否可以在此现有查询结构中基于 SQL 注入删除记录。

postgresql postgresql-9.3

5
推荐指数
1
解决办法
1556
查看次数

在 pgadmin4 Postgresql 中终止连接

你能告诉我如何在不执行任何脚本的情况下终止 pgadmin 4 web postgresql 中的连接吗?

如何限制与数据库的连接数以终止活动连接(我的情况我想重命名已使用的数据库!)

postgresql pgadmin pgadmin-4

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

提高 PostgreSQL 数据仓库 (RDS) 中的更新性能

我正在使用 Amazon RDS 上托管的 Postgres 数据仓库。当尝试从同一数据库中的另一个表更新事实表的一列(2500 万行)时,查询需要几天时间才能运行。为什么会发生这种情况,我该如何提高这种性能?我知道 PG 是为 OLTP 而设计的,而不是 OLAP,但是在这个表上选择查询性能通常相当不错。

有问题的查询如下所示:

UPDATE a
SET a.value = b.value
FROM b
WHERE a.id = b.id
Run Code Online (Sandbox Code Playgroud)

b是不同架构中的临时表,但与a. 两个表在 上都有主键idvalue列上没有索引或约束。有依赖于表a但没有外键的视图

我在 RDS 上使用 PG 9.5。具有 256 GB 存储空间的通用型 (SSD),因此在用尽我们最初的突发 IOPS 后,我的 IOPS 应该会略低于 800。

IOPS 节流真的是这里的问题吗?在观看查询运行时,我看到写入性能约为 400 IOPS,读取性能类似。25,000,000 行 / 400 IOPS = 17 小时,但此查询的运行时间比 24 小时长得多(大约 30 小时后取消以尝试进行调整)。同一个表上还有其他一些定期更新流量,但是当我看到这个查询花费了多长时间时,我在大约 20 小时时停止了它。

我想知道我的一般更新方法是否错误,或者是否有使用 postgres 操作数据仓库(OLAP 工作负载)的一般建议。我能否通过放弃 RDS 并在 EC2 上运行 PG 来获得更好的性能?

更新:受回复和评论的启发,我对 45k …

postgresql performance data-warehouse update amazon-rds postgresql-performance

5
推荐指数
1
解决办法
2968
查看次数

PostgreSQL 转储和恢复

我似乎无法使用我的数据库在 Windows 上转储/恢复。使用的行和错误消息:

pg_dump -h localhost -U postgres --format=c -O -d ue > latest.dump
pg_restore -h localhost -U postgres -d ue latest.dump
Run Code Online (Sandbox Code Playgroud)

得到这个错误,

pg_restore: [archiver] 输入文件似乎不是有效的存档

有了这个,

pg_dump -h localhost -U postgres -O -d ue > latest.dump
psql -h localhost -U postgres -d ue -f latest.dump
Run Code Online (Sandbox Code Playgroud)

我收到这个错误,

psql:latest.dump:1: 错误:编码“UTF8”的字节序列无效:0xff

我完全被难住了。大多数搜索结果与不使用正确的pg_restore/psql与导出的文件类型有关pg_dump,但正如您在上面看到的,我已经考虑了这一点。

latest.dump 似乎正确填写,至少以纯格式导出我可以阅读的 SQL 并且是数据库的正确导出。

postgresql windows pg-dump pg-restore

5
推荐指数
1
解决办法
6752
查看次数

如何在 Postgres 中一次更新多个表?

我有几个结构完全相同的表,我需要更新所有表中的值。

为此,我尝试构建以下脚本:

DO
$do$
DECLARE
  i pg_tables%rowtype;
BEGIN
FOR i IN SELECT * FROM pg_catalog.pg_tables where schemaname like 'public' and tablename like '%_knex_migrations'
LOOP
    UPDATE i.tablename SET name = replace(name, '.js', '.ts');
END LOOP;
END
$do$;
Run Code Online (Sandbox Code Playgroud)

我可以看到它i.tablename具有正确的值(我插入到 tmp 表中进行检查),但更新失败。

name: error
length: 223
severity: ERROR
code: 42P01
internalPosition: 8
internalQuery: UPDATE i."tablename" SET name = replace(name, '.js', '.ts')
where: PL/pgSQL function inline_code_block line 7 at SQL statement
file: parse_relation.c
line: 965
routine: parserOpenTable
Run Code Online (Sandbox Code Playgroud)

只是声明i.tablename上的插件UPDATE不起作用。 …

postgresql dynamic-sql plpgsql update

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