Filegroup trong SQL là gì

Kiểm tra hai nhóm trong cơ sở dữ liệu

Xác minh rằng filegroup không có bất kỳ tệp nào được đính kèm bằng cách ban hành lệnh sau:

use [DB] go sp_helpfilegroup

Điều này sẽ tạo ra một danh sách các nhóm fileg:

groupname | groupid | filecount -----------+---------+----------- PRIMARY | 1 | 1 xyz | 2 | 1

... và sau đó cho mỗi nhóm được liệt kê thực thi

use [DB] go sp_helpfilegroup @filegroupname='PRIMARY' go sp_helpfilegroup @filegroupname='xyz'

Đầu ra có thể trông như thế này:

groupname | groupid | filecount -----------+---------+------------ xyz | 2 | 1

.... và đầu ra thứ hai có thể là:

file_in_group | fileid | filename | size | maxsize | growth ------------------+--------+-----------------------------------+---------+-----------+--------- xyz_logical_name | 3 | X:\SQL\SQL_DATA\xyz_filegroup.ndf | 5120 KB | Unlimited | 1024 KB

Xóa tập đoàn

Nếu bạn vẫn có một tệp được liên kết với một trong các nhóm fileg của bạn, thì lệnh hoàn chỉnh để xóa tệp logic của filegroup và chính filegroup sẽ là:

USE [DB] GO ALTER DATABASE [DB] REMOVE FILE [xyz_logical_name] GO ALTER DATABASE [DB] REMOVE FILEGROUP [xyz] GO

Filegroup 'xyz' là mặc định

Nếu bạn nhận được thông báo lỗi khi cố xóa tệp logic của filegroup trông như thế này:

Msg 5031, Level 16, State 1, Line 88 Cannot remove the file 'xyz_logical_name' because it is the only file in the DEFAULT filegroup.

... sau đó bạn sẽ phải đặt PRIMARY filegroup thành DEFAULT filegroup:

ALTER DATABASE [DB] MODIFY FILEGROUP [PRIMARY] DEFAULT

Filegroup 'xyz' được đọc một lần

Tuy nhiên, nếu thông báo lỗi là như sau:

Msg 5055, Level 16, State 2, Line 88 Cannot add, remove, or modify file 'xyz_logical_name'. The file is read-only.

... sau đó bạn sẽ phải xóa thuộc tính READ_ONLY trên xyz filegroup:

ALTER DATABASE [DB] MODIFY FILEGROUP [xyz] READWRITE

Bây giờ bạn có thể loại bỏ tệp logic của filegroup và chính filegroup.

Giao dịch mở

Nếu bạn thực sự không có tệp [logic_name/pyhsical_file_name] được liên kết với filegroup xyz bạn đang cố xóa, thì việc thực hiện sao lưu nhật ký giao dịch có thể giải phóng bất kỳ giao dịch nào cản trở việc xóa thêm filegroup.

Quay số 911

Nếu vẫn thất bại, bạn có thể muốn xem xét mở một cuộc gọi với Microsoft.

Không phù hợp siêu dữ liệu

Đã thêm sau khi nghiên cứu thêm

Rõ ràng có những trường hợp khi siêu dữ liệu trong cơ sở dữ liệu không phản ánh vị trí thực tế của các đối tượng.

Tham khảo :
[.__.] - CỐ ĐỊNH: Lỗi không thống nhất siêu dữ liệu sau khi bạn chuyển phân vùng bảng và thả các tệp và nhóm tệp tương ứng [Hỗ trợ của Microsoft]
[.__.] - CỐ ĐỊNH: Xảy ra lỗi khi bạn cố gắng thả hoặc xóa các nhóm tệp hoặc các lược đồ và chức năng phân vùng trong SQL Server [Hỗ trợ của Microsoft]

Hai trường hợp này dường như đã được giải quyết với Cập nhật tích lũy 3 cho SQL Server 2014 SP1 và Cập nhật tích lũy 1 cho SQL Server 2016. Chúng không áp dụng cho tình huống của bạn, nhưng chúng cho thấy rằng đôi khi siêu dữ liệu có thể sai.

Mục dường như đang chặn việc xóa nhóm của bạn là chỉ mục, có thể được lưu trữ với dữ liệu meta sai.

Giải pháp có thể

Xem xét xây dựng lại chỉ mục Ref90159CCC được tham chiếu trong thông báo lỗi.

Cannot process rowset ID 72057594712162304 of object "STORY_TRANSLATIONSCCC" [ID 120387498], index "Ref90159CCC" [ID 2], because it resides on filegroup "CCC_APPLICATION_new" [ID 8], which was not checked.

