标签: postgresql

有没有办法让 pg_dump 忽略错误而不是停止?

我正在运行 postgres 9.4 DB 的 pg_dump,如果其他进程在表上具有独占锁,它偶尔会遇到错误。有没有办法让 pg_dump 忽略该表并继续处理数据库的其余部分,而不是仅仅停下来?

postgresql postgresql-9.4

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

Postgresql 将没有时区的时间戳更新为有时区

当我创建表时,创建了一个没有时区的时间戳列。所有导入的时间都在UTC. 现在我想明确添加时区信息,并且我已经更改了该列

ALTER TABLE review ALTER COLUMN review_time TYPE TIMESTAMP WITH TIME ZONE USING review_time AT TIME ZONE 'UTC';
Run Code Online (Sandbox Code Playgroud)

选择现有数据不显示添加的时区信息

review_time
2017-07-28 02:25:44
2017-07-28 03:10:35
2017-07-28 03:11:32
2017-07-28 03:11:35
2017-07-28 03:11:38
2017-07-28 03:11:41
2017-07-28 18:54:54
Run Code Online (Sandbox Code Playgroud)

我是否需要UPDATE对现有数据运行语句?如果需要,语法是什么?

更新1

缺少时区信息的输出是由于应用程序本身 (SQLWorkbenchJ) 造成的。查询 frompsql将显示时区

mydb # SELECT review_time FROM review;
      review_time       
------------------------
 2017-08-20 08:00:02+08
 2017-07-27 00:45:33+08
 2017-07-27 00:45:37+08
 2017-07-28 02:24:03+08
 2017-07-28 02:24:27+08
 2017-07-28 02:24:31+08
 2017-07-28 02:25:31+08
Run Code Online (Sandbox Code Playgroud)

postgresql timestamp datetime

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

移动数据目录后 Postgresql-Server 将无法启动

我正在我的 Ubuntu 17.04 机器上运行本地 postgresql 服务器(9.5 和 9.6)。按照本指南将我的数据目录移动到另一个硬盘驱动器后,服务器无法启动。

\n

即与

\n
sudo service postgresql restart && sudo service postgresql status \n\n\xe2\x97\x8f postgresql.service - PostgreSQL RDBMS\n   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)\n   Active: active (exited) since Mon 2017-11-06 10:31:32 CET; 1min 42s ago\n  Process: 8962 ExecStart=/bin/true (code=exited, status=0/SUCCESS)\n Main PID: 8962 (code=exited, status=0/SUCCESS)\n\nNov 06 10:31:32 HERCULES systemd[1]: Starting PostgreSQL RDBMS...\nNov 06 10:31:32 HERCULES systemd[1]: Started PostgreSQL RDBMS.\n
Run Code Online (Sandbox Code Playgroud)\n

两个版本的日志都包含以下内容:

\n
pg_ctl: could not access directory "/media/daveknave/BIGFS/PGSQL/9.5/main": Keine Berechtigung\n …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.5 postgresql-9.6

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

序列的 pg_dump 权限被拒绝

我对倾销post-data部分有一个奇怪的问题。

转储命令是:

pg_dump -Fc --verbose --section=post-data --no-owner --no-acl -h localhost -p 9999 -U root db_name -W > constraints.dump
Run Code Online (Sandbox Code Playgroud)

这是一条错误消息:

pg_dump: [archiver (db)] query failed: ERROR:  permission denied for relation verification_code_user_mapping_id_seq
pg_dump: [archiver (db)] query was: SELECT sequence_name, start_value, increment_by, CASE WHEN increment_by > 0 AND max_value = 9223372036854775807 THEN NULL      WHEN increment_by < 0 AND max_value = -1 THEN NULL      ELSE max_value END AS max_value, CASE WHEN increment_by > 0 AND min_value = 1 THEN NULL      WHEN increment_by …
Run Code Online (Sandbox Code Playgroud)

postgresql permissions pg-dump amazon-rds

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

如何限制 pg_dump 使用的资源?

是否可以限制 所使用的系统资源pg_dump

