先上下表结构和数据

基本语法

SqlServer中有一个未在文档中公开的函数sys.fn_dblog,提供查询当前数据库事务日志的功能。通过这个函数,可以简单了解下数据库事务日志的机制

使用方法如下:

select * from sys.fn_dblog(null,null)

  它有两个参数,分别是起始LSN和结尾LSN(Log Sequence
Number),返回结果是两个LSN之间的日志。LSN值可以不指定,使用null作为参数,则是查询所有的日志。

  两个参数,不能直接使用查询出来Current LSN值,否则会报“传递给
OpenRowset(DBLog, …)的参数无效”错误,或者参数不起作用。

  使用方法:

  select * from fn_dblog('0x00000041:00000320:0003',null) --LSN前面加0x
  select * from fn_dblog(null,'65:800:3') --转换成十进制形式
  select * from fn_dblog(null,'65000000080000003')--LSN的另一种写法

 

DROP TABLE IF EXISTS `message`;
CREATE TABLE `message` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '会员私信',
  `from_uid` int(255) NOT NULL DEFAULT '0' COMMENT '发送者',
  `to_uid` int(255) NOT NULL DEFAULT '0' COMMENT '接受者',
  `flg` int(11) NOT NULL DEFAULT '0' COMMENT '状态 0:未读 1 : 已读',
  `content` varchar(255) NOT NULL DEFAULT '' COMMENT '内容',
  `createtime` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_uid` (`from_uid`),
  KEY `to_uid` (`to_uid`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of jzhs_mssage
-- ----------------------------
INSERT INTO `message` VALUES ('10', '1', '2', '0', 'aaaaa', '0000-00-00 00:00:00');
INSERT INTO `message` VALUES ('11', '2', '1', '0', 'bbbbb', '0000-00-00 00:00:00');
INSERT INTO `message` VALUES ('12', '1', '3', '0', 'ccccc', '0000-00-00 00:00:00');

记录内容

  通过一些具体操作查看日志记录情况

    在一个数据库中查询事务日志条数,共90条:

     
 澳门微尼斯人手机版 1

       向其中一个表中插入一条数据:

  澳门微尼斯人手机版 2

     
 查询fn_dblog,记录条数变成了93条,增加了3条,分别是事务开始(LOP_BEGIN_XACT)、插入数据(LOP_INSERT_ROWS)、事务提交(LOP_COMMIT_XACT)

   
  澳门微尼斯人手机版 3

       同理,修改数据:

  update tbl set value='hhhhh' where id=6

  再查询日志,增加了三条:事务开始日志(LOP_BEGIN_XACT)、修改日志(LOP_MODIFY_ROW)、事务提交日志(LOP_COMMIT_XACT)

  澳门微尼斯人手机版 4

     类似的,执行删除:

delete from tbl where id=6

  日志增加了3条:事务开始日志(LOP_BEGIN_XACT)、修改日志(LOP_DELETE_ROWS)、事务提交日志(LOP_COMMIT_XACT)

  澳门微尼斯人手机版 5

  上面只是最简单的例子,如果涉及分配空间、页拆分、索引更新、系统表更新等操作,记录条数会增多。

Preface

 

恢复数据

  如果想要恢复被删除或被修改的数据,可以根据事务的LSN,可以将数据库恢复到事务执行之前的状态,前提是有过一次全量备份。以上面为例,先查询tbl表,查看内容:

  澳门微尼斯人手机版 6

  id=6的记录已经被删除了,如果想要恢复,先记下删除事务开始位置对应的LSN:就是上面第97行00000041:00000318:0001,后面恢复日志备份的时候用。

  先使用WITH
NORECOVERY选项恢复一个全量备份:

  

restore database biztest2
from disk='D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\biztest.bak'
with move 'BIZTEST' to 'D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\data\biztest2', 
move 'biztest_log' to 'D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\data\biztest2_log',
norecovery

  恢复完成后,SSSM中查看数据库,会有个“恢复中”的提示

  澳门微尼斯人手机版 7

  此时数据库还不可用,只能用来继续还原增量备份或事务日志备份。对刚才被删除数据的数据库BIZTEST做一下日志备份

  澳门微尼斯人手机版 8

  使用上面查到的LSN:00000041:00000318:0001和带STOPBEFOREMARK选项的RESTORE命令:

  restore log biztest2
  from disk='D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\biztest.trn'
  WITH STOPBEFOREMARK ='lsn:0x00000041:00000318:0001',
  recovery;

  澳门微尼斯人手机版 9

  此时,BIZTEST2已经可以用了。执行查询:

  澳门微尼斯人手机版 10

  id=6的数据恢复成功。

 

查询的目的为
获取本表中私信列表,内容取私信的最后一条。从网上找了很多方法,但是看着比较麻烦。所以采取了一个非常菜的写法,也总算完成了目的。

    In order to know clearly about the
real performance threshold of database server,we usually do database
benchmarks.What’s it?It’s similar with preasure test of database in the
whole system.The difference is that the database benchmark may not care
about the real business performance but the direct performance with
virtual data.It’s simple and convenient to implement whereas what is
more complex in presure test.The items what we really care about in
database benchmark is TPS/QPS/RT(Response
Time)/Concurrency,etc.I’m
gonna use sysbench(one of the benchmark test tools) to do some basic
oltp read write test of MySQL database today.

强烈欢迎各位大神来指正和交流!!

 

输出内容如下

澳门微尼斯人手机版,Introduce

 

 

from_uid
to_uid
flg
content
createtime
2 1 0 bbbbb  
1 3 0 ccccc  

   
sysbench is a common tool used in database bentchmark to test MySQL
database(of cource,it supports PostgreSQL and Oracle,too).It provide
many test case through several built-in lua scripts by specifying option
of “testname”.We can use the tool to get performance statistics about
CPU,IO,Memory,etc.

执行sql:

 

SELECT from_uid,to_uid,content,createtime,if(from_uid>to_uid,CONCAT(from_uid,'_',to_uid),CONCAT(to_uid,'_',from_uid)) as groups 
FROM message  
GROUP BY groups 
ORDER BY id DESC

Procedure

主要目的为,已from_uid、to_uid两个字段的进行分组查询。前提为这两个是int类型,方便做if的判断操作。

 

 

Official web site:

https://github.com/akopytov/sysbench

 

Git clone address:

https://github.com/akopytov/sysbench.git

发表评论

电子邮件地址不会被公开。 必填项已用*标注