上下文
我们正在开发一个底部有一个大型数据库的系统。它是在 SQL Server 2008 R2 上运行的 MS SQL 数据库。数据库的总大小约为 12 GB。
其中,单个表中大约有 8.5 GB BinaryContent。顾名思义,这是一个表,我们将任何类型的简单文件作为 BLOB 直接存储在表中。最近,我们一直在测试使用 FILESTREAM 将所有这些文件从数据库移到文件系统的可能性。
我们对数据库进行了必要的修改,没有任何问题,迁移后我们的系统仍然运行良好。该BinaryContent表大致如下所示:
CREATE TABLE [dbo].[BinaryContent](
[BinaryContentID] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](50) NOT NULL,
[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL
) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG]
ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL
ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID]
Run Code Online (Sandbox Code Playgroud)
PRIMARY除了FileBinaryContent位于单独文件组中的字段外,所有内容都驻留在文件组中FileStreamContentFG。
场景
从开发人员的角度来看,我们通常希望从我们的生产环境中获得一个新的数据库副本,以便能够处理最新的数据。在这些情况下,我们很少对存储在BinaryContent(现在使用 FILESTREAM)。
我们几乎可以按照我们的意愿工作。我们备份数据库,没有像这样的文件流:
BACKUP DATABASE FileStreamDB
FILEGROUP …Run Code Online (Sandbox Code Playgroud) 在 Microsoft SQL Server 2012 上激活 FILESTREAM 功能后,SQL Server 将在系统上创建“隐藏”共享。份额定义如下:
Sharename FILESTREAM_SHARE
Path \\?\GLOBALROOT\Device\RsFx0320\<localmachine>\FILESTREAM_SHARE
Remark SQL Server FILESTREAM share
Maximum users unlimited
Users Caching Manual caching of documents
Permissions NT-AUTHORITY\Authenticated Users, FULL
Run Code Online (Sandbox Code Playgroud)
该名称是您在SQL Server 配置管理器中最初配置 FILESTREAM 时提供的共享名称。但它是为了什么?
我通读了所有可用的 FILESTREAM 文档,从以下位置开始:
sql-server-2008 sql-server database-internals sql-server-2012 filestream
我有一个包含近 1TBFILESTREAM数据的数据库,我不需要备份(如果数据被删除,它会在几个小时内自动重新创建,所以它并不重要)。大多数数据每隔几天就会更改一次,因此差异备份并不能真正帮助减小大小。
通过将恢复模式设置为Full,创建一个单独FILEGROUP的FILESTREAM,然后只备份“主要”,我让备份按照我需要的方式工作FILEGROUP。这导致的问题是日志文件(也被备份)现在不必要地大,因为它包含FILESTREAM数据。
SIMPLE恢复模式剥夺了我对特定FILEGROUPs进行备份的能力,所以我认为这也不是一种选择。
我的想法是将FILESTREAM数据移动到一个单独的数据库,但现在我正在失去参照完整性,并且肯定还会继承许多其他问题。
有没有办法在Simple恢复模式下创建部分备份(不将FILESTREAM表设置为只读)?如果没有,我的问题还有其他合理的解决方案吗?
sql-server backup transaction-log filestream sql-server-2014
我们使用文件流中的Microsoft SQL Server 2008(SP2) - 10.0.4000.0(X64)和Windows Server 2008存储数百万文件。由于有数百万个文件,所有这些文件都被分为 100 个文件组,并一个接一个地按顺序插入。现在我们在每个文件组中有大约 15K 个文件,并且预计很快会增长到 20K。所以我们想知道文件组是否有最大行数限制才能提供最佳性能,或者当我们在单个文件夹中存储或准备存储大约 <20K 个文件时,操作系统端是否有任何最大行数限制以实现最佳性能?
对正确资源的任何建议也将非常有帮助。
我有一个指向 msdn 博客的链接,其中指出
4.检查 FILESTREAM 目录容器的文件数是否不超过 300,000 个,因为 NTFS 性能下降可能是一个问题,尤其是在启用生成 8.3 文件名时。
谢谢。
我使用 SQL Server 并且有一个包含两个文件组的巨大数据库:
现在,备份方案是:
由于数据库很大,并且在远程服务器上生产,因此每当我想将数据库带到本地环境以创建测试数据库(每周一次)时,我必须同时携带主数据库和文件流。
我希望能够更改备份和还原的完成方式,只需引入主文件组,而忽略文件流。通过这种方式,每周我只会带来主要文件组,而不是所有假设文件流的信息。
我认为可能存在很多问题,并且在访问文件时所有文件流引用都可能丢失。我想知道是否可以在执行备份时修改所有文件流列的内容,或者使用测试环境中托管的不同文件流。此外,我只听说过一些文件组的零碎还原,但我对如何执行它有很多疑问。
问题1:我可以有这个场景吗?
问题 2:只有一个完整备份并将差异备份/事务日志带入测试环境是个好主意吗?
问题 3:我可以有更好的场景来备份和恢复吗?
我全神贯注于建议。如果您有任何示例案例,请向我展示 T-SQL 查询。
我们正在开展一个项目,其中我们需要在 SQL Server 中处理大量图像、文本等。我们正在考虑使用 Filestream 和 filetable 功能。然而,即使在网上搜索了大量数据后,我们也无法找到以下查询的答案:
我们正在尝试在我们的系统上创建一个共享文件夹,然后将其映射到文件流。所以我们正在创建一个共享文件夹(比如 D:\Ftable ),它的访问级别设置为每个人的完全访问权限。现在,当我们转到 SQL Server 配置管理器并尝试将此文件夹设置为 filstream 的共享文件夹(启用文件流访问的属性选项卡)时,它会向我们抛出错误:Windows 共享文件夹名称不是有效的 Windows 共享。我们知道文件流文件夹必须是本地文件夹,但是即使我们只是尝试放置不同的本地文件夹路径(如 D:\test 等),它也会给我们一个错误。
我们还想知道是否可以在映射驱动器上创建文件流共享目录?我们在一个系统上创建了一个共享文件夹,并将该文件夹映射到另一个系统上(使其显示为本地)。然而,再一次,当我们尝试将映射驱动器上的特定文件夹设置为文件流共享文件夹时,它会抛出一个错误。
非常感谢有关该主题的任何指示/帮助。我们的主要访问权限是在我们选择的物理位置创建文件流共享,该共享位置是共享的,以便我们可以远程/或通过工具将数据传输到它。
我损坏了数据库中与 FILESTREAM 相关的文件。
在.mdf和.ldf文件仍然完好,但是当我尝试上网的数据库,它抱怨,说有关FILESTREAM的文件是不正确的。
我不关心存储在 FILESTREAM 中的数据,但我关心其他数据。我可以从.mdf和.ldf文件中取回它吗?如何?
当我执行:
sp_attach_db @dbname = 'Demo',
@filename1 = N'<File path>.mdf',
@filename2 = N'<File path>.ldf'
Run Code Online (Sandbox Code Playgroud)
答复是:
Msg 5120, Level 16, State 105, Line 1
Unable to open the physical file "<Location>". Operating system error 2: "2(The system cannot find the file specified.)".
Msg 5105, Level 16, State 14, Line 1
A file activation error occurred. The physical file name '<Location>' may be incorrect. Diagnose and correct additional …Run Code Online (Sandbox Code Playgroud) 我们有一个FILESTREAM包含几百万个文件的容器,我们相信这是我们遇到的性能问题(大量超时)的原因。
根据这个关于FILESTREAM最佳实践的博客,每个容器不应超过 300,000 个文件。
根据此处接受的答案,除非将表重新创建到新FILESTREAM位置,否则无法完成它。
表的结构如下:
CREATE TABLE [dbo].[Documents](
[ContentPath] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[FileContent] [varbinary](max) FILESTREAM NULL,
CONSTRAINT [UQ_IX_Documents_ContentPath] UNIQUE NONCLUSTERED
(
[ContentPath] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] FILESTREAM_ON [FSFileGroup_1]
Run Code Online (Sandbox Code Playgroud)
我们使用的是 SQL Server 2012。不幸的是,不是 Enterprise(我们最近才意识到它支持每个文件组多个容器)。
尽管我们从不进行记录更新,但我们进行了大量写入,可能与读取一样多。模式是:一次一个,由 ContentPath 读取,并且没有特定的容器或顺序写入。
我需要在使用 FileStream 的数据库上设置数据库复制(以实现高可用性)。这是在 SQL Server 2012 标准版上,所以永远在线或对等复制不是一个选项。此外,数据库镜像不适用于 FileStream。
我剩下的唯一选择是事务复制或合并复制。我发现当所有机器都打开时,两种复制类型都可以正常工作,但是如果一台机器关闭会发生什么?
这就是我所拥有的(服务器作为虚拟机在 Microsoft Azure 上运行):
Microsoft 每月至少执行一次维护,每次最多关闭一台服务器。如何在这些机器上设置复制,以便在一台服务器关闭时实现高可用性?
replication sql-server sql-server-2012 filestream high-availability
这对我来说真的是一个令人困惑的话题。
我可以理解 BLOB 是什么,我可以轻松使用它。我能理解 FILESTREAM 是什么。我可以轻松地在数据库中实现,我可以备份数据库并使用为存储这些文件而创建的文件夹来恢复它。像这样的事情,我想,我能理解。
我不明白的是:
.PDF仅使用数据库中的 VARBINARY(MAX) 列插入(例如)与将其存储.PDF在 FILESTREAM 数据库中有什么区别。我知道 BLOB varbinary(max).PDF是在数据库内部。如果我物理删除.PDF,我仍然可以使用存储在 varbinary(MAX) 列中的值来恢复它吗?
当我在.PDF文件流中插入这个文件时,我可以在文件夹中看到它(为文件组创建的那个),如果我插入 100 个文件,我可以在文件流文件夹中看到 100 个文件,但是当我运行DELETE FROM并删除 100 行时数据库,我仍然可以在文件流文件夹中看到这些文件。为什么会发生这种情况?我认为,为了保持一致性,这些文件也会被删除。
对于这两种情况,在.PDFBLOBVARBINARY(MAX)或 FILESTREAM 中插入文件后,我还需要原始文件吗?因为它在数据库中,所以我可以很容易地恢复它。
我以 .PDF 为例
我可以使用和实施这两种方法,但我仍然不清楚它们会发生什么。对我来说,它是一样的,但是一个存储在数据库之外,另一个存储在数据库内。
filestream ×10
sql-server ×10
backup ×2
restore ×2
blob ×1
corruption ×1
replication ×1
varbinary ×1