我正在查询一个外部数据库,它抛出了一个错误:
ERROR: 25006: cannot execute UNLISTEN during recovery我的理解是,每当postgreSQL完成时都会调用它,这表明这是由关闭连接引起的。
对我来说奇怪的是,代码似乎可以打开到数据库的连接,但在尝试关闭连接时出错。此外,这种情况似乎只会偶尔发生,所以这可能是由于数据库本身重新启动造成的吗?
为什么postgreSQL可以打开一个连接,但不能关闭一个连接?
下面是执行的代码,最麻烦的一行是dbConn.Close()
Dim sConnectionString as String = "Server=10.2.21.46;Port=5432;User Id=myuser;Password=mypsw;Database=demos;"
Dim sErrorMessage As String = ""
Dim bConnectionOpen As Boolean = False
Dim dbConn As Npgsql.NpgsqlConnection = New Npgsql.NpgsqlConnection(sConnectionString)
Try
dbConn.Open()
bConnectionOpen = True
Catch
sErrorMessage = "open connection fail."
End Try
If bConnectionOpen Then
Dim cmdTxt As String = sQueryString
Dim cmdTmp As Npgsql.NpgsqlCommand = New Npgsql.NpgsqlCommand(cmdTxt, dbConn)
Dim bReaderOpen As Boolean = False
Dim rsTmp As Npgsql.NpgsqlDataReader
Try
rsTmp = cmdTmp.ExecuteReader()
bReaderOpen = True
Catch
sErrorMessage = "ExecuteReader fail."
End Try
If bReaderOpen Then rsTmp.Close()
rsTmp = Nothing
dbConn.Close()
End If发布于 2013-01-08 18:59:42
根据PostgreSQL源代码here的说法,只有当服务器试图从糟糕的状态或长期失败的事务中执行恢复时(换句话说,它现在感觉不是很好),才会发生此错误。
令人困惑的是,它在本例中使用的是错误代码25006 ERRCODE_READ_ONLY_SQL_TRANSACTION。我认为真正发生的情况是,服务器不想将任何东西写入磁盘以不干扰当前的恢复-这就是为什么它是只读事务。
我想你应该联系那个外部服务器的管理员,让他看一下。简单的服务器重启可能会有所帮助。或者,它可能需要从备份中恢复...
编辑:
也有可能此服务器曾经是/现在是热备用服务器。在热备模式下,即使是只读连接,你也会看到完全相同的行为。来自source code的代码片段
/*
* ... there are a few commands that are allowed
* in "read-only" xacts but cannot be allowed in Hot Standby mode.
* Those commands should call this function.
*/
PreventCommandDuringRecovery(const char *cmdname)
...https://stackoverflow.com/questions/14213076
复制相似问题