如何实现监控mysql,并将有变动的数据表写入指定的文件夹

如何实现监控mysql,并将有变动的数据表写入指定的文件夹,第1张

首先介绍下 pt-stalk,它是 Percona-Toolkit 工具包中的一个工具,说起 PT 工具包大家都不陌生,平时常用的 pt-query-digest、 pt-online-schema-change 等工具都是出自于这个工具包,这里就不多介绍了。

pt-stalk 的主要功能是在出现问题时收集 OS 及 MySQL 的诊断信息,这其中包括:

1 OS 层面的 CPU、IO、内存、磁盘、网络等信息;

2 MySQL 层面的行锁等待、会话连接、主从复制,状态参数等信息。

而且 pt-stalk 是一个 Shell脚本,对于我这种看不懂 perl 的人来说比较友好,脚本里面的监控逻辑与监控命令也可以拿来参考,用于构建自己的监控体系。

三、使用

接着我们来看下如何使用这个工具。

pt-stalk 通常以后台服务形式监控 MySQL 并等待触发条件,当触发条件时收集相关诊断数据。

触发条件相关的参数有以下几个:

function:

∘ 默认为 status,代表监控 SHOW GLOBAL STATUS 的输出;

∘ 也可以设置为 processlist,代表监控 show processlist 的输出;

variable:

∘ 默认为 Threads_running,代表 监控参数,根据上述监控输出指定具体的监控项;

threshold:

∘ 默认为 25,代表 监控阈值,监控参数超过阈值,则满足触发条件;

∘ 监控参数的值非数字时,需要配合 match 参数一起使用,如 processlist 的 state 列;

cycles:

∘ 默认为 5,表示连续观察到五次满足触发条件时,才触发收集;

连接参数:host、password、port、socket。

其他一些重要参数:

iterations:该参数指定 pt-stalk 在触发收集几次后退出,默认会一直运行。

run-time:触发收集后,该参数指定收集多长时间的数据,默认 30 秒。

sleep:该参数指定在触发收集后,sleep 多久后继续监控,默认 300 秒。

interval:指定状态参数的检查频率,判断是否需要触发收集,默认 1 秒。

dest:监控数据存放路径,默认为 /var/lib/pt-stalk。

retention-time :监控数据保留时长,默认 30 天。

daemonize:以后台服务运行,默认不开启。

log:后台运行日志,默认为 /var/log/pt-stalklog。

collect:触发发生时收集诊断数据,默认开启。

∘ collect-gdb:收集 GDB 堆栈跟踪,需要 gdb 工具。

∘ collect-strace:收集跟踪数据,需要 strace 工具。

∘ collect-tcpdump:收集 tcpdump 数据,需要 tcpdump 工具。

一个方法:通过 sp_trace_create 建立数据库跟踪,可记录执行的任何语句包括存储过程

使用的系统存储过程包括:sp_trace_create-创建跟踪 sp_trace_setevent-设定跟踪事件 sp_trace_setstatus-启用跟踪 具体方法百度一下

1、WIN的话,在安装目录下,找到myini文件

查[mysqld]区段,添加日志的配置

比如说:[mysqld]log=C:/temp/mysqllog

log_slow_queries=C:/temp/mysql_slowlog

long_query_time=1

log指示日志文件存放目录

log_slow_queries指示记录执行时间长的sql日志目录;

long_query_time指示多长时间算是执行时间。

2、LINUX下的话,文件名为mycnf

Linux下这些配置项其实都有的,只是被注释掉了,删去注释符#之类的就可以了。

你不愿删注释符,愿意的话手工再添加也可以……

然后重启mysql服务就OK了。

可以说mysql的多数特性都是围绕日志文件实现,而其中最重要的有以下三种

innodb 为了提高磁盘I/O读写性能,存在一个 buffer pool 的内存空间,数据页读入会缓存到 buffer pool,事务的提交则实时更新到 buffer pool,而不实时同步到磁盘(innodb 是按 16KB 一页同步的,一事务可涉及多个数据页,实时同步会造成浪费,随机I/O)。事务暂存在内存,则存在一致性问题,为了解决系统崩溃,保证事务的持久性,我们只需把事务对应的 redo 日志持久化到磁盘即可(redo 日志占用空间小,顺序写入磁盘,顺序I/O)

sql 语句在执行的时候,可能会修改多个页面,还会更新聚簇索引和二级索引的页面,过程产生的redo会被分割成多个不可分割的组(Mini-Transaction)。MTR怎么理解呢?如一条 insert 语句可能会使得页分裂,新建叶子节点,原先页的数据需要复制到新数据页里,然后将新记录插入,再添加一个目录项指向新建的页子。这对应多条 redo 日志,它们需要在原子性的 MTR 内完成

MTR 产生的 redo 日志先会被复制到一个 log buffer 里(类似 buffer pool)。而同步到磁盘的时机如下:

事务需要保证原子性,也是说事务中的 *** 作要么全部完成,要么什么也不做。如果事务执行到一半,出错了怎么办-回滚。但是怎么回滚呢,靠 undo 日志。undo 日志就是我们执行sql的逆 *** 作

binlog有三种格式:Statement、Row以及Mixed。

redolog 中的事务如果经历了二阶段提交中的prepare阶段,则会打上 prepare 标识,如果经历commit阶段,则会打上commit标识(此时redolog和binlog均已落盘)。崩溃恢复逻辑如下:

My SQL可以用下面方法跟踪sql 语句,以下方法以Windows平台为例,linux雷同:

