当前位置: 首页 > news >正文

SQL Server 2012 ldf日志文接太大的截断和收缩日志处理

SQL Server 2012 ldf日志文接太大的截断和收缩日志处理操作

--- SQL Server 2012 ldf日志文接太大的截断和收缩日志处理 ----- 查看所有 database 列表及详情
select * from sys.databases;-- 切换到指定的操作数据库
use testdb;-- 查询当前数据库的日志文件ID和逻辑文件名
SELECT * FROM sys.database_files;
SELECT file_id, name, type_desc, physical_name, state, state_desc FROM sys.database_files;-- 查看所有数据库的日志文件大小及使用百分比
dbcc sqlperf(logspace);-- 查询当前数据库的日志信息,包括文件内的所有VLF虚拟日志文件信息 //select * from sys.dm_db_log_info;
dbcc loginfo;-- 查询当前数据库的数据库文件空间量(已分配、未分配的大小)
SELECT file_id, type_desc,CAST(FILEPROPERTY(name, 'SpaceUsed') AS decimal(19,4)) * 8 / 1024. AS space_used_mb,CAST(size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS decimal(19,4)) AS space_unused_mb,CAST(size AS decimal(19,4)) * 8 / 1024. AS space_allocated_mb,CAST(max_size AS decimal(19,4)) * 8 / 1024. AS max_size_mb
FROM sys.database_files;-- 查询SQL Server数据库 testdb 的日志文件的分配量及使用情况:
SELECT * FROM sys.dm_db_log_space_usage;
SELECT database_id, total_log_size_in_bytes/1.0/1024/1024 AS total_log_size_mb, used_log_space_in_bytes/1.0/1024/1024 AS used_log_space_mb, used_log_space_in_percent FROM sys.dm_db_log_space_usage;
SELECT (total_log_size_in_bytes - used_log_space_in_bytes)*1.0/1024/1024 AS free_log_space_mb FROM sys.dm_db_log_space_usage;-- 前面了解了足够的日志信息以后,开始执行 DBCC SHRINKFILE 命令进行 数据文件 或 日志文件收缩操作
-- 一般不推荐缩减数据文件的大小、会对Server有较大的性能影响,一般日志文件占用磁盘大,只收缩日志文件大小,如果一定要收缩数据库文件,则 DBCC SHRINKFILE 执行时指定数据文件ID或者数据文件的逻辑文件名
-- 将文件收缩到小于创建大小、单位MB,同时将最小文件大小重置为新值,可以指定0也可以指定一个值,最终的文件大小会重置成收缩后的实际最小值
-- 若要允许 DBCC SHRINKFILE 命令收缩文件,首先需要通过将数据库恢复模式设置为 SIMPLE 来截断该文件,然后再执行 DBCCSHRINKFILE 命令收缩日志文件;
-- 如果是在实际生产环境上操作时,建议分多次操作,每次收缩一定比例,降低单次收缩的耗时,最终分多次收缩达到最终的收缩目标;USE testdb;-- Step1:截断日志-- 方法1:不备份直接截断日志(到实际的最小值)-- 注意:SQL Server 在高版本中的事务日志截断:SQL Server 已经已停用 BACKUP LOG WITH NO_LOG 和 WITH TRUNCATE_ONLY 选项,
-- 高版本中使用完整恢复模式或大容量日志恢复模式时,如果必须删除数据库中的日志备份链,请切换至简单恢复模式,操作完后,再设回完整恢复模式-- 高版本需要将数据库恢复模式设置为简单模式
-- ALTER DATABASE testdb SET RECOVERY SIMPLE;-- 不备份直接截断日志(到实际的最小值)
DBCC SHRINKFILE (testdb_log, 0);
-- DBCC SHRINKFILE (testdb_log, 0);
-- DBCC SHRINKFILE (2, 0);  //也可以用 file_id 方式-- 方法2:备份日志、会自动截断(方法1和方法2,根据自己的事业业务场景二选一操作即可)
-- 前提是需要有数据库备份存在,否则会报错提示数据库备份不存在;
-- 数据库备份存在以后,后续可以只备份LOG日志文件
BACKUP DATABASE testdb TO Disk = 'D:\Backup\testdb.bak' WITH NOFORMAT, NOINIT, COMPRESSION;
BACKUP LOG testdb TO Disk = 'D:\Backup\testdb_log.bak' WITH NOFORMAT, NOINIT, COMPRESSION;
-- 高版本已不再支持 BACKUP LOG DBNAME WITH NO_LOG; 直接截断日志-- Step2:收缩日志文件-- 收缩日志文件、减小日志文件大小、释放磁盘空间
-- 参数 TruncateOnly 的用处是把:“将文件末尾的所有可用空间释放给操作系统,但不在文件内部执行任何页移动”,上面的语句的作用,只能把文件结尾部分有限的空闲数据页回收。也就不能完全达到数据库收缩的作用了。
DBCC SHRINKFILE (testdb_log, TRUNCATEONLY);-- 高版本将数据库恢复模式设置回完整恢复模式
-- ALTER DATABASE testdb SET RECOVERY FULL;-- Step3: 查看结果-- 可以通过 sys.databases 系统视图查看事务日志不能被截断的原因
SELECT log_reuse_wait, log_reuse_wait_desc FROM sys.databases WHERE name='testdb';-- 查看所有数据库的日志文件大小及使用百分比
dbcc sqlperf(logspace);-- 查询当前数据库的日志信息,包括文件内的所有VLF虚拟日志文件信息 //select * from sys.dm_db_log_info。日志收缩成功后VLF条目也会少很多
dbcc loginfo;-- 查询当前数据库的数据库文件空间量(已分配、未分配的大小)
SELECT file_id, type_desc,CAST(FILEPROPERTY(name, 'SpaceUsed') AS decimal(19,4)) * 8 / 1024. AS space_used_mb,CAST(size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS decimal(19,4)) AS space_unused_mb,CAST(size AS decimal(19,4)) * 8 / 1024. AS space_allocated_mb,CAST(max_size AS decimal(19,4)) * 8 / 1024. AS max_size_mb
FROM sys.database_files;-- 查询SQL Server数据库 testdb 的日志文件的分配量及使用情况:
SELECT * FROM sys.dm_db_log_space_usage;
SELECT database_id, total_log_size_in_bytes/1.0/1024/1024 AS total_log_size_mb, used_log_space_in_bytes/1.0/1024/1024 AS used_log_space_mb, used_log_space_in_percent FROM sys.dm_db_log_space_usage;
SELECT (total_log_size_in_bytes - used_log_space_in_bytes)*1.0/1024/1024 AS free_log_space_mb FROM sys.dm_db_log_space_usage;

