Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
Нужно окончательно удалить файловую группу.
Остался последний файл, который не могу очистить.
Перенёс уже все индексы, секции, xml и прочие столбцы, осталось 690 кб непонятно чего. Большинство запросов о содержимом ФГ ничего не показывает, только есть несколько "allocation units", но они ни с чем не связываются.
SELECT a.* FROM sys.allocation_units a
INNER JOIN sys.filegroups fg ON    fg.data_space_id = a.data_space_id
AND  fg.name = 'DATA1';

allocation_unit_id typetype_desccontainer_iddata_space_idtotal_pagesused_pagesdata_pages
720576016442982401IN_ROW_DATA720575959736647682000
720576016471818241IN_ROW_DATA720575959758929922921
720576016826368001IN_ROW_DATA720575960038113282921
720576016975790081IN_ROW_DATA720575960192778242921

Что это может быть?

select @@version: Microsoft SQL Server 2016 (SP1-CU2) (KB4013106) - 13.0.4422.0 (X64)
31 июл 17, 10:35    [20687043]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Larr`,

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-allocation-units-transact-sql

автор
container_id bigint ID of the storage container associated with the allocation unit.

If type = 1 or 3, container_id = sys.partitions.hobt_id.


If type is 2, then container_id = sys.partitions.partition_id.

0 = Allocation unit marked for deferred drop


SELECT a.*, p.*
from sys.allocation_units a
inner join sys.partitions p on a.container_id = p.hobt_id
INNER JOIN sys.filegroups fg ON    fg.data_space_id = a.data_space_id
AND  fg.name = 'DATA1';
31 июл 17, 11:10    [20687196]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
Minamoto,
не так всё просто, этот запрос выдаёт 0 строк.
31 июл 17, 11:31    [20687325]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
o-o
Guest
а DBCC CHECKDB что об этой базе думает?
31 июл 17, 11:44    [20687393]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Larr`
Minamoto,
не так всё просто, этот запрос выдаёт 0 строк.


А такой?

select * 
from  sys.dm_os_buffer_descriptors AS bd 
inner join sys.allocation_units a on a.allocation_unit_id = bd.allocation_unit_id
31 июл 17, 11:46    [20687402]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
o-o
а DBCC CHECKDB что об этой базе думает?

Он долго ещё будет думать, сама база больше 3TB
Minamoto
А такой?
select * 
from  sys.dm_os_buffer_descriptors AS bd 
inner join sys.allocation_units a on a.allocation_unit_id = bd.allocation_unit_id

В общем случае, конечно, выдаёт строки, но с этими allocation_unit_id среди них нет
31 июл 17, 11:59    [20687451]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
Larr`,

DBCC SHRINKFILE (N'MY_DB' , EMPTYFILE)?
31 июл 17, 12:02    [20687461]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
Владислав Колосов
Larr`,
DBCC SHRINKFILE (N'MY_DB' , EMPTYFILE)?

Ну не my_db, а my_db_file, но ответ, конечно же:
There is insufficient space in the filegroup to complete the emptyfile operation.
31 июл 17, 12:09    [20687493]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
o-o
Guest
Larr`
o-o
а DBCC CHECKDB что об этой базе думает?

Он долго ещё будет думать, сама база больше 3TB

вы на выходных что ли не проверяли?
а когда последний раз проверяли, или "3Тб -> проверять не надо"?
у нас 2Тб за 5 часов проверяет, это при том, что туча LOBов
31 июл 17, 12:38    [20687577]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
o-o
Larr`
пропущено...

Он долго ещё будет думать, сама база больше 3TB

вы на выходных что ли не проверяли?
а когда последний раз проверяли, или "3Тб -> проверять не надо"?
у нас 2Тб за 5 часов проверяет, это при том, что туча LOBов

