====== Microsoft - Microsoft SQL Server - SQL - Shrink vs Truncate ======
===== Shrink =====
The **shrink** command is used to reduce the physical log file size of a database.
**NOTE:** That can be understood as de-fragmentation, file compaction, and resetting file physical pointers.
Often databases that are setup with the **simple recovery model** have corresponding backup jobs that would run during non-business hours (e.g. 2AM) as this will automatically shrink log files.
* Hence, manual intervention may not be required for this design choice.
Other recovery models such as **FULL** and **BULK-Logged** will require special considerations.
* The former will store all transactions Data Definition Language (DDL) and Data Manipulation Language (DML) in transaction log files with a sequential order.
* These logs will not auto-truncate during CHECKPOINT operations.
* The latter, BULK-Logged is similar to FULL with the main difference in that certain bulk operations are minimally logged.
* Hence, specific point-in-time data cannot be instantaneously restored without retrieving certain log files in whole.
* Hence, shrink operations are often necessary for these types of recovery models.
**WARNING:** There is an inherent risk of data loss should this process fails.
Here is a sample T-SQL to perform this task on a Full-Recovery-Model database:
Use [master]
Go
ALTER DATABASE [TestDb] SET RECOVERY SIMPLE WITH NO_WAIT
DBCC SHRINKFILE (TestDb, 1)
ALTER DATABASE [TestDb] SET RECOVERY FULL WITH NO_WAIT
GO
----
===== Truncate =====
The **truncate** command changes the status of one or more virtual log files (VLF) from active to inactive, which marks those files for overwriting or reuse.
**NOTE:** The **truncate** command can also be substituted with **NO_LOG**, which will purge a database’s transaction log.
* This may be interpreted as actual deletion.
* It is notable that sql backup jobs will also automatically truncate log files.
* However, such process will not delete files unless **NO_LOG** is specified after the backup job.
Here is a sample T-SQL to perform this task manually:
Use [master]
Go
DBCC SHRINKFILE(TestDb_Log, 1)
BACKUP LOG TestDb WITH TRUNCATE_ONLY -- NO_LOG (to delete log file)
DBCC SHRINKFILE(TestDb_Log, 1)
GO
**NOTE**:
* Adequate disk space provisioning for log files are necessary for the health and longevity of SQL Servers.
* It is recommended that log files be placed on a separate volume from the database files for better performance and administration.
* Assuming Simple Recovery models, daily database backup duration should be estimated to account for disk space truncation as that would occur automatically.
* Assuming Full or Bulk_Logged Recovery models, the **ALTER DATABASE** … **SET RECOVERY SIMPLE** command as precursor to the **SHRINK** command is necessary to reduce disk usage on a periodic basis.
* This sequence should only be executed after each **BACKUP** operations.
----