标签: sql-server-2017

SQL Server 主登录限制

我只阅读了路由设置并且工作正常。我有一个 SQL 登录名,它使用ApplicationIntent=ReadOnly. 但是我想阻止用户访问主。

我已经看到很多关于此的主题,它们似乎都建议禁用主服务器上的登录。当我做这个连接到听众ApplicationIntent=ReadOnly失败时Login failed for user ''. Reason: The account is disabled.

我已确保帐户是相同的 SID。

谢谢你的帮助。

sql-server availability-groups sql-server-2017

4
推荐指数
1
解决办法
155
查看次数

SQL Server 索引和统计维护性能问题

我尝试在IndexOptimize索引数量非常多(> 250.000)的数据库上使用存储过程。存储过程收集需要处理的数据的初始步骤需要数小时,即使我设置了 @Indexes 参数来缩小工作范围。

SQL Server 维护解决方案版本:2019-02-10 10:40:47 安装了最新 CU14 的 SQL Server 2017 标准版。

在客户那里,我看到了一个包含 500.000 个以上索引的数据库。12 小时后,数据收集步骤仍在运行。

我希望如果我将 @Indexes 设置为单个索引执行应该立即开始。

这是我的存储过程调用的示例。

EXECUTE dbo.IndexOptimize
@Databases = 'db',
@Indexes =  'db.dbo.'
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 30,
@FragmentationLevel2 = 50,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y',
@LogToTable = 'Y',
@LockTimeout = 60
Run Code Online (Sandbox Code Playgroud)

有人可以与我分享他在索引数量非常多的数据库中使用 IndexOptimize 的经验吗?

index sql-server ola-hallengren index-maintenance sql-server-2017

4
推荐指数
1
解决办法
492
查看次数

无法解释的 DBCC CHECKDB 命令输出

Microsoft SQL Server 2017 (RTM-CU14-GDR) (KB4494352) - 14.0.3103.1 (X64) 2019 年 3 月 22 日 22:33:11 版权所有 (C) 2017 Microsoft Corporation Developer Edition(64 位),Windows Server 2016(数据中心 10.0)内部版本 14393:)(管理程序)

我的生产服务器在 SQL 代理作业中执行这些命令以将结果输出到我的管理数据库中的表:

DECLARE @SQL VARCHAR(MAX) = 'master..xp_cmdshell ''SQLCMD -E -Q"DBCC CHECKDB('+@Database+') WITH NO_INFOMSGS, ALL_ERRORMSGS"'''; -- If all is well, there will be no output.
INSERT INTO DBCC_CHECKDB_Results EXEC(@SQL);
Run Code Online (Sandbox Code Playgroud)

昨晚,输出一行信息,作业停止执行,作业历史记录中没有显示错误。一行信息是:

“Sqlcmd:警告:上次操作已终止,因为用户按下了 CTRL+C。”

这怎么可能?周日晚上 10:00,没有人登录到服务器。CTRL+C不在命令行中。

作为测试,我执行了此命令,并在执行时键入CTRL+C::

USE ARC 
DBCC CHECKDB WITH NO_INFOMSGS, ALL_ERRORMSGS:
Nothing happened. 
Run Code Online (Sandbox Code Playgroud)

关于什么会导致该输出行的任何想法?

谢谢,李

sql-server dbcc dbcc-checkdb sql-server-2017

4
推荐指数
1
解决办法
350
查看次数

如何重新创建具有相同设置的索引?

我想向现有索引添加另一个包含的列,但保持其余设置(例如 FILLFACTOR、ONLINE、SORT_IN_TEMPDB 等)相同。

  • 我在源代码管理中没有以前的版本
  • 我没有在 sys.indexes DMV 中找到它们中的大部分(FILLFACTOR 在那里,但不是 ONLINE)
  • 在对象资源管理器中查找索引并编写它的脚本会填充 ONLINE 设置的默认值(并省略 DATA_COMPRESSION)
  • 我没有在 OBJECTPROPERTY DMF 中找到该属性
  • Brent Ozar 的 sp_BlitzIndex 也不提供其中一些高级设置
  • sp_helpindex 为我提供与 sp_help 在父表上相同的有限信息。
  • 我无法测试 WITH (DROP_EXISTING = ON) 是否使用相同的设置重新创建索引,因为我在任何地方都找不到设置。

有任何想法吗?

index t-sql sql-server-2017

4
推荐指数
1
解决办法
99
查看次数

在while循环中显示局部变量

我有一个运行数天的 while 循环(bydesign)请参阅相关是否有限制可以将多少个备份附加到单个文件?

我有一个显示循环计数的局部变量,当我在查询窗口中运行它时,我可以用 print @counter

