如果事务成功提交,我能否 100% 确定它已写入数据库和日志文件?我可以确定数据已保存吗?
今天我们的日志文件已经达到了驱动器的限制,我们得到了很多错误。此外,其他一些服务也崩溃了。我们增加了磁盘并重新启动了服务器。
在启动期间,服务器进行了“数据库恢复”——我能确定一切正常吗?
我有一个带有复合主键(由 4 列组成)的表,用于确保没有重复项输入到表中。我现在需要一个新表,它需要将此表中的键作为外键引用。
我的问题是哪种方法对查找速度更有效:
1)我是否创建包含所有 4 列的新表并在外键中引用它们。
或者
2)我是否在主键表中创建一个新的标识列并将其用作新表中的外键。
预计该数据库将保存大量数据,因此我一直构建它,以期最大限度地减少每个表中保存的数据量。考虑到这一点,选项 2 将是最好的方法,因为我将为每一行保存 2 个 int 列和一个 datetime 列,但我想避免在不必要的情况下增加查找时间。
sql-server-2008 database-design primary-key identity composite-types
考虑以下两个语句:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Run Code Online (Sandbox Code Playgroud)
两个语句都返回-1;这不是不正确,因为第二个二进制值比第一个值高 65,536 十进制,不是吗?
这肯定不是由于无声截断?
如果我运行以下语句:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Run Code Online (Sandbox Code Playgroud)
我遇到了以下错误:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Run Code Online (Sandbox Code Playgroud)
我如何诊断这里发生了什么?
我在 SQL Server 2012 v11.0.5058 上运行它。结果在 SQL Server 2008 R2 SP2、SQL Server 2005 和 SQL Server 2000 上相同。
上周我们的数据库发生了一些奇怪的事情。突然之间,应用程序阻止了我们无法保存新实体等的用户。在查看 SQL Server(2008 兼容模式 2005)的活动监视器后,我看到以下三个条目:

一段时间后,用户出现连接超时。当我杀死进程64时,他们可以再次正常保存。
问题是他们在块期间尝试保存的实体被多次插入数据库(最多 3 次),即使有代码可以防止这种情况发生(数字列必须是唯一的但没有约束...检查发生在代码中)。
我们使用实体框架 6.0。
我们在客户服务器上安装了一个 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 2008R2 中有一个非常大的生产数据库和一个非常大的测试环境数据库。两个数据库具有相似的表结构,但不同的用户/登录名/权限/角色。
我只需要定期从生产中刷新测试数据库中的几个表,大约每月一次。
我目前计划这样做的方式是
对于这么小的任务来说,这一切似乎有点太复杂了。它似乎也会产生很多重做(在 t-log 中)有没有更好的方法来做到这一点?
我想到的另一种方法是将备份从生产恢复到测试环境 - 但我遇到的问题是完整备份会非常大,我不需要刷新所有表,只需要刷新几个 - - 而且生产数据库中的用户和安全性与测试不同。如果我恢复整个数据库,这将被生产数据库中的安全设置覆盖。
我根据 database2 中的表在 database1 中创建了视图。我SELECT授予了一个只能访问 database1 的用户的权限。用户无法使用此视图,因为他在 database2 中没有帐户。我该如何解决这个问题?我不想在 database2 中创建帐户。
在 SQL Server 错误日志文件中,我发现了以下几行:
2018-02-22 14:10:58.95 spid17s Starting up database 'msdb'.
2018-02-22 14:10:58.95 spid16s Starting up database 'ReportServer'.
2018-02-22 14:10:58.95 spid18s Starting up database 'ReportServerTempDB'.
2018-02-22 14:10:58.95 spid19s Starting up database 'XYZ'.
Run Code Online (Sandbox Code Playgroud)
如果我在此之前检查数据库 XYZ 的状态,则ONLINE使用以下语句:
SELECT state_desc FROM sys.databases WHERE name='XYZ'
Run Code Online (Sandbox Code Playgroud)
...但是当我尝试使用 C# 应用程序连接到该数据库时,它无法连接到该数据库。
错误是:
用户“asd”登录失败。
原因:无法打开明确指定的数据库。
我尝试了三个不同的用户(为应用程序定义的 Windows 用户、sa、SQL Server 用户)。当我在操作系统启动时运行应用程序时会出现问题,但是如果我在启动后手动启动它,则不会发生错误,因此我认为所有 SQL Server 设置和防火墙设置都是正确的。
在此之前,我还检查了服务状态是否正在运行。
我还应该检查什么以确保数据库实际上在线并准备好进行查询?
我正在寻找一个密钥,它告诉我可以查询数据库,而不是延迟一段时间(甚至不是基于明确的原因)。
我想扫描文本“启动数据库'XYZ'”的错误日志,但这意味着我必须为SQL Server错误日志的路径添加应用程序的设置。这也意味着多次阅读文件,直到我找到这句话。
MSDN 文档很难理解。
是否有任何可用于学习 SQL Profiler 的在线教程?如果可能,视频或简单的博客文章将是首选。
对于我们即将托管的应用程序,我需要在 SQL Server 2008 Web 版和 SQL Server 2008 企业版之间进行选择。没有任何“必备”功能:应用程序当前在 SQL Express 上运行,但它会超过 SQL Express 强加的 10GB 最大大小。
我正在查看此比较图表,以及本页“可扩展性和性能”中最重要的表格。随着表变大,诸如“表和索引分区”之类的功能对于保证性能速度至关重要。但是,这需要多大的桌子尺寸?
我应该使用什么策略来确定我的数据库的大小和使用情况是否需要企业版可扩展性和性能功能?
sql-server-2008 ×10
sql-server ×8
backup ×1
identity ×1
learning ×1
permissions ×1
primary-key ×1
profiler ×1
security ×1
startup ×1
view ×1