Именно эту проверять не надо было, поскольку это тест-зеркало от рабочей. После проверки некоторых улучшений, касаемых columnstore и memory optimized надо было её пожать и поменять с рабочей. И чек я собирался запустить перед обменом.
31 июл 17, 12:55    [20687616]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
Larr`,

так добавьте спейсу 3ТБ или урежьте "пустой" файл.
31 июл 17, 13:02    [20687636]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
o-o
Guest
Larr`
Именно эту проверять не надо было, поскольку это тест-зеркало от рабочей


зеркало получает записи лога идентичной базы,
но живет на своем диске, а база-оригинал на своем.
и если крякнет один из этих дисков, второй в общем-то будет продолжать жить,
ибо физической связи между ними ну никакой.

кстати, какие же это вы делали изменения на зеркале,
это же ридонли копия.

а еще у вас там memory optimized?
уж не его ли FG вы пытаетесь удалить?
удалить inmemory FG невозможно
31 июл 17, 13:03    [20687639]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
Владислав Колосов
Larr`,
так добавьте спейсу 3ТБ или урежьте "пустой" файл.

Не понимаю, о чём Вы...
Например, в базе 10 файловых групп, в каждой файловой группе по 10 файлов.
Мне надо удалить одну файловую группу. Таблицы и всё остальное я перенёс в другую группу, 9 из 10 файлов удалил.
Остался один файл с непонятными данными внутри. Вопрос в том, что это за данные.
31 июл 17, 13:08    [20687667]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
o-o
Larr`
Именно эту проверять не надо было, поскольку это тест-зеркало от рабочей

зеркало получает записи лога идентичной базы,
но живет на своем диске, а база-оригинал на своем.
и если крякнет один из этих дисков, второй в общем-то будет продолжать жить,
ибо физической связи между ними ну никакой.

кстати, какие же это вы делали изменения на зеркале,
это же ридонли копия.

Не надо так триггериться на слово "зеркало". Если Вам угодно, пусть будет "копия рабочей базы, которая поддерживается изменяющимися данными из рабочей"
o-o
а еще у вас там memory optimized?
уж не его ли FG вы пытаетесь удалить?
удалить inmemory FG невозможно

Нет, inmemory в другой файловой группе.

Кстати, checkdb завершился и
SQL
CHECKDB found 0 allocation errors and 0 consistency errors in database

У кого ещё предложения, что посмотреть?
31 июл 17, 16:10    [20688844]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
o-o
Guest
Larr`
Не надо так триггериться на слово "зеркало". Если Вам угодно, пусть будет "копия рабочей базы, которая поддерживается изменяющимися данными из рабочей"

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

прекрасно, когда checkdb ничего не находит.

попробуйте посмотреть вот так:

select sch.[name], obj.[name], obj.[type_desc], *
from sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, DEFAULT) pa
	join sys.all_objects obj
			on obj.[object_id] = pa.[object_id]
	join sys.schemas sch
			on sch.[schema_id] = obj.[schema_id]
where allocation_unit_id = 72057601647181824


если ничего не вернет, убирайте джойны и покажите результат просто из sys.dm_db_database_page_allocations
31 июл 17, 16:21    [20688893]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
o-o
попробуйте посмотреть вот так:
select sch.[name], obj.[name], obj.[type_desc], *
from sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, DEFAULT) pa
	join sys.all_objects obj
			on obj.[object_id] = pa.[object_id]
	join sys.schemas sch
			on sch.[schema_id] = obj.[schema_id]
where allocation_unit_id = 72057601647181824

если ничего не вернет, убирайте джойны и покажите результат просто из sys.dm_db_database_page_allocations

Кое-что вернуло. Но вроде как упоминаемая таблица хранится в другой ФГ. Что делать, ещё раз пересоздать индекс на ней?
31 июл 17, 16:31    [20688943]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Larr`
У кого ещё предложения, что посмотреть?

