linux下怎么将mysql日志文件转码

linux下怎么将mysql日志文件转码,第1张

首先登陆 mysql:

>mysql -u root -p

然后查看是否启用了日志

mysql>show variables like 'log_%'

查看当前的日志

mysql>show master status

你需要知道的mysql的日志类型:

错误日志: -log-err

查询日志: -log

慢查询日志: -log-slow-queries

更新日志: -log-update

二进制日志: -log-bin

修改配置(以下为日志文件保存位置)

[mysqld]

log=/var/log/mysqld_common.log

log-error=/var/log/mysqld_err.log

log-bin=/var/log/mysqld_bin.bin

MySQL 的 Binlog 记录着 MySQL 数据库的所有变更信息,了解 Binlog 的结构可以帮助我们解析Binlog,甚至对 Binlog 进行一些修改,或者说是“篡改”,例如实现类似于 Oracle 的 flashback 的功能,恢复误删除的记录,把 update 的记录再还原回去等。本文将带您探讨一下这些神奇功能的实现,您会发现比您想象地要简单得多。本文指的 Binlog 是 ROW 模式的 Binlog,这也是 MySQL 8 里的默认模式,STATEMENT 模式因为使用中有很多限制,现在用得越来越少了。

Binlog 由事件(event)组成,请注意是事件(event)不是事务(transaction),一个事务可以包含多个事件。事件描述对数据库的修改内容。

现在我们已经了解了 Binlog 的结构,我们可以试着修改 Binlog 里的数据。例如前面举例的 Binlog 删除了一条记录,我们可以试着把这条记录恢复,Binlog 里面有个删除行(DELETE_ROWS_EVENT)的事件,就是这个事件删除了记录,这个事件和写行(WRITE_ROWS_EVENT)的事件的数据结构是完全一样的,只是删除行事件的类型是 32,写行事件的类型是 30,我们把对应的 Binlog 位置的 32 改成 30 即可把已经删除的记录再插入回去。从前面的 “show binlog events” 里面可看到这个 DELETE_ROWS_EVENT 是从位置 378 开始的,这里的位置就是 Binlog 文件的实际位置(以字节为单位)。从事件(event)的结构里面可以看到 type_code 是在 event 的第 5 个字节,我们写个 Python 小程序把把第383(378+5=383)字节改成 30 即可。当然您也可以用二进制编辑工具来改。

找出 Binlog 中的大事务

由于 ROW 模式的 Binlog 是每一个变更都记录一条日志,因此一个简单的 SQL,在 Binlog 里可能会产生一个巨无霸的事务,例如一个不带 where 的 update 或 delete 语句,修改了全表里面的所有记录,每条记录都在 Binlog 里面记录一次,结果是一个巨大的事务记录。这样的大事务经常是产生麻烦的根源。我的一个客户有一次向我抱怨,一个 Binlog 前滚,滚了两天也没有动静,我把那个 Binlog 解析了一下,发现里面有个事务产生了 1.4G 的记录,修改了 66 万条记录!下面是一个简单的找出 Binlog 中大事务的 Python 小程序,我们知道用 mysqlbinlog 解析的 Binlog,每个事务都是以 BEGIN 开头,以 COMMIT 结束。我们找出 BENGIN 前面的 “# at” 的位置,检查 COMMIT 后面的 “# at” 位置,这两个位置相减即可计算出这个事务的大小,下面是这个 Python 程序的例子。

切割 Binlog 中的大事务

对于大的事务,MySQL 会把它分解成多个事件(注意一个是事务 TRANSACTION,另一个是事件 EVENT),事件的大小由参数 binlog-row-event-max-size 决定,这个参数默认是 8K。因此我们可以把若干个事件切割成一个单独的略小的事务

ROW 模式下,即使我们只更新了一条记录的其中某个字段,也会记录每个字段变更前后的值,这个行为是 binlog_row_image 参数控制的,这个参数有 3 个值,默认为 FULL,也就是记录列的所有修改,即使字段没有发生变更也会记录。这样我们就可以实现类似 Oracle 的 flashback 的功能,我个人估计 MySQL 未来的版本从可能会基于 Binlog 推出这样的功能。

了解了 Binlog 的结构,再加上 Python 这把瑞士军刀,我们还可以实现很多功能,例如我们可以统计哪个表被修改地最多?我们还可以把 Binlog 切割成一段一段的,然后再重组,可以灵活地进行 MySQL 数据库的修改和迁移等工作。

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

MySQL>show variables like 'log_bin'

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

3.怎样知道当前的日志

MySQL>show master status

4.看二进制日志文件用MySQLbinlog

shell>MySQLbinlog mail-bin.000001

或者

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

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

有个小技巧跟大家介绍下,我在准备转换的时候发现日志文件有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 3.0 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-readForce 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-formJust 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 argumentthe 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 argumentthe 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 exit.Variables (--variable-name=value)

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

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

database (No default value)

disable-log-bin FALSE

force-readFALSE

host (No default value)

offset0

port 3306

position 4

read-from-remote-server FALSE

open_files_limit 64

short-formFALSE

socket(No default value)

start-datetime(No default value)

stop-datetime (No default value)

start-position4

stop-position 18446744073709551615

to-last-log FALSE

user (No default value)

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


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

原文地址: http://outofmemory.cn/zaji/5931179.html

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

发表评论

登录后才能评论

评论列表(0条)

保存