MySql二进制日志文件解析系统

文章目录

  • MySql二进制日志文件解析系统
    • 一、前期准备
      • 1、前端框架
      • 2、后端框架
      • 3、mysql二进制日志文件解析
      • 4、系统架构
    • 二、知识储备
      • 1、数据库取证背景
        • (1)数据库存储结构分析
        • (2)数据文件
        • (3)日志文件
      • 2、数据库系统取证
        • (1) 数据库电子证据收集范围和次序
        • (2) 数据库系统相关电子证据收集
      • 3、Mysql二进制日志文件的设置
        • (1). 开启bin-log二进制日志
        • (2). 查看bin-log二进制日志
        • (3)、mysql二进制日志文件解析步骤详解
      • 4、Mysql日志解析结果
        • (1)INSERT操作
        • (2)UPDATE操作
        • (3)SELETE操作
    • 三、代码分块
      • 1、前后端交互(axios与flask接口交互)
      • 2、python调用mysqlbinlog.exe解析mysql二进制日志文件
      • 3、将查询后的数据分类显示在不同颜色表格中
      • 4、前端数据保存为txt文件、xls表格文件
    • 四、总结与展望
      • 1、总结
      • 2、展望
    • 五、参考文献

先看看最后的一个结果:

一、前期准备

1、前端框架

element-ui:Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是Mint UI 。

vue.js:是一套构建用户界面的渐进式框架, 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

axios.js: Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求。

<!-- import CSS --><link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"><!--<script src="js/axios.js"></script>--><script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script><!-- import Vue before Element --><script src="js/vue.js"></script><!-- import JavaScript --><script src="https://unpkg.com/element-ui/lib/index.js"></script>

2、后端框架

Flask框架:

​ Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

​ Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。它被称为微框架,“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩展,Flask框架的主要特征是核心构成比较简单,但具有很强的扩展性和兼容性,程序员可以使用Python语言快速实现一个网站或Web服务。

3、mysql二进制日志文件解析

​ 日志是数据库取证最重要的信息依据,MySQL 数据库的日志中记 录了用户对数据库数据所有的操作.本文通过研究 MySQL 数据存储原 理和日志功能原理,分析MySQL二进制日志结构,使用KMP算法对MySQL 二进制日志进行关键字匹配检索出所需要的信息,提出了基于日志分 析的 MySQL 数据库取证算法.大量的实验结果检验了该算法的有效性.

4、系统架构

客户端服务器mysqlbinlog上传二进制日志文件日志文件日志文件解析后的明文解析日志功能解析后的明文下载解析文件按条件取证日志取证数据下载取证数据客户端服务器mysqlbinlog

二、知识储备

1、数据库取证背景

​ 数据库是信息系统中不可或缺的部分。随着大数据时代的到来,数据库已经成为犯罪分子的目标,大量数据库被"拖库"用于网络盗窃和网络诈骗等活动。数据库具备完善的日志,因此案件现场的数据库蕴含了大量证据,可以根据这些证据回溯犯罪过程、固定证据并确定入侵者。

(1)数据库存储结构分析

​ 数据库存储结构有两个维度,一个是它的物理存储结构,另一个是它的逻辑存储结构。物理存储结构是从操作系统角度来看数据库的构成要素,通常包括数据文件和日志文件。逻辑存储结构是从数据库内部观看其构成要素,表示数据库系统如何组织和管理数据。

(2)数据文件

​ 每个数据库都包含数目不等的数据文件,用来记录具体的数据内容。多数数据库中的数据对象(表、索引等)被存储在这些可通过操作系统访问的数据文件中。另外,一些数据库系统也支持在没有文件系统的裸设备上存储数据。SQL Server的数据文件在物理存储结构上又分为主数据文件和次要数据文件。主数据文件是数据库的起点,每个数据库都有一一个主数据文件,其推荐文件扩展名是.mdf"。

(3)日志文件

