标签: sql-server

将 bak 文件还原为较小的 mdf 和 ldf 数据库文件

我有一个遗留数据库,它可怕的设计缺乏我不会在这里介绍,但服务器上的文件(相对)巨大。我有:

我的数据库.mdf
:24.8GB 我的数据库.ldf :114.6GB

该数据库每晚备份到一个 .bak 文件,然后发送到我们的报告服务器,在那里恢复。.bak 文件要小得多,只有 1.8GB。

但是,当我尝试在报告服务器上还原它时,由于空间不足而失败。服务器上有大约 100GB 的可用空间,它试图吃掉原始服务器上文件消耗的全部 139.4GB。除非我的压缩知识大错特错,否则我很有信心 1.8GB 的​​文件实际上并没有扩展 7400%。

我的问题:有没有办法告诉 SQL Server 恢复这个备份文件而不预先保留那个空间?我不关心任何日志;我只需要数据就在那里。我从开发和模式的角度理解数据库,但我绝不是任何类型的 DBA。

这是在 SQL Server 2008 R2 上。感谢您的任何帮助或建议。

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

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

将日期存储为整数(数字),有什么好处

问题 1

我正在使用一个系统,其中日期存储为整数(实际数字(8,0)),我注意到其他系统也将日期存储为 int ,例如在此线程中的 cisco。例子

20120101  -- 01 Jan 2012
Run Code Online (Sandbox Code Playgroud)

保持数字日期系统而不使用 SQL 日期时间有什么好处吗?

问题2

现在我正在尝试遍历数字日期以查找两个日期之间的客户。如果startenddate包含两个月,我会得到数千条记录,而不仅仅是 60 条记录。例如:

create table #temp1(day int,capacity int) /* just a temp table */

declare @start int 
declare @end int

set @start=20111201
set @end = 20120131

while (@start <= @end) 
Begin
    insert into #temp1  /* I am storing things in #temp table so data looks pretty */
    exec usp_GetDailyCap @date1= @start

    set @start = @start + 1;    
end

select …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server date-format

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

这个“映射”表是否需要一个单独的 Id 列?

我有一个表Producers和一个表Products,两者都是以下形式:

  • Id - int, 主键
  • Name - nvarchar

Producer 可以携带多个产品,因此我将创建一个名为的表ProducerDetails,该表将具有:

  • ProducerId - int, 外键 Producers.Id
  • ProductId - int, 外键 Products.Id

然后我开始质疑自己,所以我想我会问专家。Id在我的ProducerDetails表中有一个额外的(int,主键)列会更好的数据库设计吗?或者这是不必要的?

如果这有什么不同,我正在使用 SQL-Server 2008 R2。

编辑- 我相信这些表之间的关系是多对多的,抱歉我没有说清楚。一个生产者可以携带多种类型的产品,同一产品可以由多个不同的生产者生产。

如果这个问题过于简单,我深表歉意,参照完整性/数据库设计不是我的强项(尽管我正在努力改进)。

database-design sql-server referential-integrity

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

通过 T-SQL 以编程方式引用数据库

我正在编写一个存储过程,它将数据库名称作为参数并返回该数据库索引及其碎片级别的表。这个存储过程将存在于我们的 DBA 数据库(包含 DBA 用于监视和优化事物的表的数据库)中。如果有区别的话,所讨论的系统都是 SQL Server 2008 R2。

我已经完成了基本查询,但我一直在尝试提供索引的实际名称。据我所知,该信息包含在每个人的 sys.indexes 视图中。我的具体问题是尝试从另一个数据库的存储过程中以编程方式引用该视图。

为了说明,这是有问题的查询部分:

FROM sys.dm_db_index_physical_stats(@db_id,NULL,NULL,NULL,NULL) p
INNER JOIN sys.indexes b ON p.[object_id] = b.[object_id] 
    AND p.index_id = b.index_id 
    AND b.index_id != 0
Run Code Online (Sandbox Code Playgroud)

当从@db_id 标识的数据库执行时,查询工作正常,因为它使用了正确的 sys.indexes 视图。但是,如果我尝试从 DBA 数据库中调用它,则所有结果都为空,因为 sys.indexes 视图用于错误的数据库。

更笼统地说,我需要能够做这样的事情:

DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
Run Code Online (Sandbox Code Playgroud)

或者

USE @db_name;
Run Code Online (Sandbox Code Playgroud)

