MYSQL的binlog问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL的binlog问题相关的知识,希望对你有一定的参考价值。
我把Master机器mysql下的binlog文件手工删掉了cd /data/mysql/binlog/rm -f * 然后重启MYSQL,binlog下重新生成了新的binlog.xxxxxx文件,从binlog.00001开始。然后查看错误日志中发现报错,依然读取的是以前的binlog文件:110809 13:50:44 [ERROR] Failed to open log (file '/data/mysql/binlog/binlog.000011', errno 2)同时Slave机器也无法同步SHOW SLAVE STATUS;Slave_IO_State项错误如下:Waiting TO reconnect AFTER a failed MASTER event read ===========================================我手工删除binlog的目的,是因为之前Slave一直报错同步失败,说同步的表结构与主库不一致。 所以我把Slave库删掉,重新从主库导了一份全新的过来。然后删掉主库和从库机器上的所有binlog。 希望能实现按最新的数据同步。
当启动Binlog后,事务会产生Binlog Event,这些Event被看做事务数据的一部分。因此要保证事务的Binlog Event和InnoDB引擎中的数据的一致性。所以带Binlog的CrashSafe要求MySQL宕机重启后能够保证:- 所有已经提交的事务的数据仍然存在。
- 所有没有提交的事务的数据自动回滚。
- 所有已经提交了的事务的Binlog Event也仍然存在。
- 所有没有提交事务没有记录Binlog Event。
这些要求很好理解,如果重启后数据还在,但是Binlog Event没有了,就没办法复制到其他节点上了。如果重启后,数据没了,但是Binlog Event还在,那么不存在的数据就会被复制到其他节点上,从而导致主从的不一致。
为了保证带Binlog的CrashSafe,MySQL内部使用的两阶段提交(Two Phase Commit)。 参考技术A 我汗,你真敢删啊。只删binlog文件有什么用啊,从库都记录好了从哪份binlog的哪个position开始继续读,结果被你删了,当然找不到后续的Master event啦。
正确的操作:
1.mysqldump -uxxx -p --master-value=2 --all-databases >/xxx/xxx.dmp
2.cd /xxx; grep xxx.dmp 'CHANGE_MASTER_TO'
记录下binlog 和position
3.从库上 复制一份xxx.dmp,mysql -u xxx -p </yyy/xxx.dmp
4.从库上,进入数据库,输入命令
change master to master_host='主库IP地址',master_port=xxxx,master_user='xx',master_password='xx',master_log_file='mysql-bin.xxxxxx',master_log_pos=xxxxxxxxxxxx;
master_log_file 和master_log_pos就是第二步记录下的值啦。
最后start slave就好了。
binlog文件可不能乱删啊。 参考技术B 使用二进制日志来完成同步,把各客户机的二进制日志还原为SQL文件,然后分别在服务器数据库上执行一遍,最后使用服务器数据库覆盖各客户机数据库即可。
mysqlbinlog.exe:用于处理二进制日志文件的实用工具。服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。
c:\> mysqlbinlog [options] log-files...
例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:
c:\> mysqlbinlog binlog.0000003
输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。
参考技术C 应该reset一下日志就可以
以上是关于MYSQL的binlog问题的主要内容,如果未能解决你的问题,请参考以下文章