我有一个使用PostgreSQL数据库的资源相当密集的服务器。它正在运行FreeBSD 10.2。服务器有 8 GB 内存。

我使用以下命令运行备份。

pg_dump -h <address> -U <user> -Fc <database> -f <location>
Run Code Online (Sandbox Code Playgroud)

当备份完成时,相关的 postgres 进程的内存使用量不断上升。仅该进程就达到了 2.2 GB。此时内存几乎已用完并FreeBSD开始杀死进程。

我尝试更改备份的完成方式。例如,我尝试使用多个作业(因此将格式更改为目录)。

pg_dump -j 4 -h <address> -U <user> -Fd <database> -f <location>
Run Code Online (Sandbox Code Playgroud)

没有差异。最终,内存使用量将达到上限并FreeBSD终止数据库备份(以及其他进程)。

我还尝试调整一些系统变量。有管理内核资源资源消耗。这些影响了服务器使用的正在运行的 postgres 进程,但对进程使用没有影响pg_dump。在 FreeBSD 开始终止进程​​之前,它仍然上升到 2.2 GB。

我已经通读了pg_dump手册,除了多项作业之外,没有真正看到任何有帮助的内容。

此时我不太确定该怎么办。pg_dump有没有办法限制允许使用的资源?我不介意备份是否慢一些。只是不要在系统资源耗尽时操作系统必须开始终止进程​​。

postgresql memory pg-dump postgresql-9.4

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

搜索数组性能?

我们有一张桌子

id|school_id|parent_ids
Run Code Online (Sandbox Code Playgroud)

其中parent_ids是 id 数组。

如果我们没有school_idand onlyparent_id来搜索,那么查询将搜索数组中的所有表行parent_ids,可能有数千行,并且parent_id实际上可能只在其中的几行中。

在这种情况下,在查询数组列时使用 IN 是否会成为性能障碍?

编辑

这是表结构的转储:

-- ----------------------------
-- Table structure for schools_messages
-- ----------------------------
DROP TABLE IF EXISTS "public"."schools_messages";
CREATE TABLE "public"."schools_messages" (
  "id" int4 NOT NULL DEFAULT nextval('schools_messages_id_seq'::regclass),
  "message" jsonb NOT NULL DEFAULT '[]'::jsonb,
  "details" jsonb NOT NULL DEFAULT '[]'::jsonb,
  "school_id" int4 NOT NULL,
  "created_at" timestamp(0),
  "updated_at" timestamp(0),
  "parents_ids" int4[] DEFAULT ARRAY[]::integer[]
)
;
ALTER TABLE "public"."schools_messages" OWNER TO "prod_schools";

-- ---------------------------- …
Run Code Online (Sandbox Code Playgroud)

postgresql performance array

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

Amazon RDS PostgreSQL 只读副本中的查询运行速度非常慢

我们一直在维护一个具有网络和移动应用程序平台的项目。该项目的后端使用Django 1.10开发并部署在AWS中。

一开始,当用户很少时,我们使用一个 EC2 实例和一个带有 PostgreSQL 数据库的 RDS 实例进行部署。一段时间后,用户数量增加,我们遇到了响应速度很慢、不同页面超时等问题。由于性能问题,我们采取了以下措施:

  • 我们开始使用 Redis 缓存来存储频繁访问的数据(AWS 中的 ElasticCache)
  • 我们部署在两个不同的 EC2 实例中(一个用于 Web 平台,另一个用于移动应用程序的 API)。
  • 我们在RDS中创建了一个只读副本,并添加了一个数据库路由器,该路由器选择仅使用主数据库进行写入操作,所有读取操作都在只读副本数据库中执行。

该解决方案在短短几周内运行良好。一段时间后,所有读取操作都变得太慢。此时,与主数据库的数据库连接数量平均为 2-3 个,有时会激增至 5-7 个。但由于只读副本数据库中的查询执行速度较慢,30-50 个连接在只读副本数据库中很常见。

使用 JOIN 和聚合的查询经常失败,并在只读副本中出现以下错误:

canceling statement due to conflict with recovery DETAIL: User query might have needed to see row versions that must be removed.