截断日志&收缩日志也可以合并成1条命令执行:

-- 截断日志&收缩日志(减小日志文件大小、释放磁盘空间)
-- DBCC SHRINKFILE (testdb_log, 0); //仅直接截断日志到实际的最小值,日志文件大小不会减小、末尾剩余空间不会释放
-- DBCC SHRINKFILE (testdb_log, TRUNCATEONLY); //仅收缩日志文件,如果成功,文件会减小、释放给磁盘
-- 参数 TruncateOnly 的用处是把:“将文件末尾的所有可用空间释放给操作系统,但不在文件内部执行任何页移动”,上面的语句的作用,只能把文件结尾部分有限的空闲数据页回收。也就不能完全达到数据库收缩的作用了
-- 把截断和收缩操作合并成一条命令执行: DBCC SHRINKFILE (testdb_log, 0, TRUNCATEONLY)
DBCC SHRINKFILE (testdb_log, 0, TRUNCATEONLY);-- 查询结果状态,可以通过 sys.databases 系统视图查看事务日志不能被截断(被延迟)的原因,
SELECT log_reuse_wait, log_reuse_wait_desc FROM sys.databases WHERE name='testdb';-- 如果是 LOG_BACKUP 说明需要日志备份,以将日志的头部前移(仅适用于完整恢复模式或大容量日志恢复模式)。日志备份不会妨碍截断。等下次完成日志备份后,日志头部将会前移,从而使得一些日志空间可能变为可重复使用。
BACKUP LOG testdb TO Disk = 'D:\Backup\testdb_log.bak' WITH NOFORMAT, NOINIT, COMPRESSION

相关问题介绍

