小编Sol*_*zky的帖子

SQL Server - 我应该使用什么备份/恢复策略来完成以下任务?

问题陈述: 我们的支持工程师需要从客户那里获取数据库备份。目前,我们的数据库包含在一个 Primary/.mdf 文件组/文件中。这些数据库多年来一直在收集历史数据,并且越来越大。我们的工程师需要几天时间才能将备份复制到我们的办公室。

似乎没有任何规定/想法来管理数据库的增长。

最“有价值”的数据是我们系统的“配置”。它包含在大约 50 个表中,我们正在考虑将这些表移至与历史数据(将放置在数据文件组中)分开的新配置文件组,以尝试为部分或文件备份设置阶段。

但我不确定我需要哪种备份/恢复策略来完成这个 - 部分备份文件备份

出于研发目的,我有一个名为FilegroupDemo使用SIMPLE恢复模型的数据库。FilegroupDemo包含 3 个文件组:

  • 主要(映射到 FilegroupDemo.mdf)
  • 配置(映射到 FilegroupDemo_Configuration.ndf)
  • 数据(映射到 FilegroupDemo_Data.ndf)

配置文件组中的数据不会经常更改,并且可能会被标记为只读(如果有帮助),而数据文件组中的数据每分钟更改一次。

我希望能够灵活地仅备份/恢复主文件组和配置文件组/文件。

SQL Server Partial Backups的 BOL 文章中,它指出:

部分备份类似于完整数据库备份,但部分备份不包含所有文件组。相反,对于读写数据库,部分备份包含主文件组、每个读写文件组以及一个或多个只读文件(可选)中的数据。

这种读取方式让我认为部分备份旨在省略只读文件组,最有可能用于不会更改并标记为只读的大量数据。这些不需要每次都备份。

1. 我说存在部分备份是为了备份所有文件组(除了标记为只读的文件组)是否正确?换句话说,如果我不使用只读文件组,那么使用部分备份就没有意义了——对吗?而且我认为我不能使用部分备份来备份只读文件组?

因此,我不认为部分备份是我所需要的。我相当天真地尝试了文件备份/恢复。我将数据库切换到FULL恢复模式并运行:

BACKUP DATABASE FilegroupDemo FILEGROUP = N'PRIMARY'
TO DISK = N'C:\Backups\FilegroupDemo_FG_Primary.bak'
WITH INIT
GO

BACKUP DATABASE FilegroupDemo FILEGROUP = N'Configuration'
TO DISK = N'C:\Backups\FilegroupDemo_FG_Configuration.bak'
WITH INIT
GO

BACKUP DATABASE FilegroupDemo FILEGROUP …
Run Code Online (Sandbox Code Playgroud)

sql-server etl backup restore sql-server-2014

5
推荐指数
1
解决办法
668
查看次数

将数据集合插入 SQL Server 数据库的最佳做法是什么

我正在使用 C#,实体框架。用于开发 SQL Server。我有一个方法,它有两个参数 ( int ID, List<String> _listobj)。对于每个 ID,都有一个 obj 列表。所有这些 ID 和列表都将插入到数据库中的不同表中。所以问题是:最好的做法是什么?我有几个选择:

  1. 在 C# 中,拆分list<obj>为单个值,然后创建一个带有两个参数 ( ID, str)的存储过程,然后 C# 将根据列表的大小多次调用存储过程

  2. IDlist<obj>作为两个参数传递给存储过程,并让存储过程拆分list<obj>. 这样C#只会调用一次存储过程

第二种策略可行吗?如果是,哪个在性能方面更好?

sql-server-2008 sql-server stored-procedures entity-framework c#

5
推荐指数
1
解决办法
2817
查看次数

PostgreSQL 9.x 中的排序规则和代码集

在 Windows 7 中,"English_United States.1252"当我在安装程序中选择“英语,美国”区域设置时,排序规则设置为。在 Linux 中,排序规则"en_US.UTF-8"默认设置为。

我还没有找到任何方法在 Windows 中将排序规则的代码集设置为 UTF-8,所以我只是想知道在这些示例情况下数据库的行为是否会有所不同?或者一般来说,排序规则的代码集部分的影响是什么?

