日志文件持续增长的案例
在完整恢复模式时,只有执行事务日志备份之后日志才被截断。 在日志被截断之前,有一种特殊情形导致数据文件的空间几乎没有变化,而日志文件却持续增长。一、搭
在完整恢复模式时,只有执行事务日志备份之后日志才被截断。
在日志被截断之前,有一种特殊情形导致数据文件的空间几乎没有变化,而日志文件却持续增长。
一、搭建测试环境
1. 创建数据库
CREATE DATABASE [db01]
ON PRIMARY
( NAME = N'db01', FILENAME = N'C:\sqldata\db01.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'db01_log', FILENAME = N'C:\sqldata\db01_log.ldf' , SIZE = 1024KB , FILEGROWTH = 1024KB)
ALTER DATABASE [db01] SET RECOVERY FULL
2. 创建表并插入一条新记录
USE db01
CREATE TABLE table1
(UserID int,pwd char(20),OtherInfo char(4000),modifydate datetime)
INSERT table1
VALUES ( 123,'456','this is the first record',getdate() )
3. 再插入999条记录
DECLARE @i int
SET @i=0
WHILE @i
BEGIN
INSERT INTO table1
SELECT cast(floor(rand()*100000) as int), cast(floor(rand()*100000) as varchar(20)), cast(floor(rand()*100000) as char(4000)), GETDATE()
SET @i=@i+1
END
4. 查看数据库的磁盘使用空间
此时,mdf文件为7MB,ldf文件为1MB。使用情况如下图。
二、第一次测试
1. 重复修改第一条记录
DECLARE @i int
SET @i=0
WHILE @i
BEGIN
UPDATE table1
SET pwd = cast(floor(rand()*100000) as varchar(20)),
OtherInfo=cast(floor(rand()*100000) as char(4000)),
modifydate = GETDATE()
WHERE UserID=123
SET @i=@i+1
END
2. 查看数据库的磁盘空间
查看数据库的磁盘空间,结果发现:mdf文件和ldf文件的磁盘空间都几乎没有变化。
3、原因分析
按照我们的理解:在完整恢复模式时,事务日志应当记录table1的所有数据变化的LSN记录,然后可以通过重做LSN从而恢复到任意时间点。
既然我们已经对table1的第1条记录反复修改了1000次,理论上应当在ldf文件中记录这些修改的LSN记录。可是上面的测试结果显示ldf文件的磁盘空间没有变化,说明ldf文件中没有保存所有的LSN记录。这是为什么呢?
回到事务日志的工作机制上,事务日志备份的恢复目标是什么呢?首先需要基于一个完整备份,然后从这个完整备份的最后一个LSN开始依次重做所有的LSN记录,从而将数据恢复直到最后一笔交易。
要注意到,数据库db01自创建以来,没有做过完整备份。原因终于找到了!由于没有完整备份,数据库引擎认为ldf没有必要保存这些LSN记录(VLF被自动复用),因为这些LSN记录不能用于恢复。
三、第2次测试
1. 完整备份
BACKUP DATABASE [db01]
TO DISK = N'C:\Backup\db01.bak' WITH FORMAT, INIT
2. 重复修改第1条记录
再重复修改第1条记录,反复修改1000次。
3. 查看磁盘空间
查看数据库的磁盘空间,结果发现:mdf文件仍然为7MB,而ldf文件从1MB增长到18MB。当然,如果反复修改的次数更多,将会使ldf增长更多。
4. 原因分析
如果前面没有做过事务日志备份,则ldf文件中保存着自上一次完整备份以来的所有LSN记录;如果前面有做过事务日志备份,则ldf文件中保存着自上一次事务日志备份以来的所有LSN记录。
mdf文件没有增长,是因为数据变化始终发生在第一个数据行,,始终用新的数据去覆盖旧的数据,因此不需要新的磁盘空间。而ldf文件持续增长,是因为需要新的磁盘空间用来保存所有的LSN记录。
四、场景示例
例如,某个table记录了用户最后登入某个应用系统的时间。当无数个用户频繁登入系统,即使这些用户登入应用系统后没有任何操作就退出了系统,最后导致mdf文件几乎不变而ldf文件却持续增长。
五、收缩日志文件
请参考 《如何收缩事务日志》
本文出自 “我们一起追过的MSSQL” 博客,请务必保留此出处

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

「OracleSQLでの除算演算の使用方法」 OracleSQLでは、除算演算は一般的な数学演算の1つです。データのクエリと処理中に、除算演算はフィールド間の比率を計算したり、特定の値間の論理関係を導出したりするのに役立ちます。この記事では、OracleSQL での除算演算の使用法を紹介し、具体的なコード例を示します。 1. OracleSQL における除算演算の 2 つの方法 OracleSQL では、除算演算を 2 つの異なる方法で実行できます。

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

Oracle と DB2 は一般的に使用される 2 つのリレーショナル データベース管理システムであり、それぞれに独自の SQL 構文と特性があります。この記事では、Oracle と DB2 の SQL 構文を比較し、相違点を示し、具体的なコード例を示します。データベース接続 Oracle では、次のステートメントを使用してデータベースに接続します: CONNECTusername/password@database DB2 では、データベースに接続するステートメントは次のとおりです: CONNECTTOdataba

MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

解決策: 1. ログインしているユーザーがデータベースにアクセスまたは操作するための十分な権限を持っているかどうかを確認し、ユーザーが正しい権限を持っているかどうかを確認します; 2. SQL Server サービスのアカウントに指定されたファイルまたはデータベースにアクセスする権限があるかどうかを確認します。 3. 指定されたデータベース ファイルが他のプロセスによって開かれているかロックされているかどうかを確認し、ファイルを閉じるか解放して、クエリを再実行します。管理者として試してください。Management Studio をなどとして実行します。

ネットワーク接続の監視は、コンピュータ システムの安定性とセキュリティを確保するために重要です。ネットワーク管理者であっても個人ユーザーであっても、ネットワーク接続を追跡し、関連情報をログに記録する方法があることは非常に貴重です。このブログ投稿では、ネットワーク接続を監視し、データをログ ファイルに保存するための Python スクリプトを作成する方法を説明します。 Python とその豊富なライブラリの機能を活用することで、ネットワークのステータスを定期的にチェックし、IP アドレス、タイムスタンプ、接続ステータスなどの関連詳細をキャプチャし、将来参照できるようにログ ファイルに保存するスクリプトを開発できます。このスクリプトは、ネットワーク接続に関するリアルタイムの洞察を提供するだけでなく、トラブルシューティングと分析に役立つ履歴記録も提供します。 P を書き始める前に環境をセットアップする

MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか?データの集計と統計は、データ分析と統計を実行する際の非常に重要な手順です。 MySQL は強力なリレーショナル データベース管理システムとして、データの集約と統計操作を簡単に実行できる豊富な集約機能と統計機能を提供します。この記事では、SQL ステートメントを使用して MySQL でデータの集計と統計を実行する方法を紹介し、具体的なコード例を示します。 1. カウントには COUNT 関数を使用します。COUNT 関数は最も一般的に使用されます。