如果 SQL Server 数据库的事务日志已满(达到了设定的事务日志文件大小的最大值),则 SQL Server 数据库引擎 会发出 9002 错误。 当数据库联机或恢复时,日志可能会满。 
如果日志在数据库处于联机状态时已满,则该数据库仍会保持联机状态,但只能读取,不能更新。 
如果恢复过程中日志已满,则数据库引擎将数据库标记为 RESOURCE PENDING。
不管哪种情况,都需要 DBA 用户执行操作才能使日志空间可用。因此,平时使用过程中,DBA 就应该频繁的进行维护处理,避免日志文件写满。


SQL Server 官方关于解决事务日志已满的问题(SQL Server 错误 9002)的说明参考:

https://learn.microsoft.com/zh-cn/sql/relational-databases/logs/troubleshoot-a-full-transaction-log-sql-server-error-9002?view=sql-server-ver15


导致已满事务日志的常见原因:

对已满事务日志的正确响应取决于导致日志已满的情况。 常见原因包括:
1)日志未截断(生产环境中,即使在简单恢复模式,也可能是由于很早就 Begin Transaction 打开的长事务,还没有 Commit/Rollback 而导致事务一直未关闭,从而导致事务日志截断被阻断,从而导致日志文件一直增长);
2)磁盘卷已满;
3)日志大小设置为固定的最大值或禁用自动增长;
4)无法完成复制或可用性组同步。

如果是有大事务未关闭而导致日志截断被阻断一直增长,可以手动执行 CHECKPOINT [checkpoint duration] 命令来将缓存中的数据提交写入到 mdf 文件中。指定多长时间内(单位秒)数据库系统完成 checkpoint 操作。


事务日志截断:

关于事务日志截断,官方的说法如下:

日志截断将释放日志文件的空间,以便由事务日志重新使用。 必须定期截断事务日志,防止占满分配的空间。 几个因素可能延迟日志截断,因此监视日志大小很重要。 某些操作可以最小日志量进行记录以减少其对事务日志大小的影响。

日志截断从 SQL Server 数据库的逻辑事务日志中删除不活动的虚拟日志文件 (VLF),释放逻辑日志中的空间以便物理事务日志重用这些空间。 如果事务日志从不截断,它最终将填满分配给物理日志文件的所有磁盘空间。

为了避免空间不足,除非由于某些原因延迟日志截断,否则将在以下事件后自动进行截断:

1)简单恢复模式下,在检查点之后发生。

2)在完整恢复模式或大容量日志恢复模式下,如果自上一次备份后生成检查点,则在日志备份后进行截断(除非是仅复制日志备份)。

3)首次使用完整恢复模式创建数据库时,事务日志将根据需要重复使用(类似于使用简单恢复模式的数据库),直到创建完整数据库备份为止。

有关详细信息,请参阅本文后面的可能延迟日志截断的因素(https://learn.microsoft.com/zh-cn/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-ver16&redirectedfrom=MSDN#factors-that-can-delay-log-truncation)

日志截断不会减小物理日志文件的大小。 若要减少物理日志文件的物理大小,则必须收缩日志文件。 有关收缩物理日志文件大小的信息,请参阅管理事务日志文件的大小(https://learn.microsoft.com/zh-cn/sql/relational-databases/logs/manage-the-size-of-the-transaction-log-file?view=sql-server-ver16)。 但是,请记住可能延迟日志截断的因素(https://learn.microsoft.com/zh-cn/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-ver16&redirectedfrom=MSDN#factors-that-can-delay-log-truncation)。 如果在日志收缩后还需要存储空间,则会再次增加事务日志,导致在增加日志操作期间产生性能开销。


是什么阻止了日志截断

可以通过查询 sys.databases 目录视图的 log_reuse_wait 和 log_reuse_wait_desc 列:

SELECT log_reuse_wait, log_reuse_wait_desc FROM sys.databases;

有关延迟日志截断的原因的说明,可参考官方说明:

事务日志:https://learn.microsoft.com/zh-cn/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-ver15

可能延迟日志截断的因素:https://learn.microsoft.com/zh-cn/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-ver15#factors-that-can-delay-log-truncation

如何解决事务日志写满的问题

有多重方法来解决该问题:

1)截断日志

  截断日志常见的解决方案是确保为数据库执行事务日志备份,此操作将确保日志被截断。
  
  截断事务日志和收缩事务日志是有区别的:
  
  a)日志截断是一种逻辑操作,通常发生在事务日志备份期间,用于删除日志中已提交的记录;
  
  b)而日志收缩操作,则是通过减小文件大小来回收文件系统上的物理空间。
  
     收缩数据文件通过将数据页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间。在文件末尾创建足够的可用空间后,可以取消对文件末尾的数据页的分配并将它们返回给文件系统。
  
     若要通过将文件中的可用空间返回到操作系统来减小物理日志文件的物理大小,请收缩日志文件。只有当事务日志文件包含未使用的空间时,收缩才会产生影响。
     
  c)日志截断发生在虚拟日志文件 (VLF) 边界上,并且一个日志文件可能包含许多 VLF。仅当某个日志文件内有可回收的空白空间时,才能收缩该日志文件。
  
  d)仅收缩日志文件并不能解决完整日志文件的问题。相反,必须找出日志文件已满且不能截断的原因。
  
  注意:被移动用来收缩文件的数据可以分布到文件的任何可用位置。 这将导致索引碎片并可能会使搜索索引范围的查询变慢。 若要消除碎片,请考虑在收缩后重新生成文件的索引。
  
  重新生成索引(ALTER INDEX REBUILD),可参考官方介绍:https://learn.microsoft.com/zh-cn/sql/relational-databases/indexes/reorganize-and-rebuild-indexes?view=sql-server-ver15#rebuild-an-index
  
