标签: postgresql-11

在并行事务中使用相同的临时表名是否安全?

使用 postgreSQL 10 或 11,创建具有相同名称的临时表是否安全,每个表都携带不同的数据?我不打算在任何会话/连接/交易之间共享数据。名称本身并不重要,但我想避免为每个需要此类中间表的并发查询生成随机名称的麻烦。

临时表仅用于不同的SELECT查询。它将在每个带有该ON COMMIT DROP子句的事务结束时删除。

PostgreSQL文档说明:

当临时表存在时,具有相同名称的现有永久表对当前会话不可见,除非它们被模式限定名称引用。

我不清楚这是否也适用于临时表。

postgresql transaction temporary-tables postgresql-10 postgresql-11

4
推荐指数
1
解决办法
807
查看次数

使用默认分区中已存在的值创建新的表分区

我有下表:

CREATE TABLE orders
(
  info_date  date,
  country_code  VARCHAR,
  order_total   int,
  CONSTRAINT orders_pk PRIMARY KEY (info_date, country_code)
) PARTITION BY LIST (country_code);

CREATE TABLE orders_def PARTITION OF orders DEFAULT;
Run Code Online (Sandbox Code Playgroud)

我插入一些行country_code 'foo',它们最终位于默认分区中。

一段时间后,我决定应该'foo'有自己的分区,我该怎么做?

根据文档:

如果存在 DEFAULT 分区,并且 DEFAULT 分区中存在任何行,否则它们将适合要添加的新分区,则无法添加新分区。


这是我的尝试

begin;
CREATE TEMP TABLE temp_table ON COMMIT DROP AS 
SELECT * FROM orders where country_code = 'foo';
DELETE FROM orders where country_code = 'foo';
CREATE TABLE orders_foo PARTITION OF orders FOR VALUES IN ('foo');
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

postgresql migration partitioning default-value postgresql-11

4
推荐指数
1
解决办法
2342
查看次数

为什么我的查询处于空闲状态?

我是 postgres 新手,我有 aws rds 实例运行 postgresql 引擎版本 11.5。

我所有的查询都是 clientRead 有 wait_event。为什么我的所有查询都处于空闲状态。这是否意味着它们在事务中处于空闲状态?

我应该采取哪些步骤来解决这个问题?

例如,如果我将idle_in_transaction_session_timeout更改为10分钟,它会解决这个问题吗?

select count(*),state FROM pg_stat_activity group by 2;
 count | state
-------+--------
     5 |
     1 | active
   451 | idle


Select pid, datname, usename, wait_event_type, wait_event, backend_type FROM pg_stat_activity where state='idle';
  pid  | datname  |         usename          | wait_event_type | wait_event |  backend_type
-------+----------+--------------------------+-----------------+------------+----------------
 14797 | xxxxx    | user                     | Client          | ClientRead | client backend


SELECT current_setting('idle_in_transaction_session_timeout');
 current_setting
-----------------
 1d
(1 row)
Run Code Online (Sandbox Code Playgroud)

postgresql amazon-rds postgresql-11 postgresql-performance

4
推荐指数
1
解决办法
5402
查看次数

在不使用子查询的情况下选择行中的上一个值

假设您在 PostgreSQL 11 中有一个表,其中包含如下所示的值集。

12 18
11 12
5  12
9  18
7  19
14 18
11 16
6  12
4  11
5  9
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以在不使用子选择的情况下进行选择,或者通过使用函数或触发器/函数来查找每个值低于先前值或可能高于先前值的位置,但此示例低于先前值(可能是 2 行或15+ 行)在列和第一列中都高于最后一行或第一列和第二列以终止选择,使条件为正?

我不知道如何在选择中包含当前变量。如果我可以回顾变量那么我应该能够做到这一点。我想知道是否有人遇到过这个问题,并使其在选择中工作,或者他们在数据库之外进入 GoLang / Python / C++ / Perl / PHP / 等。一旦我离开数据库,做起来非常简单,但我我真的很想将其保留在 PostgreSQL 11 中。

postgresql select postgresql-11

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

PostgreSQL:如何列出序列所属的表?

我知道我可以用这个列出所有序列:

SELECT * FROM information_schema.sequences;
Run Code Online (Sandbox Code Playgroud)