​ 数据库的日志文件用于记录已经被作用在数据库上的所有变动操作。具体包括系统存储过程或数据定义语言对系统表所做的更改,每次分配或释放的扩展盘区,对表或者索引的删除操作等内容。但不包括对表的查询操作。尽管对于类似access, foxpro这样的桌面数据库并没有日志这样的概念,这些数据库中仅仅包括数据而已。但在Ondle、SQL Server之类的大型数据库系统中均包含数据文件和日志文件两个必要的部分。例如,sQLServer日志文件的推荐扩展名为“.ldf",Oracle日志文件的推荐扩展名是"log"。

​ 一些数据库的日志文件根据记录的时期,又分为事务日志文件和归档日志文件两类。事务日志文件用于记录数据库执行的任何交易,例如数据的新增、修改、删除等动作。归档日志文件可以认为是事务日志的复本。例如,Orace用于记录在线事务处理的事务B志文件称为重置日志文件 。

2、数据库系统取证

(1) 数据库电子证据收集范围和次序

**数据库证据收集范围:**调查人员进行数据库的证据收集之前,首先要清楚的掌握计算机中可能存放数据库相关证据数据的位置,确定证据收集的范围。另外,操作系统作为数据库系统下层载体,数据库系统所在的操作系统也记录了许多数据库的相关信息。表1罗列了在数据库系统所在服务器上可收集的相关证据数据的主要范围。

**数据库证据收集次序:**调查人员在了解了数据库系统证据数据的收集范围之后,需要进一步确定证据收集的优先次序,以实现数据库系统证据较全面和完整的收集,从而最大化的保全证据。调查人员应该根据数据库证据数据的稳定性和重要性来制定收集的次序,可以参考以下次序进行收集。

​ A. 数据库系统版本信息

​ B. 不稳定的数据库数据

​ C. 数据库临时表空间

​ D. 活动事务处理日志

​ E. 数据库文件

​ F. 数据库错误日志

​ G. 系统事件日志

​ H. 跟踪文件(trace files)

(2) 数据库系统相关电子证据收集

收集数据库系统版本信息

​ 准确找到被调查的数 据库系统,并且获取了该数据库系统的版本信息,系统目 录等信息,是进行有针对性的数据库取证的前提.即使是同类型的数据库系统,其不同的版本所支持的功能也不尽 相同.通常一台服务器只会存放一个数据库系统,此时找 到被调查的数据库系统不是难事.当服务器上同时运行多 个数据库系统时,需要调查人员根据被调查的应用服务程 序或WEB服务来追踪目标数据库.应用服务程序或 WEB服务作为连接用户和数据库的中间层,其服务配置 文件中,通常都会记录程序或服务所连接的数据库地址和 名称.

收集不稳定数据库数据

​ 不稳定的数据也称易失性数据,主要是指存储在主存和高速缓冲存储器中的数据。当调查人员进行数据库系统取证调查时,如果数据库 所在操作系统未关闭,允许联机调查,调查人员应该首先 对不稳定的数据库证据数据进行收集,这也是数据库取证 的难点.不稳定的数据库数据通常存放在各类缓存中,数 据库缓存按用途通常可以分为三类:一是日志缓存.为了 提高日志记录输出效率,数据库系统通常会先将日志记录 临时保存在日志缓冲区中,直到活动事务被提交或回滚. 二是数据缓存.为提高访问效率,数据库系统也会开辟数 据缓冲区,存储最近从数据文件中读取的数据.三是过程 缓存,也称程序缓存.用于存放最近的用户代码或执行计划.

收集系统临时数据库

