观察:我在 PostgreSQL 实例中的一个表上有一个串行索引,并且我执行了一个将新记录插入到该表中的函数。函数失败(原因不重要),事务被回滚......但索引增加并且没有回滚。这会导致未使用的序列值,例如具有索引 1、2、4、5、7 等且没有删除的表。
问题:有什么办法可以回收丢失的序列值,或者防止失败的函数增加索引?
我知道有其他方法可以缓解这个潜在问题,但我仍然很好奇。
我正在尝试使用 psql 从 Bash 脚本中强行删除 PostgreSQL 9.4.4 数据库:
#!/bin/bash
db="mydb"
psql -d $db -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$db';"
Run Code Online (Sandbox Code Playgroud)
我正在使用此问题中显示的解决方案,但它不起作用。我看到的是这样的:
Run Code Online (Sandbox Code Playgroud)FATAL: terminating connectoin due to administrator command server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
我究竟做错了什么?我拥有数据库并且我的用户角色具有“超级用户”属性,如我\du在 Postgres 控制台中所做的那样。
我有两个非常简单的表,以及在bigint字段上加入它们的视图:
CREATE TABLE foo.ao (
id serial NOT NULL,
ao_id bigint NOT NULL,
ao_plz text,
ao_community text,
ao_street text,
ao_ms_id text,
ao_status text DEFAULT 'Standard'::character varying,
ao_has_eear boolean,
ao_last_update timestamp without time zone,
CONSTRAINT ao_pkey PRIMARY KEY (id),
CONSTRAINT ao_id_unique UNIQUE (ao_id)
);
CREATE TABLE foo.ms (
id serial NOT NULL,
ms_nis_number text NOT NULL,
ms_plz text,
ms_community text,
ms_street text,
ms_status text DEFAULT 'Standard'::character varying,
ms_coord_x integer,
ms_coord_y integer,
ms_ao_id bigint,
CONSTRAINT ms_pkey PRIMARY KEY (id),
CONSTRAINT …Run Code Online (Sandbox Code Playgroud) postgresql performance view postgresql-9.3 postgresql-performance
在 postgresql 9.4 上,我有一个从未有任何更新或删除的表,只有插入和选择。因此它永远不会被自动吸尘,但它仍然会被自动分析,当它发生时,它可能需要 100 多秒。在那 100 秒和之后的很长一段时间内,数据库性能很糟糕,我的应用程序报告的数据库响应时间在 40-150 秒范围内,而不是正常的 2 毫秒范围内。
我一直听说你不应该禁用自动真空,但是当我为这个表设置 autovaccum_enabled=false 时,数据库的性能要可靠得多。是否有理由在这张桌子上启用它?查询计划器最终是否会因为没有在永远不会更新或删除的表上运行自动分析而受到影响?有没有更好的方法来解决这个问题?
编辑:潜在地修改该表的 autovacuum_analyze_threshold 和 autovacuum_analyze_scale_factor 以使分析更频繁地发生会更好吗?
我有一个大型(> 700GB)PostgreSQL 数据库。我正在将其导入 AWS RDS。我意识到有些模块会导致问题,我们正在单独处理这些问题,所以现在,我只是致力于将数据迁移到 RDS。
我正在使用 pg_dump 和 pg_restore 9.4.5 来回迁移 PostgreSQL 9.4.5。
传输几个小时后(pg_dump 到 pg_restore 与目录格式),我检查了日志并意识到有一件我不知道的 Postgres 用户拥有的东西(可能是一张表?)。
我在 toc.dat 文件中找到了进行调用的行并解压了 .dat.gz 文件,发现它只包含“\”。(无引号)在其中。
所以,我的问题是,除了停止传输并重新开始之外,有没有一种方法可以在导入完成后简单地传输该特定命令和文件?
以下是相关详情。
pg_dump 命令:
pg_dump -h localhost -p 5432 -d DBNAME -U USERNAME -F d -f /mnt/backup -j 7
Run Code Online (Sandbox Code Playgroud)
pg_restore 命令:
pg_restore --dbname=DBNAME --no-tablespaces --host=HOSTNAME --port=5432 --username=USERNAME --verbose -F d -j 6 /mnt/backup
Run Code Online (Sandbox Code Playgroud)
toc.dat 文件中的部分。我意识到目录格式以二进制格式输出,但我希望这是可识别的这一事实意味着有一种方法可以返回并修复该错误。
^@^F^@^@^@public^A^A^@^@^@^@^H^@^@^@postgres^@^E^@^@^@false^@^C^@^@^@173^A^A^@^@^@^@ ^@^@^@10393.dat^@W<^@^@^@^A^@^@^@^@^A^@^@^@0^@^E^@^@^@26106^@^N^@^@^@search_name_66^@
^@^@^@TABLE DATA^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@]^@^@^@COPY search_name_66 (place_id, search_rank, address_rank, name_vector, centroid) FROM stdin;
Run Code Online (Sandbox Code Playgroud)
pg_restore 报告的实际错误:
pg_restore: [archiver (db)] Error from TOC …Run Code Online (Sandbox Code Playgroud) 我使用BLOBOracle 表中的数据类型来存储图像和文档文件。现在对于 Postgres(9.4.5),我有两个选择,即,BYTEA或OID.
考虑到从 Java 端传递参数(SAVING)如下:
DiskFileItemDeepy file = myFile;
InputStream is = null;
long fileSize = 0;
if (file != null && file.getFileSize() > 0){
is = file.getInputStream();
fileSize = file.getFileSize();
call.setBinaryStream(1, (InputStream)is, (long)fileSize);
}
...
call.execute();
//When retrieve the data use:
java.sql.Blob blob = (Blob) resultSet.getBlob(tableColumnName);
Run Code Online (Sandbox Code Playgroud)
出于上述目的,哪种 Postgres 数据类型更适合替换BLOB,是BYTEA还是OID?
在 Postgresql 中,当我尝试ALTER TYPE x ADD VALUE y;在自定义数据类型上运行时,我收到一条错误消息,指出PG::Error: ERROR: must be owner of type x.
我知道这可以通过运行来解决,ALTER TYPE x OWNER TO <database owner>但我很好奇的是如何检查此特定数据类型的当前所有者。\dT+ x没有给我关于当前所有者的信息。
如何提取有关自定义数据类型的更多信息,包括当前所有者?
我需要一些帮助来了解如何使用存档的 WAL 文件以及何时可以清理它们。
目前我们有一个主数据库复制到从属数据库,但我们的主数据库服务器经常会因为使用archive_commandbuild up归档的文件而耗尽磁盘空间,我们必须手动删除它们。如果我们必须手动删除旧的存档 WAL 文件,我觉得我们错过了一些东西,因为文件系统磁盘空间不足...
话虽如此,我不确定我对复制过程的了解足以开始删除文件并确信我没有搞砸任何事情。我们的从站是使用由创建的归档文件archive_command还是仅依赖$PG_DATA/pg_xlog目录中的文件来与主站保持一致的状态?
如果是这种情况,并且我们从文档:pg_dump每六个小时做一次我们的主,我是否可以更新我们的备份脚本以清除开始时存在的所有存档文件pg_dump(pg_dump当然一旦完成)?
注意:pg_dump 和 pg_dumpall 不生成文件系统级备份,不能用作连续归档解决方案的一部分。此类转储是合乎逻辑的,并且不包含 WAL 重放所需的足够信息。
我只想确保无论我们如何清理存档文件,我们仍然拥有继续复制所需的内容,并且能够自上次基本备份以来执行 PITR。
我们的存档命令是cp %p /var/lib/postgresql/9.2/archive/%f,这里是我们recovery.conf从奴隶的文件:
standby_mode = 'on'
primary_conninfo = 'host=<ip-address> port=<port> user=rep password=<password> sslmode=require'
trigger_file = '/tmp/postgresql.trigger.5432'
Run Code Online (Sandbox Code Playgroud) 我SELECT ...FOR UPDATE在 Java PreparedStatement 中使用 a 。我可能需要也可能不需要执行更新,具体取决于SELECT.
如果我执行rs.close();或pStmt.close(); 不执行更新,MySQL 会释放锁吗?有没有其他方法可以发布它,还是我必须执行更新?
如果我也使用 Postgres,同样的问题。
不确定它是否重要,但我打算rs.updateRow();用于更新。另外,MySQL 是否支持列级锁定?
基本上,我想在所选行中增加一个计数器,但前提是该行的状态列是ACTIVE。如果它不是ACTIVE,那么我只想在没有更新的情况下释放锁,以便其他线程/进程可以读/写该行。
有一个返回数组的函数,在查询中我们使用该函数返回结果,例如:
{"TUNDUMA GOING (BORDER)","ARRIVAL DATE",09/01/2016,22,"AT CHECKPOINT"}
{"TUNDUMA RETURN (BORDER)","DEPARTURE DATE",29/01/2016,2,"ON THE ROAD"}
Run Code Online (Sandbox Code Playgroud)
我们如何添加一个WHERE子句,该子句将仅通过搜索ON THE ROAD值的数组的第 5 列进行过滤?
有没有办法参考array[4]?
试过
where trip_status(tlid) <@ array['AT CHECKPOINT']::varchar
Run Code Online (Sandbox Code Playgroud)
同trip_status()是一个返回数组的功能,但我发现了以下错误:
Run Code Online (Sandbox Code Playgroud)Query failed: ERROR: operator does not exist: character varying[] <@ character varying LINE 6: ...ere trip_closed(tlid)=false and trip_status(tlid) <@ array[ ... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
类似的东西where trip_status(tlid)[4] = 'AT CHECKPOINT'存在吗?
postgresql ×10
array ×1
autovacuum ×1
blob ×1
datatypes ×1
functions ×1
index ×1
locking ×1
migration ×1
mysql ×1
oracle ×1
performance ×1
permissions ×1
pg-restore ×1
replication ×1
sequence ×1
view ×1
where ×1