sql-server – 规复数据库,不包罗FILESTREAM数据
上下文
个中,约莫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] 全部内容都驻留在PRIMARY文件组中,但FileBinaryContent字段除外,它位于单独的文件组FileStreamContentFG中. 剧本 我们险些凭证我们的意愿行事.我们备份数据库,没有像这样的文件流: BACKUP DATABASE FileStreamDB FILEGROUP = 'PRIMARY' TO DISK = 'c:backupFileStreamDB_WithoutFS.bak' WITH INIT 并像这样规复它: RESTORE DATABASE FileStreamDB FROM DISK = 'c:backupFileStreamDB_WithoutFS.bak' 这好像事变正常,只要我们停止行使FileBinaryContent字段的部门,我们的体系就可以事变.譬喻,我们可以运行以下查询而不会呈现题目: SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID] --,[FileContentBinary] FROM [dbo].[BinaryContent] 虽然,假如我打消注释上面的行,包罗查询中的FileContentBinary,我会收到一个错误:
我们的体系处理赏罚内容配置为null的文件,以是我想做的是这样的: UPDATE [dbo].[BinaryContent] SET [FileContentBinary] = null 但这虽然给了我同样的错误.此时我被困住了. 题 可能我是否也许以错误的方法办理题目? 我本质上是一名开拓职员,而且作为一名DBA没有太多的常识,以是假如我在这里忽略了一些微不敷道的工作,请包涵. 办理要领您实行做的工作会使数据库处于(事宜上)纷歧致的状态,因此无法实现.Partial Database Availability whitepaper是一个有效的参考指南,包罗怎样搜查特定表或文件是否在线的示例.假如您的数据会见是通过存储进程举办的,则可以相对轻松地归并该搜查. 在您的场景中也许值得一看的一种更换(但有些hacky)要领是潜匿表并用视图替代它. -- NB: SQLCMD script :ON ERROR EXIT :setvar DatabaseName "TestRename" :setvar FilePath "D:MSSQLI3Data" SET STATISTICS TIME OFF; SET STATISTICS IO OFF; SET NOCOUNT ON; GO USE master; GO IF EXISTS (SELECT name FROM sys.databases WHERE name = N'$(DatabaseName)') DROP DATABASE $(DatabaseName) GO CREATE DATABASE $(DatabaseName) ON PRIMARY ( NAME = N' $(DatabaseName)',FILENAME = N'$(FilePath)$(DatabaseName).mdf',SIZE = 5MB,MAXSIZE = UNLIMITED,FILEGROWTH = 1MB ),FILEGROUP [FG1] DEFAULT ( NAME = N' $(DatabaseName)_FG1_File1',FILENAME = N'$(FilePath)$(DatabaseName)_FG1_File1.ndf',SIZE = 1MB,FILEGROWTH = 1MB ),FILEGROUP [FG2] CONTAINS FILESTREAM ( NAME = N'$(DatabaseName)_FG2',FILENAME = N'$(FilePath)Filestream' ) LOG ON ( NAME = N'$(DatabaseName)_log',FILENAME = N'$(FilePath)$(DatabaseName)_log.ldf',FILEGROWTH = 1MB ) GO USE $(DatabaseName); GO CREATE TABLE [dbo].[BinaryContent]( [BinaryContentID] [int] IDENTITY(1,[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL UNIQUE DEFAULT (NEWSEQUENTIALID()) NOT NULL,[FileContentBinary] VARBINARY(max) FILESTREAM NULL ) ON [PRIMARY] FILESTREAM_ON [FG2] GO -- Insert test rows INSERT dbo.BinaryContent ( [FileName],[FileContentBinary] ) VALUES ( CAST(NEWID() AS VARCHAR(36)),CAST(REPLICATE(NEWID(),100) AS VARBINARY) ); GO 100 USE master; GO -- Take FILESTREAM filegroup offline ALTER DATABASE $(DatabaseName) MODIFY FILE (NAME = '$(DatabaseName)_FG2',OFFLINE) GO USE $(DatabaseName); GO -- Rename table to make way for view EXEC sp_rename 'dbo.BinaryContent','BinaryContentTable','OBJECT'; GO -- Create view to return content from table but with NULL FileContentBinary CREATE VIEW dbo.BinaryContent AS SELECT [BinaryContentID],[BinaryContentRowGUID],[FileContentBinary] = NULL FROM [dbo].[BinaryContentTable]; GO -- Check results as expected SELECT TOP 10 * FROM dbo.BinaryContent; GO (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |