刪除sqlserver數(shù)據(jù)庫日志和沒有日志的數(shù)據(jù)庫恢復(fù)辦法

字號:


    這篇文章主要介紹了刪除sqlserver數(shù)據(jù)庫日志和沒有日志的數(shù)據(jù)庫恢復(fù)辦法,需要的朋友可以參考下。
    一、刪除數(shù)據(jù)庫日志文件的方法
    你曾經(jīng)有在執(zhí)行SQL的時候,數(shù)據(jù)庫報事務(wù)日志已滿,然后執(zhí)行報錯。然后糾結(jié)于怎么刪除數(shù)據(jù)庫日志,搗鼓半天嗎,現(xiàn)在就提供兩種刪除日志文件的方法,希望能夠幫到你!
    方法一:手工操作
    1.數(shù)據(jù)庫->右鍵->屬性->選項-恢復(fù)模式->由完成切換成簡單
    2.數(shù)據(jù)庫->右鍵->任務(wù)->收縮-文件->由完成切換成簡單->文件類型->日志->將文件收縮到
    
    
    
    
    方法二:存儲過程代替手工操作
    代碼如下:
    --日志文件收縮至多少M
    DECLARE@DBLogSiseASINT
    SET@DBLogSise=0
    --查詢出數(shù)據(jù)庫對應(yīng)的日志文件名稱
    DECLARE@strDBNameASNVARCHAR(500)DECLARE@strLogNameASNVARCHAR(500)DECLARE@strSQLASVARCHAR(1000)
    SELECT
    @strLogName=B.name,@strDBName=A.nameFROMmaster.sys.databasesASAINNERJOINsys.master_filesASBONA.database_id=B.database_idWHEREA.database_id=DB_ID()
    SET@strSQL='
    --設(shè)置數(shù)據(jù)庫恢復(fù)模式為簡單
    ALTERDATABASE['+@strDBName+']SETRECOVERYSIMPLE;
    --收縮日志文件
    DBCCSHRINKFILE('''+@strLogName+''','+CONVERT(VARCHAR(20),@DBLogSise)+');
    --恢復(fù)數(shù)據(jù)庫還原模式為完整
    ALTERDATABASE['+@strDBName+']SETRECOVERYFULL'
    exec(@strSQL)
    1.在數(shù)據(jù)庫中執(zhí)行上面的存儲過程
    2.然后再執(zhí)行EXECdbo.usp_p_delDBLog@DBLogSise=0(收縮至多少M)
    二、沒有日志文件的數(shù)據(jù)庫恢復(fù)方法
    今天客戶那邊執(zhí)行SQL報錯,經(jīng)查看是客戶服務(wù)器數(shù)據(jù)庫磁盤已被全部用完,日志文件達(dá)到500GB的程度,后來由于我的錯誤操作導(dǎo)致日志文件(.ldf)被刪除,后來附加.mdf文件老是說沒有日志文件附加不成功,后來經(jīng)過一番折騰終于解決了,下面分享一下!
    操作步驟
    1.新建同名的數(shù)據(jù)庫文件
    2.暫停SQLSetver服務(wù)
    3.將原先的mdf文件,覆蓋新建的數(shù)據(jù)庫,刪除新數(shù)據(jù)庫的ldf文件
    4.重新啟動SQLSetver服務(wù),這時看到的數(shù)據(jù)庫是這個樣子的,打不開
    
    5.執(zhí)行以下SQL語句
    代碼如下:
    --1.設(shè)置為緊急狀態(tài)
    alterdatabase數(shù)據(jù)庫名稱setemergency
    --2.設(shè)置為單用戶模式
    alterdatabase數(shù)據(jù)庫名稱setsingle_user
    --3.檢查并重建日志文件
    dbcccheckdb('數(shù)據(jù)庫名稱',REPAIR_ALLOW_DATA_LOSS)
    --4.第3步操作如果有錯誤提示,運行第4步,沒有錯誤則跳過
    dbcccheckdb('數(shù)據(jù)庫名稱',REPAIR_REBUILD)
    --5.恢復(fù)成多用戶模式
    alterdatabase數(shù)據(jù)庫名稱setmulti_user
    6.至此會重新生成改庫的日志文件,整個過程完成或者也可以采用手動附加