我最近读到有关 Percona Server 中的一个设置,称为max_binlog_files
限制 binlog 文件的总数。这正是我所需要的。我binlog_expire_logs_seconds
目前设置为 3 天,99% 的情况下效果都很好。然而,我目前正在进行的项目运行大量查询,并且二进制日志在短短几个小时内就消耗了超过 70GB。在这种情况下,我确实需要限制文件数量。
MySQL 是否有任何本机设置可以实现此目的?限制二进制日志消耗的总磁盘空间的最佳方法是什么?
我最近读到有关 Percona Server 中的一个设置,称为max_binlog_files
限制 binlog 文件的总数。这正是我所需要的。我binlog_expire_logs_seconds
目前设置为 3 天,99% 的情况下效果都很好。然而,我目前正在进行的项目运行大量查询,并且二进制日志在短短几个小时内就消耗了超过 70GB。在这种情况下,我确实需要限制文件数量。
MySQL 是否有任何本机设置可以实现此目的?限制二进制日志消耗的总磁盘空间的最佳方法是什么?
我一直在使用 SQL Server 及其实例类型 - 默认和命名。我的理解一直是,要连接到命名实例,必须指定实例名称。但是,我最近发现,如果将 TCP 端口设置为 1433,我可以连接到命名实例,而无需指定实例名称,也无需设置别名。
我很想知道这是否是预期的行为。我无法找到任何解释或证实此行为的文档。谁能对此提供一些见解?当 TCP 端口设置为 1433 时,是否通常能够在不提供实例名称的情况下连接到命名实例?
我感谢对此事的任何澄清。
提前致谢!
我必须从生产数据库创建 DACPAC。我想通过 Visual Studio 2022(SQL Server 对象资源管理器和“提取 - 数据层应用程序”)来执行此操作。是否可以阻止任何进程/查询或利用更多 CPU/内存来执行此操作?
最近,我的订阅(事务复制)遇到了一些问题,因为每当我尝试向现有出版物添加新订阅时,无论是使用“立即初始化”还是“首次同步”时,我总是遇到导致订阅失败的问题。
当我选择立即初始化时,在点击完成按钮后,我遇到了以下错误:
消息:执行超时已过期。操作完成之前超时时间已过,或者服务器未响应。命令文本:sp_MSreplupdateschema 参数:@object_name = [dbo].[myTableName]
Microsoft.SqlServer.Replication.SnapshotGenerationAgent.InternalRun() 处的 Replication.Snapshot.SqlServerSnapshotProvider.GenerateSnapshot() 处 Microsoft.SqlServer.Replication.AgentCore.Run() (来源:MSSQLServer,错误号:-2)获取帮助:http:// /help/-2 服务器 MyServerName,级别 11,状态 0,过程,第 0 行执行超时已过期。操作完成之前超时时间已过,或者服务器未响应。(来源:MSSQLServer,错误号:-2)获取帮助:http://help/-2 来源:目标站点:消息:等待操作超时堆栈:(来源:,错误号:0)获取帮助:http: //帮助/0 //help/-2 服务器 MyServerName,级别 11,状态 0,过程,第 0 行执行超时已过期。操作完成之前超时时间已过,或者服务器未响应。(来源:MSSQLServer,错误号:-2)获取帮助:http://help/-2 来源:目标站点:消息:等待操作超时堆栈:(来源:,错误号:0)获取帮助:http: //帮助/0 //help/-2 服务器 MyServerName,级别 11,状态 0,过程,第 0 行执行超时已过期。操作完成之前超时时间已过,或者服务器未响应。(来源:MSSQLServer,错误号:-2)获取帮助:http://help/-2 来源:目标站点:消息:等待操作超时堆栈:(来源:,错误号:0)获取帮助:http: //帮助/0
但是,如果我在首次同步时选择“初始化”,则会显示“文章 myTableName 的初始快照尚不可用”的状态。
此外,如果我重新初始化订阅,什么也不会发生
笔记:
我正在使用 SQL Server Standard 2019 Edition、Microsoft SQL Server Management Studio 2019
这也是我的服务器规格:HP Proliant Gen10 +
以及我当前通过任务管理器的系统利用率
互联网上有一些消息来源坚称idle in transaction
连接可能会阻止真空清理死元组,以下是一些示例:
处于空闲事务状态的事务可以持有阻止其他查询的锁。它还可以防止 VACUUM(包括 autovacuum)清理死行,从而导致索引或表膨胀或事务 ID 环绕。
长事务实际上不是问题——如果长事务和许多小变化必须存在,问题就开始了。请记住:长事务可能会导致 VACUUM 无法清除死行。
实际上,有很多,但从我的角度来看,这听起来绝对荒谬:在大多数情况下,事务隔离级别是读已提交,这反过来意味着不需要为此类事务保留死元组,而且,我找到了替代方案关于该主题的意见:
它并不是真正的长期事务,而是长期快照。当然,长时间运行的 select 或 insert 语句可以做到这一点。对于高于读提交的隔离级别,整个事务将保留快照直到其宕机,因此如果某些事务打开了一个可重复读事务,然后在没有提交的情况下休假,那将是一个问题。挂起的准备交易也会(如果您不知道准备交易是什么,那么您可能没有使用它们)。
或Pavel Luzanov 在 Cybertec 博文下的评论:
我相信长事务的示例仅适用于可重复读取(或可序列化)隔离级别。但默认情况下 BEGIN 使用已提交读。因此,在第一个会话中的 SELECT 完成后,VACUUM 将在会话 2 中的后续 UPDATE、DELETE 命令之后删除表中的死行。
@Bill Karwin在他的回答中实际上证实了这一点(谢谢!)
问题是:是否存在“有效”“非虚构”场景时idle in transaction
连接应被视为有害?(我不是在询问隔离级别高于已提交读的事务、事务或连接泄漏、长事务持有锁等)。
由于某些业务原因,我正在运行查询SELECT * FROM table WHERE updated_at > $1 AND user_id = $2;
。
考虑两个事务 A 和 B,它们正在更新表中的行:UPDATE table SET value = $1, updated_at = NOW() WHERE id = $2;
。事务 A 首先开始,因此updated_at
A 的 row 早于 B 的 row updated_at
。然而,由于某种原因,A 放慢了速度,B 先提交了。
如果第一个查询在 A 提交之前运行,则软件将显示 B 的行,但不会显示 A 的行,企业表示这是不可接受的。
这可以通过使用来解决pg_xact_commit_timestamp()
,但是当事务完成而不是提交时返回(这可能适合我的用例)。
另一个解决方案可能是在更新行之前运行事务SELECT FROM table WHERE user_id = $1 FOR UPDATE;
,但这些查询是更大事务的一部分,我认为这会破坏写入性能。
一个简单的解决方案似乎是让事务 B 等待 A 提交。有办法做到这一点吗?
我有下表:
CREATE TABLE transactions
(
id NUMERIC(20, 0) NOT NULL DEFAULT NEXTVAL('transactions_sequence') PARIMARY KEY,
transaction_id VARCHAR(255) DEFAULT NULL NULL,
transaction_amount NUMERIC(10,0) DEFAULT NULL NULL,
customer_name VARCHAR(256) DEFAULT NULL NULL,
transaction_date TIMESTAMP DEFAULT NULL NULL,
CONSTRAINT uq_transactions_transaction_id UNIQUE (transaction_id)
);
CREATE INDEX transactions_transaction_id_idx ON transactions (transaction_id, id);
我想将其分区transaction_date
如下:
CREATE TABLE transactions
(
id NUMERIC(20, 0) NOT NULL DEFAULT NEXTVAL('transactions_sequence'),
transaction_id VARCHAR(255) DEFAULT NULL NULL,
transaction_amount NUMERIC(10,0) DEFAULT NULL NULL,
customer_name VARCHAR(256) DEFAULT NULL NULL,
transaction_date TIMESTAMP DEFAULT NULL NULL,
CONSTRAINT transactions_pkey PRIMARY KEY (id, transaction_date),
CONSTRAINT uq_transactions_transaction_id UNIQUE (transaction_id, transaction_date)
) PARTITION BY RANGE (transaction_date);
CREATE INDEX transactions_transaction_id_idx ON transactions (transaction_id, id);
这种分区transaction_id
并不是真正唯一的,而是每个分区唯一的,因为唯一键必须具有分区键,即transaction_date
。
使用此表的应用程序不知道分区,并使用 23505 SQL 状态执行更新而不是插入。
我每天插入约 30 万行,当前表大小约为 3000 万行。
以下触发器也是如此:
CREATE OR REPLACE FUNCTION transactions_validate() RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
BEGIN
IF EXISTS (SELECT id FROM transactions WHERE transaction_id = NEW.transaction_id AND id <> NEW.id) THEN
RAISE EXCEPTION USING ERRCODE = '23505';
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER transactions_validate_trigger
BEFORE INSERT OR UPDATE
ON transactions
FOR EACH ROW
EXECUTE PROCEDURE transactions_validate();
一个坏主意?它对性能有何影响?
是否有关于在何处安装 SQL Server 二进制文件以进行新 Windows 服务器部署的最佳实践。我看到有些人建议最好将其与操作系统驱动器分开并将其放在自己的驱动器上。我见过其他人将其与操作系统分开,并将其与数据库文件放在同一驱动器上,现在在阅读《在 VMWare vSphere 上构建 Microsoft SQL Server》时,文档中写道:
SQL Server 二进制文件应安装在操作系统 VMDK 中。SQL Server,即使选择另一个驱动器进行二进制安装,仍然会在操作系统驱动器上安装东西,因此在其他地方安装没有实际意义
我需要在各自的驱动器上设置数据库、事务日志、tempdb 和备份以及这些建议的原因,但是我不能 100% 确定关于安装 SQL Server 二进制文件的位置及其原因的最佳实践建议,特别是因为我看到了来自可信来源的各种建议。
对于我们的应用程序,这将是 vmware 上的虚拟化服务器。
我们有一个本地托管的第三方 SQL Server ERP 数据库,我已经使用了一段时间了。
对于我们的一份 KPI 报告,我们需要历史数据。此数据不是由任何地方的 ERP 数据库生成的。
现在,我们将日期序列松散地存储在每个受影响项目的纯文本“注释”字段中,但这由于多种原因而存在问题,我相信您可以立即想象其中的一些原因。
我想将这些数据正确存储在表中。一种选择是在我们的 Access DB 中创建一个表,但这样做会变成一团混乱,只会让事情变得更加困难。
所以我的问题是:我可以直接安全地将表添加到此 ERP 数据库中,并使用触发器维护新添加的内容,还是数据库中通常会存在某种垃圾收集/维护例程,从而使此操作变得不安全?我的数据库管理员很少。经验,所以我不知道如果我这样做可能会出现任何问题或其他任何问题。
非常感谢