Невозможно удалить неиспользуемые файловые группы

Я хотел удалить некоторые неиспользуемые файловые группы /файлы в базе данных SQL Server, но застрял, потому что SQL Server считает, что файловые группы /файлы все еще используются.

Некоторая предыстория:

  • У нас были некоторые разделенные таблицы, которые мы преобразовали обратно в несегментированные.
  • Все разделы-функции и -схемы были удалены
  • Я запросил представления dm для неиспользуемых файловых групп следующим образом:

    SELECT 
    *
    FROM sys.filegroups fg
    LEFT OUTER JOIN 
    sysfilegroups sfg
    ON fg.name = sfg.groupname
    LEFT OUTER JOIN 
    sysfiles f
    ON sfg.groupid = f.groupid
    LEFT OUTER JOIN 
    sys.indexes i
    ON fg.data_space_id = i.data_space_id
    WHERE i.object_id IS NULL
    

    Это предоставило мне список файловых групп /файлов, которые я пытался удалить из базы данных. Но некоторые из них не могут быть удалены. Пример сообщения об ошибке:

    The filegroup 'FG_XXXX' cannot be removed because it is not empty.
    
  • Мне не удалось получить соединение с таблицами /индексами для этих файловых групп через sys.data_spaces и sys.indexes:

    SELECT * FROM  sys.data_spaces ds
    INNER JOIN sys.indexes i
    ON ds.data_space_id = i.data_space_id
    WHERE ds.name = 'FG_XXXX'
    
  • Я знаю, что файловая группа не может быть удалена, если она ссылается на некоторую схему разделов.
    Но это не может быть причиной здесь, поскольку я удалил все схемы /функции разделов в db.

Любые подсказки, что я могу сделать, чтобы избавиться от файловых групп?

6 голосов | спросил sarnu 29 J000000Monday13 2013, 17:14:23

5 ответов


7

У вас могут быть некоторые данные LOB (текст /изображение /varchar (max) /nvarchar (max)), которые все еще находятся в файловой группе. Не так давно я был доволен этим. Восстановление таблицы /индекса в другой файловой группе /разделе не позволяет перемещать любые данные LOB.

SELECT
    au.*,
    ds.name AS [data_space_name],
    ds.type AS [data_space_type],
    p.rows,
    o.name AS [object_name]
FROM sys.allocation_units au
    INNER JOIN sys.data_spaces ds
        ON au.data_space_id = ds.data_space_id
    INNER JOIN sys.partitions p
        ON au.container_id = p.partition_id
    INNER JOIN sys.objects o
        ON p.object_id = o.object_id
WHERE au.type_desc = 'LOB_DATA'

Если это действительно то, что происходит, самый простой способ перемещения данных LOB - это воссоздание таблицы. Вы можете перемещать данные либо с помощью bcp out /in, либо путем вставки непосредственно в новую таблицу и переименования впоследствии (или любым другим предпочтительным способом перемещения данных, которые у вас есть). Убедитесь, что вы создали правильные файловые группы для строк и текстовых данных при создании новой таблицы.

ответил db2 29 J000000Monday13 2013, 19:23:35
3

Попробуйте использовать sys.allocation_units вместо sys.indexes. BOL говорит, что это для внутреннего использования, поэтому я бы не написал долгосрочный код, но для этого все должно быть хорошо. Он указывает на первую страницу IAM каждой единицы распределения. Я считаю, что он будет работать лучше для того, что вы пытаетесь сделать.

SELECT *
FROM sys.filegroups fg
LEFT OUTER JOIN sysfilegroups sfg
    ON fg.name = sfg.groupname
LEFT OUTER JOIN sysfiles f
    ON sfg.groupid = f.groupid
LEFT OUTER JOIN sys.allocation_units i
    ON fg.data_space_id = i.data_space_id
WHERE i.data_space_id IS NULL

Также как @RobertGannon сказал, что вы можете щелкнуть правой кнопкой мыши по имени вашей базы данных, затем перейти к задачам, сжатию, файлам

введите описание изображения здесь>> </p>

<p> Затем вы можете выбрать «Пустой файл, перенести данные в другие файлы в той же файловой группе», чтобы удалить все данные из данного файла. Это не поможет вам избавиться от самой файловой группы, но это позволит вам сконденсировать ее до одного файла. </p>

<p> <img src =

ответил Kenneth Fisher 29 J000000Monday13 2013, 19:04:54
2

Я действительно нашел легкое решение для этого исправления, так как у меня была такая же проблема.

Я пытался удалить файловую группу [fg_LMeterDetail_13], но получил ошибку «не может быть удален, потому что она не пустая». Единственный грех этой файловой группы ассоциировался с схемой разделов. Эта файловая группа не имела данных.

Итак, после обнаружения нет противоположности NEXT USED, я экспериментировал и обнаружил, что вы можете выпустить другой NEXT USED, но указывая на предыдущую файловую группу:

ALTER PARTITION SCHEME ps_LMeterDetail
NEXT USED [fg_LMeterDetail_12]

После этого я смог выпустить REMOVE FILEGROUP, который затем автоматически удалял его из схемы разделов

ALTER DATABASE [WACOE] 
REMOVE FILEGROUP [fg_LMeterDetail_13]

Voila! Это сработало!

Приветствуем всех.

ответил Tung Dang 21 Jpm1000000pmThu, 21 Jan 2016 21:10:10 +030016 2016, 21:10:10
0

Сократите файлы и убедитесь, что они не являются файловой группой по умолчанию. Сокращение должно позволить вам проверить, что файл пуст, используя EMPTYFILE. SQL Server не позволит удалить группу файлов по умолчанию.

ответил Robert Gannon 29 J000000Monday13 2013, 18:05:10
0

Мне удалось отбросить файловые группы после удаления схемы разделов и затем удалить функцию раздела.

DROP PARTITION SCHEME <<PartitionSchemeName>>;
DROP PARTITION FUNCTION <<PartitoinFunctionName>>;
ALTER DATABASE DBNAME
REMOVE FILEGROUP PartitionFG
ответил Subrahmanya Hegde 1 Maypm16 2016, 19:33:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132