​ 系统临时数据库用于为所有的临时表、临时存储过程以及其他的临时操作提供空间。SQL Server数据库系统的临时数据库是其tempDB数据库,Oracle数据库系统的临时数据库在其temp表空间中。系统临时数据库的数据保存在物理硬盘上,而不是存放在内存中,不过这是暂时的,不是永久存储的,每次重新启动都会导致以前数据的丢失。调查人员可以通过SQL命令来联机收集和分析系统临时数据库中数据。系统临时数据库操作的事务也会记录在日志中,但临时数据库的日志仅仅记录事务回滚(Undo)的信息,而不记录重做(Redo)事务的信息。

收集活动事务日志

​ 数据库系统每建立一个会话 连接,就开始一个活动事务,直到该事务被提交或回滚后 关闭会话连接,该活动事物结束.数据库系统的事物日志 从活动事务的开始到活动事物的结束一直保持对活动状态 进行记录,日志的这部分称为活动事务日志,用于实现事 务的完整性.数据库系统出于性能上的考虑,会将用户的 改动存入缓存中,又根据先写日志原则(Write Ahead Log),这些改变会立即写入事务日志,但不会立即写入数据文件.直到数据库的检查点发生,才会将已提交完成 的事务所修改的数据从缓存中写入数据文件.所以调查人 员对活动事务日志进行在线联机收集和分析,需要注意这 些已经发生但仍未作用到数据库磁盘实际数据上的修改操 作,以获取更多的线索和证据信息.

收集数据库数据文件和日志文件

​ 数据库的所有 数据都保存在数据文件中,并且使用日志文件来记录数据 库所做的所有更改操作,所以收集数据库的数据文件和日 志文件是数据库取证的主要环节.对于数据文件和日志文 件的收集,关键是准确找到数据库数据文件和日志文件的 存放位置,同时不要遗忘了数据库的附属文件.例如SQL Server数据库的数据文件还包括次要数据文件(.ndf).数 据库的数据文件和日志文件的存放位置可以通过数据库系 统控制文件或相关数据库系统命令来查找.获取了数据文 件和日志文件之后,就可以将这些文件加载到取证分析平台上的数据库系统或数据库文件分析工具上进行比对分 析.例如,调查人员可以借助日志分析工具 Log Explorer对SQL Server日志文件进行分析,借助LogMiner对 Oracle重做日志文件进行分析.

收集数据库系统错误日志

​ 数据库系统错误日志 记录数据库系统任何当前或潜在的问题,包括内部错误消 息,数据库重启的自动恢复消息或其他服务器级错误消 息.SQL Server的错误日志文件Error.Log记录了一个进程 成功完成与否,包括备份和还原操作,批处理命令或其他 脚本和进程.Oracle 的后台报警日志文件Sidalrt.Log记录了 数据库在启动,关闭和运行期间后台进程的活动情况.

收集默认的跟踪文件

​ 跟踪(trace)文件记录了 被监听数据库的各类操作信息,以便用户能根据文件内容 来解决各种故障.跟踪文件所记录的内容与数据库系统和 用户设置的审计追踪监听策略有关.取证人员可以通过对 跟踪文件的收集和分析来发现新线索,收集更完整的数据 库证据.例如,调查人员可以通过监听到的一个敏感数据 值的更新,追踪找到执行这个更新的用户,并跟踪这个用 户所做的所有操作来发现篡改或破坏

3、Mysql二进制日志文件的设置

(1). 开启bin-log二进制日志

​ 这里我也是参看这篇博文的:https://blog.csdn.net/demonson/article/details/80664141

看系统变量log_bin,如果其值为OFF,表示没有开启二进制日志(binary log),如果需要开启二进制日志,则必须在my.cnf中[mysqld]下面添加log-bin [=DIR[filename]] ,DIR参数指定二进制文件的存储路径;filename参数指定二级制文件的文件名。 其中filename可以任意指定,但最好有一定规范。系统变量log_bin是静态参数,不能动态修改的(因为它不是Dynamic Variable)。如下所示:

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)mysql> set global log_bin=mysql_bin;
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
mysql>

