SQL Server ErrorLog 错误日志说明

2022-11-12 09:46:53
内容摘要
这篇文章主要为大家详细介绍了SQL Server ErrorLog 错误日志说明,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记!默认情况下,SQL Server 保
文章正文

这篇文章主要为大家详细介绍了SQL Server ErrorLog 错误日志说明,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

默认情况下,SQL Server 保存 7 个 ErrorLog 文件,名为:ErrorLogErrorLog.1ErrorLog.2ErrorLog.3ErrorLog.4ErrorLog.5ErrorLog.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是用户操作数据库必须考虑的一面。一、删除LOG1:分离数据库 企业管理器->服务器->数据库->右键->分离数据库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_LOG2.截断事务日志:BACKUP LOG 数据库名 WITH NO_LOG3.收缩数据库文件(如果不压缩,数据库的文件不会减小企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至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 

注:关于SQL Server ErrorLog 错误日志说明的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!