我有一个不断修改的 3GB 数据库,我需要在不停止服务器的情况下进行备份(Postgres 8.3)。
我的 pg_dump 运行了 5 分钟。如果数据在这个过程中被修改了怎么办?我可以获得一致的备份吗?我不想知道灾难何时发生。
Postgres 文档http://www.postgresql.org/docs/8.3/static/app-pgdump.html对此没有任何说明。
此查询获取您关注的人创建的帖子列表。您可以关注无限数量的人,但大多数人关注 < 1000 人。
使用这种查询方式,明显的优化是缓存"Post"id,但不幸的是我现在没有时间这样做。
EXPLAIN ANALYZE SELECT
"Post"."id",
"Post"."actionId",
"Post"."commentCount",
...
FROM
"Posts" AS "Post"
INNER JOIN "Users" AS "user" ON "Post"."userId" = "user"."id"
LEFT OUTER JOIN "ActivityLogs" AS "activityLog" ON "Post"."activityLogId" = "activityLog"."id"
LEFT OUTER JOIN "WeightLogs" AS "weightLog" ON "Post"."weightLogId" = "weightLog"."id"
LEFT OUTER JOIN "Workouts" AS "workout" ON "Post"."workoutId" = "workout"."id"
LEFT OUTER JOIN "WorkoutLogs" AS "workoutLog" ON "Post"."workoutLogId" = "workoutLog"."id"
LEFT OUTER JOIN "Workouts" AS "workoutLog.workout" ON "workoutLog"."workoutId" = "workoutLog.workout"."id"
WHERE
"Post"."userId" IN …Run Code Online (Sandbox Code Playgroud) postgresql performance index optimization postgresql-performance
我不敢相信他们让事情变得如此困难。我不知道如何查看我的数据库中的数据。
有没有一种简单的方法可以使用 pgAdmin III 查看我的表中的数据?或者,是否有我可以使用的程序不烂?
我正在处理一个 amazon RDS postgresql 数据库,我知道公共模式存在一些问题(也许它被删除了)。但显然模式存在,无论如何问题没有解决。这是一个使用新创建的空数据库的示例会话:
mydb=> CREATE TABLE distributors (
mydb(> did integer,
mydb(> name varchar(40) UNIQUE
mydb(> );
ERROR: no schema has been selected to create in
mydb=> show search_path;
search_path
----------------
"$user",public
(1 row)
mydb=> create schema public;
ERROR: schema "public" already exists
Run Code Online (Sandbox Code Playgroud)
任何提示?我应该寻找什么?
解决了。 感谢 Daniel Vérité 的回答,我已经解决了以下问题:
grant usage on schema public to public;
grant create on schema public to public;
Run Code Online (Sandbox Code Playgroud)
这些是公共架构的默认权限吗?
我有一个可以访问数据库的用户,所以我认为这无论如何都不会增加安全风险......
我想我应该对template1进行相同的修改。这是正确的吗?如何检查 template1 中的权限是否正确(例如,默认值)?
这个问题不是关于 bytea v. oid v. blob v. large objects 等。
我有一个包含主键integer字段和bytea字段的表。我想在该bytea字段中输入数据。据推测,这可以由其中一种PL/语言完成,我PL/Python将来可能会考虑这样做。
由于我仍在测试和试验,我只想使用“标准”SQL 语句从文件(在服务器上)插入数据。我知道只有在服务器上具有写入权限的管理员才能以我想要的方式插入数据。在这个阶段我并不担心,因为用户bytea目前不会插入数据。我已经搜索了各种 StackExchange 站点、PostgreSQL 档案和互联网,但一直没有找到答案。
编辑: 这个2008 年的讨论意味着我想做的事情是不可能的。那么如何使用bytea字段呢?
编辑: 2005 年的这个类似问题仍未得到解答。
解决:所提供的细节在这里上的psycopg网站,我用Python编写的解决方案提供了基础。也可以使用 将二进制数据插入到bytea列中PL/Python。我不知道这是否可以使用“纯”SQL。
我想定期调用存储过程。在 Oracle 上,我会为此创建一个工作。我发现 Postgresql 可以通过使用外部工具(cron 等)和 PgAgent 很好地模拟这一点。
您是否知道不涉及外部工具的“内部”替代方案?
~/.pgpass) 的额外系统配置。Postgresql 8.3
Linux RedHat 64 位
所以这个问题的评论提到,PostgreSQL 中的“存储过程”和“存储功能”略有不同。
评论链接到维基百科文章,但其中一些似乎并不适用(例如,它们可以在SELECT声明中使用)。
该语法本身似乎有点混乱:
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
[...]
END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
Run Code Online (Sandbox Code Playgroud)
您创建了一个FUNCTION但将其称为PROCEDURE.
那么这两者有什么区别呢?
在 PostgreSQL 9.2.3 我试图创建这个简化的表:
CREATE TABLE test (
user_id INTEGER,
startend TSTZRANGE,
EXCLUDE USING gist (user_id WITH =, startend WITH &&)
);
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: data type integer has no default operator class for access method "gist" HINT: You must specify an operator class for the index or define a default operator class for the data type.
在PostgreSQL的文档使用这个例子不为我工作:
CREATE TABLE room_reservation (
room text,
during tsrange,
EXCLUDE USING gist (room WITH =, during WITH &&)
);
Run Code Online (Sandbox Code Playgroud)
同样的错误信息。
而这个对我来说也不起作用: …
postgresql constraint installation exclusion-constraint gist-index
我正在尝试优化一个查询,该查询查看一个大表(3700 万行),并有一个关于在查询中执行操作的顺序的问题。
select 1
from workdays day
where day.date_day >= '2014-10-01'
and day.date_day <= '2015-09-30'
and day.offer_id in (
select offer.offer_day
from offer
inner join province on offer.id_province = province.id_province
inner join center cr on cr.id_cr = province.id_cr
where upper(offer.code_status) <> 'A'
and province.id_region in ('10' ,'15' ,'21' ,'26' ,'31' , ...,'557')
and province.id_cr in ('9' ,'14' ,'20' ,'25' ,'30' ,'35' ,'37')
)
Run Code Online (Sandbox Code Playgroud)
WHERE日期范围的子句是否在子查询之前执行?将最严格的子句放在首位以避免其他子句的大循环,以便更快地执行是否是一种好方法?
现在查询需要很多时间来执行。
每当我需要检查表中某行是否存在时,我总是倾向于编写如下条件:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
Run Code Online (Sandbox Code Playgroud)
还有一些人这样写:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
Run Code Online (Sandbox Code Playgroud)
当条件NOT EXISTS不是EXISTS: 在某些情况下,我可能会用 aLEFT JOIN和一个额外的条件(有时称为antijoin)来编写它:
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = …Run Code Online (Sandbox Code Playgroud) postgresql ×10
performance ×2
plpgsql ×2
amazon-rds ×1
blob ×1
constraint ×1
datafile ×1
gist-index ×1
index ×1
installation ×1
jobs ×1
mysql ×1
optimization ×1
oracle ×1
pgadmin-3 ×1
schema ×1
sql-server ×1