加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer 删除文件及文件组

发布时间:2020-12-12 13:26:55 所属栏目:MsSql教程 来源:网络整理
导读:由于数据库文件多了,得重新规划,所以必须得删除多余的文件和文件组。本文简单测试,最终只保留primary文件组和一个主文件。 --模拟测试USE masterGO--DROP DATABASE [TestDB]CREATE DATABASE [TestDB] ON PRIMARY ( NAME = N'TestDB',FILENAME = N'D:MSSQ

由于数据库文件多了,得重新规划,所以必须得删除多余的文件和文件组。本文简单测试,最终只保留primary文件组和一个主文件。

--模拟测试
USE master
GO
--	DROP DATABASE [TestDB]
CREATE DATABASE [TestDB] 
ON PRIMARY 
( NAME = N'TestDB',FILENAME = N'D:MSSQLDateFilesTestDBTestDB.mdf',SIZE = 102400KB,FILEGROWTH = 1024KB ),( NAME = N'file',FILENAME = N'D:MSSQLDateFilesTestDBfile.mdf',FILEGROUP [FG1] 
( NAME = N'file1',FILENAME = N'D:MSSQLDateFilesTestDBfile1.ndf',( NAME = N'file2',FILENAME = N'D:MSSQLDateFilesTestDBfile2.ndf',FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'TestDB_log',FILENAME = N'D:MSSQLDateFilesTestDBTestDB_log.ldf',SIZE = 51200KB,FILEGROWTH = 10%)
GO

USE [TestDB]
GO
CREATE TABLE [TestTab] (
    [ID] INT IDENTITY NOT NULL,[Name] CHAR (30) DEFAULT 'TEST DATA',[Value] DECIMAL(18,4) DEFAULT 0,[Date] DATETIME DEFAULT GETDATE ()
) ON [PRIMARY]
GO
CREATE TABLE [TestTab2] (
    [ID] INT IDENTITY NOT NULL,[Date] DATETIME DEFAULT GETDATE ()
) ON [FG1]
GO

--插入测试数据
SET NOCOUNT ON
INSERT INTO [TestTab] DEFAULT VALUES
GO 10000
INSERT INTO [TestTab2] DEFAULT VALUES
GO 10000
SET NOCOUNT OFF

--查看表和文件组信息,文件都存储有数据了
SELECT o.[name],o.[type],i.[name],i.[index_id],f.[name]  
FROM sys.indexes i  
INNER JOIN sys.filegroups f ON i.data_space_id = f.data_space_id  
INNER JOIN sys.all_objects o ON i.[object_id] = o.[object_id]  
WHERE o.name in( 'TestTab','TestTab2')  
GO  
DBCC showfilestats
GO


--现在移除文件,结果失败!文件中有数据,不能删除!
USE master
GO
ALTER DATABASE [TestDB] REMOVE FILE [file]
GO

/*错误信息:
Msg 5042,Level 16,State 1,Line 1
The file 'file' cannot be removed because it is not empty.
*/

--	将指定文件中的所有数据迁移到同一文件组中的其他文件
USE [TestDB]
go
DBCC SHRINKFILE ('file',EMPTYFILE);
GO
DBCC SHRINKFILE ('file2',EMPTYFILE);
GO
DBCC showfilestats
GO


--再移除文件,正常移除!
USE master
GO
ALTER DATABASE [TestDB] REMOVE FILE [file]
GO
ALTER DATABASE [TestDB] REMOVE FILE [file2]
GO

USE [TestDB]
go
DBCC showfilestats
GO

--若删除文件组或文件组中的唯一文件,出错!
USE [TestDB]
go
DBCC SHRINKFILE ('file1',EMPTYFILE);
GO
USE master
GO
ALTER DATABASE [TestDB] REMOVE FILE [file1]
GO
ALTER DATABASE [TestDB] REMOVE FILEGROUP [FG1]
GO
/*错误信息:
DBCC SHRINKFILE: Heap page 4:85 could not be moved.
Msg 2555,Line 1
Cannot move all contents of file "file1" to other places to complete the emptyfile operation.
The statement has been terminated.
DBCC execution completed. If DBCC printed error messages,contact your system administrator.
Msg 1105,Level 17,State 2,Line 1
Could not allocate space for object 'dbo.TestTab2' in database 'TestDB' because the 'FG1' filegroup is full. 
	Create disk space by deleting unneeded files,dropping objects in the filegroup,adding additional files to the filegroup,or setting autogrowth on for existing files in the filegroup.

Msg 5042,Line 1
The file 'file1' cannot be removed because it is not empty.

Msg 5042,State 7,Line 1
The filegroup 'FG1' cannot be removed because it is not empty.
*/


--因此,先把文件组 [FG1] 的数据转移到文件组 [primary] 中
USE [TestDB]
go
CREATE CLUSTERED INDEX [IX_TestTab2] ON dbo.TestTab2([ID]) ON [PRIMARY]  
GO  
--先移除文件,再移除文件组,完成!
ALTER DATABASE [TestDB] REMOVE FILE [file1]
GO
ALTER DATABASE [TestDB] REMOVE FILEGROUP [FG1]
GO


--看看最终结果!
USE [TestDB]
GO 
SELECT COUNT(*) FROM TestTab
SELECT COUNT(*) FROM TestTab2
GO 
SELECT o.[name],'TestTab2')  
GO  
DBCC showfilestats
GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读