关于日志的疑虑? 给分!

我学sql有近一个月时间,但对日志概念很模糊?对其的了解仅限于可也去维护数据,可记录数据库系统的操作的层面?
但我一直没由操作过,也不知如何去运用它,请列位帮小弟一把,走过这段误区,又分相送!能写出简单的代码更好,谢谢!

---------------------------------------------------------------

要经常压缩你的日志哦!
---------------------------------------------------------------

你看看联机帮助吧!

下面的代码,也许对你有用,你自己研究一下!

SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT

USE WebRoot -- 要操作的数据库名
SELECT @LogicalFileName = 'WebRoot_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 100 -- 你想设定的日志文件的大小(M)

-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)

DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

---------------------------------------------------------------

日志可用来恢复你的一些操作
它记录着你数据库所有操作的过程
如果你已有一个完整的数据库备份之后进行过一些操作后又有操作,导致数据库损坏的话 可用你的完整备份加这些事务日志备份来恢复。。。。。。
---------------------------------------------------------------

数据库必须至少包含一个数据文件和一个事务日志文件。数据和事务日志信息从不混合在同一文件中,并且每个文件只能由一个数据库使用。

SQL Server 使用各数据库的事务日志来恢复事务。事务日志是数据库中已发生的所有修改和执行每次修改的事务的一连串记录。事务日志记录每个事务的开始。它记录了在每个事务期间,对数据的更改及撤消所做更改(以后如有必要)所需的足够信息。对于一些大的操作(如 CREATE INDEX),事务日志则记录该操作发生的事实。随着数据库中发生被记录的操作,日志会不断地增长。

事务日志记录页的分配和释放,以及每个事务的提交或回滚。这允许 SQL Server 采用下列方式应用(前滚)或收回(回滚)每个事务:

在应用事务日志时,事务将前滚。SQL Server 将每次修改后的映象复制到数据库中,或者重新运行语句(如 CREATE INDEX)。这些操作将按照其原始发生顺序进行应用。此过程结束后,数据库将处于与事务日志备份时相同的状态。

当收回未完成的事务时,事务将回滚。SQL Server 将所有修改前的映象复制到 BEGIN TRANSACTION 后的数据库。如果遇到表示执行了 CREATE INDEX 的事务日志记录,则会执行与该语句逻辑相反的操作。这些前映象和 CREATE INDEX 逆转将按照与原始顺序相反的顺序进行应用。
在检查点处,SQL Server 确保所有已修改的事务日志记录和数据库页都写入磁盘。在重新启动 SQL Server 时所发生的各数据库的恢复过程中,仅在不知道事务中所有的数据修改是否已经从高速缓冲中实际写入磁盘时才必须前滚事务。因为检查点强迫所有修改的页写入磁盘,所以检查点表示启动恢复必须开始前滚事务的位置。因为检查点之前的所有修改页都保证在磁盘上,所以没有必要前滚检查点之前已完成的任何事务。

---------------------------------------------------------------

日志有点像photoshop里面的操作,如果一旦出现问题,你还有可以重来的机会

退回到某一步的操作中,嘿嘿……救命草哦
---------------------------------------------------------------

大量的读写操作,还有缺省模型。
您可以这样来缩减日志
USE DatabaseName
backup log DatabaseName with no_log

USE DatabaseName
select fileid,filename from sysfiles

USE DatabaseName
DBCC SHRINKFILE (2,1) -- 把fileid=2 即日志文件收缩到 1MB

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus