찾다
데이터 베이스MySQL 튜토리얼SQL Server 2008 事务日志物理文件过大无法缩小 分析

前段时间在做SQL Server 2008数据库维护时,遇到 日志无法收缩。最后和同事一起分析了下原因。将原因做了一个汇总。现将 分析结果

前段时间在做SQL Server 2008数据库维护时,遇到 日志无法收缩。最后和同事一起分析了下原因。将原因做了一个汇总。现将 分析结果分享一下。以共享有相同情况而又未解决的同仁们参考。

查看日志信息  
 dBCC LOGINFO('数据库名') 
 
  我们看到status=0的日志,代表已经备份到磁盘的日志文件;而status=2的日志还没有备份。当我们收缩日志文件时,收缩掉的空间其实就是status=0的空间,如果日志物理文件无法减小,这里一定能看到非常多status=2的记录。 
 
  活跃(active)的日志无法通过收缩来截断,有各种原因会使日志截断延迟,具体表现就是事务日志的物理文件无法通过截断、收缩来减小,通过下面的代码可以看到实例上每个数据库的日志截断延迟原因。 
USE [master] 
SELECT [name] ,[database_id] ,[log_reuse_wait] ,[log_reuse_wait_desc] FROM [sys].[databases]  
 
常见状态: 
log_reuse_wait_desc 值   说明 
NOTHING 当前有一个或多个可重复使用的虚拟日志文件。 
CHECKPOINT  自上次日志截断之后,尚未出现检查点,或者日志头部尚未跨一个虚拟日志文件移动(所有恢复模式)。 
这是日志截断延迟的常见原因。 
LOG_BACKUP  需要日志备份,以将日志的头部前移(仅适用于完整恢复模式或大容量日志恢复模式)。 
 
ACTIVE_BACKUP_OR_RESTORE    数据备份或还原正在进行(所有恢复模式)。 
ACTIVE_TRANSACTION  事务处于活动状态(所有恢复模式)。 
 
DATABASE_MIRRORING  数据库镜像暂停,,或者在高性能模式下,镜像数据库明显滞后于主体数据库(仅限于完整恢复模式)。 
 
REPLICATION 在事务复制过程中,与发布相关的事务仍未传递到分发数据库(仅限于完整恢复模式)。 
sp_removedbreplication 'db_test' 
 
DATABASE_SNAPSHOT_CREATION  正在创建数据库快照(所有恢复模式)。 
 
LOG_SCAN    正在进行日志扫描(所有恢复模式)。 
 
OTHER_TRANSIENT 
    此值当前未使用  
 
日志文件增长的原因 
 
SQL Server会为所有的修改记录日志,以便将来重新提交或者回滚时使用。那不停地记录,日志文件岂不会空间耗尽?为此,SQL Server设计了相对应的机制,能够定期清理日志文件中不再需要的日志记录。 
 
1. 所有没有经过"检查点"的日志记录。 
 
SQL Server定期做检查点(Checkpoint),保证所有的"脏页"都被写入硬盘。未做检查点的修改,可能仅是内存中的修改。数据文件里还没有同步。SQL Server要硬盘上的日志文件里有一份记录,以便在异常重启后重新修改。 
 
2. 所有没有提交的事务所产生的日志记录,以及在它们之后的所有日志记录。 
 
如果一个事务还没有提交,那它可以在任何时候回滚。SQL Server必须做好这种准备,以便能够从日志记录中找回修改前的数据内容,完成回滚。在SQL Server里面,所有的日志记录都有严格顺序,中间不可以有任何跳跃。所以如果某个数据库有没有提交的事务,SQL Server会标记所有从这个事务开始的日志记录(不管和这个事务有没有关系)为活动事务日志。这些日志记录都有可能"需要"被用来做回滚。 
 
3. 所有要做备份的日志记录。 
 
如果数据库设的恢复模式不是简单模式,那SQL Server就假设用户是要去备份日志记录的。所有未被备份的记录,SQL Server都会为用户保留,哪怕这些记录对数据库本身已经没有其他用途了。 
 
4. 有其他需要读取日志的数据库功能模块。 
 