但与主数据库相比,只读副本中的所有查询通常都非常慢,即使是最简单的 SELECT 查询也是如此。

为了确保问题不在于特定的只读副本实例,我们创建了另一个只读副本 RDS 实例(例如 read-replica-2)并将所有读取操作指向 read-replica-2 DB。此配置一开始表现良好,但一天内性能显着下降(对于第一个只读副本,需要 3-4 周)。

之后,我们修改了数据库路由器,以针对任何读取操作随机达到只读副本和只读副本 2 之一的峰值,但对这两个只读副本数据库的所有查询执行速度仍然非常慢。我们通过将读操作切换到master数据库进行检查,相同的读操作在master数据库中执行顺利,没有任何问题。

一些服务器负载相关信息:

  • 在高峰时段,有 500-1000 个用户使用该系统,其中大多数来自移动应用程序(通过 API EC2 实例)。
  • 在高峰时段,访问Web平台的用户很少。但它们经常执行繁重的数据库密集型任务(例如批量导入和导出数据)。
  • 在非高峰时段(当地夜间的 6 小时窗口内),系统中会执行一些繁重的数据库密集型 cron 作业,以进行报告生成和维护。

考虑到这种情况,适合我们的架构应该是什么?我们是否遗漏了一些明显的东西?什么会导致相同的查询在 RDS …

postgresql performance aws master-slave-replication amazon-rds postgresql-performance

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

对于 /copy 命令保留空字符串而不是 null

使用该\copy命令时psql,我有一个包含空值的文件。这些值不是空字符串null,而是始终为空字符串。

我的命令:

\copy agltransact FROM 'dbo_agltransact.csv' with null as '' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

ERROR:  null value in column "apar_id" violates not-null constraint
Run Code Online (Sandbox Code Playgroud)

我有这个数据:

account,amount,apar_id,apar_type
14015,3000000.000,,1
14015,3000000.000,,2
Run Code Online (Sandbox Code Playgroud)

我希望倒数第二列是空字符串。

postgresql bulkcopy

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

优化位图堆扫描

我试图理解为什么我的查询需要很长时间,即使我已经索引了所需的列:

SELECT entity_id,
       id,
       report_date
FROM own_inst_detail
WHERE ( own_inst_detail.id = 'P7M7WC-S' )
  AND ( own_inst_detail.report_date >= '2017-02-01T17:29:49.661Z' )
  AND ( own_inst_detail.report_date <= '2018-08-01T17:29:49.663Z' )
Run Code Online (Sandbox Code Playgroud)

缓存结果EXPLAIN ANALYZE如下:

Bitmap Heap Scan on own_inst_detail (cost=20.18..2353.55 rows=597 width=22) (actual time=1.471..6.955 rows=4227 loops=1)
  Recheck Cond: ((id = 'P7M7WC-S'::bpchar) AND (report_date >= '2017-06-01'::date) AND (report_date <= '2018-08-01'::date))
  Heap Blocks: exact=4182
  ->  Bitmap Index Scan on own_inst_detail  (cost=0.00..20.03 rows=597 width=0) (actual time=0.901..0.901 rows=4227 loops=1)
        Index Cond: ((id = 'P7M7WC-S'::bpchar) AND (report_date >= '2017-06-01'::date) AND …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization query-performance postgresql-performance

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

Postgres 中 BRIN 索引的测试效率

我在 BRIN 索引的 OLAP 查询中发现了许多用例,因为它们要小得多,并且速度与 BTREE 索引处于同一数量级。

通常,我使用 BRIN 索引来单调(或接近)增加时间戳列。在我们的 OLTP 数据库中,它们紧密地放置在磁盘上,因为随着时间的推移,它们自然会按顺序写入。

在我们的仓储 Postgres 实例中,表的某些部分是大批量加载的,不一定按时间排序。

是否有一些分析查询可以告诉我数据是否放置得太随机而无法使用 BRIN,即使列值分布似乎应该遵循创建 BRIN 索引的所有先决条件?

postgresql index-tuning

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