2)将日志文件移至其他更大的磁盘;

3)更改日志大小限制或不设限制启用自动增长:
  如果日志磁盘上具有可用空间,则可以增加日志文件的大小。 日志文件的最大大小是每个日志文件 2 TB。

大部分场景日志文件写满,都是接近或达到了磁盘的存储上限。因此,大部分场景都是需要考虑用截断日志的方案来处理,截断日志文件并收缩日志文件来减小日志文件大小、从而达到回收磁盘空间的效果。
 


DBCC SHRINKFILE 命令介绍

收缩当前数据库的指定数据或日志文件大小
可以使用它将一个文件中的数据移到同一文件组中的其他文件,这会清空文件,从而允许删除数据库。 
可以将文件收缩到小于创建大小,同时将最小文件大小重置为新值。

DBCC SHRINKFILE 命令语法:

DBCC SHRINKFILE   
(  
    { file_name | file_id }   
    { [ , EMPTYFILE ]   
    | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]  
    }  
)  
[ WITH 
  {     
      [ WAIT_AT_LOW_PRIORITY 
        [ ( 
            <wait_at_low_priority_option_list>
        )] 
      ] 
      [ , NO_INFOMSGS]
  }
]
       
< wait_at_low_priority_option_list > ::=  
    <wait_at_low_priority_option>
    | <wait_at_low_priority_option_list> , <wait_at_low_priority_option>
 
< wait_at_low_priority_option > ::=
    ABORT_AFTER_WAIT = { SELF | BLOCKERS }


DBCC SHRINKFILE 命令参数:

file_name:是已收缩文件的逻辑名称。文件名必须符合标识符的规则。有关更多信息,请参见使用标识符。

file_id:是要收缩的文件的标识 (ID) 号。若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles。

target_size:是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,DBCC SHRINKFILE 将文件大小减少到默认文件大小。
如果指定 target_size,DBCC SHRINKFILE 将试图将文件收缩到指定大小。将要释放的文件部分中的已使用页将重新定位到保留的文件部分中的可用空间。
例如,如果数据文件为 10MB,则带有 target_size 为 8 的 DBCC SHRINKFILE 将导致文件最后 2 MB 中所有已用页重新分配到文件前 8 MB 中的任何可用槽中。
DBCC SHRINKFILE 不会将文件收缩到小于存储文件中的数据所需要的大小。例如,如果使用 10MB 数据文件中的7 MB,带有 target_size 为 6 的 DBCC SHRINKFILE 语句只能将该文件收缩到 7 MB,而不能收缩到 6 MB。

EMPTYFILE:将所有数据从指定文件中迁移到同一文件组中的其它文件。SQL Server 不再允许将数据放在用于 EMPTYFILE 选项的文件上。该选项允许使用 ALTER DATABASE 语句除去文件。

NOTRUNCATE :导致将释放的文件空间保留在文件中。
当与 target_size 一起指定 NOTRUNCATE 时,释放的空间不会释放给操作系统。
DBCC SHRINKFILE 的唯一影响是将已使用的页从 target_size 行上面重新定位到文件的前面。当未指定 NOTRUNCATE 时,所有释放的文件空间返回给操作系统。