我在两个数据库中都将编码设置为 UTF-8,问题是排序规则代码集的差异是否会导致行为差异。

postgresql collation character-set

5
推荐指数
1
解决办法
5127
查看次数

具有执行方式、跨数据库查询和模块签名的存储过程安全性

我有一种情况,虽然我能够解决它(如重现所示),但我不明白。以下是重点

  • 两个数据库,ChainingSource 和 ChainDestination,两者都将跨数据库链接设置为 true
  • ChainingSource 中的存储过程通过EXEC(@sql)访问 ChainingDestination 中的表
  • 存储过程是用execute as子句定义的
  • 如果我尝试按原样执行该过程,它会说执行上下文的服务器主体无法访问 ChainingDestination
  • 所以我添加了一个证书和代码签名。也就是说,我将证书映射登录添加到服务器,将用户映射到每个数据库,并相应地向证书映射用户授予权限
  • 如果我保留该execute as条款,我会得到同样的错误。
  • 如果我删除该execute as条款,一切都很好。

这是我感到困惑的倒数第二点。或者,具体地,为什么一个不工作,最后一个


/******************************

            Setup

******************************/
USE [master];
go
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingSource')
BEGIN
    ALTER DATABASE [ChainingSource] SET OFFLINE WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [ChainingSource] SET ONLINE;
    DROP DATABASE [ChainingSource];
END
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingDestination')
BEGIN
    ALTER DATABASE [ChainingDestination] SET OFFLINE WITH …
Run Code Online (Sandbox Code Playgroud)

security sql-server signature certificate impersonation

5
推荐指数
1
解决办法
4287
查看次数

用于备份的 SQL Server 证书:到期日期重要吗?

如果我在 SQL Server 中有一个证书,用于备份:

  1. 证书过期后还可以创建备份吗?
  2. 证书过期后还可以恢复吗?

让这些证书过期有什么意义?(除了让我暴露于由于过期的证书而导致备份失败......)

sql-server backup certificate

5
推荐指数
1
解决办法
3752
查看次数

可以在不重建索引的情况下更改特定表的填充因子吗?

我一直在四处挖掘,但没有任何运气。

SQL Server 2008:是否可以在不重建整个表的情况下调整特定聚集索引/表的填充因子?

例如,如果它有 4 亿条记录,我们是否可以调整填充因子并让 SQL Server 在所有尚未超过该限制的页面(以及新拆分)上使用新的填充因子,然后调整已超出该限制的页面?索引维护期间超限?

是否可以预先定义在下一次索引维护期间应该构建索引的填充因子?

sql-server-2008 sql-server clustered-index fill-factor index-maintenance

5
推荐指数
1
解决办法
2422
查看次数

优雅地处理 T-SQL 代码中的“类枚举”幻数

我们运行 Dynamics GP,任何处理过 GP 的人都会熟悉它的所有“幻数”列,这些列代表应用程序内的各种枚举值。例如,报告查询可能如下所示:

...
WHERE sod.SOPTYPE = 2
    AND iv.VCTNMTHD = 3
    AND pod.POLNESTA IN (2, 3)
Run Code Online (Sandbox Code Playgroud)

......这与自我记录尽可能远。

起初我有一个聪明的想法,即创建一个名为“Enums”的表,用值填充它,并制作一个标量包装函数,这样你就可以像这样查询:

...
WHERE sod.SOPTYPE = Enum('Sales Doc Type', 'Order')
    AND iv.VCTNMTHD = Enum('Valuation Method', 'Average Perpetual')
    AND pod.POLNESTA IN (Enum('PO Line State', 'Released'), Enum('PO Line State', 'Change Order'))
Run Code Online (Sandbox Code Playgroud)

当然,这很糟糕,因为优化器无法看到潜在的“常量”值,因此做出了一些相当糟糕的选择,因为它必须进行基数猜测。

所以它需要是代码中的实际常量值,但我不确定 SSMS 中是否有任何很好的功能可以使这种事情变得容易。我可以(错误地)以某种方式使用代码片段或模板吗?如果我们可以进行某种查找/插入来使我们的代码看起来像这样,那就太棒了:

