關於 SQL Server ErrorLog 錯誤記錄檔說明_MsSql

來源:互聯網
上載者:User
預設情況下,SQL Server 儲存 7 個 ErrorLog 檔案,名為:
ErrorLog
ErrorLog.1
ErrorLog.2
ErrorLog.3
ErrorLog.4
ErrorLog.5
ErrorLog.6
在 APACS OS 版本 6.1 中,ErrorLog 檔案儲存在 c:\Program Files\Microsoft SQL Server\MSSQL$WINCC\LOG 檔案夾中。在 APACS OS 版本 7.0 中,ErrorLog 檔案儲存在 c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG 檔案夾中。ErrorLog 檔案包含最新資訊;ErrorLog.6 檔案包含最老的資訊。
每次重啟動 SQL Server 時,這些記錄檔都如下迴圈:
刪除 ErrorLog.6 檔案中的所有資料,並建立一個新的 ErrorLog 檔案。
上個 ErrorLog 檔案中的所有資料被寫入到 ErrorLog.1 檔案中。
上個 ErrorLog.1 檔案中的所有資料被寫入到 ErrorLog.2 檔案中。
上個 ErrorLog.2 檔案中的所有資料被寫入到 ErrorLog.3 檔案中。
上個 ErrorLog.3 檔案中的所有資料被寫入到 ErrorLog.4 檔案中。
上個 ErrorLog.4 檔案中的所有資料被寫入到 ErrorLog.5 檔案中。
上個 ErrorLog.5 檔案中的所有資料被寫入到 ErrorLog.6 檔案中。
如果其中一個 ErrorLog 檔案已很大,則可通過運行 sp_cycle_errorlog 預存程序手動迴圈這些 ErrorLog 檔案。注意事項:舊的 ErrorLog 檔案中的資料將被覆蓋!如果必須儲存舊的 ErrorLog 檔案中的資料,則可將這些舊的 ErrorLog 檔案複製到某個外部儲存介質中。
在 APACS OS 版本 6.1 中,可利用 SQL Qry Analyzer Tool 從 SQL Server Enterprise Manager 運行 sp_cycle_errorlog 預存程序。在 APACS OS 版本 7.0 中,可從 SQL Server Management St io 運行 sp_cycle_errorlog 預存程序。

所以需要定期能切換寫入error log . 一般可以使用DBCC errorlog命令來操作 。
Exec('DBCC ErrorLog')
或者可以通過以下命令,將sp 放在Job中定期執行。
複製代碼 代碼如下:

create procedure sp_cycle_errorlog --- 1997/06/24
as
if (not (is_srvrolemember('sysadmin') = 1)) -- Make sure that it is the SA executing this.
begin
raiserror(15247,-1,-1)
return(1)
end
dbcc errorlog
return (0)
GO

複製代碼 代碼如下:

擷取資料庫中所有的表
SELECT SysObjects.name AS Tablename FROM sysobjects WHERE xtype = 'U' and sysstat<200
擷取資料庫中所有表的列名
SELECT SysColumns.name AS Columnsname, SysObjects.name AS Tablename FROM SysObjects, SysColumns WHERE Sysobjects.Xtype='u' AND Sysobjects.Id=Syscolumns.Id
擷取SQL所有資料庫名、所有表名、所有欄位名、表欄位長度
1.擷取MSSQL中的所有資料庫名:
SELECT name FROM MASter..SysDatabASes ORDER BY name
2.擷取MSSQL中的所有使用者表名:
SELECT name FROM DatabASename..SysObjects WHERE XType='U' ORDER BY name
XType='U':表示所有使用者表;
XType='S':表示所有系統資料表;
3.擷取指定表[tb_phone]的所有欄位名:
SELECT name FROM SysColumns WHERE id=Object_Id('tb_phone')
4.SQL所有表的表名、所有欄位名、表欄位長度
SELECT table_name AS 資料表名,
column_name AS 欄位名,
ISNULL(column_default,'') AS 預設值,
is_nullable AS 是否允許為NULL,
data_type AS 資料類型,
ISNULL(ISNULL(ISNULL(character_maximum_length,numeric_precision),datetime_precision),1) AS 類型長度
FROM information_schema.columns
WHERE NOT table_name IN('sysdiagrams','dtproperties')
5.擷取指定表[tb_phone]的表名,表欄位名,欄位類型和類型長度
SELECT SysObjects.name AS Tablename,
Syscolumns.name AS Columnsname,
Systypes.name AS DateType,
Syscolumns.length AS DateLength
FROM Sysproperties RIGHT OUTER JOIN
Sysobjects INNER JOIN
Syscolumns ON Sysobjects.id = Syscolumns.id INNER JOIN
Systypes ON Syscolumns.xtype = Systypes.xtype ON
Sysproperties.id = Syscolumns.id AND
Sysproperties.smallid = Syscolumns.colid
WHERE (Sysobjects.xtype = 'u' OR
Sysobjects.xtype = 'v') AND (Systypes.name <> 'Sysname') AND
(Sysobjects.name = 'tb_phone')
ORDER BY Columnsname