есть предложение вот это посмотреть, с фильтром по нужной файлгруппе:
select *,
    '(' + CONVERT (VARCHAR (6),
        CONVERT (INT,
            SUBSTRING ([sa].[first_page], 6, 1) +
            SUBSTRING ([sa].[first_page], 5, 1))) +
    ':' + CONVERT (VARCHAR (20),
        CONVERT (INT,
            SUBSTRING ([sa].[first_page], 4, 1) +
            SUBSTRING ([sa].[first_page], 3, 1) +
            SUBSTRING ([sa].[first_page], 2, 1) +
            SUBSTRING ([sa].[first_page], 1, 1))) +
    ')' AS [First Page],
    '(' + CONVERT (VARCHAR (6),
        CONVERT (INT,
            SUBSTRING ([sa].[root_page], 6, 1) +
            SUBSTRING ([sa].[root_page], 5, 1))) +
    ':' + CONVERT (VARCHAR (20),
        CONVERT (INT,
            SUBSTRING ([sa].[root_page], 4, 1) +
            SUBSTRING ([sa].[root_page], 3, 1) +
            SUBSTRING ([sa].[root_page], 2, 1) +
            SUBSTRING ([sa].[root_page], 1, 1))) +
    ')' AS [Root Page],
    '(' + CONVERT (VARCHAR (6),
        CONVERT (INT,
            SUBSTRING ([sa].[first_iam_page], 6, 1) +
            SUBSTRING ([sa].[first_iam_page], 5, 1))) +
    ':' + CONVERT (VARCHAR (20),
        CONVERT (INT,
            SUBSTRING ([sa].[first_iam_page], 4, 1) +
            SUBSTRING ([sa].[first_iam_page], 3, 1) +
            SUBSTRING ([sa].[first_iam_page], 2, 1) +
            SUBSTRING ([sa].[first_iam_page], 1, 1))) +
    ')' AS [First IAM Page]
 from sys.system_internals_allocation_units sa
31 июл 17, 16:35    [20688961]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
o-o
Guest
Larr`
o-o
попробуйте посмотреть вот так:
select sch.[name], obj.[name], obj.[type_desc], *
from sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, DEFAULT) pa
	join sys.all_objects obj
			on obj.[object_id] = pa.[object_id]
	join sys.schemas sch
			on sch.[schema_id] = obj.[schema_id]
where allocation_unit_id = 72057601647181824

если ничего не вернет, убирайте джойны и покажите результат просто из sys.dm_db_database_page_allocations

Кое-что вернуло. Но вроде как упоминаемая таблица хранится в другой ФГ. Что делать, ещё раз пересоздать индекс на ней?

так именно таблицу вернуло или ее индекс?
31 июл 17, 16:39    [20688972]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
o-o
Guest
короче, всем ребилд.
если таблица, то таблице, если индекс, то индексу.
---
надеюсь, это не LOB-page...
31 июл 17, 16:41    [20688976]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
o-o
Larr`
пропущено...

Кое-что вернуло. Но вроде как упоминаемая таблица хранится в другой ФГ. Что делать, ещё раз пересоздать индекс на ней?

так именно таблицу вернуло или ее индекс?

Вернуло таблицы на 3 из четырёх ключей. Последний не веруло, но давайте разберёмся с этими. Что делать или какие важные поля показать?
31 июл 17, 16:46    [20688990]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
o-o
Guest
ну т.е. это таблицы-кучи, а тип IN_ROW_DATA?
и они определены на другой FG?
всем троим ALTER TABLE..REBUILD
и посмотрим, почистит ли за собой место
31 июл 17, 16:52    [20689013]     Ответить | Цитировать Сообщить модератору
 Re: file cannot be removed because it is not empty  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 750
o-o
ну т.е. это таблицы-кучи, а тип IN_ROW_DATA?
и они определены на другой FG?
всем троим ALTER TABLE..REBUILD
и посмотрим, почистит ли за собой место

Это как раз таблицы с кластерными column store индексами. Судя по всему, в некоторых служебных запросах они выглядят как кучи.
Но да, я пересоздал все индексы этих таблиц, они и их allocation units исчезли из запроса, в файле осталось 80 кб и последний unit, но теперь он смог очиститься до emptyfile.
Всем спасибо!
31 июл 17, 17:24    [20689129]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить