GVKun编程网logo

PostgreSQL 错误:由于与恢复冲突而取消语句

11

在本文中,我们将为您详细介绍PostgreSQL错误:由于与恢复冲突而取消语句的相关知识,此外,我们还会提供一些关于centos7下源码编译安装php支持PostgreSQLpostgresql手册p

在本文中,我们将为您详细介绍PostgreSQL 错误:由于与恢复冲突而取消语句的相关知识,此外,我们还会提供一些关于centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教、java – postgresql错误:由于用户请求取消声明、mysql+postgresql备份与恢复、org.postgresql.util.PSQLException:错误:由于事务之间的读/写依赖性,无法序列化访问的有用信息。

本文目录一览:

PostgreSQL 错误:由于与恢复冲突而取消语句

PostgreSQL 错误:由于与恢复冲突而取消语句

在待机模式下在 PostgreSQL 数据库上运行查询时出现以下错误。导致错误的查询可以正常工作 1 个月,但是当您查询超过 1 个月时会出现错误。

ERROR: canceling statement due to conflict with recoveryDetail: User query might have needed to see row versions that must be removed

有关如何解决的任何建议?谢谢

答案1

小编典典

在热备服务器上运行查询有点棘手——它可能会失败,因为在查询期间,可能会在主服务器上更新或删除一些需要的行。由于主节点不知道查询是在辅助节点上启动的,因此它认为它可以清理(清理)其行的旧版本。然后辅助必须重播此清理,并且必须强制取消所有可以使用这些行的查询。

更长的查询将更频繁地被取消。

您可以通过在主节点上启动可重复的读取事务来解决此问题,该事务执行虚拟查询,然后在辅助节点上运行真正的查询时处于空闲状态。它的存在将防止清理主节点上的旧行版本。

有关此主题和其他解决方法的更多信息,请参阅文档中的Hot Standby -
处理查询冲突部分。

centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教

centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教

1. 下载源码

$ mkdir /usr/downloads
$ wget -c http://cn2.php.net/distributions/php-5.6.20.tar.gz
$ tar -xvf php-5.6.20.tar.gz
$ mv php-5.6.20 /usr/local/src
$ cd !$ & cd php-5.6.20
登录后复制

2. 阅读安装指导

$ ls -also
$ less README
$ less INSTALL
登录后复制

3. 安装依赖包

$ yum install apr apr-util apr-devel apr-util-devel prce lynx
登录后复制

4. 安装httpd

$ wget -c http://apache.fayea.com//httpd/httpd-2.4.20.tar.gz
$ tar -xvf httpd-2.4.20.tar.gz
$ cd httpd-2.4.20
$ ./configure \
--prefix=/usr/local/programs/apache2 \
--enable-rewrite \
--enable-so \
--enable-headers \
--enable-expires \
--with-mpm=worker \
--enable-modules=most \
--enable-deflate \
--enable-module=shared
$ make
$ make install
$ cd /usr/local/programs/apache2
$ cp bin/apachectl /etc/init.d/httpd ## 复制启动脚本
$ /etc/init.d/httpd start ## 启动apache服务器,访问http://localhost/
$ egrep -v ''^[ ]*#|^$'' /usr/local/apache2/conf/httpd.conf | nl ## 查看apache服务器的配置
## 将apache加入系统服务
vi /etc/rc.d/rc.local
```
/usr/local/programs/apache2/bin/apachectl start
```
$ cat /etc/rc.local
登录后复制

4. 安装postgresql

立即学习“PHP免费学习笔记(深入)”;