SQL Server 的每一個資料庫,無論是系統資料庫(master,model, sybsystemprocs, tempdb),還是使用者資料庫,都有自己的transaction log,每個庫都有syslogs表。Log記錄使用者對資料庫修改的操作,所以如果不用命令清除, log會一直增長直至佔滿空間。清除log可用dump transaction 命令;或者開放資料庫選項trunc log on chkpt,資料庫會每隔一段間隔自動清除log。管理好資料庫log是使用者操作資料庫必須考慮的一面。
一、刪除LOG
1:分離資料庫 企業管理器->伺服器->資料庫->右鍵->分離資料庫
2:刪除LOG檔案
3:附加資料庫 企業管理器->伺服器->資料庫->右鍵->附加資料庫
此法產生新的LOG,大小隻有520多K
再將此資料庫設定自動收縮
或用代碼:
下面的樣本分離 77169database,然後將 77169database 中的一個檔案附加到當前伺服器。
複製代碼 代碼如下:

EXEC sp_detach_db @dbname = '77169database'
EXEC sp_attach_single_file_db @dbname = '77169database',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\77169database.mdf'

二、清空日誌
複製代碼 代碼如下:

DUMP TRANSACTION 庫名 WITH NO_LOG

再操作:
企業管理器--右鍵你要壓縮的資料庫--所有任務--收縮資料庫--收縮檔案--選擇記錄檔--在收縮方式裡選擇收縮至XXM,這裡會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了
三、如果想以後不讓它增長
企業管理器->伺服器->資料庫->屬性->交易記錄->將檔案增長限制為2M
自動收縮日誌,也可以用下面這條語句:
ALTER DATABASE 資料庫名 SET AUTO_SHRINK ON
故障還原模型改為簡單,用語句是:
複製代碼 代碼如下:

USE MASTER
GO
ALTER DATABASE 資料庫名 SET RECOVERY SIMPLE
GO
------------------------------------------
截斷交易記錄:
BACKUP LOG { database_name | @database_name_var }
{
[ WITH
{ NO_LOG | TRUNCATE_ONLY } ]
}
--壓縮日誌及資料庫檔案大小
/*--特別注意
請按步驟進行,未進行前面的步驟,請不要做後面的步驟,否則可能損壞你的資料庫.
--*/

