Sql 2018 dbcc shrinkfile: DBCC SHRINKFILE (Transact-SQL) — SQL Server
Содержание
MSSQL — изменить количество файлов в tempdb
- 22 марта 2022
Допустим, у нас в tempdb только один файл данных и один файл лога. Иногда требуется добавить файлы данных.
К примеру, добавим ещё семь файлов данных:
USE [master] GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev1', FILENAME = N'R:\tempdb1.mdf' , SIZE = 8192KB , FILEGROWTH = 102400KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev2', FILENAME = N'R:\tempdb2.mdf' , SIZE = 8192KB , FILEGROWTH = 102400KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev3', FILENAME = N'R:\tempdb3.mdf' , SIZE = 8192KB , FILEGROWTH = 102400KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev4', FILENAME = N'R:\tempdb4.mdf' , SIZE = 8192KB , FILEGROWTH = 102400KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev5', FILENAME = N'R:\tempdb5.mdf' , SIZE = 8192KB , FILEGROWTH = 102400KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev6', FILENAME = N'R:\tempdb6. mdf' , SIZE = 8192KB , FILEGROWTH = 102400KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev7', FILENAME = N'R:\tempdb7.mdf' , SIZE = 8192KB , FILEGROWTH = 102400KB ) GO
Здесь:
- NAME — название файла данных
- FILENAME — полный путь к файлу данных
- SIZE — размер, в данном случае начальный, 8 МБ
- FILEGROWTH — автоматический прирост, я поставил 100 МБ
Можно ещё указывать при необходимости:
- MAXSIZE — максимальный размер, например, MAXSIZE = 35840000KB
Удалить файл данных
Если нужно удалить один из файлов данных…
USE tempdb GO CHECKPOINT GO USE tempdb GO DBCC SHRINKFILE (tempdev7, EMPTYFILE) ALTER DATABASE tempdb REMOVE FILE tempdev7 GO
Более сильное колдунство удаления:
USE [tempdb] GO DBCC DROPCLEANBUFFERS GO DBCC FREEPROCCACHE GO DBCC FREESESSIONCACHE GO DBCC FREESYSTEMCACHE ( 'ALL') GO DBCC SHRINKFILE (N'temp7' , EMPTYFILE) GO ALTER DATABASE [tempdb] REMOVE FILE temp7 GO
Если файлы заблокированы, то я изменяем размер и рост файла. Затем перезапускаем службу SQL. Aайлы маленькие и заблокированы для роста? можно их легко удалить.
--before the sql server restart USE [master] ALTER DATABASE TempDB MODIFY FILE (NAME = temp7, SIZE = 1KB, FILEGROWTH = 0 ) GO --then after the sql server restart USE [TempDB] DBCC SHRINKFILE (N'temp7' , EMPTYFILE) GO ALTER DATABASE [tempdb] REMOVE FILE [temp7] GO
Теги
- sql
- 1C
💰 Поддержать проект
Похожие материалы
Олег
- 8 февраля 2018
- Подробнее о Maintenance Plans — резервное копирование и обслуживание баз данных в Microsoft SQL Server 2014
Microsoft SQL Server 2014 позволяет воспользоваться встроенными средствами резервного копирования и обслуживания баз данных. В данном случае план предназначен для обслуживания баз данных исключительно с моделью восстановления FULL. Если вы используете другую модель восстановления, то нужно воспользоваться другим планом, потому что резервное копирование лога транзакций вам может не потребоваться.
Теги
- Windows
- sql
- 1C
- special
Олег
- 29 ноября 2018
- Подробнее о Настройка MSSQL для работы с 1С — мифы и реальность
Оптимизируем Microsoft SQL Server 2014 для работы с 1С. ОС — Windows Server 2012 R2. Напишу что нужно сделать, а что не нужно.
Теги
- 1C
- sql
- Windows
Олег
- 27 ноября 2018
- Подробнее о MSSQL — переносим tempdb на RAM диск
«1C тормозит», — говорили они, — «Перенеси tempdb в оперативку!» — говорили они. Ну перенесём, ладно.
Теги
- sql
- Windows
- 1C
Почитать
Сжатие базы данных и журнала транзакций в Microsoft SQL Server
Многие администраторы Microsoft SQL Server сталкивались с проблемой значительного увеличения физического размера базы данных и файлов журнала транзакций и, конечно же, им хотелось бы каким-то образом уменьшить этот размер, для того чтобы не предпринимать какие-либо действия, связанные с увеличением свободного пространства на жестком диске. Способ уменьшить физический размер базы данных и файлов журнала транзакций в SQL сервере есть – это сжатие.
Что такое сжатие в Microsoft SQL Server?
Сжатие — это процесс удаления неиспользуемого пространства в файлах базы данных и журнала транзакций.
Физический размер файлов базы данных со временем растет, это связанно с добавлением данных, но при их удалении физический размер файлов остается неизменным, однако в данных файлах появляется логическое неиспользуемое пространство, которое и можно удалить.
Наибольший эффект от сжатия достигается тогда, когда операция сжатия выполняется после операции удаления таблиц из БД или удаления данных из таблиц.
Следует отличать процедуру сжатия журнала транзакций от процедуры усечения журнала транзакций. Сжатие — это уменьшение физического размера журнала за счет удаления неиспользуемого пространства, а усечение – это освобождение места в логическом журнале для повторного использования (т.е. образуется неиспользуемое пространство) журналом транзакций при этом размер физического файла не уменьшается.
Усечение журнала транзакций происходит автоматически:
- В простой модели восстановления — после достижения контрольной точки, которая может возникнуть, например, после создания BACKUP базы данных, при явном выполнении инструкции CHECKPOINT, или тогда когда размер логического журнала транзакций заполняется на 70 процентов, во всех этих случаях происходит автоматическая очистка неактивной части журнала, т.е. его усечение;
- В модели полного восстановления или в модели восстановления с неполным протоколированием — после создания резервной копии журнала при условии, что с момента создания последней резервной копии журнала была достигнута контрольная точка.
Если Вы используете модель полного восстановления или в модель восстановления с неполным протоколированием и у Вас файлы журнала транзакций слишком велики, то скорей всего Вы достаточно долго не делали BACKUP (резервную копию) журнала транзакций. В данном случае Вам необходимо сделать сначала BACKUP журнала транзакций, а затем выполнить сжатие журнала транзакций, которое мы как раз и рассмотрим чуть ниже.
Также возможно размер файлов журнала транзакций слишком большой (как при простой, так и при полной модели восстановления) за счет задержки процедуры усечения, т.е. размер журнала, состоит в основном из активной части журнала, а активную часть усечь нельзя, поэтому физический размер журнала растет. На задержку процедуры усечения влияют такие факторы как: активные длительные транзакции, некоторые сценарии отображения зеркальных баз данных и журнала транзакций, некоторые сценарии при репликации транзакций и журнала транзакций, а также усечение журнала невозможно во время операций резервного копирования и восстановления данных. В данном случае Вам нужно устранить причины задержки, затем сделать усечение (т.е. например, для полной модели восстановления BACKUP журнала), а затем сжатие до приемлемых размеров.
Обычно если на постоянной основе с определенной периодичностью создаются резервные копии журнала транзакций или базы данных (при простой модели восстановления), файлы журнала транзакций не растут, и не возникает переполнение журнала транзакций.
Как сжать базу данных в MS SQL Server?
Сжать файлы базы данных и журнала транзакций можно и с помощью графического интерфейса Management Studio и с помощью инструкций Transact-SQL: DBCC SHRINKDATABASE и DBCC SHRINKFILE. Также возможно настроить базу данных на автоматическое сжатие путем выставления параметра БД AUTO_SHRINK в значение ON.
Примечание! Сжатие базы данных я буду рассматривать на примере Microsoft SQL Server 2016 Express.
Сжимаем базу данных с помощью среды Management Studio
Запускаем Management Studio и в обозревателе объектов открываем объект «Базы данных». Затем щелкаем правой кнопкой мыши по БД, которую необходимо сжать, далее выбираем «Задачи ->Сжать -> База данных (или Файлы, если, например, нужно сжать только журнал транзакций)». Я для примера выбираю «База данных».
В итоге у Вас откроется окно «Сжатие базы данных», в котором Вы, кстати, можете наблюдать размер базы данных, а также доступное свободное место, которое можно удалить (т.е. сжать). Нажимаем «ОК».
Через некоторое время, в зависимости от размера базы данных, сжатие будет завершено.
Сжимаем базу данных с помощью инструкций SHRINKDATABASE и SHRINKFILE
В MS SQL Server для выполнения сжатия файлов базы данных и журнала транзакций существуют две инструкции SHRINKDATABASE и SHRINKFILE.
- DBCC SHRINKDATABASE – это команда для сжатия базы данных;
- DBCC SHRINKFILE – с помощью данной команды можно выполнить сжатие некоторых файлов базы данных (например, только журнала транзакций).
Для того чтобы выполнить сжатие БД (например, TestBase) точно также как мы это сделали чуть ранее в Management Studio, выполните следующую инструкцию.
DBCC SHRINKDATABASE(N'TestBase')
SHRINKDATABASE имеет следующие параметры:
- database_name или database_id — имя или идентификатор базы данных, которую необходимо сжать. Если указать значение 0, то будет использоваться текущая база данных;
- target_percent – свободное пространство в процентах, которое должно остаться в базе данных после сжатия;
- NOTRUNCATE — сжимает данные в файлах с помощью перемещения распределенных страниц из конца файла на место нераспределенных страниц в начале файла. Если указан данный параметр, физический размер файла не изменяется;
- TRUNCATEONLY — освобождает все свободное пространство в конце файла операционной системе, но не перемещает страницы внутри файла. Файл данных сокращается только до последнего выделенного экстента. Если указан данный параметр, то параметр target_percent не обрабатывается;
- WITH NO_INFOMSGS — подавляет все информационные сообщения со степенями серьезности от 0 до 10.
Синтаксис SHRINKDATABASE
DBCC SHRINKDATABASE ( database_name | database_id | 0 [ , target_percent ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ) [ WITH NO_INFOMSGS ]
Для того чтобы сжать только журнал транзакций можно использовать инструкцию SHRINKFILE, например.
DBCC SHRINKFILE (N'TestBase_log')
В данном случае мы осуществим сжатие файла журнала (TestBase_log – это название файла журнала транзакций), до его начального значения, т.е. до значения по умолчанию. Для того чтобы сжать файл до определенного размера, укажите вторым параметром размер в мегабайтах. Например, следующей инструкцией мы уменьшим размер файла журнала транзакций до 5 мегабайт.
DBCC SHRINKFILE (N'TestBase_log' , 5)
Также необходимо учесть, что если Вы укажете размер меньше того, чем требуется для хранения данных в файле, то файл до этого размера сжат не будет. Например, допустим, если Вы указали 5 мегабайт, а для хранения данных в файле требуется 7 мегабайт, файл будет сжат только до 7 мегабайт.
SHRINKFILE также имеет параметры NOTRUNCATE и TRUNCATEONLY.
Синтаксис SHRINKFILE
DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ] } ) [ WITH NO_INFOMSGS ]
Рекомендации и важные моменты при сжатии базы данных
Заметка! Если Вас интересует SQL и T-SQL, рекомендую посмотреть мои видеокурсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать с использованием языка T-SQL в Microsoft SQL Server.
На этом у меня все, надеюсь, статья была Вам полезна, удачи!
Отсюда: https://info-comp.ru/sisadminst/553-compressing-database-microsoft-sql-server.html
Как очистить журнал транзакций SQL Server с помощью DBCC SHRINKFILE
Эндрю Джексон ~
Изменено: 28 февраля 2023 г. ~ Журнал транзакций SQL ~ 5 минут чтения
Журнал транзакций — это файл, который содержит все записи транзакций и модификации базы данных, сделанные каждой транзакцией в базе данных SQL Server. Файл журнала играет очень важную роль в базе данных SQL Server, когда речь идет о аварийном восстановлении, и он не должен быть в поврежденном состоянии. Мы можем восстановить базу данных с помощью информации, присутствующей в журнале транзакций SQL Server во время любой аварии. Журнал транзакций следует регулярно усекать или очищать, чтобы размер файла журнала не увеличивался. На этой странице будет обсуждаться, как очистить журнал транзакций SQL Server.
Содержание
- Зачем очищать журнал транзакций SQL Server
- Как очистить журнал транзакций SQL Server?
- Решение SQL Server Management Studio
- Командное решение T-SQL
- Заключение
Зачем очищать журнал транзакций SQL Server?
Во время работы SQL Server журнал транзакций увеличивается, если происходят какие-либо изменения в базе данных. Регулярное управление размером журнала транзакций необходимо для предотвращения заполнения журнала транзакций. Усечение журнала или очистка журнала транзакций SQL Server требуется, чтобы журнал не заполнялся.
Процесс усечения удаляет неактивные файлы виртуального журнала из логического журнала транзакций, освобождая место для повторного использования физическим журналом транзакций. Журнал транзакций в конечном итоге заполнит все дисковое пространство, выделенное для его физических файлов журнала, если он никогда не усекается. Очевидно, чтобы получить больше места, требуется задача очистки журнала транзакций SQL-сервера.
В SQL Server существует три модели восстановления. В зависимости от того, какой из них используется, различается процесс усечения:
Простая модель восстановления Резервные копии журнала транзакций не поддерживаются, процесс усечения выполняется автоматически, а пространство доступно для использования.
Модель восстановления с массовым протоколированием Нет автоматического усечения журнала, необходимо регулярно создавать резервные копии, чтобы пометить неиспользуемое пространство и сделать его доступным для перезаписи. Размер журнала можно уменьшить, используя минимальное ведение журнала для массовых операций.
Модель полного восстановления Процесс усечения аналогичен модели восстановления с неполным протоколированием. Существует высокая вероятность увеличения файла журнала, поскольку каждая транзакция, происходящая в базе данных, регистрируется в нем.
Пространство журнала транзакций можно отслеживать с помощью команды:
Как очистить журнал транзакций SQL Server?
Усечение журнала освобождает место в файле журнала для повторного использования. Поэтому это также называется очисткой журнала. Файл журнала транзакций логически разделен на небольшие фрагменты, называемые виртуальными файлами журнала (VLF). Каждый файл VLF — это единица измерения, которая может быть помечена как доступная для повторного использования (бесплатная) или недоступная для повторного использования (использованная). VLF помечается как «активный», если он используется, и «неактивный», если он свободен. Очистить журнал транзакций SQL Server означает поиск и создание VLF как бесплатных.
Примечание: Следует помнить, что усечение журнала не предназначено для уменьшения размера физического файла журнала. Log Shrinking необходим для уменьшения физического файла журнала.
Очистка журнала транзакций SQL Server включает два шага. Во-первых, нам нужно выполнить резервное копирование журнала с параметром TRUNCATE_ONLY, а следующим шагом будет использование функции DBCC SHRINKFILE для сжатия файла до требуемого размера.
BACKUP LOG WITH TRUNCATE_ONLY — не лучший вариант, поскольку он очищает все содержимое нашего журнала транзакций без его резервного копирования. Многие люди используют эту команду перед сжатием файла журнала с помощью команды DBCC SHRINKFILE, освобождающей место на диске. TRUNCATE_ONLY недоступен в более поздних версиях SQL Server.
Вместо усечения журналов транзакций мы можем использовать простой режим восстановления, в котором мы не генерируем журналы, которые не будем использовать.
Как вы только что видели, метод журнала dbcc для сжатия файла. У нас есть два варианта сделать это. Вот они:
Используйте SQL Server Management Studio
Щелкните правой кнопкой мыши базу данных и выберите: Задачи, затем Сжать, а затем выберите Файлы:
Измените тип файла на журнал.
Уменьшить файл журнала транзакций SQL с помощью T-SQL
Для простого восстановления будет использоваться следующая команда:
DBCC SHRINKFILE
(LogFileName, желаемый размер в МБ)
Для полного восстановления (только если мы не возражаем потеря данных в файле журнала), следует использовать следующие команды:
ALTER DATABASE nameDB УСТАНОВИТЬ ВОССТАНОВЛЕНИЕ ПРОСТО ИДТИ DBCC SHRINKFILE (LogFileName, желаемый размер в МБ) ИДТИ ИЗМЕНИТЬ БАЗУ ДАННЫХ nameDB УСТАНОВИТЬ ВОССТАНОВЛЕНИЕ ПОЛНОЕ
Другой способ уменьшить файл журнала транзакций SQL — создать резервную копию журнала базы данных с помощью следующей команды:
BACKUP LOG nameDB TO BackupDevice
Вот как можно узнать, как очистить файл журнала транзакций SQL Server, чтобы освободить в нем место для дальнейшего хранения транзакций. Транзакции очень важны для отслеживания изменений, происходящих в соответствующей базе данных, а также для отката в случае необходимости. Поэтому всегда проверяйте и поддерживайте файлы журнала транзакций.
Читайте также: Уменьшение файла транзакции с использованием всех методов
Заключение
Мы надеемся, что теперь пользователи могут освободить место в своей базе данных SQL Server, очистив файлы журналов. Научиться очищать файл журнала на сервере SQL с помощью запроса легко. Тем не менее, пользователи должны знать о правильной технике. Таким образом, два упомянутых выше метода могут идеально подойти пользователям.
sql server — Как быстро сжать все файлы для всех баз данных?
спросил
Изменено
3 года, 11 месяцев назад
Просмотрено
146 тысяч раз
Как в SQL Server (в данном случае 2008) быстро сжать все файлы, журналы и данные, для всех баз данных на экземпляре? Я мог бы пройти через SSMS, щелкнуть правой кнопкой мыши и выбрать «Задачи» -> «Сжать», но я ищу что-то более быстрое.
Я написал несколько сценариев «Создать базу данных» и забыл, что они имеют увеличенные размеры по умолчанию, и не нужно столько места, зарезервированного для этих файлов в этом проекте.
- sql-server
- sql-server-2008
- сжать
Когда вы выполняете «Задачи -> Сжать» из графического интерфейса, он фактически выдает команду DBCC SHRINKDATABASE
за кулисами. Попробуй это. Когда появится диалоговое окно, не нажимайте кнопку «ОК». Вместо этого нажмите кнопку «Сценарий». Вы увидите команду в окне запроса. Объедините это с запросом к sys.databases (без учета master и msdb), и вы сможете создать сценарий для сжатия всех баз данных.
Например (взято из комментария jcolebrand):
SELECT 'USE [' + d.name + N']' + CHAR(13) + CHAR(10) + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, ТОЛЬКО ОБРЕЗАТЬ)' + СИМВОЛ(13) + СИМВОЛ(10) + СИМВОЛ(13) + СИМВОЛ(10) ОТ sys.master_files мф ПРИСОЕДИНЯЙТЕСЬ к sys. databases d ON mf.database_id = d.database_id ГДЕ d.database_id > 4;
Скопируйте результат этого запроса и запустите его, чтобы сжать все ваши файлы.
7
Как насчет одной строки инструкции sql?
Пожалуйста, прочтите этот очень интересный пост в блоге, прежде чем выполнять следующую инструкцию sql.
EXEC sp_MSForEachDB 'DBCC SHRINKDATABASE (''?'' , 0)'
2
DBCC SHRINKDB (и его двоюродный брат SHRINKFILE) очень медленные, потому что в этом коде выполняется много однопоточных операций.
Гораздо более быстрый способ сжать файл базы данных:
- Выделить новую файловую группу для базы данных
- Сделайте эту файловую группу настолько большой, насколько она должна быть (используйте
sp_spaceused
, чтобы определить, насколько большой) - Перестроить все индексы в эту новую файловую группу
- Удалить старую файловую группу
Поскольку перестроения индексов выполняются параллельно, этот метод часто приводит к гораздо более быстрому сокращению базы данных. Конечно, это требует, чтобы у вас было немного дополнительного места для новой файловой группы, пока процесс продолжается. Однако вам потребуется достаточно места в новой файловой группе только для хранения самой большой файловой группы в экземпляре (поскольку вы будете освобождать пространство по мере продвижения).
Этот метод также имеет дополнительное преимущество дефрагментации ваших индексов в процессе.
3
Я немного подправил запрос, чтобы уменьшить только ЖУРНАЛ по мере его запроса:
set nocount on ВЫБИРАТЬ 'USE [' + d.name + N']' + CHAR(13) + CHAR(10) + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, ТОЛЬКО ОБРЕЗАТЬ)' + СИМВОЛ(13) + СИМВОЛ(10) + СИМВОЛ(13) + СИМВОЛ(10) ОТ sys.master_files мф ПРИСОЕДИНЯЙТЕСЬ к sys.databases d ON mf.database_id = d.database_id ГДЕ d.database_id > 4 и mf.type_desc = 'LOG'
2
Приведенный ниже код позволяет получить список несистемных баз данных, установить базу данных только для чтения, а затем сжать файл. Я сохранил этот код в нескольких ящиках SQL Server, используя задание агента SQL, где пространство всегда является проблемой. Каждую неделю в субботу/воскресенье он запускается и сокращает все базы данных в течение нескольких часов (в зависимости от размера баз данных).
объявить @db varchar(255) объявить c курсор для выберите имя из sys.databases, где is_read_only=0 и state=0 и имя не в ('мастер','модель','tempdb','msdb') открыть с извлечь c в @db в то время как @@fetch_status=0 начинать exec SP_dboption @db,'trunc. войти в chkpt.','true' База данных сжатия DBCC (@db) выбрать следующий из c в @db конец близко с освободить c
0
Мы можем динамически повторять SHRINKDB
и SHRINKFILE
для всех баз данных:
, в то время как @DBID<=@MaxDBID начинать -- Используется динамический SQL для всех баз данных. Установите @SQL = 'Использовать '+@DBName+ ' '+Char(10) Установить @SQL += 'DBCC SHRINKFILE('+@Filename+',5)' +Char(10) Установить @SQL += 'DBCC SHRINKDATABASE('+@DBName+')'+Char(10) --#6 Увеличить DBid для перебора всех баз данных Установить @DBID = @DBID+1 Выберите @DBName = DBName, @Filename=DBFileName из #DBNames, где [dbid] = @DBID и type_Desc = 'LOG' Распечатать (@SQL) Исполнитель (@SQL) конец
Подробности в этой статье.
Уменьшить все файлы журналов, кроме master, model, msdb:
EXEC sp_MSforeachdb ' DECLARE @sqlcommand nvarchar (500) ЕСЛИ ''?'' НЕ В (''мастер'', ''модель'', ''msdb'') НАЧИНАТЬ ИСПОЛЬЗОВАТЬ [?] ВЫБЕРИТЕ @sqlcommand = ''DBCC SHRINKFILE (N'''''' + имя ИЗ [sys].[database_files] ГДЕ type_desc = ''ЖУРНАЛ'' ВЫБЕРИТЕ @sqlcommand = @sqlcommand + '''''' , 0)'' EXEC sp_executesql @sqlcommand КОНЕЦ'
Этот ответ расширяет приведенный выше ответ, используя курсор для итерации операторов SQL один за другим. Он не такой короткий, как ответ Эмры, но допускает дополнительную логику в цикле while внутри курсора..
ВЫБОР
'ИСПОЛЬЗОВАТЬ ['
+ базы данных.имя + N']'
+ СИМВОЛ(13)
+ СИМВОЛ(10)
+ 'DBCC SHRINKFILE (N'''
+ masterFiles.имя
+ N''' , 0, ТОЛЬКО ОБРЕЗАТЬ)'
+ СИМВОЛ(13)
+ СИМВОЛ(10)
+ СИМВОЛ(13)
+ CHAR(10) КАК sqlCommand
В
#shrinkCommands
ОТ
[sys].[master_files] мастер-файлы
INNER JOIN [sys].[databases] базы данных ON masterFiles.