$ yum install readline-devel  ## 安装readline依赖
$ cd /usr/downloads
$ wget -c https://ftp.postgresql.org/pub/source/v9.5.0/postgresql-9.5.0.tar.bz2
$ tar -xvf postgresql-9.5.0.tar.bz2
$ cd postgresql-9.5.0
$ ./configure --prefix=/usr/local/programs/postgresql
$ make
$ su
$ make install
$ /sbin/ldconfig /usr/local/programs/postgresql/lib ## 刷新下共享动态库
$ cd /usr/local/programs/postgresql
$ bin/psql --version  ## 检查运行情况
## 开始对postgresql的配置
$ vi /etc/profile.d/postgresql.sh ## 增加环境变量,不推荐直接在/etc/profile中添加,系统更新升级时会需要merge
``` 
PATH=/usr/local/programs/postgresql:$PATH
export PATH
```
$ source /etc/profile ## 更新环境变量

## 增加用户和其他文件夹
$ adduser postgres
$ passwd postgres 
$ mkdir /usr/local/programs/postgresql/logs
$ mkdir /usr/local/programs/postgresql/data
$ chown postgres /usr/local/programs/postgresql/data
$ su - postgres

## 初始化数据库
$ ./bin/initdb -D ./data
$ ./bin/createdb test
$ ./bin/psql test
## 已有数据库,可导入data文件夹后尝试root访问,假如带密码,可能需要进一步研究下
$ ./bin/postgres -D ./data >./logs/start-log-1.log 2>&1 &
$ ./bin/psql --list  ##列出数据库
## ok,安装完成

## 自定义设置,权限控制等,可以跳过,等熟悉使用后再做
## 编辑数据库配置及权限文件:
$ vi /usr/local/programs/postgresql/data/postgresql.conf   ## 数据库配置文件
$ chown postgres postgresql.conf
$ chmod 644 postgresql.conf
$ vi /usr/local/programs/postgresql/data/pg_hba.conf   ## 权限文件
$ vi /usr/local/programs/postgresql/data/pg_ident.conf

## 设置开机自启动:
$ vi /etc/rc.d/rc.local    ## 添加如下内容
```
/usr/local/programs/postgresql/bin/postgresql start
```
登录后复制

5. 安装php

## 源码已经在第一步中下载,现在开始安装:
$ yum install libxml2 libxml2-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel
$ ./configure \
--prefix=/usr/local/programs/php \
--with-apxs2=/usr/local/programs/apache2/bin/apxs \
--with-zlib \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-zlib-dir \
--enable-mbstring \
--with-pgsql=/usr/local/programs/postgresql \
--with-pdo-pgsql=/usr/local/programs/postgresql 
$ make
$ make test
> Bug #42718 (unsafe_raw filter not applied when configured as default filter) [ext/filter/tests/bug42718.phpt]  XFAIL REASON: FILTER_UNSAFE_RAW not applied when configured as default filter, even with flags
> Bug #67296 (filter_input doesn''t validate variables) [ext/filter/tests/bug49184.phpt]  XFAIL REASON: See Bug #49184
> Bug #53640 (XBM images require width to be multiple of 8) [ext/gd/tests/bug53640.phpt]  XFAIL REASON: Padding is not implemented yet
> zend multibyte (7) [ext/mbstring/tests/zend_multibyte-07.phpt]  XFAIL REASON: https://bugs.php.net/bug.php?id=66582
> zend multibyte (9) [ext/mbstring/tests/zend_multibyte-09.phpt]  XFAIL REASON: https://bugs.php.net/bug.php?id=66582
>Bug #70470 (Built-in server truncates headers spanning over TCP packets) [sapi/cli/tests/bug70470.phpt]  XFAIL REASON: bug is not fixed yet

## 查阅官方的bug,发现:
> id=66582: status : Closed. Fixed in master (PHP7)
> id=42718: status : Assigned
> id=42718: reference to id=49184, unsolved for many years
## 那就不关心了,直接装吧
$ make install
> You may want to add: /usr/local/programs/php/lib/php to your php.ini include_path

## 那就按它说的设置吧
$ cp php.ini-development /usr/local/programs/php/lib/php.ini
```
include_path = ".;/usr/local/programs/php/lib/php"

## 然后,编辑httpd的设置,确保其能正确解析php文件
```
...
LoadModule php5_module modules/libphp5.so
...
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .php5

...
<ifmodule dir_module>
    DirectoryIndex index.html index.php