TRUNCATEONLY:导致文件中的任何未使用的空间释放给操作系统,并将文件收缩到上一次分配的大小,从而减少文件大小,而不移动任何数据。不尝试将行重新定位到未分配页。如果使用 TRUNCATEONLY,将忽略 target_size。

-- 截断日志(不进行备份而是直接截断,注意风险)
DBCC SHRINKFILE ('YourDatabaseName_log', EMPTYFILE);

-- 收缩日志文件
SELECT file_id, name FROM sys.database_files;
DBCC SHRINKFILE ('YourDatabaseName_log', TRUNCATEONLY);
DBCC SHRINKFILE (file_id/name, TRUNCATEONLY);
-- 参数 TruncateOnly 的用处是把:“将文件末尾的所有可用空间释放给操作系统,但不在文件内部执行任何页移动”,上面的语句的作用,只能把文件结尾部分有限的空闲数据页回收。也就不能完全达到数据库收缩的作用了。

-- 清空文件
-- 下面的示例展示了如何清空文件,这样文件就能从数据库中删除。 为了方便此示例进行展示,先创建包含数据的数据文件
-- Create a data file and assume it contains data.
ALTER DATABASE testdb02
ADD FILE (
    NAME = testdb02_data2,
    FILENAME = 'C:\testdb02_data2.ndf',
    SIZE = 5MB
    );
-- Empty the data file.
DBCC SHRINKFILE (testdb02_data2, EMPTYFILE);
-- Remove the data file from the database.
ALTER DATABASE testdb02 REMOVE FILE testdb02_data2;

-- 切换数据库恢复模式:简单模式 | 完整恢复模式
ALTER DATABASE YourDatabaseName SET RECOVERY SIMPLE;
ALTER DATABASE YourDatabaseName SET RECOVERY FULL;


-- 如果在执行无错误、收缩操作后文件大小未改变,请尝试执行以下操作来验证文件是否有足够的可用空间
SELECT name, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0 AS available_space_mb FROM sys.database_files;

-- 可以通过 sys.databases 系统视图查看事务日志不能被截断的原因
SELECT log_reuse_wait, log_reuse_wait_desc FROM sys.databases WHERE name='testdb';


-- 删除数据文件或日志文件
ALTER DATABASE testdb02 REMOVE FILE testdb02_dat2;
ALTER DATABASE testdb02 REMOVE FILE testdb02_log2;


BACKUP LOG 命令

-- 备份并截断事务日志: Back up the transaction log (full and bulk-logged recovery models)
-- 备份事务日志会自动截断日志
-- 更多 BACKUP 命令的详细介绍,可参考官网介绍:https://learn.microsoft.com/zh-cn/sql/t-sql/statements/backup-transact-sql?view=sql-server-ver16

语法:
BACKUP LOG
  { database_name | @database_name_var }
  TO <backup_device> [ ,...n ]
  [ <MIRROR TO clause> ] [ next-mirror-to ]
  [ WITH { <general_WITH_options> | <log_specific_options> } [ ,...n ] ]
[;]

eg: 
BACKUP LOG YourDatabaseName TO Disk = 'D:\Backup\YourDatabaseLog.bak' WITH NOFORMAT, NOINIT, COMPRESSION

注意:

1,收缩数据文件的影响
数据库使用数据文件(扩展名是 mdf 或 ndf)来存储数据,使用日志文件(扩展名是 ldf)来存储事务日志,通常情况下,数据文件会持续增长,不会自动释放空闲空间,这样会导致硬盘空间耗尽。

如果一个数据库的文件有很多空闲空间,收缩数据库文件是一种解决硬盘空间紧张的直接方式。

原理与影响:

  在 SQL Server 中,我们可以使用 DBCC ShrinkFile 命令收缩数据文件,该命令首先将文件尾部的区(extent)移动到文件的开头,文件结尾的空闲的硬盘空间被释放给操作系统。

  这种操作就像截断将文件的尾部一样,这种方式不需要消耗很多IO就能释放空间。

    但是,如果空闲部分不在文件末尾时,收缩操作必须扫描数据文件,并对正在读取的页面加锁,把文件末尾的区移动到文件开头,这是一个IO密集型的操作,影响数据库的性能。
    
    注意:

  1)收缩操作不是一个独占行为,在做文件收缩时,其他用户仍然可以对数据库进行读写操作;

  2)收缩会锁表,会阻塞;

  3)在任意一个时间点停止 dbcc shrinkfile 收缩命令,任何已经完成的工作都将保留。