...
WHERE sod.SOPTYPE = /*Order*/2
    AND iv.VCTNMTHD = /*Average Perpetual*/3
    AND pod.POLNESTA IN (/*Released*/2, /*Change Order*/3)
Run Code Online (Sandbox Code Playgroud)

我也不反对检查 SSMS 加载项。

sql-server ssms t-sql enum

5
推荐指数
1
解决办法
1233
查看次数

一个通用映射表 VS 许多特定映射表

我正在尝试设计数据库表来跟踪最终用户上传的文件。
文件可以在不同的上下文中上传。
每个上下文都是一个不同的表。

举个例子:

  • 员工可以针对“每周费用”条目上传多个“收据”文件。
  • 员工可以针对“宠物”条目上传多个“照片”文件。

这个(人为的)场景中的实体/表是:

  • Employees (Id, Name)
  • Expenses (Id, Date, RequestedRefund, RequestedByEmployeeId)
  • Pets (Id, Name, Type, BelongsToEmployeeId)

我已经有一个名为的表Files,用于跟踪有关文件本身的信息:
Files (Id, Name, Size, Extension, Folder)

我的问题是关于如何根据文件记录映射费用收据上传和宠物照片上传。我知道我可以通过两种方式做到这一点:

第一个选项:

有一个通用映射表:GenericFileMap (FileId, ContextId, Type)
where

  • FileId 是文件记录的id
  • ContextId 是我试图检索的上下文记录的 ID
  • Type 是描述上下文本身的字段

在这种情况下,我会像这样获取员工的所有费用收据:

SELECT *
FROM Employee e
INNER JOIN Expenses ex ON e.Id = ex.RequestedByEmployeeId
INNER JOIN GenericFileMap g ON g.ContextId = ex.Id AND g.Type = 'expense'
INNER JOIN Files f ON g.FileId = f.Id
Run Code Online (Sandbox Code Playgroud)

第二个选项:

每个实体/上下文表都有单独的映射表: …

database-design sql-server table

5
推荐指数
1
解决办法
2309
查看次数

在查询中使用 COLLATE 的规则是什么?

我正在将一个脚本放在一起,它为我提供了对数据库对象的权限。

SELECT  permission_order=710
       ,permission_type = 'Object Level Permissions'
       ,db = db_name(),
login_=null,
role_=dp.name collate Latin1_General_CI_AS,
Obj = sys.schemas.name + '.' + so.name collate Latin1_General_CI_AS,
Permission = permission_name collate Latin1_General_CI_AS,
[script]=
'IF OBJECT_ID ('  + '''' + '['+ sys.schemas.name + '].[' + so.name + ']'  + '''' + ') IS NOT NULL ' + CHAR(10) + state_desc + 
' ' + permission_name + ' on ['+ sys.schemas.name + '].[' + so.name + '] to [' + dp.name + ']' collate Latin1_General_CI_AS …
Run Code Online (Sandbox Code Playgroud)

sql-server collation permissions scripting t-sql

5
推荐指数
1
解决办法
2005
查看次数

SQL Server 中选择查询的区分大小写排序规则

我们的 SQL Server 的排序规则设置为SQL_Latin1_General_CP1_CI_AS

我有一个要求,即我们在不同的情况下具有相同的值,但 SQL Server 会以相同的方式对待它们,因为我们的排序规则在服务器级别设置为不区分大小写。我的要求是,我需要根据一个特定查询的大小写敏感性将每个值视为不同的。我COLLATE SQL_Latin1_General_CP1_CS_ASWHERE子句中使用来强制区分大小写。我的问题是:此排序规则是否仅应用于此查询,还是最终会在列或表级别为使用此列的所有查询更改此设置?

Create Table #tmpTest 
(
id int primary key identity(1,1),
name varchar(100)
)

Insert Into  #tmpTest  values ('TestQuery'),('TESTQUERY'),('TEstquerY')

Select * from #tmpTest
 Where name = 'TestQuery'

Select * from #tmpTest
 Where name = 'TestQuery'
 Collate SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

sql-server query collation t-sql sql-server-2012

5
推荐指数
1
解决办法
1131
查看次数