sqlserver 的 查询语句SELECT * From ::fn_dblog(Default,Default), 这一串代表什么意思呀??
{
"CurrentLSN": "00000017:00000032:0001",
"Operation": "LOP_COMMIT_XACT",
"Context": "LCX_NULL",
"TransactionID": "0000:000002d6",
"LogBlockGeneration": 0,
"TagBits": [0, 0],
"LogRecordFixedLength": 48,
"LogRecordLength": 52,
"PreviousLSN": "00000017:00000030:0001",
"FlagBits": [0, 2],
"LogReserve": 58,
"EndTime": "2019/08/2910:05:25:403",
"TransactionBegin": "00000017:00000030:0001",
"ReplicatedRecords": 0,
"OldestActiveLSN": "none",
"ServerName": "none",
"DatabaseName": "none",
"VirtualClock": 0,
"Description": "",
"LogRecord": [0, 0, 48, 0, 23, 0, 0, 0, 48, 0, 0, 0, 1, 0, 2, 0, -42, 2, 0, 0, 0, 0, -127, 0, -43, 72, -90, 0, -72, -86, 0, 0, 23, 0, 0, 0, 48, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在SQL Server数据库中,从登陆开始,然后做了什么操作,以及数据库里发生了什么,大多都是有记录可循的,但是也有一些确实无从查起。
一. 数据库启动记录
1. 最近一次启动SQL Server的时间
2. 最近几次启动SQL Server的时间
3. 历史上更多次启动SQL Server的时间
查看windows event log,SQL语句无法直接读取event log,如果想用命令行,可以试试VBS,Powershell。
Event Viewer/Windows logs下Application 或者 System 事件里都有服务启动的记录。
二. 登录数据库记录
1. 查看error log
默认情况下,只有失败的登录会被记录在error log里,如果想登录失败/成功都被记录到error log,需要开启如图选项:
用SQL语句修改注册表,也同样可以开启,键值对应关系如下:
0, None
1, Failed
2, Successful
3, Both failed and successful
在error log里查看登录记录:
2. 利用LOGON 触发器进行记录
从SQL Server 2005 SP2开始引入了LOGON Trigger,可以用它在登录时做个记录,实现如下:
3. 实例:查询某login的最后一次登录
系统表/试图里,并没有这样的字段记录,syslogins里accdate也是不对的,如果要查可以通过上面2个方法里的一种:
(1) ERROR LOG,得设置记录Login Auditing 的“Both failed and successful” 选项,默认为”Failed”;
(2) Logon Trigger;
三. 创建,修改,删除记录 (DDL)
1. 服务器对象的创建,修改
2. 数据库对象创建,修改
注意:
(1) 索引的创建,修改并没有记录
(2) 关于creator和owner
SQL Server里只有owner,数据库里对象的owner必须是一个有效的database principal (user或者role),没有creator,很难知道是谁创建了这个对象,因为owner并不准确:
首先,数据库对象的owner可以被修改,ALTER AUTHORIZATION或者sp_changeobjectowner都行;
其次,就算owner没被修改过,默认情况下数据库对象的owner沿用schema的owner,除非在创建schema时特意指定了某个owner;
最后,系统表并没有记录creator,如果想要查询,也许得利用DDL 触发器来记录。
关于owner简单举例如下:
object owner
3. 默认跟踪里的创建,修改,删除对象 (create, alter, drop)
从sql server 2005开始引入了默认跟踪,这是sql server默认开启的跟踪,并定义了事件、文件大小,个数,查看定义如下:
示例,利用默认跟踪查看删除数据库记录如下:
注意:
(1) 其他对象比如表的删除等也都可以查到;
(2) 默认跟踪返回的列值有很多定义,没有系统表记载,需要去翻帮助,比如ObjectType列值参考这个列表:
https://msdn.microsoft.com/en-us/library/ms180953.aspx
(3) 注意默认跟踪的时效性,5个20MB的文件,也许想要看的信息很快就被覆盖了;
(4) truncate table并没有被默认跟踪记录。
四. 数据库表的各种记录
汇总一下对表的各种历史操作记录的查看:
(1) create table, alter table记录,查看sys.objects 或者默认跟踪;
(2) drop table记录,查看默认跟踪;
(3) truncate table 也许只有去打开数据库log文件查看了,最后会简单介绍下;
(4) DML操作表中数据的记录,查看sys.dm_db_index_usage_stats,如下:
注意:动态管理视图(DMV) 中采集来的信息都是从sql server启动后开始的,也就是说重启后就没了。
五. 历史SQL语句记录
有些数据库本身,会记录所有历史的SQL命令。比如:mysql和pgsql都有专门的log文本文件来存放所有历史的SQL命令;
也有些数据库在保存log文本的同时,还保留最近的N条SQL命令在数据库里,以方便查询。
SQL Server并没有这样的实现,只有sys.dm_exec_query_stats缓存了一部分 (sql server服务开启后执行的语句,某些不被缓存执行计划的语句并不记录)。
这个视图主要是对执行计划的统计,包含消耗成本,运行次数等等,并没有session,user,每次被执行的时间等信息:
当然,开启跟踪,审计之类的方法,是可以记录所有操作的,但是这个开销有可能会影响系统性能,所以一般并不在生产环境启用。
六. 数据库备份还原历史记录
备份还原的记录都在msdb里。
1. 备份记录
如果server_name是本机,那么备份是在本机生成的;
如果server_name是别的主机名,那么备份是被拿到本机做过数据库还原;
2. 还原纪录
还原数据库的时候是会写backupset和backupmediafamily系统表的,用来记录还原所用到的备份文件信息。
七. 作业,维护计划,数据库邮件历史记录
作业,维护计划,数据库邮件的历史记录,也都在msdb里。
1. 作业历史记录
2. 维护计划历史记录
维护计划最终是作为作业在运行的,也可以直接查看同名作业的历史记录。
3. 数据库邮件历史记录
八. 查看数据库日志文件
数据库日志文件里对于DDL,DML操作肯定是有记录的,有2个内置函数可以用来解析,但是并不那么轻松,简单介绍如下:
1. fn_dblog 读取当前在线的日志
返回的结果集中字段定义:
(1) AllocUnitName: 对象名
(2) Operation: 操作类型,常见的有 'LOP_INSERT_ROWS', 'LOP_DELETE_ROWS', 'LOP_MODIFY_ROW'
(3) [RowLog Contents 0], [RowLog Contents 1], 2,3,4,5: 字段内容,但是是二进制的,和dbcc page看到的类似
试着查看truncate table记录如下:
2. fn_dump_dblog 读取数据库备份里的日志
参数介绍:前面两2个NULL和fn_dblog一样代表起始的日志LSN,DISK表示设备类型,1表示备份文件个数,最多64个,这里以1个文件为例:
这2个函数返回的信息量很大,如果有兴趣,不妨多做点测试。