powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / спасите БД (кончилось место)
15 сообщений из 15, страница 1 из 1
спасите БД (кончилось место)
    #39935543
sure2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MSSQL 2014 (12.0.2000)
На hdd только БД, занимает 600гб, сейчас свободно 5мб и запись в БД остановилась.
Лог транзакций уже почищен и больше потереть на диске просто нечего.
База сегментирована по месяцам, начиная с 2013 года. И эта инфа больше не нужна.
Что можно экстренно придумать?
Можно как то отключить от базы и перенести старые сегменты?
Или хотя бы перенести старые сегменты на другой диск.
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39935545
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019
Можно как то отключить от базы и перенести старые сегменты?
Отключить можно, а "перенести" - куда, что вы имеете в виду? В другую базу?
sure2019
Или хотя бы перенести старые сегменты на другой диск.
Да, ALTER DATABASE ... MODYFI FILE
Конечно, если у вас сегменты лежат в отдельных файлах.
Иначе нужно писать код переноса сегментов в отдельные файлы.
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39935546
sure2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

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


дополнительно сейчас пришла мысль SHRINKFILE TRUNCATEONLY на те сегменты, которые ну точно не используются (к примеру, БД с 2013 года, запросы сейчас выполняются на >2019. Что скажете?
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39935547
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019
alexeyvg,

перенести имею ввиду на другой диск на том же сервере.
Тогда смотрите в хелпе команду ALTER DATABASE, описание MODYFI FILE.

sure2019
дополнительно сейчас пришла мысль SHRINKFILE TRUNCATEONLY на те сегменты, которые ну точно не используются (к примеру, БД с 2013 года, запросы сейчас выполняются на >2019. Что скажете?
Нет, шринк уменьшает файлы, в которых есть свободное место, а у вас секции заполнены.
Вам нужно удалить данные из секции командой TRUNCATE TABLE ... WITH PARTITIONS (WITH PARTITIONS обязательно, иначе удалите всю таблицу!!!), потом удалить логическую секцию из таблицы, а потом удалить файл секции командой ALTER DATABASE ... REMOVE FILE

Впрочем, нет, WITH PARTITIONS появилось с 2016, а у вас 2014
Тогда удалить нужно командой DELETE (что медленно, хотя можно, т.к. у вас данных мало), либо переключением секции в специальную таблицу.
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39935551
sure2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

звучит опасными экспериментами :-)
а разве сам по себе TRUNCATE не требует свободного места для выполнения операций?


экспериментально попробовал SHRINKFILE на паре старых сегментов - выиграл 30% от их объема. Получается они не то что заполнены до отказа
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39935562
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019

экспериментально попробовал SHRINKFILE на паре старых сегментов - выиграл 30% от их объема. Получается они не то что заполнены до отказа


смотри пункт 4 - там скрипт по определению свободного места в файлах
https://www.mssqltips.com/sqlservertip/1805/different-ways-to-determine-free-space-for-sql-server-databases-and-database-files/

попробуй команду DBCC SHRINKFILE (N'имяфайла', 0, TRUNCATEONLY) на каждом файле с большим кол-вом свободного места
https://www.mssqltips.com/sqlservertip/4368/execute-sql-server-dbcc-shrinkfile-without-causing-index-fragmentation/

не все файлы получится обрезать (вернуть пространство на диск), так как этот вариант команды удаляет пустое место только в _конце_ файла
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39935572
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019
звучит опасными экспериментами :-)
Эээ, почему "эксперименты"? Но да, конечно, SQL-команды опасны, они же работают с БД, можно данные удалить безвозвратно.
Рекомендую перед началом любых действий сделать бакап.

sure2019
а разве сам по себе TRUNCATE не требует свободного места для выполнения операций?
Нет, он просто удаляет, в логах появляется запись "удалено", она места не требует.

sure2019
экспериментально попробовал SHRINKFILE на паре старых сегментов - выиграл 30% от их объема. Получается они не то что заполнены до отказа
Значит, в файлах есть свободное место.
Тогда можно, как посоветовал komrad, пройтись по файлам командой DBCC SHRINKFILE (N'имяфайла', 0, TRUNCATEONLY), наверняка свободного места добавится, и можно будет спокойно заняться удалением/переносом в архив старых секций.
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940066
sure2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какая то бедулька

USE [master]
GO
ALTER DATABASE [имя базы] SET OFFLINE
ALTER DATABASE [имя базы] MODIFY FILE ( NAME=April2011,FILENAME = 'C:\новое место\April2011.ndf' );
ALTER DATABASE [имя базы] SET ONLINE
GO


alter висит уже выполняется часов.
это нормально?
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940068
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019
alter висит уже выполняется часов.
это нормально?
Да.
Код: sql
1.
ALTER DATABASE [имя базы] SET OFFLINE with rollback immediate



ЗЫ: Ошибаетесь, если считаете, что modify file сам переместит файл в новое расположение.
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940069
sure2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫ: Ошибаетесь, если считаете, что modify file сам переместит файл в новое расположение.[/quot]

Дайте ЦУ ?
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940076
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019
Дайте ЦУ ?
Сначала modify file, потом вручную перемещаете файл, затем set online
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940087
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940121
sure2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дождался alter, выполнил modify file. пытаюсь привести в online, получаю Operating system error 5: "5(Отказано в доступе.)".
Первым делом пошел смотреть права у файлов, которые перенес и у тех, что оставил на месте.
У оставленных есть владелец MSSQLSERVER
Но новым не могу назначить такого владельца, поскольку винда говорит нет такого.

Поставил "Всем пользователям" полные права. Поднялось.

Как рекомендуете проверить работоспособность базы?
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940131
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019

Как рекомендуете проверить работоспособность базы?

- база вышла в онлайн
- dbcc checkdb прошла без ошибок

если диск без ошибок, то новых проблем с базой появиться не должно
...
Рейтинг: 0 / 0
спасите БД (кончилось место)
    #39940179
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sure2019,

Так же рекомендую мониторить внутренние и внешние размеры файлов БД этим скриптом - крайне наглядно и понятно все показывает, и нули внутри дата-файлов, и параметры автоприращения.
Можно даже раскомментировать опциональную колонку по DBCC SHRINK - будет генерить соответствующие стейтменты


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
USE [CN-GFC-PBD] -- ИМЯ ВАШЕЙ БД


select db_name(sa.dbid) as DBname 
	, sa.name as LogicalName,
	DATABASEPROPERTYEX(DB_NAME(),'Recovery') AS 'Database_RecoveryMode'
	, case sa.groupid
		WHEN 0 then 'LOG'
		ELSE sfg.groupname
	  end as Filegroup
	, sa.filename as Filename
	, cast(sf.size*8/1024. as numeric(19,0))as sizeMB
	, cast(sf.spaceused*8/1024. as numeric(19,0)) as spaceusedMB
	, cast((sf.size-sf.spaceused)*8/1024. as numeric(19,0)) as freespaceMB
	, case sf.maxsize
		when -1 then 'Unlimited'
		else cast(cast(sf.maxsize*8/1024.  as numeric(19,0))as varchar(22))
	  end as maxsizeMB
	, cast(sf.growth*8/1024. as numeric(19,0)) as nextgrowthMB
	--'USE [' + convert(nvarchar(MAX), db_name(sa.dbid)) + '];DBCC SHRINKFILE (N''' + convert (nvarchar(MAX), sa.name) + ''' ,' + convert (nvarchar (MAX), convert(INT, cast(sf.spaceused*8/1024. as numeric(19,0))) + CONVERT(INT, cast(sf.growth*8/1024. as numeric(19,0))) ) + ')' AS ShrinkCMD

from master..sysaltfiles sa 
left join (
	select   cast(size as bigint) as size
			,fileid
			,groupid
			,cast(fileproperty(name,'SpaceUsed')as bigint) as spaceused 
			,cast(maxsize as bigint) as maxsize
			,cast(case 
				when status & 0x100000 = 0 then growth
				else size*growth/100
			 end as bigint) as growth
	from sysfiles
	) sf on sf.fileid=sa.fileid 
		and sf.groupid = sa.groupid
left outer join sysfilegroups sfg on sfg.groupid = sf.groupid
where sa.dbid = db_id()

--- #################################
--AND
--(
--sa.name LIKE '%2016%'
--OR sa.groupid = 0 -- LOG FILES
--)
--- #################################

order by case when sa.groupid = 0 THEN 'Y' ELSE '-' end, sa.groupid, sa.fileid


...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / спасите БД (кончилось место)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]