Bài viết sau đây mô tả một tình huống tương tự và chỉ ra cách tác giả phát hiện ra thủ phạm và giải quyết tình huống.

Tham khảo :SQL Server: vấn đề phân vùng và siêu dữ liệu không nhất quán [ Blog dbi-service.com]

Tìm các đối tượng liên quan đến Filegroup đã lỗi thời

Tôi đã dựng lên kịch bản này để kiểm tra càng nhiều nơi ẩn càng tốt cho các bảng/chỉ mục/phân vùng/v.v. điều đó vẫn có thể liên quan đến tệp filegroup bị bỏ:

Vui lòng thay thế DEFAULTRO bằng tên của nhóm fileg lỗi thời của bạn [ví dụ: CCC_APPLICATION]

/* ================================================================== Author......: hot2use Date........: 16.02.2018 Version.....: 0.1 Server......: LOCALHOST [first created for] Database....: StackExchange Owner.......: - Table.......: - Type........: Script Name........: ADMIN_Filegroup_Statement_All_Objects.sql Description.: Checks all objects related to filegroups based on the ............ relationship between the data_space_id ID. ............ History.....: 0.1 h2u First created ............ ............ ================================================================== */ DECLARE @nvObsoleteFG AS NVARCHAR[50] SET @nvObsoleteFG = N'DEFAULTRO' SELECT -- DISTINCT use in conjunction with sys.allocation_units table and objects '-->' AS DataSpaceNfo ,ds.name AS DataSpaceName ,ds.data_space_id AS DatSpacID_DataSpace ,'-->' AS FileGroupNfo ,f.name AS FileGrpName ,f.data_space_id AS DatSpacID_FileGrp ,f.[type] AS FileGrpType ,'-->' AS DataBaseFilesNfo ,df.data_space_id AS DatSpacID_DBFiles ,df.[type] AS DBFilesType ,df.name AS DBFilesName ,'-->' AS ObjectNfo ,o.[object_id] AS OjbID ,o.name AS ObjName4HeapsClusters ,o.type_desc AS ObjTypeDesc ,'-->' AS IndexNfo ,i.name AS ObjName4Indexes ,i.type_desc AS IndTypeDesc ,i.[object_id] AS IndObjID ,i.index_id AS IndIndID ,'-->' AS PartSchemaNfo ,ps.name AS PartSchemaName ,ps.data_space_id AS DatSpacID_PartSchema -- ,au.type_desc AS AllocUnitTypeDesc -- ,au.data_space_id AS DatSpacID_AllocUnit FROM sys.data_spaces AS ds FULL JOIN sys.filegroups AS f ON ds.data_space_id = f.data_space_id FULL JOIN sys.database_files AS df ON f.data_space_id = df.data_space_id FULL JOIN sys.indexes AS i ON f.data_space_id = i.data_space_id FULL JOIN sys.partition_schemes AS ps ON f.data_space_id = ps.data_space_id FULL JOIN sys.objects AS o ON i.[object_id] = o.[object_id] -- FULL JOIN sys.allocation_units AS au -- ON au.data_space_id = f.data_space_id -- If you omit the whole WHERE clause you get an overview of everything [incl. MS objects] WHERE o.is_ms_shipped = 0 -- if you omit the lower AND you'll get all items related to all filegroups AND [ df.data_space_id=[ SELECT data_space_id FROM sys.filegroups WHERE NAME = @nvObsoleteFG ] OR f.data_space_id=[ SELECT data_space_id FROM sys.filegroups WHERE NAME = @nvObsoleteFG ] OR df.data_space_id=[ SELECT data_space_id FROM sys.filegroups WHERE NAME = @nvObsoleteFG ] OR ps.data_space_id=[ SELECT data_space_id FROM sys.filegroups WHERE NAME = @nvObsoleteFG ] ]

Tham khảo : Kịch bản cá nhân của tôi

Chạy nó và xem nếu có bất kỳ đối tượng nào được hiển thị có chứa filegroup lỗi thời của bạn. Đi với data_space_id chứ không phải với tên. Các phép nối được cố ý FULL để bắt bất kỳ tài liệu tham khảo "mồ côi" nào.

Hoặc sử dụng tập lệnh nhỏ hơn này để kiểm tra nhanh các mục trong nhóm tệp lỗi thời:

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 i.data_space_id = f.data_space_id AND o.type = 'U' -- User Created Tables

Tham khảo :SQL SERVER - Liệt kê tất cả các đối tượng được tạo trên tất cả các nhóm trong cơ sở dữ liệ [SQLAuthority.com]

Video liên quan

Chủ Đề