标签: postgresql

在 PostgreSQL 中每天存储日志

这里的要求是存储历史日志。

为简单起见,我将假设这个示例场景,我们在我们的网站上销售一些产品,我们需要保留销售员每天销售的每种产品的销售记录。销售员和产品的数量是已知且恒定的。

现在,假设我们有 3 种产品在售,笔记本电脑咖啡杯
这里我有这张表来记录今天的销售记录(实时记录,将全天更新)

CREATE TABLE IF NOT EXISTS sales_record (
    id SERIAL,
    salesman_id INT NOT NULL,
    sold_laptop INT NOT NULL,
    sold_mugs INT NOT NULL,
    sold_pen INT NOT NULL,
    PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

另一个表来保存旧数据的记录

CREATE TABLE IF NOT EXISTS sales_record_log (
    id SERIAL,
    salesman_id INT NOT NULL,
    sold_laptop INT NOT NULL,
    sold_mugs INT NOT NULL,
    sold_pen INT NOT NULL,
    record_for_day TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

启动并运行它后,我们需要做的就是不断更新记录集并为每次销售将适当的列增加 1。

我们在此设置中遇到的问题是,必须在每天结束时将数据从实时表移动到另一个表并从实时表中刷新 …

postgresql clustering

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

使用 pg_crypto 进行数据库加密和密钥管理

我正在研究必须在数据库中以可逆加密格式存储虚拟机的 root 密码的可能性。原因是有时机器需要本地登录,但不鼓励这样做,我们需要能够查找 root 密码。当然,访问权限将受到严格限制,只有少数管理员。除非无法通过网络访问 vm,否则这些将不会被使用。在这方面同步用户和密码会带来类似的问题,即如果网络出现故障,sudoer 如何使用保证的最新密码登录?

计划要旋转的密钥的最佳方法是什么?我应该使用每个管理员都有的密码吗?这在我心中引起了一些危险信号。有没有办法安全地管理密钥,以便管理员可以设置自己的密码?也许使用公钥加密并使用每个管理员的公钥加密对称密钥?

在这里,我只是在寻找有关加密敏感数据的密钥管理的解决方案的一般概述。如果我无法弄清楚如何从该级别实施,我可以提出更多问题。

postgresql encryption

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

PostgreSQL 8.4:如何判断是否安装了过程语言?

我有一个安装程序,需要 plpgsql 在 PostgreSQL 8.4 数据库中安装存储过程。我需要确保安装了语言,否则应用程序将失败。我不想放弃语言并重新添加它,因为这可能会搞砸其他一些事情。

有没有办法“轻轻”安装语言?
CREATE LANGUAGE IF NOT EXISTS似乎无效。

postgresql plpgsql functions postgresql-8.4 postgresql-extensions

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

PostgreSQL 9.1 流式复制问题:replica 无法正确使用索引

我们在主服务器上的 Ubuntu Linux 12.04 上使用 PostgreSQL 9.1.7,在副本服务器上的 FreeBSD 9.0-RELEASE 上使用 PostgreSQL 9.1.7。副本服务器和主服务器对同一 SQL 查询返回不同的结果。查询计划显示使用索引(BTree 索引,我们根本不使用哈希索引)来获取结果,因此看起来索引在副本服务器上处于不一致或不完整状态。主服务器上的查询:

db1=# select id from users where email='xxxx@xxxx.net';
   id    
---------
 1698116
(1 row)

db1=#
Run Code Online (Sandbox Code Playgroud)

在副本服务器上的查询:

db1=> select id from users where email='xxxx@xxxx.net';
 id 
----
(0 rows)

db1=> select created_at from users where id=1698116;
         created_at         
----------------------------
 2013-03-04 10:40:05.221214
(1 row)

db1=>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,副本数据库已经包含一个具有正确 ID 的用户,因此数据已就位,但由于某种原因尚未编入索引。我们仔细检查了副本是否处于接收/重新应用状态,因此这不是暂时中断。用户从未被编入索引。我们也曾在 CentOS 5.6 上使用 PostgreSQL 9.0 遇到过类似问题,因此我们认为这不是 FreeBSD 或 PostgreSQL 9.1 特定的问题。

我们使用副本服务器运行大量繁重的 SQL 查询,这可能是问题的根源吗?无论如何,我们如何才能有效地检测和防止将来发生此类情况?副本今天没有停机,日志中没有任何错误行,所以我们只是偶尔检测到这种不一致。

postgresql replication postgresql-9.1

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

使用多个并发进程时如何提高 PostgreSQL 的性能?

在我们的 Python 应用程序上看到查询性能并不令人满意,该应用程序运行多个SQLAlchemy core用于访问 PostgreSQL 9.2 数据库的进程。我们可能有大约 100-200 个或更多并发进程对数据库执行查询

我们没有像pgpoolIIpgbounce当前安装的连接池系统。

我测试了查询,可以采取的顺序1-10秒,从我们的应用程序,它运行在何时psql最多20毫秒

我们认为这个问题与并发连接有关,特别是因为上述行为,并且因为我们在访问系统中的不同表时看到这些性能下降。但是,我们对此并不确定,可以很容易地接受替代建议或解决方案。

处理来自单个数据库服务器的多个进程的并发连接的常用方法是什么,以使查询能够快速执行?

postgresql concurrency

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

PgBouncer 是否为每个数据库配置条目创建一个单独的池?

如果我设置了一个包含多个数据库条目的 pgbouncer.ini 配置文件,pgBouncer 是否会为每个条目创建一个单独的池?我会这么认为,但无法证实这一点。

例如,有这样的事情:

[数据库]
db1 = ...
db2 = ...

[pgbouncer]

.
.
.
max_client_conn = 480

default_pool_size = 250

每个数据库的默认池为 250 个最大为 480 个,还是总共250 个默认和最大 480 个连接在两者之间共享?

非常感谢!

postgresql database-design max-connections pgbouncer

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

PostgreSQL 处理磁盘填满的策略

我正在使用 PostgreSQL (8.4) 来存储由频繁插入的应用程序生成的数据(在下面描述的表结构中)。

数据库随着时间不断增长,并且由于新数据比旧数据更相关(在这个特定的应用程序中),删除旧行是一个合理的解决方案(基于 lowerid或 old input_datetime,或多或少相同) .

为了防止与此数据库(此服务器上运行的唯一数据库)相关的问题影响系统的其余部分,我将 PostgreSQL 数据目录放在其自己的分区(在 Linux 系统上为 ext3)。然而,当这个分区变满时,这会导致许多问题。

我正在考虑定期删除旧数据(例如DELETE FROM data_group WHERE id <= ...通过 cron 作业)来解决这个问题。

首先,我的理解VACUUM(由 auto-vacuum 执行,已开启)是,虽然它不一定将磁盘空间返还给操作系统(就像VACUUM FULL那样),但它仍然允许将一些新数据插入到已使用的磁盘空间(即DELETEs 不一定影响文件大小,但它们仍然在 PostgreSQL 自己的数据结构中释放空间)。这样对吗?(我注意到VACUUM FULL应用程序本身引起了一些问题,可能是因为它使用了锁。)

如果是这样,它似乎也SELECT pg_database_size('my_database')反映了磁盘上使用的大小,这不一定反映可用于进一步插入的内容。是否有另一种方法可以估算新插入物的可用空间?

此外,当为时已晚并且分区已填充到 100% 时,运行此DELETE语句会导致此错误并导致 PostgreSQL 服务崩溃:

恐慌:无法写入文件“pg_xlog/xlogtemp.7810”:设备上没有剩余空间

PostgreSQL 守护进程停止当然是一个主要问题(并且在这台机器上没有其他磁盘可以将集群移动到)。

是否有防止此类问题发生的通用策略(知道磁盘空间受限于给定分区内,但删除旧数据是可以接受的)?我想在没有rootor postgres(或 PostgreSQL 管理员)干预的情况下尽可能多地自动化。


CREATE TABLE data_group (
    id SERIAL PRIMARY KEY,
    name TEXT,
    input_datetime TIMESTAMPTZ
);

CREATE …
Run Code Online (Sandbox Code Playgroud)

postgresql disk-space vacuum

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

PostgreSQL CREATE TABLE 创建的所有者不正确

我正在使用 PostgreSQL 9.2.4。当我在非超级用户拥有的数据库中以非超级用户身份创建表时,它归postgres用户所有,因此除非我明确授予自己权限,否则我无法将任何数据放入其中。

我创建了这样的非超级用户:

admin_user=# create role "test1" NOINHERIT LOGIN ENCRYPTED PASSWORD 'wibble' CONNECTION LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个test1像这样拥有的数据库:

admin_user=# create database "test1$db1" with owner "test1";
Run Code Online (Sandbox Code Playgroud)

然后我以 user 身份启动了一个新的 psql test1,并创建了一个表:

test1$db1=> create table test_table (column_name varchar(50));
Run Code Online (Sandbox Code Playgroud)

但我无法插入其中:

test1$db1=> insert into test_table values ('some data');                                                                                                    
ERROR:  permission denied for relation test_table
Run Code Online (Sandbox Code Playgroud)

检查权限显示该表归postgres用户所有:

test1$db1=> \dt
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | test_table     | table | postgres
Run Code Online (Sandbox Code Playgroud)

但是,我可以授予自己权限并执行以下操作:

test1$db1=> grant …
Run Code Online (Sandbox Code Playgroud)

postgresql permissions postgresql-9.2

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

可以在 Postgres 8.4 中嵌套插入吗?

我正在尝试将数据导入库存类型数据库。这是我的表格(为简洁起见被截断):

创建类型主机为 enum ('Physical', 'Virtual', 'Hypervisor', 'Other');

创建表主机(
  id 串行主键,
  主机名 varchar(40),
  角色hostrole
);

创建表接口(
  id 串行主键,
  名称 varchar(20),
  主机 int 在删除级联上引用主机(id),
  mac macaddr
);

我知道我可以将 a 嵌套select到一个insert语句中,我的问题是我是否可以insert将 an嵌套到 an 中insert(如果可以,该怎么做)。这是我试图运行的语句:

插入界面 
  (姓名, 
   苹果电脑, 
   主持人) 
     价值观 
  ('eth0', 
   '00:50:56:9d:34:d4', 
   (插入主机(主机名,主机角色)值('foobar','Virtual')返回 id)
);

错误出现在嵌套插入的“进入”处。我可以一次性完成此操作,还是必须进行单独的查询才能执行此插入操作?

postgresql insert

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

错误:无法在 TEMP 环境变量路径中写入

我安装PostgreSQL 9.2.4-1-windows.exeWindows 7 64Service Pack 1

我得到以下,似乎相当有名的错误:

出现错误。

无法在 TEMP 环境变量路径中写入。

这会在启动后立即发生。我看到 postgresql 飞溅,然后发生此错误。

到目前为止我在互联网上找到的所有东西,我都试过了。这包括:

  1. 禁用所有杀毒软件。我也停止了启动中的一切。
  2. 检查.VBS脚本的文件关联。没有任何异常(Windows Script Host 已注册)
  3. Windows Script Host 已启用。
  4. 我试过以管理员和其他具有管理员权限的用户身份安装。
  5. 我已经HKLM\SOFTWARE\PostgreSQL\Installations手动创建了密钥并赋予它全部权限。
  6. 我已经Everyone完全访问C:\Users\[username]\AppData\Local\Tempc:\temp

基本上前 10 名谷歌点击中的所有内容。

我正在使用 32 位版本,但 64 位版本安装失败并出现相同的错误。我能够在具有类似配置的其他机器上成功安装。

我还能尝试什么?

安装日志文件:

日志开始于 2013 年 9 月 20 日 11:55:16 首选安装模式:qt 尝试在模式 qt 模式下初始化安装程序 qt 成功初始化执行 C:\Users\chad\AppData\Local\Temp/postgresql_installer_67b274715d/temp_check_comspec.bat 脚本退出代码:0

脚本输出:“测试正常”

脚本标准错误:

找不到注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\PostgreSQL\Installations\postgresql-9.2 数据目录。将变量 iDataDirectory 设置为空值 …

postgresql windows installation postgresql-9.2

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