除了数据库引擎,还有一些功能,比如说,事务型复制(Transactional Replication)和数据库镜像(Database Mirroring)也需要读取日志文件中的内容,完成它们的同步工作。在这些功能组件没有读取日志记录之前,SQL Server也会保留。 
 
对所有"不需要"的日志记录,SQL Server会在每个检查点做一次截断的动作,把这些记录占用的空间标志成可重用。这样这些空间就被释放出来。因为日志文件是循环使用的,只要日志文件里有这样的空间,SQL Server都会去重用,所以不会报告空间已满,或者试图去做自动增长。SQL Server做检查点的频率取决于服务器属性"Recovery Interval"。默认大概一分钟左右做一次检查点。 
 
 
如果日志文件里"需要"的记录越来越多,那就会出现日志文件不停增长的现象。通常的原因有下面几个。 
 
1. 数据库恢复模式不是简单模式,但是没有安排日志备份。 
 
对于非简单模式的数据库,只有做完日志备份后记录才会被截断。做完整备份和差异备份都不会起这个作用。 
 
2. 数据库上面有一个很长时间都没有提交的事务。 
 
由于应用程序设计的问题,有些连接可能会遗留一个事务在SQL Server里面,而不是及时提交了它。SQL Server是不会干预用户的这种行为的。只要这个连接不退出,这个事务就会永远存在,直到客户端主动提交或者回滚它。而从这个事务开启的那个时间点开始的所有日志记录,SQL Server都会保留。(做过日志备份也没有用。) 
 
3. 数据库上有一个很大的事务正在运行。 
 
例如,某个用户正在建立/重建索引,或者用DELETE/INSERT语句删除或插入大量数据等。或者用户端开了一个服务器端游标,但是没有把数据及时取走等。 
 
4. 数据库复制或者镜像出了异常。 
 
要避免日志文件不停增长,其实就是要避免上面这些情况的发生。对于一个最近不会去做日志备份的数据库,设成简单恢复模式即可。如果数据库设成了完整恢复模式,那就一定要安排定期做日志备份。如复制或镜像任务出问题,要及时解决。如果没办法解决,就必须暂时拆除复制或镜像,以防止日志记录越积越多,最终造成数据库不可使用。在设计程序的时候,也要避免事务时间过长,一个事务做太多的操作。数据库晚上或周末会做一些维护工作,例如历史数据清洗整理,数据导入导出,索引重建等。这些操作都可能写许多日志,所以要为它们预留出足够的空间,并且在做完之后及时备份。 

linux

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
데이터 처리 및 계산에 MySQL 기능을 사용하는 방법데이터 처리 및 계산에 MySQL 기능을 사용하는 방법Apr 29, 2025 pm 04:21 PM

MySQL 기능은 데이터 처리 및 계산에 사용될 수 있습니다. 1. 기본 사용에는 문자열 처리, 날짜 계산 및 수학 연산이 포함됩니다. 2. 고급 사용에는 복잡한 작업을 구현하기 위해 여러 기능을 결합하는 것이 포함됩니다. 3. 성능 최적화를 위해서는 WHERE 절에서 기능 사용 및 GroupBy 및 임시 테이블 사용을 피해야합니다.

MySQL에 데이터를 일괄 삽입하는 효율적인 방법MySQL에 데이터를 일괄 삽입하는 효율적인 방법Apr 29, 2025 pm 04:18 PM

MySQL에 데이터 삽입을위한 효율적인 방법은 다음과 같습니다. 1. InsertInto 사용 ... 값 구문 사용 ... 값 구문, 2. 트랜잭션 처리 사용, 3. 트랜잭션 처리 사용, 4. 배치 크기 조정, 5. 인덱스 비활성화, 6. Insertignore 또는 Insert ... ondupliceKeyUpdate를 사용하여 데이터베이스 작동 효율성을 크게 향상시킬 수 있습니다.

MySQL 테이블에 필드를 추가 및 삭제하는 단계MySQL 테이블에 필드를 추가 및 삭제하는 단계Apr 29, 2025 pm 04:15 PM