1 配置myini文件(在安装目录,linux下文件名为mycnf

查找到[mysqld]区段,增加日志的配置,如下示例:[mysqld]log=C:/temp/mysqllog

log_slow_queries=C:/temp/mysql_slowlog

long_query_time=1

log指示日志文件存放目录;

log_slow_queries指示记录执行时间长的sql日志目录;

long_query_time指示多长时间算是执行时间长,单位s。

Linux下这些配置项应该已经存在,只是被注释掉了,可以去掉注释。但直接添加配置项也OK啦。

2 重新启动mysql服务。注意事项:A日志存放目录必须提前存在,否则不能记录日志。这里也局势C:/temp目录必须已经存在

B 日志文件是linux格式的文本,建议用ultraEdit打开,转换为dos格式查看(否则没有换行,看不懂的)

C 服务在启动状态下不能删除日志文件,否则就无法记录sql语句了。

D 不能用ultraEdit直接清除文件内容后保存,否则也记录不下来了。需要重启服务,如果ultraEdit保存了bak,后记录到此文件中。

E 可以用notepad清除文本后保存,可以继续记录日志。

1首先确认你日志是否启用了

MySQL>show variables like 'log_bin';

2如果启用了,即ON那日志文件就在MySQL的安装目录的data目录下

3怎样知道当前的日志

MySQL> show master status;

4看二进制日志文件用MySQLbinlog

shell>MySQLbinlog mail-bin000001

或者

shell>MySQLbinlog mail-bin000001 | tail 因为mail-bin000001是二进制的日志,所以想看日志就需要用mysqlbinlog命令,将二进制文件转换为日志文件,下面详细说说如何使用:上面已经说过如果启用了日志文件,那么默认的日志文件就在data目录下(如果你没有更改的话)进入存放日志文件目录,使用mysqlbinlog localhost-bin000202 > new_file_namelog

命令,将目标文件保存为日志文件,可指定保存路径下

有个小技巧跟大家介绍下,我在准备转换的时候发现日志文件有2G多,寻思着为什么mysql为什么不把日志按日志定期的分多个文件放呢。结果发现mysql有个更好的方法,可以通过时间参数获取某个时间段的数据,例子如下:mysqlbinlog --start-datetime="2010-11-20 00:00:00" --stop-datetime="2010-11-21 00:00:00"

[hx@localhost data]$ mysqlbinlog

mysqlbinlog Ver 30 for pc-linux-gnu at i686

By Monty and Sasha, for your professional use

This software comes with NO WARRANTY: This is free software,

and you are welcome to modify and redistribute it under the GPL licenseDumps a MySQL binary log in a format usable for viewing or for piping to

the mysql command line clientUsage: mysqlbinlog [options] log-files

-d, --database=name List entries for just this database (local log only)

-D, --disable-log-bin

Disable binary log This is useful, if you enabled

--to-last-log and are sending the output to the same

MySQL server This way you could avoid an endless loop

You would also like to use it when restoring after a

crash to avoid duplication of the statements you already

have NOTE: you will need a SUPER privilege to use this

option

-f, --force-read Force reading unknown binlog events

-, --help Display this help and exit

-h, --host=name Get the binlog from server

-o, --offset=# Skip the first N entries

-p, --password[=name]

Password to connect to remote server

-P, --port=# Use port to connect to the remote server

-j, --position=# Deprecated Use --start-position instead

--protocol=name The protocol of connection (tcp,socket,pipe,memory)

-r, --result-file=name

Direct output to a given file

-R, --read-from-remote-server

Read binary logs from a MySQL server

--open_files_limit=#

Used to reserve file descriptors for usage by this

program

-s, --short-form Just show the queries, no extra info

-S, --socket=name Socket file to use for connection

--start-datetime=name

Start reading the binlog at first event having a datetime

equal or posterior to the argument; the argument must be

a date and time in the local time zone, in any format

accepted by the MySQL server for DATETIME and TIMESTAMP

types, for example: 2004-12-25 11:25:56 (you should

probably use quotes for your shell to set it properly)

--stop-datetime=name

Stop reading the binlog at first event having a datetime

equal or posterior to the argument; the argument must be

a date and time in the local time zone, in any format

accepted by the MySQL server for DATETIME and TIMESTAMP

types, for example: 2004-12-25 11:25:56 (you should

probably use quotes for your shell to set it properly)

--start-position=# Start reading the binlog at position N Applies to the

first binlog passed on the command line

--stop-position=# Stop reading the binlog at position N Applies to the

last binlog passed on the command line

-t, --to-last-log Requires -R Will not stop at the end of the requested

binlog but rather continue printing until the end of the

last binlog of the MySQL server If you send the output

to the same MySQL server, that may lead to an endless

loop

-u, --user=name Connect to the remote server as username

-l, --local-load=name

Prepare local temporary files for LOAD DATA INFILE in the

specified directory

-V, --version Print version and exitVariables (--variable-name=value)

and boolean options {FALSE|TRUE} Value (after reading options)

--------------------------------- -----------------------------

database (No default value)

disable-log-bin FALSE

force-read FALSE

host (No default value)

offset 0

port 3306

position 4

read-from-remote-server FALSE

open_files_limit 64

short-form FALSE

socket (No default value)

start-datetime (No default value)

stop-datetime (No default value)

start-position 4

stop-position 18446744073709551615

to-last-log FALSE

user (No default value)

local-load (No default value)20090930 检查一个应用的问题的时候,发现通过 oracle 的 dblink 连接 mysql 进行更新等 *** 作的时候,mysql 不会把 *** 作的 sql 语句记录到日志文件里

以上就是关于如何实现监控mysql,并将有变动的数据表写入指定的文件夹全部的内容,包括:如何实现监控mysql,并将有变动的数据表写入指定的文件夹、C#如何监听mysql的LOG日志 源码、如何在mysql中记录sql日志记录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10200629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存