百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

收集mysql、MSSQL和mongodb指定表的log

toyiye 2024-06-21 12:13 9 浏览 0 评论

背景说明:

需要采集mysql、sql Server和mongodb指定表的相关操作记录并加以分析,从而形成对数据变化的监测;


实现原理:

mysql则通过解析binlog并过滤指定的表,并将结果保存到表中。

Sql Server则是通过以profiler的形式,以sql实现相关功能,跟踪相关的SQL语句并实现过滤和筛选。

Mongodb则是通过对oplog分析并过滤,并将结果持久化操作。


Mysql实现代码:

1)记录表:

create table sqlAudit(

id bigint primary key auto_increment COMMENT '主键自增ID',

stringsql text COMMENT '跟踪到的SQL语句',

postioninfo varchar(500) COMMENT 'postion的开始、结束位置和执行时间',

addtime datetime default now() COMMENT '添加时间'

)


2)下载并安装工具:

shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql

shell> pip install -r requirements.txt


3)Shell文件getbinlog.sh的脚本:

#!/bin/bash

HOSTNAME="10.12.11.34"

PORT=30001

USERNAME="root_user"

PASSWORD="//@#Y3M2T1pwd"


select_sql="show master status;"


result=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" | awk 'NR>1'`

#echo `mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" | awk 'NR>1'`

binlog=`echo $result | awk '{ print $1 }'`

postion=`echo $result | awk '{ print $2 }'`

bin=`echo $binlog|sed 's/.*\(...\)$/\1/'`

intbin=`echo $bin | awk '{print int($0)}'`

binsmall=$[$intbin-1]

lenbin=`echo $binsmall |wc -L`

if [ $lenbin == 2 ];then

sbinlog=${binlog/$bin/"0"$binsmall}

else

sbinlog=${binlog/$bin/$binsmall}

fi

#sbinlog=${binlog/$bin/$binsmall}

echo $sbinlog

if [ ! -f "/$sbinlog" ];then

python ./binlog2sql.py -h$HOSTNAME -P$PORT -u$USERNAME -p$PASSWORD -t filemd5 --start-file=$sbinlog>/$sbinlog

suser="root_user"

spassword="//@#Y3M2T1pwd"

shost="monitor.db.ymatou.com"

sport="30001"


mysql_conn="mysql -h"$shost" -P$sport -u"$suser" -p"$spassword""


cat /$sbinlog | while read stringsql

do

#OIFS=$IFS; IFS="#"; set -- $stringsql; aa=$1;bb=$2; IFS=$OIFS

stringsql1=`echo $stringsql | awk -F"; #" '{print $1}'`

stringsql2=`echo $stringsql | awk -F"; #" '{print $2}'`

sqlstring=`echo $stringsql1 | sed #39;s/\'/\'\'/g'`

#echo $sqlstring

$mysql_conn -e "INSERT INTO dbmonitor.sqlAudit(ip,dbport,stringsql,postioninfo) values('$HOSTNAME',$PORT,'$sqlstring','$stringsql2')"

done

else

echo 'exists'

fi


说明:红色代码部分是需要采集的mysql服务器IP地址、端口及指定的表名; 部署完毕后则采集到的时候写入到sqlAudit表中


Sql Server实现代码:

1) 创建分割函数

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))

returns @temptable TABLE (items varchar(8000))

as

begin

declare @idx int

declare @slice varchar(8000)

select @idx = 1

if len(@String)<1 or @String is null return

while @idx!= 0

begin

set @idx =charindex(@Delimiter,@String)

if @idx!=0

set @slice =left(@String,@idx - 1)

else

set @slice = @String

if(len(@slice)>0)

insert into @temptable(items)values(@slice)

set @String =right(@String,len(@String)- @idx)

if len(@String)= 0 break

end

return

end

2) 创建采集存储过程

USE [dbmanage]

GO

/****** Object: StoredProcedure [dbo].[sp_trace_sql_durtion] Script Date: 2021/1/21 14:43:21 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

Create PROC [dbo].[sp_trace_sql_durtion]

@tablename nvarchar(500),

@FilePath nvarchar(260),

@onoff int

AS

BEGIN

if @onoff=0

begin

declare @int int

declare yb cursor for

SELECT id FROM sys.traces where path like '%'+substring(@FilePath,1,8)+'%'

open yb

fetch next from yb into @int

while @@FETCH_STATUS=0

begin

EXEC sp_trace_setstatus @int,0 --停止, 第一个参数为SELECT * FROM sys.traces中的ID列

EXEC sp_trace_setstatus @int,2 --删除

fetch next from yb into @int

end

close yb

deallocate yb

end

else

begin

DECLARE @rc int,@TraceID int,@MaxFileSize bigint;

SET @MaxFileSize = 50;


declare @date nvarchar(10)

set @date=replace(convert(nvarchar(10),getdate(),120),'-','')

--select @date

set @FilePath=@FilePath+'trc'+@date


declare @filename nvarchar(100)

declare @FilePathnew nvarchar(500)

set @filename=@FilePath+'.trc'

set @FilePathnew=@FilePath

declare @result int =0

--select @filename

execute master.[sys].[xp_fileexist] @filename,@result output

if @result =1

begin

--select 'aaa'

set @FilePathnew=@FilePath+'_a'

select @FilePathnew

end

EXEC sp_trace_create @TraceID OUTPUT,2,@FilePathnew,@MaxFileSize,NULL;


IF @rc != 0

RETURN;


DECLARE @On bit;

SET @On = 1;


EXEC sp_trace_setevent @TraceID,10,35,@On;

EXEC sp_trace_setevent @TraceID,10,1,@On;

EXEC sp_trace_setevent @TraceID,10,13,@On;

EXEC sp_trace_setevent @TraceID,10,14,@On;

EXEC sp_trace_setevent @TraceID,10,15,@On;

EXEC sp_trace_setevent @TraceID,10,11,@On;

EXEC sp_trace_setevent @TraceID,10,8,@On;

EXEC sp_trace_setevent @TraceID,10,18,@On;

EXEC sp_trace_setevent @TraceID,41,35,@On;

EXEC sp_trace_setevent @TraceID,41,1,@On;

EXEC sp_trace_setevent @TraceID,41,13,@On;

EXEC sp_trace_setevent @TraceID,41,14,@On;

EXEC sp_trace_setevent @TraceID,41,15,@On;

EXEC sp_trace_setevent @TraceID,41,11,@On;

EXEC sp_trace_setevent @TraceID,41,8,@On;

EXEC sp_trace_setevent @TraceID,41,18,@On;


--SET @Seconds = @Seconds * 1000000;


--EXEC sp_trace_setfilter @TraceID,13,0,4,@Seconds;


IF @tablename IS NOT NULL

declare @items nvarchar(500)

declare yb2 cursor for

select items from master.dbo.split(@tablename,',')

open yb2

fetch next from yb2 into @items

while @@FETCH_STATUS=0

begin

--EXEC sp_trace_setfilter @TraceID,35,0,0,@DatabaseName

set @items='%'+@items+'%'

EXEC sp_trace_setfilter @TraceID,1,1,6,@items

--select @items

fetch next from yb2 into @items

end

close yb2

deallocate yb2

EXEC sp_trace_setfilter @TraceID,1,0,7,N'%select%'


EXEC sp_trace_setstatus @TraceID,1

SELECT TraceID = @TraceID;

end

END


存储过程参数说明:

@tablename:需监控表的名称,多个表用,隔开

@FilePath:采集文件存储路径

@onoff;采集开关,0代表关闭,1代表开启


exec [sp_trace_sql_durtion2] null,'e:\autditrace\',0 #关闭监控

exec [sp_trace_sql_durtion2] 'test,test2,test3','e:\autditrace\',1 #开启监控记录表test,test2,test3的相关操作记录,并将文件记录到e:\autditrace\目录下面


3) 创建计划任务,形成自动监控。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码