SQL Server 2014:
我们有一个非常大(1 亿行)的表,我们需要更新其中的几个字段。
对于日志运输等,我们显然也希望将其保持为一口大小的交易。
如果我们让下面运行一会儿,然后取消/终止查询,那么到目前为止所做的工作会全部提交,还是需要添加明确的 BEGIN TRANSACTION / END TRANSACTION 语句以便我们可以随时取消?
DECLARE @CHUNK_SIZE int
SET @CHUNK_SIZE = 10000
UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
where deleted is null or deletedDate is null
WHILE @@ROWCOUNT > 0
BEGIN
UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
where deleted is null or deletedDate is null
END
Run Code Online (Sandbox Code Playgroud) 我们在客户服务器上安装了一个 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'})。 …
目前我们对环境中的 SQL Server 2005/2008/2008R2/2012 服务器上的备份使用标准维护计划,并且始终选中“验证备份完整性”框。
有些备份运行时间很长,因此我建议关闭该选项,但管理层需要我记录此更改的影响和风险。
我了解此选项的使用和历史,对我来说似乎没有必要将备份作业的时间加倍(在我看来),任何可能发生的错误都可能发生在备份步骤期间,而不是在验证期间。
我错了吗?如果我备份到磁盘而不是流式传输磁带或其他东西,关闭它的风险是否最小?(如果相关,我们通过网络备份到 EMC DD-800 备份设备。)
是否有任何关于何时可以安全关闭此功能的官方 MS 建议?
您是否对环境中的每个备份运行“验证”?你抽查他们吗?
编辑:澄清一下,当您在维护计划中检查“验证备份完整性”时,SQL 将在每次备份后立即对每个数据库执行完整的RESTORE VERIFYONLY。这与原始备份一样是数据/IO 密集型,并且(基本上)使备份作业的总时间加倍。这是不一样的使备份的“校验”选项(不能在向导中进行,因为据我所知)。
我在 SQL Server 2008R2 中有一个非常大的生产数据库和一个非常大的测试环境数据库。两个数据库具有相似的表结构,但不同的用户/登录名/权限/角色。
我只需要定期从生产中刷新测试数据库中的几个表,大约每月一次。
我目前计划这样做的方式是
对于这么小的任务来说,这一切似乎有点太复杂了。它似乎也会产生很多重做(在 t-log 中)有没有更好的方法来做到这一点?
我想到的另一种方法是将备份从生产恢复到测试环境 - 但我遇到的问题是完整备份会非常大,我不需要刷新所有表,只需要刷新几个 - - 而且生产数据库中的用户和安全性与测试不同。如果我恢复整个数据库,这将被生产数据库中的安全设置覆盖。
在 SQL Server 中,我可以在协议设置中“强制加密”。如果我将该设置保留为“否”,则任何客户端仍可能需要加密。
我能以某种方式查看到数据库的哪些连接正在使用加密吗?
我是一名“偶然”的 DBA,相对缺乏经验并且对这个问题感到困惑。
运行 MS SQL Server 2012。问题在于这个 UPDATE 语句:
UPDATE dbo.tAccts SET
Ticket = 'ARP.ExGE'
, Method = 'smtp'
, AcctOwner = 'r00417819'
, DisplayName = '~AppLight HBSFax-Inactive'
, Destination = 'r00417819@mail.ad.ge.com'
, UpdatedBy = SYSTEM_USER
, UpdatedOn = CAST(GetDate() AS DATE)
FROM dbo.vReclaimable
WHERE OHR_EmpStatus <> 'A'
Run Code Online (Sandbox Code Playgroud)
这应该只更新tAccts 表中由 vReclaimable 视图返回的行。
vReclaimable 视图基于 tAccts 表并返回 tAccts 中行的子集。
当我运行它时,它失败并显示唯一键错误:
(0 row(s) affected)
Msg 2627, Level 14, State 1, Line 67
Violation of UNIQUE KEY constraint 'UQ__tAccounts_DNIS.Method.Destination.Phones'. Cannot …Run Code Online (Sandbox Code Playgroud) 我有一个 1.4TB 的 SQL Server 数据库,它在磁盘 I/O 方面遇到了很大的困难。我们已经在服务器中安装了一个新的 SSD 阵列,它将解决我们所有的问题,我们只是在讨论移动数据库的最佳方式。理想情况下,如果我们可以在不停机的情况下完成这项工作,那就最好了。但是,如果要在两天性能不佳(例如复制数据时)与两小时停机时间之间进行选择,则后者可能更可取。
到目前为止,我们提出的解决方案是:
简单的复制。使数据库脱机,复制文件,更改 SQL Server 中的位置并使其重新联机。粗略的数字估计这最多需要五个小时,这不是真的可以接受,但这是最简单的解决方案。
块级复制。使用类似 rsync 的实用程序,我们在数据库启动时在后台复制文件。当我们准备好迁移时,我们使数据库脱机,使用此实用程序进行差异复制,然后将 SQL 服务器指向新文件并使其联机。这里的时间未知。我们不知道对 1.4TB 进行差异分析并复制它需要多长时间。我们的另一个担忧是块级副本会使文件处于 SQL Server 无法读取的某种状态,我们将浪费时间。
SQL 迁移。在新磁盘上创建一个新的 1.4TB SQL 数据文件并禁用所有其他文件的自动增长。然后依次对所有其他数据文件运行 DBBC SHRINKFILE(-file_name-, EMPTYFILE)。处理完所有数据后,我将在某个时间点使用预定窗口将 MDF 文件移至 SSD 并删除其他未使用的文件。我喜欢这个,因为它最大限度地减少了停机时间。但我不知道这需要多长时间,以及它在发生时是否会导致性能下降。
我们没有任何类型的负载和性能环境来测试这个。我可以验证这些策略是否适用于我们的暂存环境,但不是影响,而不是性能。
所以,标题总结了它。
我有一个包含 28 个表和 86 个必须进行逆向工程的存储过程的 SQL Server 数据库。我很确定有些表从未使用过,并且并非所有 proc 都使用过。
最大的问题是所有创建用于此数据库的 Windows 服务以及所有软件和数据库文档都丢失了,并且无处可寻设计整个系统的人。
我已经设法创建了一个 ER 图来帮助我理解这些关系,但是由于我没有数据库管理经验,我不知道应该从哪里开始。
如果不打算在这里问这种问题,我也很抱歉。
我有以下形式的查询:
SELECT ...
FROM ColumnstoreTable cs
CROSS APPLY (
SELECT *
FROM (VALUES
('A', cs.DataA)
, ('B', cs.DataB)
, ('C', cs.DataC)
) x(Col0, Col1)
) someValues
Run Code Online (Sandbox Code Playgroud)
这从 Columnstore 支持的子查询 ( ColumnstoreTable) 中获取每一行并将这些行相乘。这本质上是一个UNPIVOT. 真正的查询比这更大。这部分查询会进入其他处理。
这里的问题是这CROSS APPLY是作为一个循环连接实现的,这是一个合理的选择。不幸的是,循环连接不支持批处理模式。
这部分查询对性能非常关键,我怀疑以批处理模式运行它可能对性能非常有益。
我怎样才能重写这个查询,这样我就不会退出批处理模式?
我确实尝试使用临时表而不是VALUES,但这并没有改变这样一个事实,即没有相等连接条件来进行哈希连接。
在我们上一次每周例会上,一个没有数据库管理背景经验的人提出了这个问题:
“会不会有一种情况证明将数据存储在行(字符串)而不是多行中是合理的?”
让我们假设有一个表,称为countryStates我们想要存储一个国家的州的位置;我将在这个例子中使用美国,为了懒惰,不会列出所有的州。
在那里我们会有两列;一个叫Country,另一个叫States。正如这里所讨论的,以及@srutzky 的回答所提出的,这PK将是ISO 3166-1 alpha-3定义的代码。
我们的表看起来像这样:
+---------+-----------------------+-------------------------------------------------------+
| Country | States | StateName |
+---------+-----------------------+-------------------------------------------------------+
| USA | AL, CA, FL,OH, NY, WY | Alabama, California, Florida, Ohio, New York, Wyoming |
+---------+-----------------------+-------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
当向一位开发人员朋友提出同样的问题时,他说从数据流量大小的角度来看,这可能有用,但如果我们需要操纵这些数据,则不是。在这种情况下,应用程序代码必须有智能,可以在列表中转换此字符串(假设有权访问此表的软件需要创建一个组合框)。
我们得出的结论是这个模型不是很有用,但我怀疑可能有办法让它有用。
我想问的是,你们中是否有人已经以真正有效的方式看到、听到或做过这样的事情。
sql-server ×10
backup ×2
batch-mode ×1
columnstore ×1
connections ×1
constraint ×1
encryption ×1
ssd ×1
t-sql ×1
transaction ×1
unpivot ×1
update ×1
view ×1