1:修改my.cnf,在[mysqld]下面增加log_bin=mysql_bin_log,重启MySQL后,你就会发现log_bin变为了ON,二进制日志(binary log)默认放在数据目录下(系统变量datadir下),如下所示:

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name                   | Value                              |
+---------------------------------+------------------------------------+
| log_bin                         | ON                                 |
| log_bin_basename                | /var/lib/mysql/mysql_bin_log       |
| log_bin_index                   | /var/lib/mysql/mysql_bin_log.index |
| log_bin_trust_function_creators | OFF                                |
| log_bin_use_v1_row_events       | OFF                                |
| sql_log_bin                     | ON                                 |
+---------------------------------+------------------------------------+
6 rows in set (0.00 sec)mysql>

(2). 查看bin-log二进制日志

系统变量log_bin的值为OFF表示没有开启二进制日志(binary log)。ON表示开启了二进制日志(binary log)

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)mysql>

查看当前服务器所有的二进制日志文件

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 |      9653 |
| mysql-bin.000006 | 340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)

当然你还可以使用下面命令查看

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 |      9653 |
| mysql-bin.000006 |  340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)mysql>

查看当前二进制日志文件状态

mysql> show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 373655406 |              |                  |                   |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

(3)、mysql二进制日志文件解析步骤详解

​ 在获取到mysql二进制日志文件之后,用X-Ways Forensics取证工具对这个文件进行读取,如下图所示,在参考文献中就给出了mysql二进制文件的详细解读。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4m7o1te-1595653305422)(D:\工作必要\研一\课程\计算机取证\数据库取证\微信截图_20200414161131.png)]

为了验证 MySQL 二进制日志结构分析的正确性,使用二进制文件查看器选取一条记录进行分析,如图 18 所示,小图(a)(b)©分别为日志记录(QUERY 类型)中的 Common-Header,Post-Header,Body 的三部分,在 MySQL 二进制日志中的编码模式是小端模式[33]。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBPTxdwl-1595653305426)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200531170609201.png)]

(1)图18中的(a)图中一共19个字节,E4F32F53表示时间,因为二进制是用小尾数表示的所以上面四个字节表示0x532FF3E4=1395651556(十进制),转换成时间就是2014/3/24 16:59:16.02表示类型,就是QUERY类型,01 00 00 00表示server-id,0x00000001=1, 77 00 00 00表示t 大小,就是0x00000077=119;3E010000表示记录结束的地方,就是离文件起始位置有0x0000013E=318个字节;0000是标识位。

(2)图18中的(b)图中一共13个字节,17 00 00 00表示线程id,大小为23;00 00 00 00 表示exec-time,大小为零;04表示数据库名字的长度,大小 为4;00 00表示错误代码,大小为0,表示无错;21 00表示status_var_len的长度为33

(3)图18中的©图中一共87个字节,这个值可以有total-size减去Common-Header和Post-Header的长度得出,119-19-23=87,该结果与记录中实际的长度是一样的;00 00 00 00 00 01 00 00 20 50 00 00 00 00 06 03 73 74 64 04 08 00 08 00 21 00 0C 01 74 65 73 74 00 这里一共33个字节,表示状态的值;74 65 73 74 00这里一共5个字节表示,表示数据库的名字,ascii码的转换可以得出该数据库的名字为test;75 70 64 61 74 65 20 74 65 74 20 74 70 74 20 73 65 74 20 65 74 20 6E 61 6D 65 3D 27 79 61 6C 69 65 73 68 69 27 20 31 这里 45 个字节,该段二进制内容根据 ascii 码 转换后可以得出字符串为:update tset set name=‘yaliceshi’ where id = 1, 该字符串为 SQL 的命令语句,最后的四个字节 3A CC 18 EC 是校验码,判断整条 记录是否正确。

​ 最后用 mysqlbinlog 程序将该条记录转换成文本文件,可以得到如图 19 中的信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrCMldTj-1595653305429)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200531170828868.png)]

首先使用X-Ways Forensics查看日志的二进制文件,选区一段二进制,验证上述解析步骤如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOllqWnr-1595653305433)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604103913514.png)]

然后将二进制文件转为字符串得到 insert user values(“fdsa”,“89”)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-neq6yKGZ-1595653305437)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604103934701.png)]

4、Mysql日志解析结果

(1)INSERT操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isx2zynt-1595653305440)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604100637957.png)]

从分析结果中可得到,在2020/04/22 14:58:52 对数据库插入一组数据

INSERT INTO strings (string, state) VALUES (‘this is a sun’, ‘0’)

在2020/04/22 15:03:30 对数据库插入一组数据

insert strings VALUES(“fjdklas”, 0)

(2)UPDATE操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UrSxVotf-1595653305443)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604100753379.png)]

从分析结果中可得到,在2020/04/22 15:06:59 对数据库更新一组数据

UPDATE strings SET string=‘this is an sun’ WHERE (string=‘this is a sun’) AND (state=‘0’)

(3)SELETE操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ik8Mx0Nq-1595653305446)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604100812956.png)]

从分析结果中可得到,在2020/04/22 15:06:04 对数据库插入一组数据

DELETE FROM strings WHERE (string=‘fjdklas’) AND (state=‘0’)

三、代码分块

1、前后端交互(axios与flask接口交互)

前端axios:

get_binary_str(){temp_list = []axios({method: 'post',url: 'http://127.0.0.1/get_binary_str',data: JSON.stringify({id: '12',lastName: 'Flintstone'})}).then(function(response) {console.log("请求成功")    temp = {}temp['str'] = response.datatemp_list.push(temp)}).catch(function(error) {console.log("请求失败")console.log(error);});this.binary_to_str_textarea = temp_list},//get_binary_str

后端Flask:

@app.route('/get_type_sql',methods = ['POST', 'GET'])
def get_type_sql():get_data = json.loads(request.get_data())type_list = get_data['id']#获取前端传来的参数get_data = json.loads(request.get_data())type_list = get_data['type']#获取前端传来的参数result = binary_to_str()return Response(json.dumps(result), content_type='application/json')

2、python调用mysqlbinlog.exe解析mysql二进制日志文件

(1)mysqlbinlog工具

在Windows环境下,安装完成Mysql后,在安装目录bin下会存在mysqlbinlog.exe应用程序。binlog是二进制内容文件,人类是无法直视的。而mysqlbinlog这个工具是用来辅助人类查看Mysql数据库binlog文件内容的。例如下图,使用mysqlbinlog.exe将二进制转换为可读文档。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7U1315s-1595653305449)(D:\工作必要\研一\课程\计算机取证\数据库取证\QQ截图20200414215404.png)]

(2)使用python调用外部exe程序

将结果存储在a.txt文档中

os.system('mysqlbinlog.exe file/mysql-bin.000002 > ../a.txt')

然后将a.txt中的数据进行划分

源码如下:

#-*-coding:utf-8-*-
import re
import os
def Print_list(insert_list, update_list, delete_list):print ("==================insert==================")for i in insert_list:print(i)print ("==================update==================")for i in update_list:print(i)print ("==================delete==================")for i in delete_list:print(i)
def to_str(filename):os.system("mysqlbinlog.exe file/" + filename +" > ../a.txt")def to_time(str_time):str_time_list = list(str_time)str_time_list.insert(4,'/')str_time_list.insert(2, '/')str2 = "".join(str_time_list)return "20" + str2def binary_to_str():os.system('mysqlbinlog.exe file/mysql-bin.000002 > ../a.txt')# os.system('mysqlbinlog.exe file/mysql_bin_log.000001 > ../a.txt')# print(a)insert_list = []update_list = []delete_list = []f = open('../a.txt', encoding='utf-8')content = f.read()list = content.split("# at")for i in list:a = {}index = re.findall('insert ', i, flags=re.IGNORECASE)if len(index) != 0:a['time'] = to_time(i.split('\n')[1][1:17])a['type'] = "INSERT"a['SQL'] = i[i.find(index[0]): -1]insert_list.append(a)# insert_list.append(i[i.find(index[0]) : -1])continueindex = re.findall('update ', i, flags=re.IGNORECASE)if len(index) != 0:a['time'] = to_time(i.split('\n')[1][1:17])a['type'] = "UPDATE"a['SQL'] = i[i.find(index[0]): -1]update_list.append(a)# update_list.append(i[i.find(index[0]): -1])continueindex = re.findall('delete ', i, flags=re.IGNORECASE)if len(index) != 0:a['time'] = to_time(i.split('\n')[1][1:17])a['type'] = "DELETE"a['SQL'] = i[i.find(index[0]): -1]delete_list.append(a)# delete_list.append(i[i.find(index[0]): -1])result = {}result['insert'] = insert_listresult['update'] = update_listresult['delete'] = delete_listPrint_list(insert_list, update_list, delete_list)return resultif __name__ == '__main__':binary_to_str()

得到划分结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hibLb2TT-1595653305452)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200531205340987.png)]

3、将查询后的数据分类显示在不同颜色表格中

表格显示:

<el-col :span="12"><div class="grid-content bg-purple"><el-table :data="abaloneData" height="800px" border style="width: 100%" :cell-style="cellStyle"><el-table-column prop="type" label="类型" > </el-table-column><el-table-column prop="time" label="时间"> </el-table-column><el-table-column prop="SQL" label="命令语句"> </el-table-column></el-table></div></el-col>
cellStyle({row, column, rowIndex, columnIndex}) {//根据测试结果动态调整单元格样式,成功-绿色,失败-红色,不支持-黄色let cellStyle;switch (row.type) {case 'INSERT':cellStyle = 'background: #BCDBFB;color:white;';break;case 'UPDATE':cellStyle = 'background: #84C465;color:white;';break;case 'DELETE':cellStyle = 'background: #F99191;color:white;';break;default:cellStyle = '';}if (column.label == '类型')return cellStyle;}//cellStyle

4、前端数据保存为txt文件、xls表格文件

(1)js将字符串保存为txt文档

download_file(){console.log("导出txt文档数据")//encodeURIComponent解决中文乱码var uri = 'data:text/XLS;charset=utf-8,\ufeff' + encodeURIComponent(this.binary_to_str_textarea[0]['str']);//获取字符串//通过创建a标签实现var link = document.createElement("a");link.href = uri;//对下载的文件命名link.download = "解析文档.txt";document.body.appendChild(link);link.click();document.body.removeChild(link);},//download_file

(2)js将数组保存为xls表格文件

print_data() {console.log("导出数据")list_name = ["type","time",  "SQL"]let title = list_name;let filter = [];  //不导出的字段this.exportExcel(this.abaloneData,'测试excel',title, filter);}, //print_data      exportExcel(JSONData, FileName, title, filter) {console.log("输出为表格")if (!JSONData) return;//转化json为objectvar arrData = typeof JSONData != "object" ? JSON.parse(JSONData) : JSONData;var excel = "<table>";//设置表头var row = "<tr>";if (title) { //使用标题项for (var i in title) {row += "<th align='center'>" + title[i] + "</th>";}} else {//不使用标题项for (var i in arrData[0]) {row += "<th align='center'>" + i + "</th>";}}excel += row + "</tr>";//设置数据for (var i = 0; i < arrData.length; i++) {var row = "<tr>";for (var index in arrData[i]) {//判断是否有过滤行if (filter) {if (filter.indexOf(index) == -1) {var value = arrData[i][index] == null ? "" : arrData[i][index];row += "<td>" + value + "</td>";}} else {var value = arrData[i][index] == null ? "" : arrData[i][index];row += "<td align='center'>" + value + "</td>";}}excel += row + "</tr>";}excel += "</table>";var excelFile ="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";excelFile +='<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';excelFile +='<meta http-equiv="content-type" content="application/vnd.ms-excel';excelFile += '; charset=UTF-8">';excelFile += "<head>";excelFile += "<!--[if gte mso 9]>";excelFile += "<xml>";excelFile += "<x:ExcelWorkbook>";excelFile += "<x:ExcelWorksheets>";excelFile += "<x:ExcelWorksheet>";excelFile += "<x:Name>";excelFile += "{worksheet}";excelFile += "</x:Name>";excelFile += "<x:WorksheetOptions>";excelFile += "<x:DisplayGridlines/>";excelFile += "</x:WorksheetOptions>";excelFile += "</x:ExcelWorksheet>";excelFile += "</x:ExcelWorksheets>";excelFile += "</x:ExcelWorkbook>";excelFile += "</xml>";excelFile += "<![endif]-->";excelFile += "</head>";excelFile += "<body>";excelFile += excel;excelFile += "</body>";excelFile += "</html>";var uri ="data:application/vnd.ms-excel;charset=utf-8," +encodeURIComponent(excelFile);var link = document.createElement("a");link.href = uri;link.style = "visibility:hidden";link.download = FileName + ".xls";document.body.appendChild(link);link.click();document.body.removeChild(link);},//exportExcel

四、总结与展望

1、总结

​ 本文通过研究了 MySQL 数据库的整体架构,MySQL 数据库的日志功能,然后提出了基于日志分析的 MySQL 数据库取证算 法,并以该算法为基础实现了基于日志分析的 MySQL 数据库取证系统,并且对 算法和系统进行了实现和测试.。

(1) 本文分析出了 MySQL 二进制日志文件中日志 信息的记录结构,从而提出了基于日志分析的 MySQL 数据库取证算法,实现了 对 MySQL 数据库的取证;

(2)以基于日志分析的 MySQL 数据库取证算法为基础,实现了基于日志分 析的MySQL 数据库取证系统.该系统实现了自动查找MySQL数据库的日志文件, 对MySQL 数据库的关键数据进行取证的功能,解决了MySQL数据库的取证问题。

2、展望

​ 本文分析的MySQL二进制日志文件算法,能够将二进制日志文件的二进制转换为可读明文。本文使用的mysqlbinlog工具,系统中用户将二进制日志文件上传进系统中,然后由工具将二进制文件转换为明文,系统根据用户的需求得到解析后的数据。理论上可以根据解析之后的明文,将数据库中一段事件内的删除数据恢复等一系列操作。

五、参考文献

[1] 基于日志分析的MySQL数据库取证算法研究
[2] bin-log二进制日志:https://blog.csdn.net/demonson/article/details/80664141
[3] 数据库系统取证实现研究

MySql二进制文件解析系统相关推荐

  1. 美团技术 mysql_美团MySQL数据库巡检系统的设计与应用

    巡检工作是保障系统平稳有效运行必不可少的一个环节,目的是能及时发现系统中存在的隐患.我们生活中也随处可见各种巡检,比如电力巡检.消防检查等,正是这些巡检工作,我们才能在稳定的环境下进行工作.生活.巡检 ...

  2. 【MySQL原理解析】01. 一条SQL查询语句是如何执行的

    这是[MySQL原理解析]的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧.万事开头难,咱们先破了 ...

  3. 数据库巡检 java_美团MySQL数据库巡检系统的设计与应用

    巡检工作是保障系统平稳有效运行必不可少的一个环节,目的是能及时发现系统中存在的隐患.我们生活中也随处可见各种巡检,比如电力巡检.消防检查等,正是这些巡检工作,我们才能在稳定的环境下进行工作.生活.巡检 ...

  4. 基于UDS的BootLoader上位机源代码,支持ISO15765通信,支持PeakCAN , ZJG CAN等CAN卡, 支持S-record格式的二进制文件解析; 可二次开发或扩展应用

    基于UDS的BootLoader上位机源代码(C#) 基于UDS的BootLoader上位机源代码,支持ISO15765通信,支持PeakCAN , ZJG CAN等CAN卡, 支持S-record格 ...

  5. mysql自动化巡检_美团MySQL数据库巡检系统的设计与应用

    巡检工作是保障系统平稳有效运行必不可少的一个环节,目的是能及时发现系统中存在的隐患.我们生活中也随处可见各种巡检,比如电力巡检.消防检查等,正是这些巡检工作,我们才能在稳定的环境下进行工作.生活.巡检 ...

  6. 美团监控系统mysql_美团 MySQL 数据库巡检系统的设计与应用

    说明: 作者:王琦 来源:美团技术团队 最新互联网大厂面试真题.Java程序员面试策略(面试前的准备.面试中的技巧)请访问GitHub 我们生活中随处可见各种巡检系统,比如电力巡检.消防检查等,正是这 ...

  7. 2020最新MySQL数据库面试题( MySQL引索系统+MySQL数据架构+红黑树结构图+B+树)

    视频参考一线互联网大佬一堂课教会你那些年,你未曾了解的MySQL索引优化 [建议收藏] '阿里高级架构师一个视频教会你MySql 各大知识点MySQL系列/ MySQL引索系统/MySQL数据架构/红 ...

  8. MySQL协议解析及C/C++代码实现

    MySQL 常用于许多知名网站,包括 Facebook.Google.Twitter 和 YouTube等等.它于 1995 年首次发布.MySQL 是用 C 和 C++ 编写的. MySQL 适用于 ...

  9. php mysql cms 商城,国内最常用的PHP+MySql免费CMS系统大全

    国内最常用的PHP+MySql免费CMS系统大全 1. DEDE -这是一款国内开源的cms,作者是一个个人,能做出如此功能的cms,是相当不错的.2007版功能十分强大,希望能改善之前数据量一大,更 ...

最新文章

  1. EF Core数据库Provider一览
  2. linux内核_Linux驱动编程的本质就是Linux内核编程
  3. 成都软件工程师python_为什么每个软件工程师都应该学习Python?
  4. 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧
  5. python语言的主网址-怎么用Python提取域名中的主域名
  6. pandas--groupby相关操作
  7. C语言入门项目篇:贪吃蛇(完整代码+详细注释)
  8. ModbusTCP通讯协议学习及实践(台达三菱PLC通讯)
  9. cadcene17.4软件汉化
  10. Oracle迁移到mysql字符集_oracle数据库字符集characterset迁移及变更系列一
  11. kernel - 制作linux开机logo
  12. linux ip_conntrack_max,解?Linux NAT ip_conntrack: table full的方法
  13. 向量场的散度和旋度_矢量场,标量场,散度,梯度,旋度的理解
  14. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元
  15. 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术
  16. Android 自定义相机 Camera 图片方向问题
  17. PAT甲级真题目录(按题型整理)(转自柳神)
  18. custom的短语_custom到底是什么意思?
  19. 谭浩强 《C程序设计》(第五版)第二章
  20. C# DataRow转DataTable

热门文章

  1. 修改tomcat默认的编码方式
  2. 基于51单片机的医用输液点滴监测报警器(实物图+源码+原理图+参考论文)
  3. 什么是Spring上下文
  4. 解决IE提示“是要保存此文件,还是联机查找程序来打开此文件”
  5. 【数据结构】NOJ014 求广义表深度(严5.30)
  6. iOS8自动适配 autolayout sizeclass
  7. 计算机网络出行711,请问电脑联网时总是出现:711 是什么意思啊?
  8. 微信小程序单次请求上限20条的坑
  9. “倒在”金三银四,大牛手把手带你
  10. 贝叶斯推理:基本概念