我想知道使用热备时如何切换2台服务器的角色?
我有 2 台服务器 :S_1和S_2,并且在时间 T 时,S_1是主服务器,并且S_2是具有流复制的热备用服务器。
稍后,我想切换S_2为主服务器和S_1热备用服务器。
我需要做什么才能转换角色?
就像 SQL Server 中的 MEMO 结构一样,它是优化器在优化查询时所采取的步骤的“书面记录”。PostgreSQL 是否有类似的结构来记录优化器所采取的步骤?
所以我目前正在创建一些 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) 我想在触发器的表中插入一个 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) 我使用以下查询来查找未使用的索引:
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,因此结果行可能实际上是遗留下来的,我想应该有足够的统计数据,以便告诉在哪里使用 和 。
我需要我的程序代码来确保逻辑的某些部分在事务中执行。
什么查询会告诉我当前的交易 ID/其他信息,使我能够确定我是否处于交易中?
BEGIN;
-- How to check if I am in a transaction?
COMMIT;
Run Code Online (Sandbox Code Playgroud) 我目前有一个看起来像这样的表:
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 …
我有一个包含 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) 我有一个运行以下内容的脚本:
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) 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 ×10
index ×2
update ×2
foreign-key ×1
index-tuning ×1
insert ×1
join ×1
json ×1
performance ×1
pg-restore ×1
plpgsql ×1
record ×1
replication ×1
transaction ×1
trigger ×1