`
LJ你是唯一LT
  • 浏览: 239131 次
社区版块
存档分类
最新评论

mysql binlog

阅读更多
mysqld在每个二进制日志名后面添加一个数字扩展名。每次你启动服务器或刷新日志时该数字则增加。
如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志。如果你正使用大的事务,
二进制日志还会超过max_binlog_size:事务全写入一个二进制日志中,绝对不要写入不同的二进制日志中。

my.ini中有两个设置:
#expire_logs_days = 10
#max_binlog_size = 100M

Expire_logs_days :定义了mysql清除过期日志的时间。
二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
max_binlog_size
如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。

====
随着mysql的运行,其binlog日志会越来越多,占用的磁盘会越来越大。
我们需要定期清理这些过期的binlog日志。
处理方法主要有两种:
1、自动删除
2、手动删除


1、自动删除
需要更改其配置文件my.cnf,添加参数expire_logs_days = 10,单位是天。
2、手工删除
当然我们可以手动删除binlog日志文件,但是这样并不会更新
mysql-bin.index
我们可以利用mysqlbinlog删除工具purge来删除并更新。
查看帮助:
mysql>help purge;
Name: 'PURGE BINARY LOGS' Description: Syntax:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }

Examples: PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';

mysql>purge binary logs before '***';

这样我们就可以删除一些特定的binlog日志。


===
自动清理MySQL binlog日志与手动删除的设置 (2010-11-19 11:28:38)转载▼
标签: mysql binlog 杂谈 分类: 工作日志
我们大家都知道MySQL数据库从复制(replication)采用了RBR 模式之后,binlog 的格式为"ROW",其主要作用是解决很多原先出现的主键重复问题。
在一个繁忙的master db server上,MySQL binlog日志文件增长速度很快,如果不定时清除,硬盘空间很快就会被充满。
设置自动清理MySQL binlog日志,配置my.cnf:
expire_logs_days = 10
在运行时修改:

show binary logs; 
show variables like '%log%'; 
set global expire_logs_days = 10;

清除之前可以采用相应的备份策略。
手动删除10天前的MySQL binlog日志:
PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
show master logs;
////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       143 |
| mysql-bin.000002 |   7183278 |
+------------------+-----------+
2 rows in set (0.00 sec)
mysql> purge binary logs before date_sub(current_date,interval 1 day);  --删除一天以前的,貌似没多大用
Query OK, 0 rows affected (0.00 sec)

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       143 |
| mysql-bin.000002 |   7258953 |
+------------------+-----------+
2 rows in set (0.00 sec)
不知道从库能不能删除一些日志:
mysql> purge binary logs before date_sub(current_date,interval 1 day);
Query OK, 0 rows affected (0.00 sec)  --清楚无任何效果


MASTER和BINARY是同义词。
一般情况下,推荐使用MIXED binlog的复制。http://dev.MySQL.com/doc/refman/5.1/en/open-bugs-general.html中 的
说明:Replication uses query-level logging: The master writes the executed queries to the
binary logThis is a very fast, compact, and efficient logging method that works perfectly in most cases
附:关于MySQL复制的几种模式

从 MySQL 5.1.12 开始,可以用以下三种模式来实现:
基于SQL语句的复制(statement-based replication, SBR),
基于行的复制(row-based replication, RBR),
混合模式复制(mixed-based replication, MBR)。
相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。 MBR 模式中,SBR 模式是默认的。
在运行时可以动态改动 binlog的格式,除了以下几种情况:
存储流程或者触发器中间
启用了NDB
当前会话试用 RBR 模式,并且已打开了临时表
如果binlog采用了 MIXED 模式,那么在以下几种情况下会自动将MySQL binlog的模式由 SBR 模式改成 RBR 模式。
当DML语句更新一个NDB表时
当函数中包含 UUID() 时
2个及以上包含 AUTO_INCREMENT 字段的表被更新时
行任何 INSERT DELAYED 语句时
用 UDF 时
视图中必须要求运用 RBR 时,例如建立视图是运用了 UUID() 函数
设定主从复制模式:
log-bin=MySQL-bin
#binlog_format="STATEMENT"
#binlog_format="ROW"
binlog_format="MIXED"

也可以在运行时动态修改binlog的格式。例如
MySQL> SET SESSION binlog_format = 'STATEMENT';
MySQL> SET SESSION binlog_format = 'ROW';
MySQL> SET SESSION binlog_format = 'MIXED';
MySQL> SET GLOBAL binlog_format = 'STATEMENT';
MySQL> SET GLOBAL binlog_format = 'ROW';
MySQL> SET GLOBAL binlog_format = 'MIXED';
两种模式各自的优缺点:
SBR 的优点:
历史悠久,技能成熟
binlog文件较小
binlog中包含了所有数据库修改信息,可以据此来审核数据库的安全等情况
MySQL binlog可以用于实时的还原,而不仅仅用于复制
主从版本可以不一样,从服务器版本可以比主服务器版本高
SBR 的缺点:
不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候。
调用具有不确定因素的 UDF 时复制也可能出疑问
运用以下函数的语句也不能被复制:
LOAD_FILE()
UUID()
USER()
FOUND_ROWS()
SYSDATE() (除非启动时启用了 –sysdate-is-now 选项)
INSERT … SELECT 会产生比 RBR 更多的行级锁
复制须要执行 全表扫描(WHERE 语句中没有运用到索引)的 UPDATE 时,须要比 RBR 请求更多的行级锁
对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
存储函数(不是存储流程 )在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事
确定了的 UDF 也须要在从服务器上执行
数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
执行复杂语句如果出错的话,会消耗更多资源
RBR 的优点:
任何情况都可以被复制,这对复制来说是最安全可靠的
和其他大多数数据库系统的复制技能一样
多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
复制以下几种语句时的行锁更少:
INSERT … SELECT
包含 AUTO_INCREMENT 字段的 INSERT
没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
执行 INSERT,UPDATE,DELETE 语句时锁更少
从服务器上采用多线程来执行复制成为可能
RBR 的缺点:
binlog 大了很多
复杂的回滚时 binlog 中会包含大量的数据
主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写疑问
UDF 产生的大 BLOB 值会导致复制变慢
不能从 binlog 中看到都复制了写什么语句(加密过的)
当在非事务表上执行一段堆积的SQL语句时,最好采用 SBR 模式,否则很容易导致主从服务器的数据不一致情况发生
另外,针对系统库 MySQL 里面的表发生变化时的处理准则如下:
如果是采用 INSERT,UPDATE,DELETE 直接操作表的情况,则日志格式根据 MySQL binlog_format 的设定而记录
如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何 都采用 SBR 模式记录。
注:采用 RBR 模式后,能处理很多原先出现的主键重复问题。实例:
对于insert into db_allot_ids select from db_allot_ids 这个语句:
在BINLOG_FORMAT=STATEMENT 模式下:
BINLOG日志信息为:


BEGIN  ;  # at 173  #090612 16:05:42 server id 1 end_log_pos 288 Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1244793942;  insert into db_allot_ids select * from db_allot_ids  ;
在BINLOG_FORMAT=ROW 模式下:


====
mysqladmin flush-logs 也可以重新开始新的binary log


=====
解决方法如下:

第一种方法:

mysql> show binary logs;  查看mysql bin-log日志,除了这个以外的,其它都可以使用删除。

mysql> purge binary logs to 'binlog.000058';  (删除mysql bin-log日志,删除binlog.000005之前的,不包括binlog.000058)

第二种方法:

进入数据库,查看一下当前使用的binlog日志是哪个,除了这个以外的,其它都可以使用rm -rf 删除!



=====
查看指定删除日志
mysql >show binary logs; 查看多少binlog日志,占用多少空间。
mysql> PURGE MASTER LOGS TO 'mysql-bin.002467'; 删除mysql-bin.002467以前所有binlog,
这样删除可以保证*.index信息与binlog文件同步。


手动清理
mysql>PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 5 DAY); 手动删除5天前的binlog日志


自动设置清理
mysql> set global expire_logs_days = 5; 把binlog的过期时间设置为5天;
mysql> flush logs; 刷一下log使上面的设置生效,否则不生效。

为保证在MYSQL重启后仍然有效,在my.cnf中也加入此参数设置
expire_logs_days = 5





==================================实际操作==========
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       143 |
| mysql-bin.000002 |  12180875 |
+------------------+-----------+
2 rows in set (0.01 sec)

mysql> purge binary logs before date_sub(current_date,interval 2 day);
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000002 |  12244804 |
+------------------+-----------+
1 row in set (0.00 sec)




///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
使用binlog恢复数据的重要命令如下
mysql> flush logs;  默认的日志是mysql-bin.000001,现在刷新了重新开启一个就多了一个mysql-bin.000002
                                ./mysqlbinlog --no-defaults binlog日志名,来查看日志
[root@localhost bin]# ./mysqlbinlog --no-defaults ../var/mysql-bin.000001 | more    //查看bin-log日志的内容
[root@localhost bin]# ./mysqlbinlog --no-defaults ../var/mysql-bin.000001 | ./mysql -uroot -p //恢复mysql-bin.000001日志的内容
如果需要从某个点恢复到某个点,用以下操作
定位: --start-position 开始点
--stop-position 结束点
--start-date 开始时间
--stop-date  结束时间
现在恢复mysql-bin.000002恢复,从134点开始到386结束 
[root@localhost bin]# ./mysqlbinlog --no-defaults --start-position 134 --stop-position=386 ../var/mysql-bin.000002 | ./mysql -uroot -p

/**        mysqlbinlog日志恢复数据实验        ****/
//查看一下var下面的内容,现在是没有mysql-log.000001类似的binlog日志的
[root@localhost var]# ls
brocms      ibdata1      ib_logfile1    localhost.pid  mysql-bin.index
brotherblog  ib_logfile0  localhost.err  mysql          test
[root@localhost var]# ../bin/mysql -uroot -p //登录数据库
mysql> use test; //使用test数据库
mysql> flush logs; //刷新binlog日志,新开一个,现在会在var目录下面生成一个mysql-bin.000001的文件,以下的操作都会记录其中

//创建一个表
mysql> create table user(
    -> id int auto_increment primary key,
    -> username char(30),
    -> password char(32))
    -> engine=myisam default charset=utf8;
//插入几条测试数据
mysql> insert into user(username,password) values(1,2);
mysql> insert into user(username,password) values(1,2);
mysql> insert into user(username,password) values(1,2);
//新开一个binlog日志,现在会生成一个名为mysql-bin.000002的文件,下面的操作会记录在mysql-bin.000002的文件中

mysql> flush logs;
//查询一下内容
mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | 1        | 2        |
|  2 | 1        | 2        |
|  3 | 1        | 2        |
+----+----------+----------+
mysql> delete from user; //现在将数据删除
mysql> drop table user; //将表删除
mysql> select * from user; //查看表里面的内容
mysql> \q
[root@localhost var]# ls
brocms      ibdata1      ib_logfile1    localhost.pid  mysql-bin.000001  mysql-bin.index
brotherblog  ib_logfile0  localhost.err  mysql          mysql-bin.000002  test
[root@localhost var]# ../bin/mysqlbinlog --no-defaults mysql-bin.000001 | more //查看mysql-bin.000001里面的内容
[root@localhost var]# ../bin/mysqlbinlog --no-defaults mysql-bin.000002 | more //查看mysql-bin.000002里面的内容
[root@localhost var]# ../bin/mysqlbinlog --no-defaults mysql-bin.000001 | ../bin/mysql -uroot -p //用mysql-bin.000001来恢复数据
Enter password:
[root@localhost var]# ../bin/mysql -uroot -p //进数据库查看
mysql> use test;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user          |
+----------------+
1 row in set (0.00 sec)

mysql> select * from user; //查看数据,数据回来了
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | 1        | 2        |
|  2 | 1        | 2        |
|  3 | 1        | 2        |
+----+----------+----------+
3 rows in set (0.00 sec)

mysql> \q
如果需要从某个点恢复到某个点,用以下操作
定位: --start-position 开始点
--stop-position 结束点
--start-date 开始时间
--stop-date  结束时间

现在恢复mysql-bin.000002恢复,从134点开始到386结束 
[root@localhost bin]# ./mysqlbinlog --no-defaults --start-position 134 --stop-position=386 ../var/mysql-bin.000002 | ./mysql -uroot -plinux
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    MySQL Binlog Digger 4.28 + Mysql Binlog分析 + 数据库

    MySQL Binlog Digger是一款免费的,且基于图形界面的binlog挖掘分析工具与sql审计工具。当发生误删、误增、误改时,它可以帮助我们从binlog中快速定位到误操作的重做语句(redo sql),同时推理出回滚语句(undo sql)。...

    MySQL Binlog Digger 4.8.0

    MySQL Binlog Digger是一个基于图形界面的MySQL Binlog挖掘分析工具,可以为数据恢复提供undo sql回滚语句,它免安装,能对在线binlog与离线binlog进行分析,在选定在线binlog(甚至分析到最新日志)或离线binlog日志...

    Mysql binlog查看工具

    简单好用的mysql binlog查看工具 采集于网络。

    MySQL Binlog Digger 4.19

    MySQL Binlog Digger 4.19安装包,mysql日志回滚、解析、挖掘、支持离线在线 支持解析全sql字段语句

    mysql binlog日志恢复【亲测有效,有例子实测】

    二进制日志(binnary log)以事件形式记录了...主从复制:mysql replication在master端开启binlog,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的。 数据恢复:通过mysqlbinlog工具来恢复数据。

    MySQL Binlog Digger 4.10

    MySQL Binlog Digger基于图形界面,免安装的日志分析工具,能对在线binlog与离线binlog进行分析,在选定在线binlog或离线binlog日志后,可对数据库、表、binlog开始时间、binlog结束时间、误操作的重做类型进行信息...

    MySQL Binlog Digger 4.18 Setup.exe

    MySQL Binlog Digger是一款免费的,且基于图形界面的binlog挖掘分析工具与sql审计工具。当发生误删、误增、误改时,它可以帮助我们从binlog中快速定位到误操作的重做语句(redo sql),同时推理出回滚语句(undo sql)。...

    8、NIFI综合应用场景-NiFi监控MySQL binlog进行实时同步到hive

    8、NIFI综合应用场景-NiFi监控MySQL binlog进行实时同步到hive 网址:https://blog.csdn.net/chenwewi520feng/article/details/130620988 本文旨在介绍通过实时监控mysql的binlog实现数据的实时同步至hive中。但由于...

    MySQL Binlog Digger 4.9.rar

    MySQL Binlog Digger基于图形界面,免安装的日志分析工具,能对在线binlog与离线binlog进行分析,在选定在线binlog或离线binlog日志后,可对数据库、表、binlog开始时间、binlog结束时间、误操作的重做类型进行信息...

    MySQL Binlog Digger 4.20 Setup.exe

    MySQL Binlog Digger是一款免费的,且基于图形界面的binlog挖掘分析工具与sql审计工具。当发生误删、误增、误改时,它可以帮助我们从binlog中快速定位到误操作的重做语句(redo sql),同时推理出回滚语句(undo sql)。...

    MySQL – binlog日志简介及设置

    mysql-binlog介绍   mysql-binlog是MySQL数据库的二进制日志,用于记录用户对数据库操作的SQL语句((除了数据查询语句)信息。可以使用mysqlbin命令查看二进制日志的内容。 binlog 的作用 用于数据库的主从复制及...

    mysql-binlog-connector-java-0.21.0-API文档-中文版.zip

    赠送jar包:mysql-binlog-connector-java-0.21.0.jar; 赠送原API文档:mysql-binlog-connector-java-0.21.0-javadoc.jar; 赠送源代码:mysql-binlog-connector-java-0.21.0-sources.jar; 赠送Maven依赖信息文件:...

    MySQL Binlog Digger 4.17.zip

    MySQL Binlog Digger是一个免费的,且基于图形界面的binlog挖掘分析工具。它可以为数据恢复提供有力的参考依据,它可以对在线binlog与离线binlog进行挖掘分析,在设定过滤条件后便可以进行精确过滤,从而得到我们所...

    MySQL binlog闪回工具

    MySQL binlog闪回工具

    MySQL Binlog Digger 4.32

    MySQL Binlog Digger是一款基于图形界面的binlog挖掘分析工具与sql审计工具。当发生误删、误增、误改时,它可以帮助我们从binlog中快速定位到误操作的重做语句(redo sql),同时推理出回滚语句(undo sql)。此外,它还...

    MySQL Binlog Digger 4.4.zip

    MySQL Binlog Digger 4.4.zip

Global site tag (gtag.js) - Google Analytics