标签: sql-server-2008

如果一个事务被“提交”,那么它会被保存吗?

如果事务成功提交,我能否 100% 确定它已写入数据库和日志文件?我可以确定数据已保存吗?

今天我们的日志文件已经达到了驱动器的限制,我们得到了很多错误。此外,其他一些服务也崩溃了。我们增加了磁盘并重新启动了服务器。

在启动期间,服务器进行了“数据库恢复”——我能确定一切正常吗?

sql-server-2008 sql-server sql-server-2008-r2

12
推荐指数
1
解决办法
2486
查看次数

复合主键作为外键的效率

我有一个带有复合主键(由 4 列组成)的表,用于确保没有重复项输入到表中。我现在需要一个新表,它需要将此表中的键作为外键引用。

我的问题是哪种方法对查找速度更有效:

1)我是否创建包含所有 4 列的新表并在外键中引用它们。

或者

2)我是否在主键表中创建一个新的标识列并将其用作新表中的外键。

预计该数据库将保存大量数据,因此我一直构建它,以期最大限度地减少每个表中保存的数据量。考虑到这一点,选项 2 将是最好的方法,因为我将为每一行保存 2 个 int 列和一个 datetime 列,但我想避免在不必要的情况下增加查找时间。

sql-server-2008 database-design primary-key identity composite-types

12
推荐指数
2
解决办法
6436
查看次数

CONVERT() 出现此问题的原因是什么?

考虑以下两个语句:

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 sql-server sql-server-2012

12
推荐指数
1
解决办法
2045
查看次数

为什么会出现 async_network_io 等待类型?

上周我们的数据库发生了一些奇怪的事情。突然之间,应用程序阻止了我们无法保存新实体等的用户。在查看 SQL Server(2008 兼容模式 2005)的活动监视器后,我看到以下三个条目:

async_network_io 等待类型

一段时间后,用户出现连接超时。当我杀死进程64时,他们可以再次正常保存。

问题是他们在块期间尝试保存的实体被多次插入数据库(最多 3 次),即使有代码可以防止这种情况发生(数字列必须是唯一的但没有约束...检查发生在代码中)。

我们使用实体框架 6.0。

  • 你们中有人知道这些 ASYNC_NETWORK_IO 等待类型发生的原因和时间以及如何避免它们吗?
  • 它们究竟是什么意思?

sql-server-2008 sql-server entity-framework

12
推荐指数
2
解决办法
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'})。 …

sql-server-2008 sql-server backup

12
推荐指数
2
解决办法
6147
查看次数

从生产中仅刷新测试数据库中的几个表的最佳方法是什么?

我在 SQL Server 2008R2 中有一个非常大的生产数据库和一个非常大的测试环境数据库。两个数据库具有相似的表结构,但不同的用户/登录名/权限/角色。

我只需要定期从生产中刷新测试数据库中的几个表,大约每月一次。

我目前计划这样做的方式是

  1. 使用 BCP 实用程序从生产中导出我需要的表。
  2. 将 bcp 导出文件复制到测试服务器上
  3. 禁用我在测试中刷新的所有表的索引和约束
  4. 截断测试数据库表
  5. 使用 BCP 将数据加载回测试数据库表。
  6. 在测试中重建索引并重新启用约束

对于这么小的任务来说,这一切似乎有点太复杂了。它似乎也会产生很多重做(在 t-log 中)有没有更好的方法来做到这一点?

我想到的另一种方法是将备份从生产恢复到测试环境 - 但我遇到的问题是完整备份会非常大,我不需要刷新所有表,只需要刷新几个 - - 而且生产数据库中的用户和安全性与测试不同。如果我恢复整个数据库,这将被生产数据库中的安全设置覆盖。

sql-server-2008 sql-server

12
推荐指数
1
解决办法
1万
查看次数

访问基于另一个数据库中的表的视图,而无需在该另一个数据库中的帐户

我根据 database2 中的表在 database1 中创建了视图。我SELECT授予了一个只能访问 database1 的用户的权限。用户无法使用此视图,因为他在 database2 中没有帐户。我该如何解决这个问题?我不想在 database2 中创建帐户。

sql-server-2008 security sql-server permissions view

12
推荐指数
1
解决办法
1万
查看次数

SQL Server 数据库何时准备好接受查询?

在 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错误日志的路径添加应用程序的设置。这也意味着多次阅读文件,直到我找到这句话。

sql-server-2008 sql-server startup

12
推荐指数
1
解决办法
2572
查看次数

SQL Profiler 新手教程

MSDN 文档很难理解。

是否有任何可用于学习 SQL Profiler 的在线教程?如果可能,视频或简单的博客文章将是首选。

sql-server-2008 learning profiler

11
推荐指数
1
解决办法
2701
查看次数

SQL 2008 Web 版“太大”有多大?

对于我们即将托管的应用程序,我需要在 SQL Server 2008 Web 版和 SQL Server 2008 企业版之间进行选择。没有任何“必备”功能:应用程序当前在 SQL Express 上运行,但它会超过 SQL Express 强加的 10GB 最大大小。

我正在查看此比较图表,以及本页“可扩展性和性能”中最重要的表格。随着表变大,诸如“表和索引分区”之类的功能对于保证性能速度至关重要。但是,这需要多大的桌子尺寸?

我应该使用什么策略来确定我的数据库的大小和使用情况是否需要企业版可扩展性和性能功能?

sql-server-2008 sql-server

11
推荐指数
2
解决办法
3062
查看次数