曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3763|回复: 0
打印 上一主题 下一主题

二进制日志

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2013-3-11 22:30:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MySQL 服务器版本:5.6.10

二进制日志文件包含了所有更新了数据或已经潜在更新了数据的所有语句(增加,删除,修改)。一个没有匹配任何行的一个 DELETE 语句就是一个“已经潜在更新了的语句”。


二进制日志还包含关于每个更新数据库语句的执行时间信息,它不包含没有修改任何数据的语句


使用二进制日志的主要目的是,在恢复时能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新,因此也常见使用它来进行增量备份。


启用二进制日志,可能会给服务器带来小的性能损失,但对于它所带来的好处而言,这点损失是可以忽略的。


启用二进制日志的几个常用命令行参数说明如下:
--log-bin[=file_name]               # file_name 是指定的二进制日志文件名,系统会在此基础上添加一串可以递增的数字后缀,如 mysqld-binlog.000001,这里 mysqld-binlog 就是 file_name
--log-bin-index[=file]                # 指定二进制日志的索引文件,索引文件里记录了生成的二进制日志文件名
--max-binlog-size                   # 日志最大尺寸
--binlog-do-db=db_name        # 要对那个数据库进行记录,忽略其他的
--binlog-ignore-db=db_name  # 忽略不记录的数据库,其它的都记录

比如使用下面的启动方法:
# ./bin/mysqld --defaults-file=./my.cnf --log-bin=/tmp/mysqld-binlog
其中一些基本的启动参数写在 my.cnf 文件中(可参考:《CentOS6.3 源码安装 MySQL 5.6.10 》)。

当服务器启动后,可以观察一下 /tmp 目录下是否生成了相应的二进制文件:

由上可见,生成了个 mysqld-binlog.000001 的二进制日志文件;并且还有一个索引文件 mysqld-binlog.index;虽然我们并没有明确指定生成的索引文件名,但系统默认给出的是“二进制文件名 + .index” 。

如果使用配置文件(my.cnf),那么可以在其中添加一项 log_bin ,比如下面的一个配置范例:
[mysqld]
explicit_defaults_for_timestamp         #避免旧有的 TIMESTAMP 警告
socket          = /tmp/mysqld.sock
log_bin         
log-bin-index  = /tmp/mysqld-bin.index
max_binlog_size = 50M

port            = 3306
pid-file        = /tmp/mysql.pid
basedir = /opt/mysql-5.6.10
datadir = /opt/mysql-5.6.10/data
log_error = /opt/mysql-5.6.10/mysql_error.log
user = mysql
在上面,使用 log_bin 开启了二进制日志功能,还通过 log-bin-index 指定了一个索引文件,另外还用 max_binlog_size 选项设置了二进制日志的最大尺寸( 50M )。在这种情况下,二进制文件会在数据库目录(这里是  /opt/mysql-5.6.10/data)下生成:

现在,查看一下  /tmp/mysqld-bin.index 下的索引文件的内容是什么:

可见二进制日志索引文件的内容正是所生成的二进制日志的文件名。

当然,也可以在登录 mysql 服务器后使用 show binary logs; (show master logs; 命令也可以)命令来查看:


接下来,验证一下设置的 max_binlog_size 参数是否正确:

可以用 select 命令计算一下是否是 50M :

可见设置是也是生效的。

和二进制日志相关的一个命令是 flush logs; 。 flush logs 是日志切换命令,它告诉服务器关闭当前二进制日志文件,并创建一个新的二进制文件。比如先执行一下 show binary logs; 命令查看当前都生成多少个二进制日志文件:

接着,执行 flush logs 命令,然后再查看一下,此时可以看到:

多了个 mysql-bin.000008 。

随着时间的推移,二进制文件会越来越多,那么如何删除它们呢?可以执行 reset master; 命令,这样相当于重新初始化了一遍二进制日志,也就是以前的旧有文件会被全部删除,然后重新再生成一个:


还可以用purge 命令删除日志:

删除掉了 mysql-bin.000003 之前的日志。

如果希望系统能够自动删除一些过期的日志,那么可以对 expire_logs_days 这个变量进行设置,比如:
mysql> set global expire_logs_days = 3;
Query OK, 0 rows affected (0.00 sec)
即表示自动删除 3 天以前的日志。


和二进制日志相关的一个工具就是 mysqlbinlog ,可以用它来查看日志的情况。为了使用这个工具,现在先往 test 这个数据库的 tb1 表中插入一段数据:


使用 mysqlbinlog 查看二进制日志文件:
[root@centos mysql-5.6.10]# mysqlbinlog ./data/mysql-bin.000003
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#130311 20:43:41 server id 1  end_log_pos 120 CRC32 0x9c8d8818     Start: binlog v 4, server v 5.6.10-log created 130311 20:43:41
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
fdE9UQ8BAAAAdAAAAHgAAAABAAQANS42LjEwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAARiI
jZw=
'/*!*/;
# at 120
#130311 22:31:14 server id 1  end_log_pos 199 CRC32 0xdb5029c3     Query    thread_id=1    exec_time=0    error_code=0
SET TIMESTAMP=1363012274/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 199
#130311 22:31:14 server id 1  end_log_pos 320 CRC32 0x4504dbee     Query    thread_id=1    exec_time=0    error_code=0
use `test`/*!*/;
SET TIMESTAMP=1363012274/*!*/;
insert into tb1 (name, age) values ('good', 30)
/*!*/;
# at 320
#130311 22:31:14 server id 1  end_log_pos 351 CRC32 0xbec2fd85     Xid = 16
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 23:26 , Processed in 0.082357 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表