建议:

    1)收缩数据库是非常耗费server性能的操作,如果没有必要不要收缩;

  2)收缩无非就是把已经分配给数据库文件空间收回来,但是:收缩的时候要移动数据页,而且可能造成大量的碎片,影响性能;

  3)日志收缩和数据文件收缩不一样,日志中的VLF(Virtual Log File)虚拟文件状态只有在可复用时候才能收缩。而且凡是有活动的日志的日志虚拟文件都是活动的不能收缩。

    4)如果收缩日志失败,可以通过 sys.databases 系统视图查看事务日志不能被截断的原因。例如:SELECT log_reuse_wait, log_reuse_wait_desc FROM sys.databases WHERE name='testdb';


2,日志中的VLF(Virtual Log File)虚拟文件状态的4种状态(Status):

    active:     表示VLF中存在活动的事务(即未完成的事务);
    recoverable:表示VLF中的事务全部已经完成,但是某些操作(例如数据库镜像、复制等)还需要用到这些数据,因此不可以被覆盖;
    reusable:   表示VLF中的数据已经不需要了,可以被覆盖;
    unused:     表示VLF从未被使用。
    
    例如:
    use testdb;
    dbcc loginfo;
    
    执行 dbcc loginfo 的返回信息说明:
    FileID = 2 表示数据库的第2个文件,对于 testdb 这个测试库,第2个文件就是唯一的 LDF 文件。
    FileSize   表示 VLF 的大小。
    FSeqNo     表示 VLF 的序列号,如果为零则表示这个 VLF 未被使用。
    CreateLSN  如果为零表示创建数据库时就同时创建了这些 VLF;如果不为零则表示在 LSN 产生时才创建这个 VLF。
    Status     表示 VLF 的状态。0:则表示这个 VLF 为 reusable 或者 unused。2:则表示这个 VLF 为 active 或者 recoverable。
    
    在简单恢复模式时,自动或手动 checkpoint 操作,以及对数据库做完全备份都会将 recoverable 状态的 VLF 标记成 Status=0,这些VLF可以被不断重用。如果没有大量的事务导致 checkpoint 延迟或者“脏数据”回写延迟,LDF事务日志文件就不需要增长。
  收缩日志文件时,数据库引擎会检查 VLF 的状态,将 Status=0(即 reusable 和 unused )的 VLF 所占用的空间释放出来,然后 LDF 再收缩它的边界。


3,收缩数据文件或日志文件的影响
    1)日志文件收缩,回收磁盘空间。
  2)数据文件根据设计,设计的大小,一般情况不用收缩,收缩可能带来性能的问题。


4,日志增长
  如果选择的日志恢复模型是完全(FULL)模式,如果没有日志截断,则日志会增长的很大。

5,运维建议
    
    方案1--生产环境最好是定期备份数据库和日志文件
    1)备份日志:BACKUP LOG DBNAME TO disk='备份设备' [with option]
           BACKUP DATABASE testdb TO disk = 'D:\Backup\testdb.bak' WITH NOFORMAT, NOINIT, COMPRESSION;
           BACKUP LOG testdb TO disk = 'D:\Backup\testdb_log.bak' WITH NOFORMAT, NOINIT, COMPRESSION;
           备份日志同时会自动进行日志截断。
  
    方案2--测试环境可以直接截断日志并收缩日志文件:
    1)截断日志:BACKUP LOG DBNAME WITH NO_LOG;
           注意:
           在低版本中的事务日志截断:在简单恢复模式下,备份了数据库后会自动截断日志;而在完整恢复模式下,只有备份了事务日志后方才截断日志。但是,截断过程有时也可能发生延迟。
           在高版本中的事务日志截断:SQL Server 已经已停用 BACKUP LOG WITH NO_LOG 和 WITH TRUNCATE_ONLY 选项。 高版本中使用完整恢复模式或大容量日志恢复模式时,如果必须删除数据库中的日志备份链,请切换至简单恢复模式。
           例如:SQL Server 高版本已停用 BACKUP LOG WITH NO_LOG 和 WITH TRUNCATE_ONLY,官网有详细介绍 https://learn.microsoft.com/zh-cn/sql/t-sql/statements/backup-transact-sql?view=sql-server-ver16
    
    2)然后收缩日志文件大小:DBCC SHRINKFILE(2, 10);

    最后再释放文件空间给操作系统磁盘:
    DBCC SHRINKFILE(2, TRUNCATEONLY);