我尝试使用字符串连接和 OBJECT_NAME/OBJECT_ID/DB_ID 函数的组合来切换数据库或引用其他数据库,但似乎没有任何效果。我很感激社区可能有的任何想法,但我怀疑我将不得不重新调整这个存储过程以驻留在每个单独的数据库中。

在此先感谢您的任何建议。

sql-server

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

是否有一种基于集合的方法来加载/读取带有 HierarchyId 的树枝

我正在玩 HierarchyId,但我还没有想出一种基于集合的方法来执行以下操作:

  • 一次插入所有子树
  • 一次检索所有子树

这个问题与我之前的问题有关,我怀疑使用 HierarchyId 完成这两个任务的唯一方法是一次一个节点或一个级别。如果我使用的是物化路径,那么这两个操作都可以通过一个(且简单的)基于集合的命令轻松完成。

我错过了什么?

编辑:我也错过了移动子树的方法,但我是从 Mikael Eriksson 的评论中学到的

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

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

将日期时间列转换为秒数

在我的 SQL Server 数据库中,我有一datetime列。

创建代表列long值的新列的好方法是什么datetime?在long将表示了若干秒。

我想如果我可以将它转换为longs,那么在一段时间内按查询分组会更容易,因为我可以将长数除以固定数量。

该表是静态的,不会更新或删除数据。

sql-server-2008 sql-server t-sql type-conversion datetime

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

当工作类别中的任何工作失败时发出警报

是否可以在 SQL Server 2008 中设置警报,以便在特定类别中的作业失败时发送电子邮件?

我想知道,因为我想在 SSRS 订阅失败时设置电子邮件 - 所有这些订阅都是Report Server类别中的作业。

编辑- 事实证明,当 SSRS 订阅失败时,作业本身不会失败,因此我的问题不适用于 SSRS 订阅监视使用。但是我仍然想知道我们在我们的环境中运行的其他作业

sql-server-2008 monitoring sql-server ssrs sql-server-agent

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

SQL Server 是否为每一行评估一次函数?

我有一个这样的查询:

SELECT col1
FROM   MyTable
WHERE  
    DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
       BETWEEN col2 
       AND     col3
;
Run Code Online (Sandbox Code Playgroud)

这给出了与此类似的执行计划的工具提示:

执行工具提示

dateadd搜索谓词的一部分是否对查询中的每一行执行?或者 SQL Server 是否为整个查询计算一次值?

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

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

使用 MoveFile API 实时对 SQL Server 数据和日志文件进行碎片整理

我的雇主正在考虑部署 NTFS 碎片整理软件,该软件使用 Windows MoveFile API 对打开的文件进行碎片整理。这将被部署到数千个运行 SQL 版本 2005-2012 和 Windows 版本 2003 和 2008 R2 的 SQL Server 服务器。如果重要的话,我正在谈论的产品是 PerfectDisk,但我相信有类似的程序以相同的方式工作。

到目前为止,除了偶尔出现的 I/O 性能问题之外,测试还没有发现很多问题,这并不奇怪,可以通过重新安排和调整碎片整理来解决。但是,我更关心数据损坏的风险。

这里有没有人有在数据库服务器上在生产中运行这种类型的软件的经验?您是否遇到过任何数据损坏?

尽管无法找到任何确凿的证据表明它存在问题,但我对此感到相当不安。

感谢您的任何答复。

编辑补充:幸好这个可怕的想法被遗忘了,部分原因可能是我给出了一些警告。

sql-server fragmentation

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

为什么 10^37 / 1 会抛出算术溢出错误?

继续我最近玩大数字的趋势,我最近将一个错误归结为以下代码:

DECLARE @big_number DECIMAL(38,0) = '1' + REPLICATE(0, 37);

PRINT @big_number + 1;
PRINT @big_number - 1;
PRINT @big_number * 1;
PRINT @big_number / 1;
Run Code Online (Sandbox Code Playgroud)

我为此代码得到的输出是:

10000000000000000000000000000000000001
9999999999999999999999999999999999999
10000000000000000000000000000000000000
Msg 8115, Level 16, State 2, Line 6
Arithmetic overflow error converting expression to data type numeric.
Run Code Online (Sandbox Code Playgroud)

什么?

为什么前 3 个操作有效,而最后一个无效?如果@big_number显然可以存储 的输出,怎么会出现算术溢出错误@big_number / 1

sql-server-2008 sql-server datatypes

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