</ifmodule>     
```

## 重启httpd,测试
$ cd /usr/local/programs/apache2
$ bin/httpd -h
$ bin/httpd -k stop
$ bin/httpd -f conf/httpd.conf
## 默认设置的www页面在./htdocs/下,那就先去里面建一个测试页面吧
$ vi htdocs/index.php
```
<?php phpinfo(); ?>
```
$ curl http://localhost/index.php |grep postgresql
#ok
登录后复制

后续应该做的事

* 1. 启动时,不需要要手动指定配置文件
* 2. php初始化www目录设置
* 3. php 用户、权限管理等

'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了centos 7下源码编译安装php支持PostgreSQL,包括了postgresql,centos 7方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

java – postgresql错误:由于用户请求取消声明

java – postgresql错误:由于用户请求取消声明

什么原因导致 postgresql中的这个错误?
org.postgresql.util.PsqlException: ERROR: canceling statement due to user request

我的软件版本:

Postgresql 9.1.6 on x86_64-redhat-linux-gnu,由gcc(GCC)4.7.2 20120921(Red Hat 4.7.2-2)64位编译.

我的postgresql驱动程序是:postgresql-9.2-1000.jdbc4.jar

使用java版本:Java 1.7

线索:我的postgresql数据库是在一个固态硬盘驱动器,这个错误发生随机,有时甚至根本没有.

解决方法

我们已经弄清了这个问题的原因.它是通过在最新的JDBC驱动程序9.2-100x中执行setQueryTimeout()来解释的.如果您手动打开/关闭连接可能不会发生,但是通常会在连接池到位并且autocommit设置为false时发生.在这种情况下,setQueryTimeout()应该调用非零值(例如,使用Spring框架@Transactional(timeout = xxx)注释).

事实证明,在语句执行期间发生sql异常时,取消定时器尚未被取消并保持活动(这就是它的实现方式).因为池,连接后面没有关闭,而是返回到池.
之后,当取消定时器触发时,它随机取消当前与该定时器相关联的连接的查询.在这一刻,这是一个完全不同的查询,解释了随机效应.

建议的解决方法是放弃setQueryTimeout()并使用Postgresql配置(statement_timeout).它不提供相同的灵活性,但至少总是有效.

mysql+postgresql备份与恢复

mysql+postgresql备份与恢复

mysql备份一个库, mysqldump  -u用户名 -p密码 [选项] [数据库名] > /备份路径/备份文件名

mysqldump -uuser -p123123 auth > /path/auth-$(date +%Y%m%d).sql

备份多个库  mysqldump  -u用户名 -p密码 [选项]  数据库名1 [数据库名2] > /备份路径/备份文件名

mysqldump -uuser -p123123 --databases auth mysql > /path/auth+msyql-$(date +%Y%m%d).sql

备份整个库  mysqldump  -u用户名 -p密码 [选项]   --opt --all-databases   > /备份路径/备份文件名,--opt加快备份速度

mysqldump -uuser -p123123 --opt --all-databases  > /path/mysql_all-$(date +%Y%m%d).sql

备份表  mysqldump  -u用户名 -p密码 [选项]  数据库名 表明 > /备份路径/备份文件名

mysqldump -uuser -p123123  mysql user > /path/msyql_user-$(date +%Y%m%d).sql

备份表结构  mysqldump  -u用户名 -p密码 [选项]  -d 数据库名 表明 > /备份路径/备份文件名

mysqldump -uuser -p123123  -d mysql user > /pathdesc_/msyql_user-$(date +%Y%m%d).sql

mysql 恢复

1、进入数据库 source /path/backup.sql

2、mysql -uuser -p123123 库名 < /path/backup.sql

mysql 增量恢复,

从日志开头截止到某个时间点的恢复:

mysqlbinlog [--no-defaults] --stop-datetime=''年-月-日  小时:分钟:秒‘  二进制日志文件名 | mysql  -uuser -p123123

从某个时间点到日志结尾的恢复:

mysqlbinlog [--no-defaults] --start-datetime=''年-月-日  小时:分钟:秒‘  二进制日志文件名 | mysql  -uuser -p123123

从某个时间点到某个时间点的恢复:

mysqlbinlog [--no-defaults] --start-datetime=''年-月-日  小时:分钟:秒‘  --stop-datetime=''年-月-日  小时:分钟:秒‘    二进制日志文件名 | mysql  -uuser -p123123

基于位置的恢复,at 1624266

mysqlbinlog --stop-position=''1624266''  二进制日志文件名 | mysql  -uuser -p123123

mysqlbinlog --start-position=''1624266''  二进制日志文件名 | mysql  -uuser -p123123

postgresql 备份 一个库

/test/postgresql_bak9.4.5/bin/pg_dump -U chanzorpsql chanzordb -p 5432 > /path/backup.sql

备份库中的某个表

/test/postgresql_bak9.4.5/bin/pg_dump -U chanzorpsql backup -p 5432 -t 表名 >  /path/backup.sql

/test/postgresql_bak9.4.5/bin/pg_dump -U chanzorpsql backup -p 5432 -t 表名 -f  /path/backup.sql

postgresql恢复

/test/postgresql_bak9.4.5/bin/psql -U chanzorpsql backup  <  /path/backup.sql

 

org.postgresql.util.PSQLException:错误:由于事务之间的读/写依赖性,无法序列化访问

org.postgresql.util.PSQLException:错误:由于事务之间的读/写依赖性,无法序列化访问

更新:我最终设法在最小的设置中重现这个,我发布了 separate question.

从同一个Postgresql实例和表并行运行的两个不同应用程序进行JDBC插入时,我遇到了以下异常:

org.postgresql.util.PsqlException: ERROR: Could not serialize access due to read/write dependencies among transactions
 [java] ERROR>  Detail: Reason code: Canceled on identification as a pivot,during write.
 [java] ERROR>  Hint: The transaction might succeed if retried.

尝试执行以下语句时发生异常:

public int logRepositoryOperationStart(String repoIvoid,MetadataPrefix prefix,RepositoryOperation operation,int pid,String command,String from_XMLGregCal) throws sqlException {
    Connection        conn = null;
    PreparedStatement ps   = null;
    try {
        conn = getConnection();
        conn.commit();
        String sql = "INSERT INTO vo_business.repositoryoperation(ivoid,Metadataprefix,operation,i,pid,command,from_xmlgregcal,start_sse)  "+
                     "(SELECT ?,?,COALESCE(MAX(i)+1,0),? FROM vo_business.repositoryoperation                                      "+
                     "WHERE ivoid=? AND Metadataprefix=? AND operation=?)                                                                         ";
        ps = conn.prepareStatement(sql);
        ps.setString(1,repoIvoid);
        ps.setString(2,prefix.value());
        ps.setString(3,operation.value());
        ps.setInt   (4,pid);
        ps.setString(5,command);
        ps.setString(6,from_XMLGregCal);
        ps.setInt   (7,Util.castToIntWithChecks(TimeUnit.SECONDS.convert(System.currentTimeMillis(),TimeUnit.MILLISECONDS)));
        ps.setString(8,repoIvoid);
        ps.setString(9,prefix.value());
        ps.setString(10,operation.value());
        if (ps.executeUpdate() != 1) { // line 217
            conn.rollback();
            throw new RuntimeException();
        }
        conn.commit();
        return getMaxI(conn,repoIvoid,prefix,operation);
    } catch (sqlException e) {
        conn.rollback();
        throw e;
    } finally {
        dbutils.closeQuietly(conn,ps,(ResultSet) null);
    }

}

..在线上标有217线.我在最后提供了实际的堆栈跟踪.

在conConnection()的实现中,Connection conn对象的事务隔离级别设置为SERIALIZABLE:

protected Connection getConnection() throws sqlException {
    Connection conn = ds.getConnection();
    conn.setAutoCommit(false);
    conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
    return conn;
}

很可能另一个应用程序也试图同时在同一个表上写,虽然它确实提供了一个不同的操作字段,所以我看不出有任何混淆可能发生.而且,这是一个单一的原子插入,所以我看不到访问序列化是如何发挥作用的.

这是什么样的错误,我应该如何解决此问题?我应该查看事务隔离级别,整个表与行特定的锁(如果Postgresql中有这样的概念),等等?我应该重试(提示说“如果重试,交易可能会成功.”).我将尝试在SSCCE中重现它,但我只是发布它,以防它有明显的原因/解决方案

[java] ERROR>org.postgresql.util.PsqlException: ERROR: Could not serialize access due to read/write dependencies among transactions
 [java] ERROR>  Detail: Reason code: Canceled on identification as a pivot,during write.
 [java] ERROR>  Hint: The transaction might succeed if retried.
 [java] ERROR>  at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
 [java] ERROR>  at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
 [java] ERROR>  at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
 [java] ERROR>  at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
 [java] ERROR>  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
 [java] ERROR>  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
 [java] ERROR>  at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
 [java] ERROR>  at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
 [java] ERROR>  at _int.esa.esavo.dbbusiness.DBBusiness.logRepositoryOperationStart(DBBusiness.java:217)
 [java] ERROR>  at _int.esa.esavo.harvesting.H.main(H.java:278)
每当您请求SERIALIZABLE隔离时,DB将尝试使并发查询集看起来按照它们生成的结果进行串行执行.这并非总是可行的,例如当两个交易具有相互依赖性时.在这种情况下,Postgresql将中止其中一个带有序列化失败错误的事务,告诉您应该重试它.

使用SERIALIZABLE的代码必须始终准备好重新尝试事务.它必须检查sqlSTATE,并且对于序列化失败,重复该事务.

见the transaction isolation documentation.

在这种情况下,我认为你的主要误解可能是:

this is a single atomic insert

因为它不是那种,它是一个INSERT … SELECT,它接触vo_business.repositoryoperation进行读写.这足以与另一个执行相同操作的事务创建潜在依赖关系,或者以另一种方式读取和写入表.

另外,出于效率原因,可序列化隔离代码在某些情况下可以去生成保持块级依赖性信息.因此,它可能不一定是触及相同行的事务,只是相同的存储块,尤其是在负载下.

如果不确定它是否安全,Postgresql更愿意中止可序列化的事务.证明系统有局限性.所以你也有可能找到一个愚弄它的案例.

要确定我需要并排查看这两个事务,但这里有一个证明插入的证明… select可以与它自己发生冲突.打开三个psql会话并运行:

session0: CREATE TABLE serialdemo(x integer,y integer);

session0: LOCK TABLE serialdemo IN ACCESS EXCLUSIVE MODE;

session1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;

session2: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;

session1: INSERT INTO serialdemo (x,y)
          SELECT 1,2
          WHERE NOT EXISTS (SELECT 1 FROM serialdemo WHERE x = 1);

session2: INSERT INTO serialdemo (x,2
          WHERE NOT EXISTS (SELECT 1 FROM serialdemo WHERE x = 1);

session0: ROLLBACK;

session1: COMMIT;

session2: COMMIT;

session1将提交正常. session2将失败:

ERROR:  Could not serialize access due to read/write dependencies among transactions
DETAIL:  Reason code: Canceled on identification as a pivot,during commit attempt.
HINT:  The transaction might succeed if retried.

它与您的情况不同,序列化失败并不能证明您的语句可能相互冲突,但它表明插入… select不像您想象的那样原子.

我们今天的关于PostgreSQL 错误:由于与恢复冲突而取消语句的分享已经告一段落,感谢您的关注,如果您想了解更多关于centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教、java – postgresql错误:由于用户请求取消声明、mysql+postgresql备份与恢复、org.postgresql.util.PSQLException:错误:由于事务之间的读/写依赖性,无法序列化访问的相关信息,请在本站查询。

本文标签: