Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Дали мне .BAK файл размером где-то гигабайт.
Восстанавливаю с него базу и получаю 8 .NDF фалов размером по 24 GB каждый и два .LDF файла по 20 GB каждый.
Место было, запустил на ночь и восстановил эти почто 300 GB.
Но реально данных на полтора гигабайта.
При этом в каждом и .NDF файлов есть данные.
Все файлы принадлежать к одной partition group (PRIMARY).

Вопрос:
Как мне добиться того, чтобы осталься только один файл данных и один файл логов?
25 мар 14, 11:15    [15782132]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Glory
Member

Откуда:
Сообщений: 104760
DBCC SHRINKFILE ... EMPTYFILE
25 мар 14, 11:18    [15782146]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Спасибо Glory!
25 мар 14, 11:23    [15782189]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Я так понимаю, что эта команда "размажет" данные по другим файлам?
А как заставить "передвинуть" все данные исключительно в первый файл?
25 мар 14, 11:26    [15782215]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Yuri Abele
Я так понимаю, что эта команда "размажет" данные по другим файлам?

EMPTYFILE
Migrates all data from the specified file to other files in the same filegroup.

Yuri Abele
А как заставить "передвинуть" все данные исключительно в первый файл?

Удалять файлы по одному, по-очереди ?
25 мар 14, 11:27    [15782227]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Glory
Yuri Abele
Я так понимаю, что эта команда "размажет" данные по другим файлам?

EMPTYFILE
Migrates all data from the specified file to other files in the same filegroup.

А у меня все файлы в одной группе - PRIMARY. Т.е. получается, что все будет "размазываться" по всем оставшимся файлам?

Yuri Abele
А как заставить "передвинуть" все данные исключительно в первый файл?

Удалять файлы по одному, по-очереди ?[/quot]
Но я же не могу удалить файл, пока в нем данные? Или могу? А что будет с данными?
25 мар 14, 11:34    [15782287]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Yuri Abele
А у меня все файлы в одной группе - PRIMARY. Т.е. получается, что все будет "размазываться" по всем оставшимся файлам?

Сколько раз нужно процитировать to other files in the same filegroup. ?

Yuri Abele
Но я же не могу удалить файл, пока в нем данные? Или могу? А что будет с данными?

Мда.
По-очереди выполнять DBCC SHRINKFILE ... EMPTYFILE и удаление файла.
Пока не останется только один. Как Дункан МакЛауд.
25 мар 14, 11:37    [15782299]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Glory,
мне было бы достаточно подтверждения того, что да, мною желаемое (при очистке данные перемещаются исключительно в первый файл) не возможно и теже самые данные неэффективно будут гоняться туда-сюда несколько раз.
Молчаливая же отсылка к Book-Online сбивает с толку, поэтому я и переспрашивал по несколько раз.

Спасибо еще раз за помощь!
25 мар 14, 11:42    [15782335]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Yuri Abele
Молчаливая же отсылка к Book-Online сбивает с толку

Какая молчаливая ? Что непонятного в цитате то ?
Как еще можно понять "в другие файлы этой же файловой группы" ?

Сообщение было отредактировано: 25 мар 14, 11:45
25 мар 14, 11:44    [15782343]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Glory,

было бы достаточно на мой вопрос: "А как заставить "передвинуть" все данные исключительно в первый файл?" ответить одним словом: "Никак", т.к. все файлы у меня в одной группе и сменить у файла группу уже нельзя.

Еще раз спасибо за помощь!
Пойду позавтракаю, а то разнервничался немного.
25 мар 14, 11:49    [15782376]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Yuri Abele
было бы достаточно на мой вопрос: "А как заставить "передвинуть" все данные исключительно в первый файл?" ответить одним словом: "Никак"

А следующим был бы вопрос - "А точно никак ? А может есть какой-нибудь хитрый способ ?"
25 мар 14, 11:53    [15782401]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Вообще, IMHO недоработка это в MSSQL.
Если я очищаю файл, то почти 100%-ной вероятностью для его дальнейшего удаления.
А раз так, то разумно предположить, что это не единственный файл, который я хочу удалить и дать для этого опциональную возможность явно указать куда "двигать" данные. А то в моем случае получается, что 7 раз будут данные гоняться не туда, где они в этоге будут лежать. А это гигабайты ...
25 мар 14, 11:54    [15782405]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Yuri Abele
Если я очищаю файл, то почти 100%-ной вероятностью для его дальнейшего удаления.
А раз так, то разумно предположить, что это не единственный файл, который я хочу удалить и дать для этого опциональную возможность явно указать куда "двигать" данные. А то в моем случае получается, что 7 раз будут данные гоняться не туда, где они в этоге будут лежать. А это гигабайты ...