6,BACKUP 命令和其他命令的互操作性&影响:

在数据库仍在使用时,SQL Server 使用联机备份过程对数据库进行备份。 在备份过程中,可以进行多个操作;例如:在执行备份操作期间允许使用 INSERT、UPDATE 或 DELETE 语句。

在数据库或事务日志备份的过程中无法运行的操作包括:

  1)文件管理操作,例如带有 ADD FILE 或 REMOVE FILE 选项的 ALTER DATABASE 语句。

  2)收缩数据库或文件操作。 这包括自动收缩操作。

如果备份操作与文件管理或 DBCC SHRINK 操作重叠,则会出现冲突。 无论哪个冲突操作先行开始,第二个操作总会等待第一个操作设置的锁超时(超时期限由会话超时设置控制)。 如果在超时期限内释放锁,第二个操作将继续执行。 如果锁超时,则第二个操作失败。

相关文章:

SQL Server 2012 ldf日志文接太大的截断和收缩日志处理

SQL Server 2012 ldf日志文接太大的截断和收缩日志处理操作 --- SQL Server 2012 ldf日志文接太大的截断和收缩日志处理 ----- 查看所有 database 列表及详情 select * from sys.databases;-- 切换到指定的操作数据库 use testdb;-- 查询当前数据库的日志文件ID和逻辑文件名 S…...

java日志门面之JCL和SLF4J

文章目录 前言一、JCL1、JCL简介2、快速入门3、 JCL原理 二、SLF4J1、SLF4J简介2、快速入门2.1、输出动态信息2.2、异常信息的处理 3、绑定日志的实现3.1、slf4j实现slf4j-simple和logback3.2、slf4j绑定适配器实现log4j 4、桥接旧的日志框架4.1、log4j日志重构为slf4jlogback的…...

Oracle DB运维常用的视图及数据字典

List item 本文介绍一些Oracle DB日常运维最常用到&#xff08;使用频率很高&#xff09;的视图及数据字典 用户有关的常用视图&#xff1a; 1、 查看当前用户的缺省表空间* SQL>select username,default_tablespace from user_users; 2、 查看当前用户的角色 SQL>sele…...

vue.config.js devServer中changeOrigin的作用

问题 vue开发时&#xff0c;为了解决前端跨域问题&#xff0c;通常在vue.config.js配置 devServer proxy devServer: {proxy:{/api: {target: http://b.com,changeOrigin: false},}, }官方文档http-proxy options对changeOrigin的解释 option.changeOrigin: true/false, Defa…...

基于Ubuntu 20.04 LTS上部署MicroK8s(最小生产的 Kubernetes)

目录 文章目录 目录简介Kubernetes简介MicroK8s简介Ubuntu系统MicroK8s的优势安装环境基本要求执行安装命令加入群组(使用非 root 用户访问)开启 dashboard 仪表盘查看服务名称查看仪表盘开放的端口打开浏览器检查状态打开你想要的服务(使用附加组件)开始使用 microk8s访问 Kub…...

Spring:项目中的统一异常处理和自定义异常

介绍异常的处理方式。在项目中&#xff0c;都会进行自定义异常&#xff0c;并且都是需要配合统一结果返回进行使用。 1.背景引入 &#xff08;1&#xff09;背景介绍 为什么要处理异常&#xff1f;如果不处理项目中的异常信息&#xff0c;前端访问我们后端就是显示访问失败的…...

有点快要跟不上时代的感觉

团队的群里面有一个同事突然问了下&#xff0c;下面的这个 JavaScript 如何进行优化 var startIndex (start undefined || start null) ? null : start[0].Value;看上面的代码就是典型的判断和返回的问题。 如果是要调试的话也不是做不出来&#xff0c;但可能要花点时间&a…...

【pytorch】pytorch入门4:神经网络的卷积层

