當前位置:首頁 » 數據倉庫 » sqlserver資料庫日誌文件
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver資料庫日誌文件

發布時間: 2023-01-15 18:14:51

㈠ linux下sqlserver資料庫日誌文太小

以下是建立一個資料庫命令可以更改的資料庫文件的位置。

名稱='
創建資料庫TEST1
test1_data
文件名='C:\ test1.mdf「 - 銀行可以更改資料庫文件的位置。
大小為5MB,
FILEGROWTH = 10%)

日誌(

名稱='test1_log「的,
文件名='C :\ test1.ldf「 - 銀行可以改變資料庫日誌文件的位置。
大小= 2MB的
MAXSIZE = 5MB,
FILEGROWTH = 1MB

㈡ sql資料庫日誌文件

麻煩了,很多DBA不太清楚,資料庫的日誌裝的其實是真正的數據(歸檔前改變的數據),所以日誌文件也是非常重要的。

至於有些資料庫的日誌文件過大,主要是DBA沒有正確的對資料庫進行調優設置造成的。

下面的方法也許對你是有用的。

0.備份數據文件'xxzx_discuz_Log.MDF'
1.新建一個同名的資料庫'xxzx_discuz'
2.再停掉sqlserver服務(注意不要分離資料庫)
3.用原資料庫的數據文件'xxzx_discuz_Log.MDF' 覆蓋掉新建的資料庫

4.再重啟sqlserver服務
5.此時打開企業管理器時會出現置疑,先不管,執行下面的語句(注意修改其中的資料庫名)
6.完成後一般就可以訪問資料庫中的數據了。這時,資料庫本身一般還有問題,解決辦法是:利用資料庫的腳本創建一個新的資料庫,然後通過DTS將數據導進去就行了.
SQL代碼
use master
go
sp_configure 'allow updates',1 reconfigure with override
go
update sysdatabases set status =32768 where name='置疑的資料庫名'
go
sp_dboption '置疑的資料庫名', 'single user', 'true'
go
dbcc checkdb('置疑的資料庫名')
go
update sysdatabases set status =28 where name='置疑的資料庫名'
go
sp_configure 'allow updates', 0 reconfigure with override
go
sp_dboption '置疑的資料庫名', 'single user', 'false'
go

特別注意最後一步中的說明「這時,資料庫本身一般還有問題,解決辦法是:利用資料庫的腳本創建一個新的資料庫,然後通過DTS將數據導進去就行

㈢ SQLServer 如何自動清理日誌文件

資料庫日誌文件是隨著時間增長而增長的,如果長時間不清理,文件會變得特別大,因此需要定期清空,但是日至文件是恢復資料庫的重要依據,不用日誌文件也是不明智的。手工清除單個資料庫的還好說,但資料庫多了,或者臨時沒有來得及清理,可能硬碟空間就會占滿了,影響訪問。因此設置自動清理資料庫日誌文件還是比較實用的。

手動清理方法:右鍵單擊需要清理的資料庫,選擇「屬性」,在「選項」卡上,把故障還原模型設定為簡單,確定後關閉;再右鍵單擊該資料庫,「所有任務」-「收縮資料庫」,確認後即可清除日誌文件,最後記得重新選擇「屬性」,將故障還原模型設置為完全。

自動清理方法:利用sql server代理服務,執行自動作業。

打開企業管理器,進入「管理」-「sql server代理服務」-「作業」,在右側窗口點擊右鍵,選擇「新建作業」。「常規」選項卡中,填寫作業名稱,具體

上邊的資料庫名稱填寫需要維護的資料庫名稱,資料庫日誌文件名填寫其對應的日誌文件名,注意,不是資源管理器里看到的帶後綴名的那個名字,而是企業管理器里,資料庫屬性里日誌選項卡中日誌的名字(通常也只是差一個後綴名……),確定後添加一個作業步驟。 如果需要維護多個資料庫,用上述方法重復添加作業步驟,注意每個步驟成功或失敗後的動作即可,最後選擇一下開始的步驟。

在「調度」選項卡中,類似備份的維護計劃,填寫調度周期,即定期清理的周期,不再細述。如果需要,可以在最後的「通知」選項卡上設置作業完成後的通知項,需要設置操作員,以及設置相應的服務,這里也不具體說明了,通常不用……

㈣ SQLserver資料庫備份後,怎麼查詢備份的日誌

SQL Server的備份有三種形式:

一是全備份(full backup)

這個備份裡麵包含的內容是值得商榷的,我們知道資料庫有兩種文件,數據文件與日誌文件,全備份是不是將所有的數據文件與日誌文件打包,備份成一個文件? 那麼還原的時候是不是需要做恢復,將備份過後發生的事務接著備份時間點重新執行一邊? 上面的問題細想都是肯定的。全備份做的事情,就是將所有的緩存先flush到磁碟上,不管在進行的事務是否提交,這樣保證了日誌的連續性,數據與日誌的一致性,如果事務沒提交 ,在日誌文件上的標記是active的,這段日誌也就不會被清空,下次恢復的時候,就從這段日誌開始,接著使用新的日誌執行。因此 全備份之前肯定會執行一次checkpoint;、

二是差異備份(differential backup)

這個備份會不會也重復full backup的過程,先執行checkpoint,然後再將上一次備份之後,發生數據頁變化的這些數據頁都備份起來,這部分備份就不會有日誌。但是和全備份一樣,備份的容積體量比較大,差異備份備份的是數據頁,不管這一頁是不是只有一條數據更改了,還是全部更改了;

三是日誌備份(transaction log backup)

日誌備份中需要注意的就是對未提交事務的理解,沒有提交的事務其實還是佔用日誌文件的VLF,shrink並不能回收日誌空間;提交事務的日誌如被備份之後,就會將日誌VLF打上unactive或者truncated標記,這個時候執行shrink就可以回收這部分日誌VLF了。日誌備份體量小,比較適合頻率高的執行,比如每5分鍾執行一次。

全備份:

全備份用到的命令,涉及到兩方面的參數,一是指定相應的備份設備,可以是磁碟,也可以是磁帶;另一方面 就是備份可用的選項,比如是否壓縮,是否加密。

BACKUP DATABASE database

TO backup_device [ ,...n ]

[ WITH with_options [ ,...o ] ] ;


備份設備很講究,可以事先定義好邏輯設備,也可以直接指定物理設備。磁帶備份機倒是沒見過,但是常規的磁碟備份還是可以討論一下的:

我們可以將一個本機帶路徑的物理文件名指定為備份設備:

backup database lenistest

to disk = 'E:Data_BUlenistest5__backup.bck';


也可以將網路上的一個帶路徑的物理文件名指定為備份設備:

backup database AdventureWorks2012

to disk = '\BackupSystemBackupDisk1AW_backupsAdventureWorksData.Bak';


這里有個有趣的現象,如果我們在全備份之後 ,沒有備份好日誌,這個時候故障突然發生了,我們需要作恢復,但是恢復的時候因為會重寫日誌,這樣就會丟失數據,如果不採取額外地措施,系統是會報錯的:


restore database lenistest

from disk = 'E:Data_BUlenistest5__backup.bck'


Msg 3159, Level 16, State 1, Line 6

The tail of the log for the database 「lenistest」 has not been backed
up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains
work you do not want to lose. Use the WITH REPLACE or WITH STOPAT
clause of the RESTORE statement to just overwrite the contents of the
log.

Msg 3013, Level 16, State 1, Line 6

RESTORE DATABASE is terminating abnormally.



所以如果對丟失的數據不關心或者認為不會丟失數據,可以採用with replace選項來重寫原來的日誌文件進行強制恢復。


restore database lenistest

from disk = 'E:Data_BUlenistest5__backup.bck'

with replace;



差異備份:

差異備份相對全備份,優越的地方在於備份數據量少,但是有趣的是差異備份不能獨立存在(日誌備份也不能獨立存在,他倆只能依附於全備份,也就是說在執行差異備份和日誌備份的時候,必須先有一個全備份做好在那裡), 差異備份必須以一個全備份做基準,在這基礎之上再判斷哪些數據頁是有過更新的,這些更新的數據頁計算出來並被備份起來。

use master;


go


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup.bck';


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup.bck'

with differential;


假如我們沒有事先做好全備份,就直接作差異備份了,那麼這是不成功的:


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup2.bck'

with differential;


Msg 3035, Level 16, State 1, Line 11

Cannot perform a differential backup for database 「lenistest」, because
a current database backup does not exist. Perform a full database
backup by reissuing BACKUP DATABASE, omitting the WITH DIFFERENTIAL
option.

Msg 3013, Level 16, State 1, Line 11

BACKUP DATABASE is terminating abnormally.


日誌備份:

日誌備份相對差異備份來說,體量更小,同樣它也需要全備份事先存在:

backup log lenistestto disk = 'E:Data_BUlenistest5__backup.bck';


假如我沒有事先做好全備份,我們看看直接備份日誌會出現什麼結果:


Msg 4214, Level 16, State 1, Line 15

BACKUP LOG cannot be performed because there is no current database
backup.

Msg 3013, Level 16, State 1, Line 15

BACKUP LOG is terminating abnormally.


提示先做全備份!

備份我們都討論完了,接下來我們看看還原。還原通常有兩個步驟,一是還原,二是恢復。當然我們也可以直接還原不恢復,但是可能會丟失數據,除非全備份之後 ,沒有任何操作。假設我們一天一個全備份,每15分鍾做一個差異備份 ,每5分鍾做一個日誌備份,我們該如何還原我們的資料庫呢?

通常我們首先要知道我們的備份文件名或者物理路徑,這個地方涉及到很多術語很難理解,比如說backup device, backupset, backup media, media set ,media family.

MSDN上有一個解釋,先看這個腳本:


backup database AdventureWorks2012

to tape = '\. ape0'

, tape = '\. ape1'

, tape = '\. ape2'

with format

, medianame = 'MyAdvWorks_MediaSet_1';


解釋說到,這個備份操作產生了一個 media set, 這個media set就是命名為MyAdvWorks_MediaSet_1, 這個media set還有個media header, media header一旦生成,就可以往裡面寫入備份文件了。這段腳本也同時生成了一個橫跨三個tape的備份文件, 他們統稱為backup set.

當我們指定3個backup device作為backup set(備份集)並且執行第一次全備份的時候,接下來所有的備份都需要同時指定這3個backup device作為backup set:


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup02.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

with format

, medianame = 'lenistestbackupset';


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

with noinit

, differential

, medianame = 'lenistestbackupset';



Msg 3231, Level 16, State 1, Line 10

The media loaded on 「E:Data_BUlenistest5__backup01.bck」 is formatted
to support 3 media families, but 2 media families are expected
according to the backup device specification.

Msg 3013, Level 16, State 1, Line 10

BACKUP DATABASE is terminating abnormally.


上面我先作了一次全備份,指定了三個backup device作為一份backup set, 接下來作差異備份的時候,我只指定了其中兩個backup device作為backup set, 操作失敗,提示就是少了一個backup device.


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

, disk = 'E:Data_BUlenistest5__backup02.bck'

with noinit

, differential

, medianame = 'lenistestbackupset';


這次我們指定了同樣個數的backup device,但backup device的順序顛倒了一下,操作成功。

到目前為止,我們的腳本已經新建了 1 個media set,名為 lenistestbackupset , 2 個backup set, 第一個backup set是全備份的backup set,另外一個backup set是差異備份。所以每一次備份都會產生一個backup set. Media set產生的時間則是第一次給資料庫作全備份的時候。

這個時候我們需要恢復資料庫,那麼第一步就是要先還原全備份,但是先不恢復,等全備份還原過後,再用差異備份做恢復:

restore database lenistest

from disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

, disk = 'E:Data_BUlenistest5__backup02.bck'

with file = 1

, replace

, norecovery;


restore database lenistest

from disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

, disk = 'E:Data_BUlenistest5__backup02.bck'

with file = 2

, recovery;


這里一定是用replace來重寫日誌。


select mf.media_set_id

, isnull(ms.name, 'no media name') as media_name

, mf.physical_device_name

, mf.family_sequence_number

, mf.media_family_id

, bs.database_name

, bs.backup_start_date

, bs.backup_finish_date

from backupmediafamily mf

inner join backupset bs

on mf.media_set_id = bs.media_set_id

left join backupmediaset ms

on bs.media_set_id = ms.media_set_id

where bs.database_name = 'lenistest';


上面的腳本可以抓出來這些media family, media set, backup set的信息,如果像上面的例子一樣, 我們用3個backup device來承載備份,那麼這3個backup device組成了一個media family, 按照family_sequence_number來編排,1,2,3。

下面實現一個備份到恢復的全過程例子,分別在full backup, differential backup, log backup之前各出入同樣的數據,看看是不是還原的時候,能正確還原過來:


insert into dbo.dataloading

(

object_id

, object_name

)

select object_id

, name as object_name

from sys.objects;


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup02.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

with format

, medianame = 'lenistestbackupset';



insert into dbo.dataloading

(

object_id

, object_name

)

select object_id

, name as object_name

from sys.objects;


backup database lenistest

to disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

, disk = 'E:Data_BUlenistest5__backup02.bck'

with noinit

, differential

, medianame = 'lenistestbackupset';



insert into dbo.dataloading

(

object_id

, object_name

)

select object_id

, name as object_name

from sys.objects;


backup log lenistest

to disk = 'E:Data_BUlenistest5__backup01.bck'

, disk = 'E:Data_BUlenistest5__backup03.bck'

, disk = 'E:Data_BUlenistest5__backup02.bck'

with noinit

, medianame = 'lenistestbackupset';


接著我們做還原與恢復:


restore database lenistest

from disk = 'E:Data_BUlenistest5__backup01.bck', disk = 'E:Data_BUlenistest5__backup03.bck', disk = 'E:Data_BUlenistest5__backup02.bck'

with file = 1

, replace

, norecovery;


restore database lenistest

from disk = 'E:Data_BUlenistest5__backup01.bck', disk = 'E:Data_BUlenistest5__backup03.bck', disk = 'E:Data_BUlenistest5__backup02.bck'

with file = 2

, norecovery;


restore database lenistest

from disk = 'E:Data_BUlenistest5__backup01.bck', disk = 'E:Data_BUlenistest5__backup03.bck', disk = 'E:Data_BUlenistest5__backup02.bck'

with file = 3

, recovery;


這里的file選項就是backup set選項,表示第一個備份集,第二個備份集,第三個備份集。如果想還原到最新的故障發生時間點,前面的restore都不能recovery,只有在最後的時候才能作recovery.

如果我們只想恢復全備份的數據,只要執行recovery就可以了,但是數據肯定是少了:

restore database lenistest

from disk = 'E:Data_BUlenistest5__backup01.bck', disk = 'E:Data_BUlenistest5__backup03.bck', disk = 'E:Data_BUlenistest5__backup02.bck'

with file = 1

, replace

, recovery;

如何刪除sqlserver資料庫日誌文件

1、確定SQL資料庫的安裝路徑與所用的SQL資料庫名稱。2、點擊開始--程序--MicrosoftSQLServer--查詢分析器--確定,進入軟體里,點擊菜單幫助--Transact-sql幫助(S)--索引--輸入(sp_attach_single_file_db),在右邊對話框里找到以下的命令或者在空白處直接輸入以下的命令:EXECsp_detach_db@dbname='pubs'returnEXECsp_attach_single_file_db@dbname='pubs',@physname='c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\pubs.mdf'注意:return是加入的命令語名,將資料庫(*.LDF與*.MDF)分離,再將資料庫名改回所要選的,即是pubs改為J2002。即是:EXECsp_detach_db@dbname='J2002'returnEXECsp_attach_single_file_db@dbname='J2002',@physname='c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\J2002.mdf'3、輸入命令後,點擊菜單查詢--執行,下面對話框出現命令"命令已成功完成"。4、刪除命令(EXECsp_detach_db@dbname='J2002'return),進入安裝SQL資料庫路徑里將J2002.ldf文件重命名。5、接著第3點開始,點擊菜單查詢--執行,下面對話框出現命令"設備激活錯誤。物理文件名'C:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\J200188.ldf'可能有誤。已創建名為'c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\j200188_log.LDF'的新日誌文件"。

㈥ 如何清空sql資料庫的日誌文件

SQLSERVER的資料庫日誌佔用很大的空間,下面提供三種方法用於清除無用的資料庫日誌文件x0dx0a方法一: x0dx0a1、打開查詢分析器,輸入命令 x0dx0aBACKUP LOG database_name WITH NO_LOG x0dx0a2、再打開企業管理器--右鍵要壓縮的資料庫--所有任務--收縮資料庫--收縮文件--選擇日誌文件--在收縮方式里選擇收縮至xxm,這里會給出一個允許收縮到的最小m數,直接輸入這個數,確定就可以了。 x0dx0ax0dx0a方法二: x0dx0a設置檢查點,自動截斷日誌 x0dx0ax0dx0a一般情況下,SQL資料庫的收縮並不能很大程度上減小資料庫大小,其主要作用是收縮日誌大小,應當定期進行此操作以免資料庫日誌過大 x0dx0a1、設置資料庫模式為簡單模式:打開SQL企業管理器,在控制台根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的伺服器-->雙擊打開資料庫目錄-->選擇你的資料庫名稱(如用戶資料庫cwbase1)-->然後點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇「簡單」,然後按確定保存 x0dx0a2、在當前資料庫上點右鍵,看所有任務中的收縮資料庫,一般裡面的默認設置不用調整,直接點確定 x0dx0a3、收縮資料庫完成後,建議將您的資料庫屬性重新設置為標准模式,操作方法同第一點,因為日誌在一些異常情況下往往是恢復資料庫的重要依據 x0dx0ax0dx0a方法三:通過SQL收縮日誌 x0dx0ax0dx0a把代碼復制到查詢分析器里,然後修改其中的3個參數(資料庫名,日誌文件名,和目標日誌文件的大小),運行即可 x0dx0ax0dx0aSET NOCOUNT ON x0dx0aDECLARE @LogicalFileName sysname, x0dx0a@MaxMinutes INT, x0dx0a@NewSize INT x0dx0ax0dx0aUSE tablename -- 要操作的資料庫名 x0dx0aSELECT @LogicalFileName = 'tablename_log', -- 日誌文件名 x0dx0a@MaxMinutes = 10, -- Limit on time allowed to wrap log. x0dx0a@NewSize = 1 -- 你想設定的日誌文件的大小(M) x0dx0ax0dx0a-- Setup / initialize x0dx0aDECLARE @OriginalSize int x0dx0aSELECT @OriginalSize = size x0dx0aFROM sysfiles x0dx0aWHERE name = @LogicalFileName x0dx0aSELECT 'Original Size of ' + db_name() + ' LOG is ' + x0dx0aCONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + x0dx0aCONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' x0dx0aFROM sysfiles x0dx0aWHERE name = @LogicalFileName x0dx0aCREATE TABLE DummyTrans x0dx0a(DummyColumn char (8000) not null) x0dx0ax0dx0aDECLARE @Counter INT, x0dx0a@StartTime DATETIME, x0dx0a@TruncLog VARCHAR(255) x0dx0aSELECT @StartTime = GETDATE(), x0dx0a@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' x0dx0ax0dx0aDBCC SHRINKFILE (@LogicalFileName, @NewSize) x0dx0aEXEC (@TruncLog) x0dx0a-- Wrap the log if necessary. x0dx0aWHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired x0dx0aAND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) x0dx0aAND (@OriginalSize * 8 /1024) > @NewSize x0dx0aBEGIN -- Outer loop. x0dx0aSELECT @Counter = 0 x0dx0aWHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) x0dx0aBEGIN -- update x0dx0aINSERT DummyTrans VALUES ('Fill Log') x0dx0aDELETE DummyTrans x0dx0aSELECT @Counter = @Counter + 1 x0dx0aEND x0dx0aEXEC (@TruncLog) x0dx0aEND x0dx0aSELECT 'Final Size of ' + db_name() + ' LOG is ' + x0dx0aCONVERT(VARCHAR(30),size) + ' 8K pages or ' + x0dx0aCONVERT(VARCHAR(30),(size*8/1024)) + 'MB' x0dx0aFROM sysfiles x0dx0aWHERE name = @LogicalFileName x0dx0aDROP TABLE DummyTrans x0dx0aSET NOCOUNT OFF x0dx0ax0dx0a方法四:刪除日誌文件。 x0dx0ax0dx0a此方法有一定的風險性,因為sql server的日誌文件不是即時寫入資料庫主文件的,如處理不當,會造成數據的損失。1、操作前請斷開所有資料庫連接。 x0dx0a2、分離資料庫 x0dx0a分離資料庫:企業管理器->伺服器->資料庫->cwbase1->右鍵->分離資料庫 x0dx0a分離後,cwbase1資料庫被刪除,但保留了數據文件和日誌文件 x0dx0a3、刪除log物理文件 x0dx0a刪除LOG物理文件,然後附加資料庫: 企業管理器->伺服器->資料庫->右鍵->附加資料庫 x0dx0a此法生成新的log,大小隻有500多k。 x0dx0ax0dx0a注意:建議使用第一種方法。操作前請確保所有操作員都已經推出系統,斷開資料庫的連接。 x0dx0ax0dx0a以上操作前,請務必做好數據備份!x0dx0ax0dx0a1.sql server 2005 清除日誌語句 x0dx0ax0dx0amp transaction 資料庫名稱 with no_log x0dx0abackup log 資料庫名稱 with no_log x0dx0adbcc shrinkdatabase(資料庫名稱)