У меня возникают некоторые странные сообщения об ошибках в SQL Server 2017 CU3. Я перемещаю базы данных и реорганизую файловые группы. Под «реорганизацией» я подразумеваю, что я использую хранимую процедуру, которая создает функцию разделения и схему разбиения для новой файловой группы для объекта, перестраивает индексы при разбиении и затем удаляет разбиение.
В конце у меня есть несколько пустых файловых групп. Их файлы будут удалены . Также сами файловые группы удаляются. Это работает хорошо в большинстве случаев. Однако для двух баз данных я удалил файлы ... у меня осталась файловая группа без связанного файла, но
ALTER DATABASE REMOVE FILEGROUP
выдает ошибку 5042:
Файловая группа 'xyz' не может быть удалена, потому что она не пуста.
Вопрос
Как я могу избавиться от этой пустой файловой группы ... в чем может быть проблема?
Я уже прочитал некоторые распространенные проблемы, однако они не присутствуют в моей системе:
Проверено:
SELECT * FROM sys.partition_schemes; SELECT * FROM sys.partition_functions;
0 строк ... в базе данных не осталось объектов разделения
UPDATE STATISTICS
для всех объектов в базе данныхнет эффекта
Проверяет наличие индексов в файловой группе:
SELECT * FROM sys.data_spaces ds INNER JOIN sys.indexes i ON ds.data_space_id = i.data_space_id WHERE ds.name = 'xyz'
0 строк
Проверяет объекты в файловой группе:
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' AND ds.name ='xyz'
0 строк
Я также дал DBCC SHRINKFILE
с параметром EMPTYFILE
попытку до удаления файла из файловой группы. Это не имеет смысла для меня, однако я читаю решения, чтобы описать это как исправление. Все равно ничего не дало.
Я получил некоторую надежду, прочитав этот вопрос по вине сервера, и попробовал следующее:
- Обновить всю статистику
- Отбросьте всю статистику, не связанную с индексами
Однако это не имело никакого эффекта. У меня все еще есть файловая группа, с которой не связано ни одного файла, и эта файловая группа не может быть удалена. Я полностью озадачен, поскольку это происходит в некоторых базах данных, а не в других (с той же структурой). Когда я выполняю DBCC CHECK FILEGROUP
эту пустую файловую группу, я получаю кучу сообщений об ошибках, таких как:
Не удается обработать набор строк с идентификатором 72057594712162304 объекта "STORY_TRANSLATIONSCCC" (ID 120387498), индекс "Ref90159CCC" (ID 2), поскольку он находится в файловой группе "CCC_APPLICATION_new" (ID 8), которая не была проверена.
Результаты DBCC для STORY_TRANSLATIONSCCC. Для объекта "STORY_TRANSLATIONSCCC" имеется 0 строк на 0 страницах.
Это нормально или это указывает на что-то необычное?
Этот вопрос может быть дубликатом, однако я не могу найти рабочее исправление для меня в других вопросах на dba.stackexchange. Пожалуйста, посмотрите на список того, что я уже пробовал. Это идентично решениям, описанным в разделе Невозможно удалить неиспользуемые файловые группы .
Подробнее
Может быть, это помогает понять, что я делаю, прежде чем ошибка произойдет. Я планирую переход на новый сервер. В настоящее время я тестирую это на тестовом экземпляре. Базы данных восстанавливаются с сервера prod, а модель восстановления переключается на простую. Моя цель - реструктурировать файловые группы и перейти от модели с одним файлом на файловую группу к модели с двумя файлами на файловую группу. Чтобы добиться этого, я создаю новые пустые файловые группы по два файла в каждой и перемещаю данные. К сожалению, большинство объектов имеют LOB-данные (XML и двоичные) ... поэтому я использую разбиение как помощник для перемещения lob-данных. В конце все данные находятся в новых файловых группах, а старые файловые группы пусты. Затем я удаляю все файлы и удаляю соответствующую файловую группу. Основная файловая группа остается и просто добавляется другой файл.вопрос мой . Этот процесс работает нормально, но в двух базах данных файлы могут быть удалены, а файловая группа - нет. Удивительно, но структура этих баз данных должна быть такой же, как и структура других баз данных, где не возникало никаких проблем в процессе перемещения данных и удаления старых файловых групп.
Итак, вот список файловой группы и файлов двух баз данных, где возникает проблема:
- CCC_GENTE
перед
+-----------------+------------+
| Filegroup | Filename |
+-----------------+------------+
| CCC_APPLICATION | CCC_APP |
+-----------------+------------+
| CCC_ARCHIVE | CCC_ARCHIV |
+-----------------+------------+
| CCC_AXN | CCC_AXN |
+-----------------+------------+
| CCC_GDV | CCC_GDV |
+-----------------+------------+
| PRIMARY | CCC |
+-----------------+------------+
после
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| Filegroup name | Filegroup temporary name | Filename (logical) | Status |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | - | CCC_APP | file removed, filegroup cannot be removed (error) |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | - | CCC_ARCHIV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | - | CCC_AXN | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | - | CCC_GDV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | CCC | file renamed to PRIMARY_1 |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | PRIMARY_2 | new file added |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
Я надеюсь, что это немного помогает. Есть также вторая база данных, в которой имена файловых групп отличаются, но я оставлю это для краткости.
источник
Ответы:
Двойная проверка файловых групп в базе данных
Убедитесь, что в файловой группе нет файлов, прикрепленных с помощью следующей команды:
Это создаст список файловых групп:
... и затем для каждой перечисленной файловой группы выполнить
Вывод может выглядеть так:
.... и второй вывод может быть:
Удаление файловой группы
Если у вас все еще есть файл, связанный с одной из ваших файловых групп, тогда полная команда для удаления логического файла файловой группы и самой файловой группы будет:
Файловая группа 'xyz' по умолчанию
Если вы получаете сообщение об ошибке при попытке удалить логический файл файловой группы, который выглядит следующим образом:
... тогда вам нужно установить
PRIMARY
файловую группу в качествеDEFAULT
файловой группы:Файловая группа 'xyz' доступна только для чтения
Однако, если сообщение об ошибке следующее:
... тогда вам придется удалить свойство READ_ONLY в
xyz
файловой группе:Теперь вы сможете удалить логический файл файловой группы и саму файловую группу.
Открытые транзакции
Если у вас действительно нет файла (логическое_имя / имя_файла_файла), связанного с файловой группой, которую
xyz
вы пытаетесь удалить, то выполнение резервного копирования журнала транзакций может освободить все транзакции, препятствующие дальнейшему удалению файловой группы.Наберите 911
Если ничего не помогает, вы можете рассмотреть возможность вызова в Microsoft.
Несовпадение метаданных
Добавлено после дальнейшего исследования
По-видимому, бывают случаи, когда метаданные в базе данных не отражают фактическое местоположение объектов.
Ссылка:
- ИСПРАВЛЕНИЕ: ошибка несоответствия метаданных после переключения разделов таблицы и удаления соответствующих файлов и групп файлов (поддержка Microsoft)
- ИСПРАВЛЕНИЕ: Ошибка возникает при попытке удалить или удалить группы файлов или схемы и функции разделов в SQL Server (поддержка Microsoft)
Похоже, что эти два случая были решены с помощью накопительного обновления 3 для SQL Server 2014 с пакетом обновления 1 ( SP1) и накопительного обновления 1 для SQL Server 2016 соответственно. Они не относятся к вашей ситуации, но показывают, что иногда метаданные могут быть неправильными.
Элемент, который, кажется, блокирует удаление вашей файловой группы, является индексом, который может храниться с неверными метаданными.
Возможное решение
Попробуйте перестроить индекс, на
Ref90159CCC
который ссылается сообщение об ошибке.Следующая статья описывает похожую ситуацию и показывает, как автор обнаружил виновника и разрешил ситуацию.
Справка: SQL Server: проблема с переключением разделов и метаданных (блог dbi-services.com)
Найти объекты, связанные с устаревшей файловой группой
Я установил этот скрипт, чтобы проверить как можно больше тайников для таблиц / индексов / разделов / и т. Д. это может быть связано с удаленным файлом файловой группы:
Пожалуйста, замените
DEFAULTRO
имя вашей устаревшей файловой группы (напримерCCC_APPLICATION
)Ссылка: Мой личный сценарий
Запустите его и посмотрите, отображаются ли какие-либо объекты, содержащие вашу устаревшую файловую группу. Идите с ,
data_space_id
а не с именем. Соединения намеренноFULL
улавливают любые «осиротевшие» ссылки.В качестве альтернативы используйте этот меньший скрипт для быстрой проверки элементов в устаревшей файловой группе:
Ссылка: SQL SERVER - список всех объектов, созданных для всех файловых групп в базе данных (SQLAuthority.com)
источник
...CCC_APPLICATION_new...
это временная файловая группа?) Еще несколько мыслей и попытаюсь воспроизвести в моей среде.Через четыре месяца служба поддержки Microsoft нашла решение. Действительно, была таблица, ссылающаяся на эту предположительно пустую файловую группу.
Таблица была идентифицирована следующим утверждением:
После перемещения данных в новую таблицу и удаления проблемной таблицы файловая группа была успешно удалена. Процесс перемещения данных был следующим: создать новую таблицу с той же структурой и индексами, скопировать данные с помощью SELECT INTO, удалить старую таблицу, переименовать новую таблицу (и, конечно, позаботиться о внешних ключах, если они есть во всем процессе) )
источник