文章目录 前言一、定义概念 缩写二、性质三、代码总结参考文献 前言 使用 B站小土堆课程的笔记 一、定义概念 缩写 卷积层是神经网络中用于突出特征来进行分类任务的层。 二、性质 卷积核例子&#xff1a;vgg16 model 三、代码 添加库 python代码块import os import …...

【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力

目录 &#x1f354; LSTM介绍 &#x1f354; LSTM的内部结构图 2.1 LSTM结构分析 2.2 Bi-LSTM介绍 2.3 使用Pytorch构建LSTM模型 2.4 LSTM优缺点 &#x1f354; 小结 学习目标 &#x1f340; 了解LSTM内部结构及计算公式. &#x1f340; 掌握Pytorch中LSTM工具的使用. &…...

QT学习笔记之文件操作

你千万不要跟任何人谈起任何事。你只要一谈起&#xff0c;就会想念起每一个人来。 在ui界面添加一个LineEdit(lEt)、QPushButton(btn)、QWidget widget.cpp #include "widget.h" #include "ui_widget.h" #include <QFile> #include <QFileDialo…...

Mybatis XML配置文件操作数据库

Mybaits在操作数据库时&#xff0c;可以有两种方式&#xff1b;第一种是使用注解的方式操作&#xff0c;另一种是使用XML配置文件的方式&#xff1a;一般而言&#xff0c;若没有特别的要求&#xff0c;则编写一些简单的SQL语句&#xff0c;可以直接使用注解的方式&#xff1b;编…...

Ansible-template模块动态生成特定文件

文章目录 一、Jinja2介绍什么是主要特性安装基本用法进阶特性总结 Jinja2与Ansible关系1. 模板引擎2. Ansible 的依赖3. 变量和模板4. 动态生成配置5. 社区和生态系统总结 二、Ansible如何使用Jinja2使用template模块Jinja2文件中使用判断和循环Jinja2文件中使用判断语法 Jinja…...

【Hadoop】【vim编辑器】【~/.bashrc 文件】如何编辑

1. 进入 vim 编辑器 在终端中输入以下命令&#xff1a; vim ~/.bashrc 2. 进入插入模式 打开文件后&#xff0c;你将处于普通模式。在普通模式下&#xff0c;你不能直接编辑文本。 要进入插入模式&#xff0c;请按下 i 键。这时&#xff0c;你应该会看到屏幕底部出现 -- 插…...

vs code自动报错

让vs code自动报错&#xff0c; 点击插件 → 搜索error lens → 点击install&#xff0c; 下载完后&#xff0c;编写的代码有问题就会自动报错了。 5、修改默认缩进字符 点击设置&#xff08;settings&#xff09; → 点击常用设置 → 修改字符缩进。...

详细分析Nginx中的proxy_pass 末尾斜杠

目录 前言1. 基本知识2. Demo 前言 对于Nginx的讲解&#xff0c;更多推荐阅读&#xff1a; Nginx配置静态网页访问&#xff08;图文界面&#xff09;Nginx将https重定向为http进行访问的配置&#xff08;附Demo&#xff09;Nginx从入门到精通&#xff08;全&#xff09;详细分…...

数据结构:双指针—移动0(OJ283)

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

LeetCode - 850 矩形面积 II

题目来源 850. 矩形面积 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中&#xff08;x1&#xff0c;y1&#xff09;是矩形 i 左下角的坐标&#xff0c; (xi1, yi1) 是该…...

Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像

1.定义参数&#xff1a; 使用 booleanParam 定义一个布尔参数&#xff0c;示例如下 booleanParam(name: BUILD_DOCKER, description: 是否构建Docker镜像, defaultValue: false)2.使用参数&#xff1a; 在 stage 中&#xff0c;根据参数的值决定构建方式&#xff1a; stage(编…...

C++入门基础知识86(实例)——实例11【计算自然数之和】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于计算自然数之和相关内容&#xff01; 关…...

ChatGPT与R语言融合技术在生态环境数据统计分析、绘图、模型中的实践与进阶应用

自2022年GPT&#xff08;Generative Pre-trained Transformer&#xff09;大语言模型的发布以来&#xff0c;它以其卓越的自然语言处理能力和广泛的应用潜力&#xff0c;在学术界和工业界掀起了一场革命。在短短一年多的时间里&#xff0c;GPT已经在多个领域展现出其独特的价值…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...