标签: postgresql

如何在 PostgreSQL 中切换主服务器和热备份(带流复制)?

我想知道使用热备时如何切换2台服务器的角色?

我有 2 台服务器 :S_1S_2,并且在时间 T 时,S_1是主服务器,并且S_2是具有流复制的热备用服务器。

稍后,我想切换S_2为主服务器和S_1热备用服务器。

我需要做什么才能转换角色?

postgresql replication postgresql-9.1

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

如何深入了解 PostgreSQL 的优化器并跟踪优化查询所需的每一步?

就像 SQL Server 中的 MEMO 结构一样,它是优化器在优化查询时所采取的步骤的“书面记录”。PostgreSQL 是否有类似的结构来记录优化器所采取的步骤?

postgresql

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

如何确定列是否定义为串行数据类型而不是基于目录的整数?

所以我目前正在创建一些 SQL 来读取 postgres (9.1) 目录以构建表定义。但是,我遇到了 SERIAL/BIGSERIAL 数据类型的问题。

例子:

CREATE TABLE cruft.temp ( id BIGSERIAL PRIMARY KEY );
SELECT * FROM information_schema.columns WHERE table_schema='cruft' AND table_name='temp';
"db","cruft","temp","id",1,"nextval('cruft.temp_id_seq'::regclass)","NO","bigint",,,64,2,0,,,,,,,,,,,,,"db","pg_catalog","int8",,,,,"1","NO","NO",,,,,,,"NEVER",,"YES"
Run Code Online (Sandbox Code Playgroud)

它给了我数据库名 (db)、模式名 (cruft)、表名 (temp)、列名 (id)、默认值 (nextval( ... )) 和数据类型(bigint 和 int8 .. NOT bigserial) ...我意识到我可以检查默认值是否是一个序列 - 但我不相信这会是 100% 准确的,因为我可以手动创建一个序列并创建一个非序列列,其中默认值是那个顺序。

有没有人对我如何实现这一点有建议?除了检查 nextval(*_seq) 的默认值之外还有什么别的方法吗?

针对 TL;DR 或不熟悉 pg_catalog 的新用户在此处添加的 SQL 解决方案进行了编辑:

with sequences as (
  select oid, relname as sequencename from pg_class where relkind = 'S'
) select
  sch.nspname as schemaname, tab.relname as tablename, col.attname …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

将 RECORD 插入触发器函数中的表中

我想在触发器的表中插入一个 RECORD 数据类型变量(新变量)。SQL 会是什么样子?
以下尝试均未成功:

EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql update record

9
推荐指数
2
解决办法
6630
查看次数

查找未使用的索引

我使用以下查询来查找未使用的索引:

SELECT 
PSUI.indexrelid::regclass AS IndexName 
,PSUI.relid::regclass AS TableName 
FROM pg_stat_user_indexes AS PSUI 
JOIN pg_index AS PI 
ON PSUI.IndexRelid = PI.IndexRelid 
WHERE PSUI.idx_scan = 0 
AND PI.indisunique IS FALSE;
Run Code Online (Sandbox Code Playgroud)

在运行之前我应该​​运行任何统计收集语法或其他任何内容吗?上述查询可以用于此目的吗?我的意思是,那么 SQL 输出中显示的所有索引都应该被删除吗?

这是一个已有 8 年历史的 BD,因此结果行可能实际上是遗留下来的,我想应该有足够的统计数据,以便告诉在哪里使用 和 。

postgresql index index-tuning postgresql-9.4

9
推荐指数
2
解决办法
5707
查看次数

如何检查当前连接是否处于事务中?

我需要我的程序代码来确保逻辑的某些部分在事务中执行。

什么查询会告诉我当前的交易 ID/其他信息,使我能够确定我是否处于交易中?

BEGIN;
-- How to check if I am in a transaction?
COMMIT;
Run Code Online (Sandbox Code Playgroud)

postgresql transaction

9
推荐指数
2
解决办法
6125
查看次数

Postgresql 10 没有与 ON CONFLICT 规范匹配的唯一或排除约束

我目前有一个看起来像这样的表:

CREATE TABLE "PDPC".collection
(
    col_no bigint NOT NULL DEFAULT nextval('"PDPC".collection_col_no_seq'::regclass),
    q1 character varying(10000) COLLATE pg_catalog."default",
    q2 character varying(10000) COLLATE pg_catalog."default",
    q3 character varying(10000) COLLATE pg_catalog."default",
    q4 character varying(10000) COLLATE pg_catalog."default",
    dg_fkey bigint,
    CONSTRAINT collection_pkey PRIMARY KEY (col_no),
    CONSTRAINT collection_dg_fkey_fkey FOREIGN KEY (dg_fkey)
        REFERENCES "PDPC".datagroup (dg_no) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE "PDPC".collection
    OWNER to postgres;
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 postgresql 在 PHP 中执行 UPSERT 语句,但我收到了

致命错误:未捕获的 PDOException:SQLSTATE[42P10]:无效的列引用:7 …

postgresql foreign-key insert update

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

如何使用反连接加速查询

我有一个包含 2 个反连接(UserEmails = 1M+ 行Subscriptions = <100k 行)、2 个条件和一个排序的查询。我为2个条件+排序创建了索引,这将查询速度提高了50%。两个反连接都有索引。但是,查询太慢(生产时 4 秒)。

这是查询:

SELECT
    "Users"."firstName",
    "Users"."lastName",
    "Users"."email",
    "Users"."id"
FROM
    "Users"
WHERE
    NOT EXISTS (
        SELECT
            1
        FROM
            "UserEmails"
        WHERE
            "UserEmails"."userId" = "Users". ID
    )
AND NOT EXISTS (
    SELECT
        1
    FROM
        "Subscriptions"
    WHERE
        "Subscriptions"."userId" = "Users". ID
)
AND "isEmailVerified" = TRUE
AND "emailUnsubscribeDate" IS NULL
ORDER BY
    "Users"."createdAt" DESC
LIMIT 100
Run Code Online (Sandbox Code Playgroud)

这是解释:

Limit  (cost=1.28..177.77 rows=100 width=49) (actual time=6171.121..6171.850 rows=100 loops=1)
  ->  Nested Loop Anti Join …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index join query-performance

9
推荐指数
2
解决办法
8658
查看次数

带有 `jobs` 标志的 `pg_restore` 导致 `pg_restore: 错误:一个工作进程意外死亡`

我有一个运行以下内容的脚本:

pg_restore tmp/latest.backup --verbose --clean --no-acl --no-owner --dbname hub_development --jobs=12
Run Code Online (Sandbox Code Playgroud)

这经常失败并出现以下错误:

error: could not find block ID 4584 in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive

pg_restore: error: a worker process died unexpectedly
Run Code Online (Sandbox Code Playgroud)

反过来,这个错误意味着应该有索引、主键等的表最终没有它们。例如,在没有多核的情况下运行时,我们的users表如下所示,正如预期的那样:


                                           Table "public.users"
       Column       |            Type             | Collation | Nullable |              Default              
--------------------+-----------------------------+-----------+----------+-----------------------------------
 id                 | integer                     |           | not null | nextval('users_id_seq'::regclass)
 created_at         | timestamp without time zone |           | not null …
Run Code Online (Sandbox Code Playgroud)

postgresql pg-restore

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

Postgres中json字段的大小在压缩之前或之后有限制吗?

json 字段的大小限制为 1GB(来源:此 StackOverflow 答案):

json与数据类型相同text,但具有 JSON 验证。数据text类型的最大大小为 1GB。

我进行了一些实验,将json不同大小的数据插入到 Postgres 的表中。这里的行pg_sizeof似乎表明 Postgres 对 json 数据进行了压缩。

我的实验:

create table json_size (n integer, j json);
Run Code Online (Sandbox Code Playgroud)

值为n1、10、100、1000、10 000、100 000、1 000 000。

with q as (select generate_series(1, n)::bigint as x)               
insert into json_size (n, j)
select 1, coalesce(json_agg(to_json(q.*)), '[]'::json) from q;
Run Code Online (Sandbox Code Playgroud)
select n, pg_column_size(j) as size from json_size;
Run Code Online (Sandbox Code Playgroud)

结果

n       size
1       10
10      92
100     996
1000    3224
10000 …
Run Code Online (Sandbox Code Playgroud)

postgresql json

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