1.清空日誌
DUMP TRANSACTION 庫名 WITH NO_LOG
2.截斷交易記錄:
BACKUP LOG 資料庫名 WITH NO_LOG
3.收縮資料庫檔案(如果不壓縮,資料庫的檔案不會減小
企業管理器--右鍵你要壓縮的資料庫--所有任務--收縮資料庫--收縮檔案
--選擇記錄檔--在收縮方式裡選擇收縮至XXM,這裡會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了
--選擇資料檔案--在收縮方式裡選擇收縮至XXM,這裡會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了
也可以用SQL語句來完成
--收縮資料庫
DBCC SHRINKDATABASE(客戶資料)
--收縮指定資料檔案,1是檔案號,可以通過這個語句查詢到:
select * from sysfiles DBCC SHRINKFILE(1)
4.為了最大化的縮小記錄檔(如果是sql 7.0,這步只能在查詢分析器中進行)
a.分離資料庫:
企業管理器--伺服器--資料庫--右鍵--分離資料庫
b.在我的電腦中刪除LOG檔案
c.附加資料庫:
企業管理器--伺服器--資料庫--右鍵--附加資料庫 此法將產生新的LOG,大小隻有500多K
或用代碼:
下面的樣本分離 77169database,然後將 77169database 中的一個檔案附加到當前伺服器。
a.分離
EXEC sp_detach_db @dbname = '77169database'
b.刪除記錄檔
c.再附加
EXEC sp_attach_single_file_db @dbname = '77169database', @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\77169database.mdf'
5.為了以後能自動收縮,做如下設定:
企業管理器--伺服器--右鍵資料庫--屬性--選項--選擇"自動收縮"
--SQL語句設定方式:
EXEC sp_dboption '資料庫名', 'autoshrink', 'TR'
6.如果想以後不讓它日誌增長得太大
企業管理器--伺服器--右鍵資料庫--屬性--交易記錄
--將檔案增長限制為xM(x是你允許的最大資料檔案大小)
--SQL語句的設定方式:
複製代碼 代碼如下:

alter database 資料庫名 modify file(name=邏輯檔案名稱,maxsize=20)
--------------------------------------------------------------
/*--壓縮資料庫的通用預存程序
壓縮日誌及資料庫檔案大小,因為要對資料庫進行分離處理,所以預存程序不能建立在被壓縮的資料庫中。
/*--調用樣本
exec p_compdb 'test'
--*/
use master --注意,此預存程序要建在master資料庫中
go
if exists (select * from dbo.sysobjects where id
= object_id(N'[dbo].[p_compdb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_compdb]
GO
create proc p_compdb
@dbname sysname, --要壓縮的資料庫名
@bkdatabase bit=1, --因為分離日誌的步驟中,可能會損壞資料庫,所以你可以選擇是否自動資料庫
@bkfname nvarchar(260)='' --備份的檔案名稱,如果不指定,自動備份到預設備份目錄,
備份檔案名為:資料庫名+日期時間
as

--1.清空日誌
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')
--2.截斷交易記錄:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')
--3.收縮資料庫檔案(如果不壓縮,資料庫的檔案不會減小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')
--4.設定自動收縮
exec('EXEC sp_dboption '''+@dbname+''',''autoshrink'',''TR''')
--後面的步驟有一定危險,你可以可以選擇是否應該這些步驟
--5.分離資料庫
複製代碼 代碼如下:

if @bkdatabase=1
begin
if isnull(@bkfname,'')=''
set @bkfname=@dbname+'_'+convert(varchar,getdate(),112)
+replace(convert(varchar,getdate(),108),':','')
select 提示資訊='備份資料庫到SQL 預設備份目錄,備份檔案名:'+@bkfname
exec('backup database ['+@dbname+'] to disk='''+@bkfname+'''')
end
--進行分離處理
create table #t(fname nvarchar(260),type int)
exec('insert into #t select filename,type=status&0x40 from ['+@dbname+']..sysfiles')
exec('sp_detach_db '''+@dbname+'''')
--刪除記錄檔
declare @fname nvarchar(260),@s varchar(8000)
declare tb cursor local for select fname from #t where type=64
pen tb
fetch next from tb into @fname
while @@fetch_status=0
begin
set @s='del "'+rtrim(@fname)+'"'
exec master..xp_cmdshell @s,no_output
fetch next from tb into @fname
end
close tb
deallocate tb
--附加資料庫
set @s=''
declare tb cursor local for select fname from #t where type=0
open tb
fetch next from tb into @fname
while @@fetch_status=0
begin
set @s=@s+','''+rtrim(@fname)+''''
fetch next from tb into @fname
end
close tb
deallocate tb
exec('sp_attach_single_file_db '''+@dbname+''''+@s)
go

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.