我现在正在作业中运行 while 循环,并且我想显示该@counter值。经过一番研究,我尝试了RAISERROR (Transact-SQL),它应该显示在 SQL 错误日志中,但它不起作用。我读了Using RAISERROR我认为我的代码是正确的,但不确定它是否可以在带有局部变量的 While 循环中使用。

创建数据库并准备它

USE [master]
GO
Create database T_test

USE [master]
GO
ALTER DATABASE [T_test] SET RECOVERY FULL WITH NO_WAIT
GO

BACKUP DATABASE T_test to disk= N'K:\Test\T_test.bak' with noinit --Create first full
GO
Run Code Online (Sandbox Code Playgroud)

尝试在查询窗口中运行以进行测试

DECLARE @counter int
SET @counter = 0
WHILE 1=1
BEGIN 
BACKUP DATABASE [T_test] TO  
DISK = N'K:\Test\T_Test.diff' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  
NAME = N'T_Test-Diff Database …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2017

4
推荐指数
1
解决办法
78
查看次数

SQL Server 可信连接附加安全性

使用 Windows 身份验证,有没有办法禁止用户通过 ODBC 连接到数据库?

security sql-server connectivity sql-server-2017

4
推荐指数
2
解决办法
1070
查看次数

SQL Server - 快照在生产环境中有用吗?

我正在阅读有关 SQL Server 高可用性解决方案和灾难恢复以及 SQL Server 具有快照功能的可用资源。从理论上讲,一切看起来都很美。

我还读到快照将在某个时间点复制数据库,您可以使用它来恢复数据库。

在这个答案中有一条评论(Peter Schofield,2013 年)关于 SQL Server 快照不受支持,并且在开发环境中用于快速回滚非常有用。

[...] 也许采用的最大障碍是 Management Studio 不提供支持[...]

[...] 这听起来像是在开发环境中使用快照的理想方式,只是为了快速部署脚本和快速回滚。[...]

我想知道快照在生产环境中是否真的有用。有哪些在生产中的使用示例,请提供有关您何时使用快照在生产系统上提供解决方案的个人示例。

主要目标是提供一些实际使用的示例,并通过这些示例为我和将阅读本文的每个人提供一些有用的想法。

就我而言,我在生产环境中使用 SQL Server 2017 Enterprise Edition。

sql-server snapshot sql-server-2017

4
推荐指数
2
解决办法
727
查看次数

4
推荐指数
1
解决办法
132
查看次数

磁盘空间不足,开始将新数据保存到不同的磁盘

我目前在一张表上大约有 70 亿行,并且接近整个数据库的最大磁盘空间。

我需要开始将一个大表上的新数据保存到新磁盘。

我已经看过分区datetime,这似乎是显而易见的选择 这是我们在 6 个月内获得新服务器之前的临时解决方案,但需要“现在”解决方案。

我将如何实现这一目标?我可以实施手动分区以便所有新数据都转到新磁盘吗?

我所看到的一切都需要创建类似于每月选项的内容,而我只想将所有新内容放在新磁盘上。

一种选择是按月拆分现有数据,然后手动移动分区。

我什至不确定这是否可行,因此希望获得有关实现上述目标的最佳解决方案的一些反馈。

SQL Server 2017 企业版。

sql-server disk-space sql-server-2017

4
推荐指数
1
解决办法
442
查看次数

Python 脚本使数据库处于恢复模式

我正在尝试使用 python 来自动化我们的一些数据库恢复。当我运行 SQL 查询时,数据库会恢复并正常恢复,但是当我运行使用相同 SQL 查询的 python 脚本时,数据库仍处于恢复模式。

对我做错的任何帮助将不胜感激。

import pyodbc

#Set these Variables
sourceserver = 'MySourceServerName'
destinationserver = 'MyDestinationServerName'
dbname = 'test'


sourceserverplusport = sourceserver + ',1433'
destinationserverplusport = destinationserver + ',1433'


def ExecSQL(serverplusport, dbnameIN, sql):
    try:
        connexecsql = pyodbc.connect('Driver={SQL Server};'
                                         'Server=' + serverplusport +';'
                                         'Database=' + dbnameIN + ';'
                                         'Trusted_Connection=yes;')

        #Set AutoCommit
        if connexecsql is not None:
           connexecsql.autocommit = True
       
        print(sql)
        cursor = connexecsql.cursor()
        cursor.execute(sql)
    finally:    
        cursor.commit
        cursor.close
        connexecsql.commit
        connexecsql.close


sqlcommand = r"""IF @@SERVERNAME = 'MyDestinationServerName'
RESTORE …
Run Code Online (Sandbox Code Playgroud)

sql-server python sql-server-2017

4
推荐指数
1
解决办法
371
查看次数