MySQL에서는 altertabletable_nameaddcolumnnew_columnvarchar (255) 이후에 필드를 추가하여 altertabletable_namedropcolumncolumn_to_drop을 사용하여 필드를 삭제합니다. 필드를 추가 할 때는 쿼리 성능 및 데이터 구조를 최적화하기위한 위치를 지정해야합니다. 필드를 삭제하기 전에 작업이 돌이킬 수 없는지 확인해야합니다. 온라인 DDL, 백업 데이터, 테스트 환경 및 저하 기간을 사용하여 테이블 구조 수정은 성능 최적화 및 모범 사례입니다.

MySQL 쿼리의 실행 계획을 분석하는 방법MySQL 쿼리의 실행 계획을 분석하는 방법Apr 29, 2025 pm 04:12 PM

설명 명령을 사용하여 MySQL 쿼리의 실행 계획을 분석하십시오. 1. 설명 명령은 성능 병목 현상을 찾는 데 도움이되는 쿼리의 실행 계획을 표시합니다. 2. 실행 계획에는 id, select_type, 테이블, type, cly_keys, key, key_len, ref, 행 및 추가 필드와 같은 필드가 포함됩니다. 3. 실행 계획에 따르면 인덱스를 추가하고 전체 테이블 스캔을 피하고 조인 작업 최적화 및 오버레이 인덱스를 사용하여 쿼리를 최적화 할 수 있습니다.

MySQL 하위 쿼리를 사용하여 쿼리 효율성을 향상시키는 방법MySQL 하위 쿼리를 사용하여 쿼리 효율성을 향상시키는 방법Apr 29, 2025 pm 04:09 PM

하위 쿼리는 MySQL 쿼리의 효율성을 향상시킬 수 있습니다. 1) 서브 쿼리는 데이터 필터링 및 집계 된 값을 계산하는 것과 같은 복잡한 쿼리 로직을 단순화합니다. 2) MySQL Optimizer는 하위 쿼리를 전환하여 작업에 참여하여 성능을 향상시킬 수 있습니다. 3) IN 대신에 사용하면 여러 행이 반환 오류를 피할 수 있습니다. 4) 최적화 전략에는 관련 하위 쿼리를 피하고, 사용 사용, 색인 최적화 및 하위 퀘스트 중첩을 피하는 것이 포함됩니다.

MySQL의 문자 세트 및 Collation 규칙을 구성하는 방법MySQL의 문자 세트 및 Collation 규칙을 구성하는 방법Apr 29, 2025 pm 04:06 PM

MySQL에서 문자 세트 및 콜라주를 구성하는 방법은 다음과 같습니다. 1. 서버 수준에서 문자 세트 및 콜라주 설정 : setNames'Utf8 '; setcharactersetutf8; setCollation_connection = 'utf8_general_ci'; 2. 특정 문자 세트 및 콜라주를 사용하는 데이터베이스를 만듭니다. createAbaseexample_DBCHARACTERSETUTF8COLLATEUTF8_GENERAL_CI; 3. 테이블을 만들 때 문자 세트 및 콜라주를 지정하십시오 : CreateTableAmplipt_table (idint

MySQL을 제거하고 잔류 파일을 청소하는 방법MySQL을 제거하고 잔류 파일을 청소하는 방법Apr 29, 2025 pm 04:03 PM

MySQL을 안전하고 철저하게 제거하고 모든 잔차 파일을 정리하려면 다음 단계를 따르십시오. 1. MySQL 서비스 중지; 2. MySQL 패키지 제거; 3. 구성 파일 및 데이터 디렉토리를 정리하십시오. 4. 제거가 철저한 지 확인하십시오.

MySQL에서 데이터베이스 이름을 바꾸는 방법MySQL에서 데이터베이스 이름을 바꾸는 방법Apr 29, 2025 pm 04:00 PM

MySQL에서 데이터베이스를 바꾸려면 간접적 인 방법이 필요합니다. 단계는 다음과 같습니다. 1. 새 데이터베이스를 만듭니다. 2. mysqldump를 사용하여 이전 데이터베이스를 내보내십시오. 3. 데이터를 새 데이터베이스로 가져옵니다. 4. 이전 데이터베이스를 삭제합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구