Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2316033
  • 博文数量: 473
  • 博客积分: 12252
  • 博客等级: 上将
  • 技术积分: 4307
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-12 10:02
文章分类

全部博文(473)

文章存档

2012年(8)

2011年(63)

2010年(73)

2009年(231)

2008年(98)

分类: Mysql/postgreSQL

2010-12-14 13:42:19

1.什么是MySQL的二进制日志?

    二进制日志记录了所有的DDL(数据定义语言)语句和DML(数据操作语言)语句,但是不记录包括数据查询的语句。语句以“事件”的形式保存,它描述了数据的更改过程,此日志对于灾难时的数据恢复起着极其重要的作用。

2.日志的位置和格式

当用—log-bin[=file_name]选项启动时,mysqld将包含所有更新数据的SQL命令写入日志文件。或者是在mysql的配置文件中,配置的log-bin=/home/log/updatelog。如果没有给出file_name值,默认名为主机名后面跟_bin,如果给出了文件名,但没有包含路劲,则文件默认被写入参数DATADIR(数据目录)指定的目录

3.日志的读取

由于日志以二进制的方式存储,不能直接读取,需要用mysqlbinlog工具来查看,语法如下:

# mysqlbinlog --start-date="2009-04-20 9:01:00" --stop-date="2009-04-20 10:00:01"
mysql-bin.000001 | mysql -uUser -pUserPWD

#mysqlbinlog --start-position="368301" --stop-position="368312"
mysql-bin.000001 | mysql -uUser -pUserPWD

4.为什么要清理二进制日志?
    mysql5.1增加了对基于行复制的支持,它把实际的数据更改记录到二进制日志中,和大部分其它的数据库产品实现复制的方式很相似,这样复制方式的最大好处就是MySQL可以正确地复制每个命令,并且一些命令可以被有效地复制。主要缺点就是二进制日志会变得很大,并且对更新数据命令的可见度会降低,因此不能使用mysqlbinlog检查二进制日志。
5.如何清理?
    如果你单纯地使用
mysql>reset master; //清除所有的二进制日志
那你就大错特错了,这样主库的二进制日志是清掉了,可是从库同步也挂了。如何才是正确的清理方法呢?
方法1)
在数据库(从属数据库上面)上面执行下面命令:
mysql>   PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 30 DAY);
(清理30天前的二进制日志文件,如果主库在使用30天前的日志文件 会报错的)
 然后修改my.cnf文件
【mysqld】
expire_logs_day=20;
方法2)
------查找当前的binlog
mysql> show binary logs;

+----------------+-----------+

| Log_name       | File_size |

+----------------+-----------+

| ablelee.000001 | 150462942 |

| ablelee.000002 |       125 |

| ablelee.000003 |       106 |

+----------------+-----------+
------删除bin-log(删除ablelee.000003之前的而没有包含ablelee.000003)

mysql> purge binary logs to 'ablelee.000003';

Query OK, 0 rows affected (0.16 sec)

------查询结果(现在只有一条记录了.)

mysql> show binlog events\G

*************************** 1. row ***************************

   Log_name: ablelee.000003

        Pos: 4

 Event_type: Format_desc

  Server_id: 1

End_log_pos: 106

       Info: Server ver: 5.1.26-rc-log, Binlog ver: 4

1 row in set (0.01 sec)

(ablelee.000001和ablelee.000002已被删除)

mysql> show binary logs;

+----------------+-----------+

| Log_name       | File_size |

+----------------+-----------+

| ablelee.000003 |       106 |

+----------------+-----------+

1 row in set (0.00 sec)

(删除的其它格式运用)
   PURGE {MASTER | BINARY} LOGS TO 'log_name'
  PURGE {MASTER | BINARY} LOGS BEFORE 'date'
  用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
  例如:
  PURGE MASTER LOGS TO 'mysql-bin.010';
  PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
6.总结
  要清理日志,需按照以下步骤:
  1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
  2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
  3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
  4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
  5. 清理所有的日志,但是不包括目标日志.
阅读(2169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~