但我需要知道这个序列被哪个表使用。

我想这样做的原因是为了找出哪些PRIMARY KEYs序列不是默认格式的table_name_id_seq

这可能吗?

注意:我的 PostgreSQL 版本是 11.5。

postgresql postgresql-11

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

pg_restore 后数据库大小不同(389 GB 与 229 GB)

我使用以下命令在 PostgreSQL 11.6(带有 TimescaleDB 1.60 扩展)中创建了数据库的备份pg_dump

PGPASSWORD=mypassword pg_dump -h 127.22.0.4 -p 5432 -U postgres -Z0 -Fc database_development
Run Code Online (Sandbox Code Playgroud)

并将其恢复到运行相同版本的 PostgreSQL 11.6(带有 TimescaleDB 1.60 扩展)的新服务器pg_restore。对于恢复,以psql用户身份执行以下命令postgres

CREATE DATABASE database_development;
\c database_development
CREATE EXTENSION timescaledb;
SELECT timescaledb_pre_restore();

\! time pg_restore -Fc -d database_development /var/lib/postgresql/backups/database_development_2020-02-29

SELECT timescaledb_post_restore();
Run Code Online (Sandbox Code Playgroud)

原始数据库的数据库大小为 389 GB,但恢复的数据库为 229 GB。这些尺寸是通过运行获得的

select pg_size_pretty(pg_database_size('database_development'))
Run Code Online (Sandbox Code Playgroud)

一些差异:

旧数据库存储在 ext4 分区上,而新数据库存储在禁用压缩的 ZFS 文件系统上。两个数据库实例都在具有 Ubuntu 18.04 主机的 Docker 容器内运行。

问题:我们如何解释数据库大小的差异?pg_dump和期间都没有遇到错误pg_restore

postgresql backup pg-dump pg-restore postgresql-11

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

PostgreSQL 11.9 无法重新启动服务器,错误 -- pg_ctl: 目录“/var/lib/postgresql/11/main”不是数据库集群目录

我们一直在努力重启停电后关闭的数据库集群服务器。我们尝试过 systemctl 、 pg_ctl 和 pg_ctlcluster 命令,但我们总是遇到同样的错误。

目录“/var/lib/postgresql/11/main”不是数据库集群目录

在我们的配置文件(postgresql.conf)中提到了相同的路径:

data_directory = '/var/lib/postgresql/11/main'

我无法理解为什么我们会收到此错误,即使服务器在断电之前以相同的配置运行。

这是我们的生产服务器。

我输入这些命令的命令行是:

  • pg_ctl : /usr/lib/postgresql/11/bin/pg_ctl 启动 -D /var/lib/postgresql/11/main
  • pg_ctlcluster : /usr/bin/pg_ctlcluster --skip-systemctl-redirect 11-main start (这与 postgresql@.service 的 ExecStart 参数下提到的命令相同)
  • systemctl : systemctl 状态 postgresql@11-main.service

postgresql postgresql-11

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

PostgreSQL - PUBLICATION 尝试复制另一个数据库中已存在的数据?

我在一台服务器上有数据库和表 collection_city 。它有 21 行。我在第二台服务器上有数据库和表 collection_city 。它也有 21 行。

他们都有这一行:

tinker=# table collection_city;
 id |     name      |    alias     | postal_code | region_id 
----+---------------+--------------+-------------+-----------
  2 | Obrenovac     | obrenovac    |             |         1
Run Code Online (Sandbox Code Playgroud)

id 列是主键。

我在第一台服务器上创建了发布:

CREATE PUBLICATION tinkerpub FOR ALL TABLES;

tinker=# \dRp[+]
                      Publication tinkerpub
  Owner   | All tables | Inserts | Updates | Deletes | Truncates 
----------+------------+---------+---------+---------+-----------
 postgres | t          | t       | t       | t       | t
(1 row)
Run Code Online (Sandbox Code Playgroud)

我在第二台服务器上创建了订阅:

CREATE SUBSCRIPTION tinkersub CONNECTION 'dbname=tinker host=192.168.150.5 user=postgres password=test port=5432' …
Run Code Online (Sandbox Code Playgroud)

postgresql replication master-slave-replication postgresql-11

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