有没有办法禁用查询中使用的参数值的日志记录,同时仍然记录实际查询本身?
我想设置log_min_duration_statement = 0为与 pgBadger 一起使用。每个查询我得到两行,例如:
LOG: Select * from table where id = $1
DETAIL: parameters: $1 = 55
Run Code Online (Sandbox Code Playgroud)
我真的很想压制 DETAIL行,因为它我的日志膨胀并保存敏感信息。
是否可以从 Postgres 中禁用它?
我之前曾在 SQL Server 环境中工作过,其中日志记录是我们存储过程的一部分,用于捕获执行开始/结束、参数值和错误消息,我发现这非常有用,并且是我希望在新环境中引入的内容。
用于此日志记录的表如下所示,使用语句将参数捕获INSERT到表中,并将 with 值隐式转换为NVARCHAR。
CREATE TABLE dbo.Execution
(
Id INT IDENTITY(1,1) NOT NULL
, SchemaName NVARCHAR(128) NOT NULL
, ProcedureName NVARCHAR(128) NOT NULL
, ExecutionStart DATETIME NOT NULL
, ExecutionEnd DATETIME NULL
, ExecutionFailed BIT NOT NULL
)
CREATE TABLE dbo.ExecutionError
(
Id INT IDENTITY(1,1) NOT NULL
, ExecutionId INT NOT NULL
, CustomErrorMessage NVARCHAR(8000) NULL
, SqlErrorMessage NVARCHAR(8000) NULL
)
CREATE TABLE dbo.ExecutionParameter
(
Id INT IDENTITY(1,1) NOT NULL
, ExecutionId INT …Run Code Online (Sandbox Code Playgroud) 我曾经在一家拥有第三方数据仓库解决方案的公司工作。显然所有的对象和表都隐藏在支持数据库中,所以我不清楚某些存储过程中究竟发生了什么。我在那里看到了这个有趣的存储过程,并想在我自己的解决方案中复制它,但我无法理解它是如何工作的。我正在描述下面的存储过程,如果有人能给我一些关于如何实现这一点的想法,这将非常有帮助。如果你能建议我如何使这更好,那就更好了。
存储过程被称为进程日志。它有 DBID、ObjectId、Step、Status、Remarks、Reads、Inserts、Updates、Delete 等参数
我们要做的是,在每个存储过程中,我们必须执行这个存储过程,状态为 2(进行中)在增加值后,在每个步骤或部分结束时可以多次执行这个存储过程的过程的可变步长。根据插入更新选择和删除语句的行数,我们应该在各自的存储过程参数变量中记录值。最后,您可以执行状态为 3(已完成)的相同存储过程,或者如果该过程在 catch 块中结束,状态将为 4(失败)在备注部分,我们可以复制 SQL 的错误消息。
为了查看所有这些信息,我们获得了一份报告的访问权限,显然我没有源代码,但报告显示了存储过程完成的时间,状态是多少插入更新删除和读取它做过。如果失败,错误信息是什么?
我已经有一些改进存储的想法,谁开始的?,参数的值是多少?对于谁开始存储过程部分,我有一个困惑。大多数这些存储过程作为不同作业的一部分运行。我们所有的作业都以服务帐户用户身份运行,但作业由不同的用户手动启动。我需要找出哪个用户启动了它,作为内部存储过程,作为当前用户,它将始终显示服务帐户。同样对于参数值,是否有更好的动态方法来找出这一点?而不是手动设置变量的值。我想使用 INPUTBUFFER 的输出,但它只显示参数的名称而不是值。
如果有人可以指导我有关此审计 SP 的后端表结构和脚本,那将非常有帮助。也欢迎任何更多的改进想法。
我的主要困惑:我相信他们有一些存储这些存储过程值的表,如果 SP 已经在运行,他们会在记录中进行更新,然后进行插入,但是他们如何识别在场景中进行插入而不是更新其中存储过程严重失败并且未执行 catch 块。
audit stored-procedures architecture sql-server-2014 logging
我必须使用 SQL Server Management Studio 2012 管理 SQL Server 2008 数据库。数据库文件大约为 290Gb。我们遇到的问题是日志文件过去增长了很多。
做了一些互联网研究(我对数据库管理完全陌生),我得出了以下结论,并应用了所有这些结论:
这个配置似乎工作正常。我一直在监视日志大小的行为,它从不需要自动增长;当日志文件的保留空间即将满时,计划备份将再次释放它。11 小时后,日志大小仅增加到 260MB,我认为还可以(11 小时内自动增长 4x10Mb)。
所以我回家了,相信这种行为会持续到晚上。但是第二天,我看到已经进行了几次自动生长。日志大小从 220 Mb 增加到 2350 Mb(超过 200 次自动增长!)。
我决定不改变任何东西,并继续监控它;日志文件的已用空间从未增长超过 18%。我将自动增长大小从 10 Mb 增加到 50 Mb。
同样,我非常有信心这种配置将防止发生自动增长。再一次,我错了。今天早上我发现已经执行了一个新的自动生长过程。只有一次,但它仍然让我感到困惑。
我注意到最后一次自动增长操作发生在执行完整数据库备份之后。
如果这种行为是正常的,请任何人解释我吗?为什么日志大小整天保持稳定,数据库备份后突然变大?为什么它会增长,而日志文件的保留空间只有 20% 在高峰时间使用,就在日志备份之前?有什么推荐吗?
我正在尝试运行一个脚本,该脚本一次将超过 2000 万条记录批量插入到 10,000 条表中。在运行开始时,它似乎工作正常。尽管一旦插入了大量记录(270,000),脚本的完成速度就开始变慢了。插入另外 30,000 条记录需要 23 小时。我最好的猜测是,随着新记录数量的增加,脚本检查新记录是否已经存在的部分需要更长的时间。我已经创建了脚本中使用的表的索引,但我需要为这个脚本缩短运行时间。任何帮助将非常感激。我的脚本如下。
CREATE NONCLUSTERED INDEX [plan2TMP] ON [dbo].[plan2]
(
[l_dr_plan1] ASC
)
INCLUDE
(
l_address,
l_provider
)ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [nameTMP] ON [dbo].[name]
(
[dr_id],
[nationalid]
)ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [plan1TMP] ON [dbo].[plan1]
(
[dr_id],
[cmt]
)ON [PRIMARY]
GO
DECLARE @BatchSize int = 10000
WHILE 1 = 1
BEGIN
INSERT INTO plan2(
l_dr_plan1
, l_address
, l_provider
)
SELECT TOP (@BatchSize)
dr1.link
,ad1.link
,dr.link
from plan1 dr1
INNER JOIN …Run Code Online (Sandbox Code Playgroud) 这些是我的设置:
根据文档,据我所知,这种设置组合以及statement_timeout值 3600000应该意味着长达一小时的查询超时,并且在此之前,它们和任何其他超过 ~214ms 的内容都应该产生 EXPLAIN 输出在日志中。但他们不是。
shared_preload_libraries当我检查时已经auto_explain默认包含。canceling statement due to statement timeout(仅在我设置后才开始发生statement_timeout),但日志中没有任何内容(根本没有,更不用说在报告的时间附近)显示除 xlog 启动和停止之外的任何内容。还可能缺少什么?
我实际上有两个问题:
如果您设置一个带有加密列的表并将其复制到另一台服务器,另一台服务器是否必须具有相同的主密钥和对称密钥,还是自动复制?
复制活动记录在哪里?- 是在windows 事件查看器里面吗?
logging ×7
sql-server ×4
postgresql ×2
amazon-rds ×1
architecture ×1
audit ×1
aws ×1
insert ×1
parameter ×1
performance ×1
replication ×1