使用 Postgres pl/pgsql,我尝试使用动态 EXECUTE 命令创建一个表,例如:
...
DECLARE
tblVar varchar := "myTable";
BEGIN
EXECUTE 'CREATE TABLE $1 (
foo integer NOT NULL,
bar varchar NOT NULL)'
USING _tblVar;
...
Run Code Online (Sandbox Code Playgroud)
但是,我继续收到错误消息
错误:“$1”处或附近的语法错误
如果我不使用$1令牌,而是编写字符串,myTable它就可以正常工作。
对 CREATE 调用使用动态语句是否有限制?
我正在开发一个预计在发布后不久将为数百万用户提供服务的项目。数据库是 postgres,现在我假设至少需要两台服务器。系统管理员(显然精通可扩展系统)建议在 Web 服务器和数据库服务器之间放置一个负载平衡器。
我的问题是关于负载平衡与连接池的区别。为了保持性能,我应该考虑其中之一,还是两者兼而有之?
我正在生成一个 SQL 命令列表来导出一些我最终使用 psql -f 运行的数据。查询都获得相同的数据子集,所以我想我会考虑资格,并将符合条件的用户 ID 列表放入临时表中,如下所示
create temporary table tmp_export_users as (select id from users where ...)
Run Code Online (Sandbox Code Playgroud)
然后在我的 \copy 命令中参考
\copy (select ... from table where user_id in (select id from tmp_export_users)) TO 'filename.csv' WITH CSV HEADER
Run Code Online (Sandbox Code Playgroud)
这些都在同一个文件中,每行一个,并运行它们 -f 我得到复制命令看不到临时表的错误,所以我猜客户端复制命令实际上不能使用相同的 postgres会话为 psql。
那是对的吗?有没有办法改变这种行为?
我对 PostgreSQL 很陌生,我以前从未使用过它进行过大型部署。但是,我在企业解决方案方面有很好的经验,我想尝试应用我使用 PostgreSQL 学到的一些知识。
我有大小可以处理大量数据和流量的站点。该基础设施将在亚马逊 (AWS) 上使用 EC2 实例和 EBS 卷构建。
设计应该有两个数据库,一个主事务数据库和一个数据仓库来处理分析和报告。
主要事务数据库
将用于实时网站,该网站建立在多个节点上以扩展并发用户。主要是我们要求这个案例的数据库读取操作非常快,我们预计>100GB的数据,每年增长30%。此时,我们计划使用两台 EC2 服务器(稍后根据需要添加更多服务器)。
我的问题是,针对上述要求的推荐设置是什么?另外,有没有办法管理表和卷分区?是否有使用 AWS 设置的建议?
数据仓库数据库
将主要用于在时间维度上从主事务数据库中捕获所有数据。因此,即使是从主数据库中删除的记录也会在 DWH 中被捕获。因此,数据会非常大,增长会更大。如果需要,我们还将使用几个 EC2 实例或更多实例。
在这种情况下,推荐的设置是什么?由于恒定写入(ETL),这将需要快速写入操作。我们可以在 PostgreSQL 中构建 OLAP 多维数据集吗?如果是的话,有人试过吗?
连接到数据库
Web 服务器将连接到主数据库进行查询和写入。我们目前正在使用 django 开发一个应用程序,它使用本机库进行连接。是否建议使用相同的基本方法?还是我们应该配置 pgpool?
数据仓库 (ETL)
构建 ETL 流程以从 main 读取并加载到数据仓库的推荐方法是什么?有什么工具吗?要遵循的方法论?PostgreSQL 在构建 ETL 过程中是否提供任何有用的功能/工具?
我正在使用 PostgreSQL 8.4.15。在运行pg_dump备份数据库时,出现以下错误:
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)
Run Code Online (Sandbox Code Playgroud)
在搜索此错误消息时,我发现了一些建议重新索引表的参考文献(此处和此处)。(在这些讨论中,有提到查询pg_class表以找到正确的pg_toast_XXXXXX值,但似乎是因为它没有显示在他们的错误消息中。我跳过了这部分,因为我在错误消息中显示了一个值。我想这可能是由于 PostgreSQL 的更高版本而带来的便利。)
我运行了以下内容:
REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;
Run Code Online (Sandbox Code Playgroud)
我现在可以毫无错误地使用了pg_dump。
pg_toast这些命令实际上做了什么以及做了什么?这些仅仅是简单的清理还是他们可以删除该表中的某些行?首先可能是什么导致了这个问题?
该表中大约有 300000 行,但我预计自上次成功备份以来只有大约 250 行新行(该表仅用于 INSERT/SELECT,没有 UPDATE)。
我们最近用升级后的机器替换了我们的数据库服务器,该机器具有 4 个四核 CPU 和 32Gb 内存。我们还重新利用了我们的旧盒子作为流复制的奴隶。两个机器都运行 CentOS 6.3 和 PostgreSQL 9.2。Postgres 是每个盒子上唯一运行的东西。
这种配置已经存在大约一个月左右,当流量开始增加时,我们突然开始遇到一些问题。我们开始看到有时 CPU 负载非常高(顶部显示平均负载为 270),当我们可以查看时,pg_stat_activity我们将看到我们的大部分连接都处于该COMMIT状态。如果不理会,这最终将完成,系统将响应连接变为IDLE。我们已尝试禁用复制以查看是否可能是问题所在,但问题仍然存在。
我们已经尝试诊断正在发生的事情,但有点迷茫。运行的输出perf显示类似于下面的内容,我不知道0x347ba9代表什么。
+ 41.40% 48154 postmaster 0x347ba9 f 0x347ba9 ?
+ 9.55% 10956 postmaster 0x2dc820 f set_config_option ?
+ 8.64% 9946 postmaster 0x5a3d4 f writeListPage
+ 5.75% 6609 postmaster 0x5a2b0 f ginHeapTupleFastCollect ?
+ 2.68% 3084 postmaster 0x192483 f build_implied_join_equality ?
+ 2.61% 2990 postmaster 0x187a55 f build_paths_for_OR ?
+ 1.86% 2131 postmaster 0x794aa …Run Code Online (Sandbox Code Playgroud) 我已经用我创建的 4 个角色遇到了这个问题:
使用 GUI (1) 在 pgAdmin III 中更改用户的密码后,该用户无法再登录。
pgAdmin III 显示错误信息:
An error has occurred:
Error connecting to the server: FATAL: password authentication failed for user "sam"
FATAL: password authentication failed for user "sam"
Run Code Online (Sandbox Code Playgroud)
我的系统:Ubuntu 12.04 上的 Postgresql 9.2
有没有什么办法解决这一问题?
(1): 使用 postgres 帐户登录,在登录角色中右键单击用户,转到“定义”选项卡并输入密码
我使用 Postgresql 9.1 和 ubuntu 12.04。
克雷格的回答启发,我的问题类型SETOF或SETOF纪录的级联我以为我会使用顺利return query,setof record等一系列的发电机到这个PLPGSQL功能:
create or replace function compute_all_pair_by_craig(id_obj bigint)
returns setof record as $$
begin
return query select o.id, generate_series(0,o.value) from m_obj as o;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
在执行期间我收到错误:
ERROR: set_valued function called in context that cannot accept a set
怎么了 ?与 Craig 相反,我告诉函数返回setof record。
我可以实现与 Craig 完全一样的工作,即通过定义类型create type pair_id_value as (idx bigint, value integer)并让我的 plpgsql 函数返回 asetof of pair_id_value而不是setof record …
postgresql stored-procedures plpgsql set-returning-functions
我是 Postgres 的新手,我试图了解模式如何适应一切以及非“公共”模式的好处是什么。例如,它是否提供安全性、访问控制优势或其他优势?
我正在使用的设置是 postgres 拥有数据库和表,但向另一个用户授予选择、插入、更新和删除权限。在“公共”模式与“myotherschema”中创建表会有很大区别吗?
我以超级用户身份登录到我的数据库postgres。
postgres=# SELECT * FROM pg_user;
+----------+----------+-------------+----------+---------+--------------+----------+----------+-----------+
| usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig |
+----------+----------+-------------+----------+---------+--------------+----------+----------+-----------+
| postgres | 10 | t | t | t | t | ******** | (null;) | (null;) |
| test | 24763 | f | f | f | f | ******** | (null;) | (null;) |
+----------+----------+-------------+----------+---------+--------------+----------+----------+-----------+
(2 rows)
Run Code Online (Sandbox Code Playgroud)
我已经列出了数据库中的所有用户。如何获取普通用户的密码test?