我想知道这个例子
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
Run Code Online (Sandbox Code Playgroud)
cityas的定义在varchar(80) 这里重复。是否有允许不重复的 PostgreSQL 语法varchar(80),仅基于references cities(city)以创建天气表?
下面是我正在处理的一个项目的一个非常精简的版本。
CREATE TABLE cidr_block (
id serial not null unique,
block_def cidr primary key,
dhcp_server_id int not null references computer_system (id),
...
);
CREATE TABLE ip_addr (
computer_id int not null references computer_system (id),
mac_addr macaddr not null unique,
ip_addr inet not null unique,
);
Run Code Online (Sandbox Code Playgroud)
这是一个网络配置数据库。现在,预计大多数(但不是全部)ip_addr.ip_addr 记录将位于 cidr_block.block_def 块中。其他可能是外部链接到客户位置的 vpn 接口可能不是。没有简单的声明性方法来确保两个表之间适用行的 fkey。所以我想知道:
在适当的地方使用触发器来创建 fkey 链接是否更可取?
仅仅在预期的地方加入就足够了吗?如果给一台计算机分配了一个错误的 IP 地址,它就不会从 dhcp 服务器获得一个,我们很快就会知道这一点。(写入触发通知,触发相关 dhcp 服务器上的更新)
还有其他更好的方法吗?
我在集群中使用流式复制和 PITR(WAL 文件),目前我有不同版本postgresql.conf的主服务器和备用服务器。
文件中唯一的区别是归档命令,它指向不同的目录。
例如,在主人我有:
archive_command = 'cp %p /dbckp/server1master/%f'
Run Code Online (Sandbox Code Playgroud)
在待机状态下:
archive_command = 'cp %p /dbckp/server2master/%f'
Run Code Online (Sandbox Code Playgroud)
我认为,如果备用系统在“备用模式”下没有生成任何档案,我可以使用相同的目录并在单个postgresql.conf.
我有一个使用 WIN1252 编码的 pg_dump 创建的 dmp 文件。我想做的是使用 pg_restore 将它导入到 Linux 机器上的数据库中。问题是在 Windows 机器上 postgreSQL 识别编码 WIN1252 但不识别 CP1252 编码(它们都是相同的,只是相同标准的不同名称)。在 Linux 机器上,postgreSQL 能识别 CP1252 但不能识别 WIN1252。因此,当我尝试执行 pg_restore 时,出现错误,因为 WIN1252 未被识别为正确的编码。此外,如果我尝试在 Windows 上执行 pg_dump 并将编码指定为 CP1252,则会出现类似的错误。我想坚持使用这种编码格式,因此在 utf8 中执行 pg_dump 或其他事情不是我想做的事情。任何帮助,将不胜感激!
编辑:实际上,经过进一步调查,postgreSQL 不理解 cp1252。用于将文本文件从一种编码转换为另一种编码的 iconv linux 命令理解 cp1252 而不是 win1252,这就是我从哪里得到它的。在Linux机器上,我仍然无法将客户端编码设置为WIN1252。这是错误消息:
FATAL: conversion between WIN1252 and LATIN1 is not supported
Run Code Online (Sandbox Code Playgroud)
变量 client_encoding 在 Linux 机器上最初设置为 UTF8,所以我不知道 LATIN1 来自哪里。除非不支持 WIN1252,否则 postgres 会尝试将其转换为 latin1,因为这是最接近它的东西,并且由于某些字符不匹配而无法实现?
我有一张如下表:
Annotation (
document,
term,
category
)
Run Code Online (Sandbox Code Playgroud)
其中document和term是一些ID,category而是一个整数。
这对夫妇document-term不是唯一的,即我可以拥有不同类别的同一对夫妇。
document_id_1, term_id_1, category_1
document_id_1, term_id_1, category_2
document_id_1, term_id_1, category_3
Run Code Online (Sandbox Code Playgroud)
我想设计一个查询,使其仅返回一对夫妇document-term对于他们来说,只有一行category = 1.
例如,在前面的例子中,没有返回这对夫妇document_id_1-term_id_1因为还存在其他两行,具有不同的 值category。
你能给我一些关于如何做到这一点的提示吗?
作为一名 DBA,我会定期观察我的数据库,调整一些查询(让程序员重新编写它,或者添加索引或更新统计信息,如果需要的话,等等)。我还调整了服务器选项等。
但我不满意的是我没有好的指标来说明我的工作是否值得。
在一次性查询优化中,我可以判断我是否让查询运行得更快。我可以使用日志和 pgfouine 来检测慢查询。
但是是否有整体方法来量化数据库的运行情况,跟踪的指标会告诉我我是在总体上改进还是没有真正产生影响,等等?
我正在寻找在数据库级别捕获的指标,而不是在应用程序级别。
是否有可能在 PostgreSQL 中内置物化视图?
我不想要 Gardner 版本或类似由触发器填充的物理表之类的东西。我读过正在/正在部署的东西......
我正在开发网络身份验证系统,用户将对随机令牌进行数字签名,这将使用存储在服务器上的 X509 证书进行检查。
因此我必须在 PostgreSQL 数据库中存储几个 X509 证书(PEM 或 DER 格式)。听起来很简单,但我希望有可能使用主题、颁发者、notBefore、notAfter 和类似标准来搜索证书。
我的想法是在数据库中有以下列:X509data、notAfter、notBefore、subject、issuer 等。然后我将使用 add_new_X509()、find_X509(search criteria) 等方法创建代表 X509 证书的对象(在 SQL 炼金术中)。所以无论何时我将使用 add_new_X509() 方法添加新证书,它将自动从证书中读取所有数据并填写其余列并将原始证书放入 X509data 列。
不幸的是,这个解决方案有两个缺点:
所以..有人有更好的主意或建议吗?也许有人看到此解决方案可能出现的任何其他安全问题?
使用 PostgreSQL,我们有数百个并发进程进行常规数据库访问。我们的数据分布在多个数据库服务器上,每个服务器都有一个与 PgBouncer 的连接池。问题在于所有服务器上的 RAM 使用率(通过top- 不确定这是否是确定这一点的最佳方法)往往会攀升至接近或 100%。我很确定这很糟糕。
我已经尝试了 pgbouncer / postgres 的几种配置,最终(在我的系统运行几分钟后)RAM 使用量上升到这一点。
我的问题是:
非常感谢!如果需要更多信息,请告诉我,我会尽快发布。
编辑: 运行 vmstat 1 一段时间后,我得到以下信息:
procs -----------内存----------- ---swap--- -----io---- --system--- -----cpu ----- rb swpd 免费 buff 缓存 si so bi bo in cs us sy id wa st 0 34 241048 20124 10208 2636248 340 80 1820 2968 3846 2864 12 14 0 73 1 0 56 240980 19256 10224 2636860 360 140 2568 6100 5773 4874 …
我担心我恢复的数据库与原始数据库有很大不同:
#check size of postgres database
postgres@db1:/tmp$ psql -c "select pg_size_pretty(pg_database_size('test_db'));"
pg_size_pretty
----------------
2105 MB
(1 row)
#backup database
postgres@db1:/tmp$ pg_dump -Fc test_db > test_db_Fc.dump
#rename postgres database (i.e. park it nearby)
postgres@db1:/tmp$ psql -c "alter database test_db rename to test_db_20130322;"
ALTER DATABASE
-------
(1 row)
#restore test_db
postgres@db1:/tmp$ pg_restore -Fc -C -d postgres test_db_Fc.dump
#check size of restored postgres database
postgres@db1:/tmp$ psql -c "select pg_size_pretty(pg_database_size('test_db'));"
pg_size_pretty
----------------
257 MB
(1 row)
Run Code Online (Sandbox Code Playgroud)
原始数据库比恢复的数据库大很多倍。这里发生了什么?据我所知,test_db 服务的网站在恢复后仍然运行良好,但在实时上下文中使用备份之前,我需要知道发生了什么。
仅供参考,如果我在每个数据库上运行vacuumdb,数据库大小似乎没有变化。
[附录,稍后添加] 在 RTFM 的传统中,我已经在 PostgreSQL …
postgresql ×10
foreign-key ×1
linux ×1
memory ×1
python ×1
replication ×1
syntax ×1
windows ×1