Мда еще раз
Создайте новую файловую группу из одного файла.
Напишите скрипт по переносу туда всех пользовательских объектов
Удалите все опустевшие файлы
25 мар 14, 11:56    [15782417]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Ну ступил немного! Спасибо за наводку.
25 мар 14, 12:00    [15782437]     Ответить | Цитировать Сообщить модератору
 Re: Уменьшение количества .NDF и .LDF файлов базы  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Написал скриптик, который генерит комманды для переноса таблиц и их индексов в другую файловую группу.
Команды генерятся для таблиц без кластерного индекса (данные в HEAP), для кластерных индексов (данные к кластерном индексе) и для некластерных индексов. Всякие другие (XML индексы, spatial и т.д. не переносятся).
Для меня вроде работает, но допускаю, что для других случаев что-то не учтено:

DECLARE @FileGroupName SysName = N'DATA';

SELECT SQL=N'CREATE ' + index_constr + N' INDEX ' + index_name +
	N' ON ' + table_name + N' (' + btree_columns + N')' +
	CASE
		WHEN included_columns <> ''
		THEN ' INCLUDE (' + included_columns + ')'
		ELSE ''
	END +
	CASE
		WHEN index_type = 0 THEN ' ON [' + @FileGroupName + '];
GO
-- This table does not have clustered index
DROP INDEX ' + index_name + ' ON ' + table_name + ';'
		ELSE N' WITH DROP_EXISTING ON [' + @FileGroupName + '];'
	END + '
GO

'
FROM (
SELECT
	table_name = N'[' + schemas.name + N'].[' + tables.name + N']',
	index_name = N'[' +
		CASE
			WHEN indexes.type = 0 THEN N'CIX_' + schemas.name + N'_' + tables.name
			ELSE indexes.name
		END + ']',
	index_type = indexes.type,
	index_constr =
		CASE
			WHEN indexes.type = 0 THEN N''
			WHEN indexes.is_unique= 1 THEN N'UNIQUE '
			ELSE N''
		END
		+
		CASE indexes.type
			WHEN 1 THEN N'CLUSTERED'
			ELSE N'NONCLUSTERED'
		END,
	btree_columns = ISNULL(STUFF((
				SELECT ', [' + name + ']' +
					CASE index_columns.is_descending_key
						WHEN 1
						THEN ' DESC'
						ELSE ''
					END --, *
				FROM
					sys.columns
					INNER JOIN sys.index_columns ON
						columns.column_id = index_columns.column_id
				WHERE
					columns.object_id = indexes.object_id
					AND
					index_columns.object_id = indexes.object_id
					AND
					index_columns.index_id = indexes.index_id
					AND
					index_columns.is_included_column = 0
				ORDER BY
					index_columns.key_ordinal
				FOR XML PATH('')
			), 1, 2, ''),
			(
				SELECT '[' + columns.name + ']'
				FROM sys.columns
				WHERE columns.object_id = tables.object_id AND columns.column_id = 1
			)),
	included_columns = ISNULL(STUFF((
				SELECT ', [' + name + ']' +
					CASE index_columns.is_descending_key
						WHEN 1
						THEN ' DESC'
						ELSE ''
					END --, *
				FROM
					sys.columns
					INNER JOIN sys.index_columns ON
						columns.object_id = index_columns.object_id
						AND
						columns.column_id = index_columns.column_id
				WHERE
					columns.object_id = indexes.object_id
					AND
					index_columns.object_id = indexes.object_id
					AND
					index_columns.index_id = indexes.index_id
					AND
					index_columns.is_included_column = 1
				ORDER BY
					index_columns.key_ordinal
				FOR XML PATH('')
			), 1, 2, ''), '')
	--,*
FROM
	sys.schemas
	INNER JOIN sys.tables ON schemas.schema_id = tables.schema_id
	INNER JOIN sys.indexes ON tables.object_id = indexes.object_id
WHERE
	indexes.type IN (0,1,2) -- HEAP, CLUSTERED, NONCLUSTERED
) T
ORDER BY
	table_name,
	index_type;


код для аналога GROUP_CONCAT взял отсюда: yabele.blogspot.com
25 мар 14, 14:48    [15783800]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить