① SQL SERVER 只有ldf日誌文件怎麼恢復數據
參考下列說明:
/*--說明:
下面的代碼演示了如何利用日誌還原功能,將主資料庫中的數據變化及時反饋到備用資料庫中
備用資料庫的數據可以隨時用於查詢,但不能被更新(備用資料庫只讀)。
--*/
--首先,創建一個演示用的資料庫(主資料庫)
CREATE DATABASE Db_test
ON
( NAME = Db_test_DATA,
FILENAME = 'c:Db_test.mdf' )
LOG ON
( NAME = Db_test_LOG,
FILENAME = 'c:Db_test.ldf')
GO
--對資料庫進行備份
BACKUP DATABASE Db_test TO DISK='c: est_data.bak' WITH FORMAT
GO
--把資料庫還原成備用資料庫(演示主資料庫與這個備用資料庫之間的同步)
RESTORE DATABASE Db_test_bak FROM DISK='c: est_data.bak'
WITH REPLACE,STANDBY='c:db_test_bak.ldf'
,MOVE 'Db_test_DATA' TO 'c:Db_test_data.mdf'
,MOVE 'Db_test_LOG' TO 'c:Db_test_log.ldf'
GO
--啟動 SQL Agent 服務
EXEC master..xp_cmdshell 'net start sqlserveragent',no_output
GO
--創建主伺服器數據訓與備用伺服器資料庫之間同步的作業
DECLARE @jogid uniqueidentifier
EXEC msdb..sp_add_job
@job_id = @jogid OUTPUT,
@job_name = N'數據同步處理'
--創建同步處理步驟
EXEC msdb..sp_add_jobstep
@job_id = @jogid,
@step_name = N'數據同步',
@subsystem = 'TSQL',
@command = N'
--主資料庫中進行日誌備份
BACKUP LOG Db_test TO DISK=''c: est_log.bak'' WITH FORMAT
--備用資料庫中還原主資料庫的日誌備份(應用主資料庫中的最新變化
--實際應該時主資料庫備份與備用資料庫的還原作業應該分別在主伺服器和備用伺服器上建立,並且備份文件應該放在主伺服器和備用都能訪問的共享目錄中
RESTORE LOG Db_test_bak FROM DISK=''c: est_log.bak'' WITH STANDBY=''c: est_log.ldf''',
@retry_attempts = 5,
@retry_interval = 5
--創建調度(每分鍾執行一次)
EXEC msdb..sp_add_jobschele
@job_id = @jogid,
@name = N'時間安排',
@freq_type=4,
@freq_interval=1,
@freq_subday_type=0x4,
@freq_subday_interval=1,
@freq_recurrence_factor=1
-- 添加目標伺服器
EXEC msdb.dbo.sp_add_jobserver
@job_id = @jogid,
@server_name = N'(local)'
GO
--通過上述處理,主資料庫與備用資料庫之間的同步關系已經設置完成
--下面開始測試是否能實現同步
--在主資料庫中創建一個測試用的表
CREATE TABLE Db_test.dbo.TB_test(ID int)
GO
--等待1分鍾30秒(由於同步的時間間隔設置為1分鍾,所以要延時才能看到效果)
WAITFOR DELAY '00:01:30'
GO
--查詢一下備用資料庫,看看同步是否成功
SELECT * FROM Db_test_bak.dbo.TB_test
/*--結果:
ID
-----------
(所影響的行數為 0 行)
--*/
--測試成功
GO
--最後刪除所有的測試
DROP DATABASE Db_test,Db_test_bak
EXEC msdb..sp_delete_job @job_name=N'數據同步處理'
GO
/*===========================================================*/
/*--伺服器檔機處理說明
使用這種方式建立的資料庫同步,當主資料庫不可用時(例如,主資料庫損壞或者停機檢修)
可以使用以下兩種方法使備用資料庫可用。
--*/
--1. 如果主資料庫損壞,無法備份出最新的日誌,可以直接使用下面的語句使備用資料庫可讀寫(丟失最近一次日誌還原後的所有數據)。
--RESTORE LOG Db_test_bak WITH RECOVERY
--2. 如果主資料庫可以備份出最新日誌,則可以使用下面的語句。
--先備份主資料庫的最新的事務日誌
--BACKUP LOG Db_test TO DISK=''c: est_log.bak'' WITH FORMAT
--再在備用資料庫中恢復最新的事務日誌,並且使備用資料庫可讀寫(升級為主資料庫)
--RESTORE LOG Db_test_bak FROM DISK='c: est_log.bak'
簡單地說:
你的sql服務要使用指定的windows用戶登陸, 而不能使用"本地系統帳戶"
用於登陸sql服務的用戶要求對共享目錄具有所有許可權
如果你的電腦沒有加入到域, 還必須保證源和目標伺服器的sql服務設置的登陸用戶是一樣的(用戶名和密碼都一樣)
網路備份主要是許可權設置問題, 參考下面的備份文件共享目錄許可權設置方法去解決目錄的共享許可權就可以了
下面假設是假設A伺服器上的資料庫備份到B伺服器上的共享目錄許可權設置(兩台伺服器應該在區域網內,允許目錄共享訪問)::
機器A,B創建一個同名的windows用戶,用戶組設置為administrators,並設置相同的密碼,做為備份文件夾文件夾的有效訪問用戶,操作:
我的電腦
--控制面板
--管理工具
--計算機管理
--用戶和組
--右鍵用戶
--新建用戶
--建立一個隸屬於administrator組的登陸windows的用戶
在B機器器上,新建一個共享目錄,做為備份文件的存放目錄,操作:
我的電腦--D: 新建一個目錄,名為: BAK
--右鍵這個新建的目錄
--屬性--共享
--選擇"共享該文件夾"
--通過"許可權"按紐來設置具體的用戶許可權,保證第一步中創建的用戶具有對該文件夾的所有許可權
--確定
設置 MSSQLSERVER 及 SQLSERVERAGENT 服務的啟動用戶
開始--程序--管理工具--服務
--右鍵 MSSQLSERVER
--屬性--登陸--選擇"此賬戶"
--輸入或者選擇第一步中創建的windows登錄用戶名
--"密碼"中輸入該用戶的密碼
--確定
--同樣的方法設置 SQLSERVERAGENT
在A機器上完成對B機器BAK目錄的映射
查詢分析器中執行下面的語句,檢驗是否成功:
exec master..xp_cmdshell 'dir 映射的盤符'
A伺服器上做備份計劃
備注:創建一個新的用戶只是為了讓MSSQLSERVER服務的啟動帳戶與共享目錄的有效訪問同名且密碼相同,這樣才能通過驗證(所以你也可以用其他有效的用戶來代替,只需要滿足用戶名和密碼相同,並且擁有足夠的許可權)
② SQLServer2008資料庫怎樣備份還原和數據恢復
在完整恢復模式或大容量日誌恢復模式下,必須先備份活動事務日誌(稱為日誌尾部),然後才能在SQLServerManagementStudio中還原資料庫。有關詳細信息,請參閱如何備份事務日誌(SQLServerManagementStudio)。若要還原已加密的資料庫,您必須有權訪問用於加密資料庫的證書或非對稱密鑰。如果沒有證書或非對稱密鑰,資料庫將無法還原。
認識資料庫備份和事務日誌備份
資料庫備份與日誌備份是資料庫維護的日常工作,備份的目的是在於當資料庫出現故障或者遭到破壞時可以根據備份的資料庫及事務日誌文件還原到最近的時間點將損失降到最低點。
資料庫備份
資料庫備份可以手動備份和語句備份
一.手動備份資料庫
1.滑鼠右鍵選擇你要進行備份的資料庫-任務-備份
可以在常規選項頁面你可以選擇備份類型是進行完整資料庫備份還是差異資料庫備份
2.點擊添加選項,選擇資料庫文件的存放路徑
注意文件名記得加後綴.bak,便於恢復時的查找
3.你還可以在選項頁面是追加到現有的備份集,還是覆蓋所有的現有備份集,還可以選擇備份驗證完整性(建議選擇),還可以選擇是否壓縮備份等。
二.語句備份資料庫
use master goBACKUP DATABASE [test] TO DISK = N'D:Microsoft sql serverMSSQL10.MSSQLSERVERMSSQLBackup est.bak' WITH NOFORMAT, NOINIT, NAME = N'test-完整 資料庫 備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10GO
資料庫日誌備份
首先需要注意,資料庫日誌的備份是基於資料庫完整備份,也就是說你備份資料庫日誌之前你首先要先對資料庫進行一次完整的備份,因為之間會涉及到堅持到檢查點 lsn, 這也是本文接下來要講的重點。
一.手動備份資料庫日誌
1.右鍵資料庫-任務-備份-選擇備份類型(事務日誌)
2.點添加,添加日誌文件備份存儲路徑
3.同資料庫完整備份一樣,你也可以選擇覆蓋現有備份集或者追加到現有備份集,這里現在覆蓋現有備份集、驗證完整性,然後確認備份
二.語句備份資料庫事務日誌
BACKUP LOG [test] TO DISK = N'D: est.trn' WITH NOFORMAT, INIT, NAME = N'test-事務日誌 備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10GO
資料庫還原
右鍵資料庫-還原資料庫-添加需要進行還原的資料庫文件路徑
在還原源選項中你可以選擇『源資料庫』,『源設備』。1.選擇源資料庫工具會自動顯示該資料庫之前的一些備份,然後直接選擇需要還原的資料庫備份集。
2.選擇源設備點擊後面的...,添加需要還原的資料庫文件
2.點擊確認還原資料庫
資料庫恢復
資料庫恢復的前提是1.一個完整的資料庫備份2.包含這個完整資料庫備份的事務日誌備份3.完整備份之間也可以存在數個差異備份
對於資料庫維護空間始終是一個比較頭疼的問題,特別是對於大型資料庫而言,每天的日誌文件增長是龐大的,很多資料庫管理員會定時對資料庫日誌文件進行收縮,但是經常收縮會存在收縮完日誌文件還是不能減少,這是因為存在很多活動的日誌無法收縮可以用
DBCC LOGINFO('資料庫名稱')
我們看到
status=0的日誌,代表已經備份到磁碟的日誌文件;而
status=2的日誌還沒有備份。當我們收縮日誌文件時,收縮掉的空
間其實就是
status=0的空間,如果日誌物理文件無法減小,這里一
定能看到非常多status=2的記錄
解決辦法:1.可以分離要收縮的資料庫,然後手動刪除日誌文件,然後附加資料庫,資料庫就會產生一個很小的日誌文件(不推薦使用這種方法)
2.右鍵要出來的資料庫選擇「屬性」-"選項",將恢復模式改成"簡單",然後利用收縮工具可以講日誌文件收縮到很小,收縮完記得講恢復模式改成"完整"
也可以用語句進行處理(dbname是你要進行收縮的資料庫名,dbname_log是你要進行收縮的資料庫的邏輯日誌名稱)
USE [master]
GO ALTER DATABASE [dbname] SET recovery SIMPLE WITH NO_WAIT GO
ALTER DATABASE [dbname] SET RECOVERY SIMPLE --簡單模式
GO
USE [dbname]
GO
DBCC SHRINKFILE (N'dbname_log' , 11, TRUNCATEONLY) GO
USE [master]
GO
ALTER DATABASE [dbname] SET RECOVERY FULL WITH NO_WAIT ALTER DATABASE [dbname] SET RECOVERY FULL
對於第一種方法不贊同使用,首先對於資料庫的分離與附加有時候會破壞資料庫,造成資料庫無法還原,還有就是對於在線資料庫也不允許進行分離操作。
對於第二種方法是slq2008收縮日誌文件的一種方法,但是此方法也不能使用過於頻繁,因為進行資料庫恢復模式的更改會截斷事務日誌文件,這樣的話當時利用事務日誌文件進行恢復的時候檢查點不能包含資料庫文件,而且當你要對事務日誌進行備份的時候會重新提示你需要對資料庫進行完整備份。
舉個例子:比如你昨天晚上進行了一次完整備份,然後同時你也進行了一次日誌備份(提前日誌未被截斷),然後你每個小時進行過一次差異備份,最近的差異備份時間點是14點,如果此時資料庫錯誤修改了數據,你可以立馬備份一個日誌文件將資料庫恢復到日誌備份開始到日誌備份終點前的任意時間點 。
如果此時你進行了修改資料庫模式,截斷日誌進行了收縮,那麼你的數據只能恢復到昨天晚上備份的那個日誌備份時間前的任意時間點,也就是今天所做的資料庫更改無法再恢復了,因為日誌文件已經被截斷了,不知道這樣解釋是否明白
因為日誌文件的檢查點(lsn)是連續的,每一次日誌備份都是在上一次備份的基礎上lsn往後增加的,lsn的范圍也包括了資料庫文件的lsn,也只有日誌文件的lsn包括了資料庫文件的lsn,才能將資料庫文件進行回滾。
上圖中總共有三個備份文件,一個完整備份、一個差異備份、一個日誌備份,大家可以注意觀察完整備份的第一個lsn與最後一個lsn,和檢查點
第二個差異備份文件的的第一個lsn與最後一個lsn,和檢查點,最後的日誌備份的第一個lsn和最後一個lsn包含了前面兩個備份文件的lsn,這種情況資料庫就可以恢復到日誌文件備份前的任意時間點,如果日誌文件沒有包含資料庫文件的最後一個lsn也就無法恢復了。
③ 如何使用事務日誌恢復sql server資料庫
以資料庫恢復模式設為FULL為例:
恢復過程的第一步是執行尾日誌備份,(BACKUP LOG Student TO DISK='E:stulog.dmp' ) 。
在恢復一個資料庫之前,為保證上次備份之後發生改變的記錄都包含在恢復過程之中,需要執行這種類型的備份。
下一步,查找資料庫備份文件在機器或網路中的存儲位置。
如果要在另一台伺服器上恢復資料庫,最好是把這些文件復制到目標伺服器中。在備份文件所在的位置,找出最後一個完整的資料庫備份(這些文件通常使用.bak為擴展名);恢復這個完整的備份。
下面的腳本將完整的備份文件應用於NewDatabase資料庫:
RESTOREDATABASENewDatabase
FROMDISK='D:.bak'
WITH
MOVE'PreviousDatabase'TO'D:DataFilesTestDatabase.mdf',
MOVE'PreviousDatabase_log'TO'D:DataFilesTestDatabase_Log.ldf',
NORECOVERY
這段腳本指出完整備份文件位於伺服器的D盤中,你正在使用備份文件恢復NewDatabase這個資料庫。
腳本中的語句將數據文件和日誌文件從完整備份文件轉移到TestDatabase資料庫的新文件中。腳本中的最後一個語句——NORECOVERY——非常重要。
NORECOVERY模式有三種選項,如下所示:
NORECOVERY:告訴SQL Server你沒有完成恢復資料庫的過程,隨後會出現恢復文件。當資料庫處於這種狀態時,資料庫還不能使用,因而不允許建立連接。
RECOVERY:告訴SQL Server你已經完成資料庫恢復過程,資料庫即將准備就緒。這是默認選項,也是最常用的選項。
STANDBY:告訴SQL Server當前資料庫還未為完成恢復做好准備,隨後可以使用日誌文件進行恢復。如果必要,你可以使用這個選項為恢復資料庫建立連接。但是,如果當前不存在連接,將來的事務日誌只能應用於資料庫。
一旦你使用NORECOVERY選項恢復了完整備份,你可以開始應用事務日誌備份或差異備份。
差異備份
差異備份是指對上次完整資料庫備份後資料庫發生的任何改變進行備份。如果有幾個差異備份,只需要恢復最後一個備份文件。在這種情況下,並不存在差異備份,因此可以直接轉向事務日誌備份。
事務日誌備份
事務日誌備份保留上次事務日誌備份後發生的所有事務的痕跡;它還允許把資料庫恢復到資料庫發生錯誤之前的一個時間點。事務日誌備份按順序發生,從而建立一個備份鏈。在把一連串事務日誌備份恢復到一個時間點時,事務日誌文件也必須按順序恢復。
當使用一個資料庫維護計劃來建立事務日誌備份時,事務日誌文件名中往往包含一個時間指示器。
下面的腳本使用NORECOVERY選項應用三個事務日誌備份,最後一個語句把資料庫恢復到最後一個事務日誌文件的結束點。
RESTORELOGNewDatabase
FROMDISK=''D:BackupFilesTestDatabase_TransactionLogBackup1.trn'
WITHNORECOVERY
RESTORELOGNewDatabase
FROMDISK=''D:BackupFilesTestDatabase_TransactionLogBackup2.trn'
WITHNORECOVERY
RESTORELOGNewDatabase
FROMDISK=''D:BackupFilesTestDatabase_TransactionLogBackup3.trn'
WITHNORECOVERY
RESTORELOGNewDatabase
FROMDISK=''D:BackupFilesTestDatabase_TransactionLogBackup4.trn'
WITHRECOVERY
恢復到一個時間點
在上面的例子中,把資料庫恢復到最後一個事務日誌的結束點。
如果想把資料庫恢復到事務日誌結束前的某個特定的時間點,必須使用STOPAT選項。
下面的腳本把日誌序列中的第四個事務日誌恢復到4:01 AM——正好在資料庫出錯之前。
RESTORELOGNewDatabase
FROMDISK=''D:BackupFilesTestDatabase_TransactionLogBackup4.trn'
WITHSTOPAT=N'6/28/20074:01:45PM',RECOVERY
④ 如何查看sql server2008操作日誌
您好,很高興為您解答。
可以降到2005 用log explorer看下的哈
使用Log Explorer查看和恢復數據
Log Explorer 4.1.可用於SQL Server2005的日誌查看工具
使用方法:
打開Log Explorer -> Attach Log File -> 選擇SQL Server伺服器和登陸方式 -> Connect ->
在Database Name中選擇資料庫 -> Attach-> 左面對話框中Browse-> View Log-> 就可以看到log記錄了
想恢復的話: 右鍵Log記錄 Undo Transation-> 選擇保存文件名和路徑-> 然後打開該文件到查詢分析器里執行 T-sql代碼就可以了
例如 如果Log是delete table where ...的話,生成的文件代碼就是insert table ....
然後將此insert table的代碼放到查詢分析器里執行.就可以恢復數據.
----------------------------------------------------------------------
--如何恢復被delete/update的數據
----------------------------------------------------------------------
1連接到被刪除資料庫的Db
打開log explorer 選擇 "file"->"attach log file"->選擇伺服器和登陸方式->"connect"->選擇"資料庫"->"attach"
2 查看日誌
在左面操作項目的對話框中選擇"browse"項目->"view log"->就可以看到當前的Log記錄了
3 恢復數據
右鍵某一條log記錄,選擇"undo transation"->"選擇保存文件名和路徑"->然後打開該文件到查詢分析器里執行
T-sql代碼就可以了
例如: 如果log是delete table where ...的話,生成的文件代碼就是insert table ....
----------------------------------------------------------------------
--Log Explorer恢復被drop table和truncate table後的數據
----------------------------------------------------------------------
1 連接到被刪除資料庫的Db
操作同上
2 恢復方法
1) 選擇"salvaage dropped/truncate"菜單,在右邊的對話框中選擇表名,和droped/trucated的日期,
File Name中選擇生成insert語句腳步的存放位置,condition選擇是droped還是truncated,
最後點擊"create" 就會生成insert語句,把生成的語句到查詢分析器裡面執行一下就可以了
2) 選擇"ViewDDL Commands"菜單->選"truncate table" 操作項->點擊"Salvage"->生成語句->查詢分析器里執行
----------------------------------------------------------------------
--log explorer使用的幾個問題
----------------------------------------------------------------------
1) 對資料庫做完全/差異/日誌備份
備份時如果選用了刪除事務日誌中不活動的條目
再用Log explorer打試圖看日誌時,提示No log recorders found that match the filter,would you like to view unfiltered data 選擇yes 就看不到剛才的記錄了
如果不選用了刪除事務日誌中不活動的條目
再用Log explorer打試圖看日誌時,就能看到原來的日誌並做恢復
2) 修改了其中一個表中的部分數據,此時用Log explorer看日誌,可以作日誌恢復
3) 然後恢復備份,(注意:恢復是斷開log explorer與資料庫的連接,或連接到其他數據上,
否則會出現資料庫正在使用無法恢復)
恢復完後,再打開log explorer 提示No log recorders found that match the filter,would you like to view unfiltered data,選擇yes 就看不到剛才在2中修改的日誌記錄,所以無法做恢復.
4) 不要用SQL的備份功能備份,搞不好你的日誌就破壞了.