我的组织正计划采用 SQL Server 2012 可用性组,我正在尝试了解它将对我们的应用程序升级过程产生什么影响(如果有)。
我们每 8 周发布一次应用程序更新,任何发布都可能包括架构更改和/或数据迁移。
我想了解的是 HA/DR 解决方案是否透明地处理架构更改(新列、索引被添加到辅助节点),或者是否需要手动干预在每个实例上创建架构然后重新打开 Always On。
我假设的数据迁移部分是透明处理的,但也想确认一下。
我想我也做了一个笼统的假设,即基于可用性组配置的这些行为没有区别,这也可能是错误的。请告诉我。
简而言之; 在我的应用程序的任何给定版本中,我可能会通过向其中添加列来更改非常大的表(数百万条记录的数十到数百条记录)。某些列可能是“全新的”,因此它们可以使用 Enterprise Online 架构更改功能。其他列可能是现有列的重构(全名被拆分为名字和姓氏),并且将为表中的每一行运行迁移以填充这些字段。这些行为中的任何一个是否需要 DBA 更改 AlwaysOn 配置,或者这是默认处理的,并且所有辅助节点都“免费”获得 DDL 和 DML 语句?
感谢您提供的任何清晰度。
schema sql-server sql-server-2012 high-availability availability-groups
我在这里和那里阅读了许多关于如何配置 tempdb 数据文件的博客,但我没有找到有关tempdb 日志文件的任何信息。
这是我目前在 tempdb 中使用的策略:
但就像我说的,没有人在谈论tempdb 日志文件。我该怎么办?在我的设置中,此文件与 tempdb 数据文件位于同一位置。我应该与 tempdb 日志文件一起使用的大小和自动增长值是多少?
我们有 SQL Server 2008 R2 合并复制设置。
最近我开始遇到一些表的冲突,当我检查冲突查看器时,我可以看到获胜者和失败者列的值是相同的!
我确信只有一位订阅者输入了这些数据。
我曾经sp_showrowreplicainfo获得有关冲突行的更多详细信息,我得到了 2 行:一个用于发布者,另一行用于订阅者,两行的“版本”均为 1。
我还实现了 Brandon 的方法:Auditing changes in Merge Replication,但它只显示正常插入!
你能告诉我如何开始解决这种冲突吗?
考虑以下查询:
MERGE [Parameter] with (rowlock) AS target
USING (SELECT @AreaId, @ParameterTypeId, @Value)
AS source (AreaId, ParameterTypeId, Value)
ON (target.AreaId = source.AreaId AND
target.ParameterTypeId = source.ParameterTypeId)
WHEN MATCHED THEN
UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
WHEN NOT MATCHED THEN
INSERT ([AreaId], [ParameterTypeId], [Value])
VALUES (source.AreaId, source.ParameterTypeId, source.Value);
Run Code Online (Sandbox Code Playgroud)
统计 I/O 提供以下输出:
表“参数类型”。扫描计数 0,逻辑读取 2,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
表 'Area'。扫描计数 0,逻辑读取 2,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
表“参数”。扫描计数 1,逻辑读取 4,物理读取 0,预读读取 0,lob 逻辑读取 …
有几个博客声称将 SSIS 转换分为阻塞(异步)、非阻塞(同步)和部分阻塞(异步)。
在查看特定问题时:多播是同步(非阻塞)还是异步(部分阻塞)?
一个资源声称异步:“多播是一种异步(也称为部分阻塞)转换”来源:http : //social.technet.microsoft.com/wiki/contents/articles/7392.ssis-multicast-transformation.aspx
另一个同步:https ://jorgklein.com/2009/04/14/ssis-lookup-is-case-sensitive/
其他资源声称 DQS Cleansing 转换是一种非阻塞转换,但在我看来它是部分阻塞的。
请不要使用按类型分类的转换列表的链接来回答。这个问题的答案有望采用更严格的方法来证明正确答案。
由于部分阻塞和阻塞转换会将数据移动到新的缓冲区,而不是在缓冲区上操作的非阻塞,我怀疑解决方案是在转换执行期间观察缓冲区的创建,但我不确定(a ) 如果这会产生明确的答案和 (b) 如何做到这一点。
我相信非阻塞转换不会导致新的执行树开始,因此答案可能在于记录 PipelineExectionTrees 和 PipelineExecutionPlan。这可以区分同步和异步,但不能区分部分阻塞和完全阻塞。
当我这样做时,dbcc show_statistics ('Reports_Documents', PK_Reports_Documents)我会得到报告 ID 18698 的以下结果:

对于此查询:
SELECT *
FROM Reports_Documents
WHERE ReportID = 18698 option (recompile)
Run Code Online (Sandbox Code Playgroud)
我得到一个查询计划,PK_Reports_Documents按预期进行聚集索引搜索。
但让我感到困惑的是估计行数的错误值:

根据这个:
当示例查询 WHERE 子句值等于直方图 RANGE_HI_KEY 值时,SQL Server 将使用直方图中的 EQ_ROWS 列来确定等于的行数
这也是我所期望的方式,但在现实生活中似乎并非如此。我还尝试RANGE_HI_KEY了由提供的直方图中存在的一些其他值,show_statistics并经历了相同的情况。在我的情况下,这个问题似乎导致某些查询使用非常不理想的执行计划,导致执行时间为几分钟,而我可以通过查询提示在 1 秒内运行它。
总而言之:有人可以解释一下为什么EQ_ROWS直方图没有用于估计的行数,不正确的估计来自哪里?
更多(可能有用)信息:
PK_Reports_Documents是一个组合PK,由ReportID INT和DocumentID CHAR(8)该查询似乎总共加载了 5 个不同的统计对象,所有这些对象都包含ReportID表中的 + 一些其他列。它们都已新鲜更新。RANGE_HI_KEY下表中是直方图中的最高上限列值。
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| name | stats_id | auto_created | user_created | Leading column Type …Run Code Online (Sandbox Code Playgroud) 我读过,在 SQL Server 2000 之后,删除了“取消标识”标识列的能力。而且这是“按设计”(不仅仅是缺失的功能)。
这是我在博客上找到的一个例子。它涉及更新系统表。(并且在 SQL Server 2000 之后删除了该功能。)我认为通过系统表执行此操作不是一个好主意。我只是想知道为什么没有以另一种方式执行此操作的功能。
解决这个问题会给我带来大量的工作。(在不容忍停机的环境中将数亿行复制到新表中。)
所以我想我会问“为什么”。
Sql Server 2005 和更高版本中的哪些更改使这成为一件坏事?或者它总是很糟糕,只是没有被锁定?
再次将标识列设为普通列会违反什么“最佳实践”(或类似原则)?
——
更新以回答“我为什么这样做”的请求:
这是一个非常高级的摘要:我将开始向我的表添加分区。(这样我就可以存档/清除旧数据。)这很容易。但我偶尔需要将记录移动到不同的分区,这样它就不会被删除(当一个分区出现进行归档/删除时)。(我的分区列增加了 2,以便始终有空间将行移动到不同的分区。)
但是如果分区列是标识列,那么我必须删除并重新插入值(没有办法更新标识列的值)。这会导致复制问题。
所以我想使用序列而不是标识列。但是这种切换在大型数据库上非常困难。
我们在客户服务器上安装了一个 SQL Server 2008 实例。客户的 IT 部门负责机器的各种备份。
SQL Server 日志显示每天晚上 7 点都有完整备份,但我们找不到在 SQL Server 中安排任何计划的证据。
我们联系的技术人员无法告诉我们是否有某种自动备份,他们只告诉我们整个机器正在备份。
使用我在这个论坛帖子中找到的脚本,我发现物理设备名称是一个 GUID,这意味着这是一个外部备份过程:
USE [msdb]
GO
SELECT
[bs].[database_name],
[bs].[backup_start_date],
[bs].[backup_finish_date],
[bs].Server_name,
[bs].user_name AS [BackupCreator] ,
[bmf].physical_device_name
FROM msdb..backupset bs
INNER JOIN msdb..backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id]
ORDER BY [bs].[backup_start_date] DESC
Run Code Online (Sandbox Code Playgroud)
这是上述查询中的一行:
db_name 2015-09-16 19:01:23.000 2015-09-16 19:01:28.000
SERVER_NAME NT AUTHORITY\SYSTEM
{424F084A-F35D-4A66-8FC7-0722778A859
此外,备份开始和完成日期仅跨越 5 秒,所以我想很明显这不是 sql server 的工作。
这是日志中的一行:
2015-09-03 19:02:30.71 备份
数据库备份。
数据库:db_name,创建日期(时间):2012/10/12(20:52:11),转储页面:3290021,
第一个 LSN:276028:152755:172,最后一个 LSN:276028:152827:1,转储设备数: 1、
设备信息:
(FILE=1, TYPE=VIRTUAL_DEVICE: {'{95380B0A-D50B-408F-B95F-1AB8975BA7F8}5'})。 …
我试图找出是否可以将 tempdb 文件添加到 SQL Server 而不必重新启动 SQL Server 服务。我在数据库管理员上看到了这个答案:
一个答案指出:
添加 - 无需停机。尽管正如 Microsoft 的 Sean 指出的那样,SQL 更喜欢使用填充较低的文件。如果您要从 1 个数据文件开始并添加更多数据,那么 SQL 将使用新的数据文件一段时间,但您的性能不会比只有一个文件差。但是,如果您已经有 2+ 个并再添加一个,那么它会在新的一个上产生热点并降低性能。
但是,评论警告以下几点:
我会在“添加”部分添加一个附录:“添加:不,但你很可能会不平衡,所以你会成为热点,这可能会使事情变得更糟。”
我对该评论有以下问题,但被指示在我自己的一个新问题(这个问题)中提出这些问题,而不是通过该问题答案中的评论来询问评论者。
具体来说:

今天我在 The Heap 上,正在查看我认为可以改进的查询计划。然而,它创造了一些东西,动摇了我对 SQL Server 查询优化器的信念。如果sql-server甚至不能计数到 100%,我还可以信任它吗?
表的特点:
date_entered列有没有人以前见过这个,是什么导致计划看起来如此扭曲?

sql-server ×10
tempdb ×2
backup ×1
identity ×1
optimization ×1
schema ×1
ssis ×1
ssis-2012 ×1
ssms ×1
statistics ×1
t-sql ×1