我想在位于我的主要物理数据库服务器下的物理服务器上设置一个备份数据库。我正在使用 Postgres 9.2,并且我想使用同步流复制(用于原子性),但我完全不知道诸如A)初始表设置如何从服务器 1 传输到服务器 2(例如,我运行syncdb来自我的 Django 应用程序,它在服务器 1) 上创建了一系列表),以及B)如何将持续的架构更改从服务器 1 传送到服务器 2(例如,我运行 Django South 迁移,它发送ALTER TABLE查询,以及添加/删除索引等)。这些事情是通过流式复制透明地处理的,还是我必须做些什么才能影响两台服务器之间的这种变化?
我今天发现在 Postgresql 中重命名表也会重命名使用我自动重命名的表的视图的 VIEW 定义?有什么办法可以关闭这个功能吗?
所以我重命名表:
ALTER TABLE xyz RENAME TO abc;
Run Code Online (Sandbox Code Playgroud)
举例来说,我的 VIEW 定义是:
CREATE VIEW foo AS SELECT * FROM xyz;
Run Code Online (Sandbox Code Playgroud)
重命名表后,我知道的下一件事是,foo 的定义已更改为指向表 abc。
我正在使用 Postgresql 8.4
--更新时间:2014 年 12 月 30 日下午 12:41--
这是一个测试用例来说明我的意思:
CREATE TABLE tmp_test_a (num integer);
CREATE VIEW v_tmp_test_a AS SELECT * FROM tmp_test_a;
-- Now look at what the VIEW is using (now is using tmp_test_a, which is what it should be using):
SELECT pg_get_viewdef('v_tmp_test_a'::regclass, false);
-- Now create a second table, and …Run Code Online (Sandbox Code Playgroud) 这是我面临的奇怪问题。我正在尝试使用以下查询输入数据
insert into product_product
(id, product_tmpl_id, make_equip, model_equip, name_template, serial_num_equip, location_equip, issue_date_equip, issue_to_equip, remarks_equip, pr, ch, categ_id,valuation)
values (700,700,'Nikon','Action 10x50 Lookout','Nikon Action 10x50 Lookout','671386','40 Wall St.','5/13/2004 12:00:00 AM','','OM''s OFFICE',62,72,502,'manual periodic');
Run Code Online (Sandbox Code Playgroud)
我收到错误:
ERROR: duplicate key value violates unique constraint "product_product_pkey"
DETAIL: Key (id)=(700) already exists.
********** Error **********
ERROR: duplicate key value violates unique constraint "product_product_pkey"
SQL state: 23505
Detail: Key (id)=(700) already exists.
Run Code Online (Sandbox Code Playgroud)
我在该记录上运行选择查询,如下所示:
select * from product_product
where id=700
Run Code Online (Sandbox Code Playgroud)
它返回没有数据的列(数据也包括 id)
我尝试像这样运行更新查询:
update product_product set
product_tmpl_id=700,
make_equip='Nikon',
model_equip='Action 10x50 …Run Code Online (Sandbox Code Playgroud) 我们正在创建 SAAS,我们最多将拥有 50.000 名客户。我们正在考虑在 Postgres 数据库中为每个客户创建一个用户。我们会将登录我们服务的每个用户映射到数据库中的用户,以确保他们只能访问自己的数据。我们还希望通过此解决方案直接在数据库中实施审计跟踪,它利用触发器。如果每个客户都有自己的数据库用户,那么即使两个客户共享相同的数据,也很容易看出谁做了什么。
因为我们的数据库中有 50.000 个用户,我们会遇到一些意想不到的问题吗?性能方面或管理方面。也许连接池会更困难,但我真的不知道我们是否需要它。
我正在使用此页面中的语句来查看 Postgres 中的阻塞查询
SELECT bl.pid AS blocked_pid,
a.usename AS blocked_user,
ka.query AS blocking_statement,
now() - ka.query_start AS blocking_duration,
kl.pid AS blocking_pid,
ka.usename AS blocking_user,
a.query AS blocked_statement,
now() - a.query_start AS blocked_duration
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a ON a.pid = bl.pid
JOIN pg_catalog.pg_locks kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
JOIN pg_catalog.pg_stat_activity ka ON ka.pid = kl.pid
WHERE NOT bl.granted;
Run Code Online (Sandbox Code Playgroud)
然而,查询被截断了,所以我通常看不到WHERE子句中的内容,这使得调试这些阻塞问题非常困难。是否有设置可以告诉 postgres 将完整查询记录到pg_stat_activity
我正在尝试将csv包含表数据的文件导入 postgres 。表的列之一具有jsonb类型。
我的csv文件的一行包含类似
1,{"a":"b"}
Run Code Online (Sandbox Code Playgroud)
假设表有一个模式
id | smallint |
data | jsonb |
Run Code Online (Sandbox Code Playgroud)
如果我只是尝试插入数据,一切正常
INSERT INTO table VALUES (1, '{"a":"b"}');
Run Code Online (Sandbox Code Playgroud)
尝试直接从文件导入
COPY table FROM '/path/to/file.csv' DELIMITER ',' csv;
Run Code Online (Sandbox Code Playgroud)
给了我以下错误:
ERROR: invalid input syntax for type json
DETAIL: Token "a" is invalid.
CONTEXT: JSON data, line 1: {a...
COPY availability, line 1, column services: "{a: b}"
Run Code Online (Sandbox Code Playgroud)
我试图用', with ", with\"和\',但没有任何效果。
哪个是正确的语法呢?
考虑一个座位预订数据库。有 n 个座位的列表,每个座位都有一个属性is_booked。0 表示不是,1 表示是。任何更高的数字都会出现超额预订。
在不允许超额预订的情况下进行多次交易(每个交易将同时预订一组 y 个座位)的策略是什么?
我会简单地选择所有未预订的座位,选择其中 y 个随机选择的一组,全部预订,然后检查该预订是否正确(也就是 is_booked 的数量不超过一个,这将表示预订了座位的另一笔交易和提交),然后提交。否则中止并重试。
这是在 Postgres 中的 Read Committed 隔离级别上运行的。
我们在 docker 容器中有 postgresql 11.7 数据库。
我们遇到了一个问题"pq: could not resize shared memory segment "/PostgreSQL.XXX" to XXX bytes: No space left on device",如下所述。
解决方案有所帮助,我们不再有问题了。但是我们应该为 Postgres 的 docker 容器的 shm_size 设置哪个大小呢?
有什么推荐吗?我们如何计算 shm_size 的“最佳大小”?
DB-B我正在使用数据库 ( ) 的副本( DB-A),我通过每天运行来保持最新状态:
pg_restore -U postgres -d someDB --clean -j 2 -L WhatToImportList admin.dump
Run Code Online (Sandbox Code Playgroud)
但我开始注意到DB-B表中存在重复记录。经过进一步调查,似乎--clean没有将表删除,DB-B因为它需要对 my 中DB-B但不在 origin 中的其他表和视图进行级联删除DB-A。
DB-A如果不是,那么什么是一个好的复制策略,我可以从中导入数据,DB-B但保留分析所需的所有函数、视图和表DB-B?谢谢。
编辑:可能的解决方法:截断每个表,然后导入它们...但我必须在脚本中包含每个表。
Edit2:为了帮助未来的读者,这样可以生成所有必须截断的表的列表:
SELECT 'TRUNCATE ' || table_name || ';'
FROM information_schema.tables
WHERE table_schema='my_schema'
AND table_type='BASE TABLE';
Run Code Online (Sandbox Code Playgroud) postgresql ×10
concurrency ×2
csv ×1
docker ×1
import ×1
insert ×1
json ×1
logs ×1
performance ×1
pg-restore ×1
primary-key ×1
replication ×1
schema ×1
users ×1
view ×1