我想知道将数据库安装介质与实际数据文件分开是否是个好主意。
在我们当前的环境中,我们有:
- C:-视窗服务器
- D: - MS SQL 安装和数据库数据文件
- E: - 备份
- L: - 日志文件
将我们的 D: 分开是个好主意吗?
- 驱动器 1:MS SQL 安装
- 驱动器 2:数据库数据文件
已经发布了类似的问题,但没有具体涉及数据库软件和数据库数据文件的分离。(类似的问题询问将操作系统和数据库分开是否是个好主意)。
我想知道将数据库安装介质与实际数据文件分开是否是个好主意。
在我们当前的环境中,我们有:
将我们的 D: 分开是个好主意吗?
已经发布了类似的问题,但没有具体涉及数据库软件和数据库数据文件的分离。(类似的问题询问将操作系统和数据库分开是否是个好主意)。
在 SQL Server 2017 中设置一些警报,这些警报通过电子邮件发送给某些 DBA。
我尝试配置的一些警报示例是警报编号 229 - 对象“X”的执行权限被拒绝
目前,电子邮件中没有关于谁的许可被拒绝的详细信息——我想知道,是否可以包括这个?
当前通知如下所示:
日期/时间:2018 年 7 月 2 日下午 1:29:59
描述:对对象“sp_Price”、数据库“Customizations”、架构“dbo”的执行权限被拒绝。
我们有一个网络共享,它使用与当前登录用户不同的凭据。在此共享中,我们拥有来自第三方数据库的完整备份、差异备份和日志备份,这些备份每天更新。
我的任务是将这些备份自动恢复到本地数据库。
为此设计和实施解决方案的最佳方式是什么?
如上所示,每个文件夹中有多个文件,文件名根据日期等不同而不同。
更新:
根据下面发布的解决方案,我不得不稍微修改建议的 PowerShell 代码以使其工作:
$pass ="xxx"|ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PsCredential('Domain\Account',$pass)
New-PSDrive -Name K -PSProvider "FileSystem" -Credential $cred -Root '\\UNC PATH TO FOLDER WHERE BACKUP IS STORED';
Get-PsDrive;
Copy-Item K:\ -Recurse M:\DESTINATION;
Restore-DbaDatabase -server MRVAPPSQL01 -path M:\DESTINATION -MaintenanceSolutionBackup -WithReplace;
Remove-PSDrive -Name K;
Remove-Item M:\DESTINATION\*.*;
使用数据库轮询的开发人员的愚蠢行为如下所示。
我在下面确定了一个查询,该查询在特定列上没有适当的索引
除了每秒使用以下查询轮询数据库之外,开发人员没有使用 CloseDateTime 上的索引,因此大约 50,000 行的扫描不断地访问数据库。(请记住这是在开发中,所以数据集较小)
在向开发人员展示我们在数据库上遇到高 CPU 使用率的原因后,通过向他们展示一个查询 - 他们返回了各种原因的借口,例如病毒等。
然后我不得不进一步调查这个问题,其中涉及使用 Perfmon 关联 CPU 利用率,使用 SentryOne Plan Explorer 来更仔细地查看查询的影响,然后最后 - 观察当我添加一个似乎是失踪。
然后我在 Sentry One Plan Explorer 中进一步调查了它。我首先注意到“CloseDateTime”上没有索引(在内部查询的 where 子句中)
我通过在此列上创建索引来检验我的假设,并观察到 CPU 使用率突然下降。然后我尝试删除这个新创建的索引,希望看到 CPU 利用率再次增加,但它没有。
我的问题是,即使我们删除了它,数据库还会继续使用这个索引吗?
MemberId,
Sum(RemovedAmount) as Amount,
Sum(RemovedQty) as Qty,
PromotionId,
CheckNo,
ProcessedDT
from vm_config..HospitalityTransaction HT with (NOLOCK)
where exists (Select * from vm_warehouse..TransHeader TH with (NOLOCK) where AssociatedCheckNo = HT.CheckNo and CloseDateTime between HT.ProcessedDT -1 and HT.ProcessedDT + 1)
Group By MemberId, CheckNo, PromotionId, ProcessedDT
在我们的生产数据库中,我们只有 1 个 tempdb 文件,它已经膨胀到 180GB。
我跑了:
Alter Database tempdb
modify file (name='tempdev', size=30gb);
调整主文件的大小,然后运行附加:
ALTER DATABASE tempdb
ADD FILE (NAME='tempdev2', FILENAME='M:\SQLData\tempdb2.ndf', Size=30GB);
添加其他 tempdb 文件。我遇到了驱动器空间错误,因为主数据库没有缩小到 30GB,并且操作在中途停止。
我现在剩下一个额外的 tempdb 文件,它是 30GB,而主文件是 180GB,我无法摆脱它。
我试过跑步
DBCC SHRINKFILE('tempdev2', EMPTYFILE)
但我收到一个错误:
在 sys.database_files 中找不到数据库“tempdb”的文件“tempdev2”。
该文件不存在或已被删除。
我觉得这个错误是因为操作无法成功完成。(我有腐败吗?)
当我尝试跑步时
ALTER DATABASE tempdb
REMOVE FILE tempdev2;
我收到以下错误:
系统目录中的文件“M:\SQLData\tempdb2.ndf”已被修改。下次启动数据库时将使用新路径。
消息 5042,级别 16,状态 1,第 35 行
文件 'tempdev2' 不能被删除,因为它不是空的。
Sys.database_files
编辑:我能够解决尝试运行 EMPTYFILE Shrink 时收到的“找不到文件”文件名损坏问题。我使用文件 ID 而不是逻辑名称。
DBCC SHRINKFILE(3,EMPTYFILE); -- File ID instead of logical name.
我发现另一种有效的方法是重命名文件。
ALTER DATABASE tempdb MODIFY FILE (NAME =tempdev2, NEWNAME =tempdev3);
我在一个应用程序之间共享登录名的环境中工作,偶尔还有开发人员 - 在这种情况下,我无法确定谁连接到数据库,或者谁在运行特定查询。
我能找到的最具体的信息似乎是主机名或 IP 地址。
我想知道,是否有办法将此信息与用户相关联?