160222 09:19:26 mysqld_safe Starting mysqld daemon with databases from /data01/mysql

2016-02-22 09:19:32 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).

2016-02-22 09:19:34 1589 [Note] Plugin ‘FEDERATED’ is disabled.

2016-02-22 09:19:34 1589 [Note] InnoDB: Using atomics to ref count buffer pool pages

2016-02-22 09:19:34 1589 [Note] InnoDB: The InnoDB memory heap is disabled

2016-02-22 09:19:34 1589 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins

2016-02-22 09:19:34 1589 [Note] InnoDB: Memory barrier is not used

2016-02-22 09:19:34 1589 [Note] InnoDB: Compressed tables use zlib 1.2.3

2016-02-22 09:19:34 1589 [Note] InnoDB: Using CPU crc32 instructions

2016-02-22 09:19:34 1589 [Note] InnoDB: Initializing buffer pool, size = 128.0M

2016-02-22 09:19:34 1589 [Note] InnoDB: Completed initialization of buffer pool

2016-02-22 09:19:35 1589 [Note] InnoDB: Highest supported file format is Barracuda.

2016-02-22 09:19:35 1589 [Note] InnoDB: The log sequence numbers 1625997 and 1625997 in ibdata files do not match the log sequence number 14714403811 in the ib_logfiles!

2016-02-22 09:19:35 1589 [Note] InnoDB: Database was not shutdown normally!

2016-02-22 09:19:35 1589 [Note] InnoDB: Starting crash recovery.

2016-02-22 09:19:35 1589 [Note] InnoDB: Reading tablespace information from the .ibd files…

2016-02-22 09:19:36 1589 [Note] InnoDB: Restoring possible half-written data pages

2016-02-22 09:19:36 1589 [Note] InnoDB: from the doublewrite buffer…

InnoDB: Last MySQL binlog file position 0 196060496, file name mysql-bin.000005

2016-02-22 09:19:38 1589 [Note] InnoDB: 128 rollback segment(s) are active.

2016-02-22 09:19:38 1589 [Note] InnoDB: Waiting for purge to start

2016-02-22 09:19:38 1589 [Note] InnoDB: 5.6.22 started; log sequence number 14714403811

^G/usr/local/mysql/bin/mysqld: File ‘/data01/mysqllog/binlog/mysql-bin.000005’ not found (Errcode: 2 - No such file or directory)

2016-02-22 09:19:39 1589 [ERROR] Failed to open log (file ‘/data01/mysqllog/binlog/mysql-bin.000005’, errno 2)

2016-02-22 09:19:39 1589 [ERROR] Could not open log file

2016-02-22 09:19:39 1589 [ERROR] Can’t init tc log

2016-02-22 09:19:39 1589 [ERROR] Aborting

其实他是先查看redo log,找出prepared但没有commited或aborted的事务列表,然后检查binlog,binlog没记录就commit,否则rollback

Group Commit of Binary Log

问题汇总:

当binlog 被启用, 会有一个急剧的性能下降 由于下面的原因:

1.binary log 不利用 组提交技术

2.有几个访问磁盘 即 写和flush

MySQL 使用预写记录来提供耐久性和一致性。

具体而言, 它们写redo和很少的undo 更改到日志

确保当提交事务的改变会被写入和刷新到磁盘

但注意的是,每秒事务提交的数量越多 越高的速度写和flush logs.

如果什么都没做 log会最终变成性能瓶颈。

绕过这个问题,一个延期的当 任何访问存储为搜集在内尽可能多的提交

这样一次写和刷新对于一组事务

这个技术被命名为group commit 是广泛用于数据库系统 来改善性能

建议的解决方案(总结):

我们要:

使用该组提交技术来减少写入和flush

问题详情:

看下面看到会发生什么, 当你提交一个事务 和启用binary log.

这个描述是基于Harrison分析当前实现的性能问题相关和使用InnoDB 作为存储引擎

因为唯一的真正的事务性引擎

  1. Prepare Innodb:

a) 写 prepare record 到InnoDB的log buffer

b) 同步log file 到磁盘

c) Take prepare_commit_mutex

  1. “Prepare” binary log:

a) 写事务到binary log

b) 同步binary log 基于sync_binlog

如果sync_binlog值大于0, MYSQL server 同步它的binary log 到磁盘(使用fdatasync())

在每次sync_binlog 写到binary log.如果自动提交启用,会把每个语句写到binary log里

默认值是0,不是同步写到磁盘的 在这种情况下, server 依赖操作系统来flush binary log的内存

值设为1 是安全的选择,由于crash 你最多丢失一个语句或者事务。然而,那也是最慢的选择

  1. Commit Innodb:

a) 写commit 记录到log

b) 释放 prepare_commit_mutex

c) 同步log file 到磁盘

d) 释放InnoDB 锁

  1. 提交 binary log

这种模型有5个问题:

  1. Prepare_commit_mutex 阻止binary log 和Innodb 进行group commit

prepare_commit_mutex 是用于确保事务是被提交到binary log 通过相同的顺序 它们被提交到InnoDB logs.

这是 Innodb Hot Backup的需要 我们没有意图改变

2.binary log 没有准备group commiting

由于这个互斥锁一次只有一个事务执行步骤2 ,这样binary log 不能group 一组事务

来降低写和flush的数量。

此外, 这个代码是不准备利用group 提交。

3.锁是持有用于 fsync的周期

MySQL 使用锁来实现它的一致性读模式,显然, 更高的锁级别 会更低的并发级别

一般来说, 它是安全的释放事务的锁 当已经提交记录到磁盘。

锁被分为两个不同的组,共享和独占锁。 共享锁会在找出一个事务已经进行它的事务后释放

并很愿意到提交。

  1. 不必要的磁盘访问,比如 太多的fsync

事务被写入磁盘3次,当binary log 被启用。

这个可以被改善作为Binary log 是作为来源和用于恢复

目前, 当恢复的时候,InnoDB 变异一个事务的列表 是prepared和不是提交也不是aborted

检查binary log 来决定。如果一个事务是被写入到binary log,它是提交的 否则它是回滚的

很显然, 不需要写和flush 提交的事务因为 最终会被其他的事务写入 在 prepare 阶段

或者 Innodb的后台进程 每秒写和刷新 innnodb buffer logs.

作用:事务在内存中的缓冲。

分配原则:控制在2-8M.这个值不用太多的。他里面的内存一般一秒钟写到磁盘一次。具体写入方式和你的事务提交方式有关。在Oracle等数据库了解这个,一般最大指定为3M比较合适。

我们推迟写和flush 在提交阶段, 为了改善性能和周期性的写和flushed 配置。

周期设置越大,会增加恢复的时间。

在功能上, 我们应该改善这种情况通过避免写和flush 在prepare阶段和

依赖binary log 来重现 丢失的事务。

5.

binary log 工作在存储引擎和一个事务协调 让它很难维护和发展。

binary log 注册为一个handler 和得到回调 当preparing,

committing, and aborting.

这个允许它写cached 数据到binary log 或者操作 事务装态以另外一种方式。

此外, binary log 表现为一个事务协调器事实上是唯一的事务协调器。

事实上它注册作为一个handler 导致一些问题 在维护方面(和潜在的性能)

建议的解决方案(细节)

启用binary log 来提高性能 可以产分下面的任务:

  1. 消除 prepare_commit_mutex, 或者需要它。

这与处理binary log 事务的顺序 相比innodb logs的事务的顺序

  1. Flush the binary log properly.

prepareing和 提交一个事务到一个binary log 不会自动的 意味着 binary log 是被刷新了。

事实上,执行一个group 提交的整个点 是不需要 每次事务都flush binary log

代替的是改善性能通过降低每个事务的flush次数

  1. 处理读锁的释放 以便进一步提高性能

更早的释放锁 是改善性能特别是对于有大量读的应用

4.延迟写和flush 在提交阶段

这将改善性能通过减少写和flush的数量 当binary log 启用时

5.让binary log 只是一个事务协调器:

Group Commit of Binary Log的更多相关文章

  1. mysql二进制文件操作语法(mysql binary log operate statements)

    开启 binary logs 功能 在 mysql 配置文件中配置 log-bin,重启 mysql my.cnf (on Linux/unix) or my.ini (on Windows) 例子: ...

  2. 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 得到复制master binary log 位置:

    17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 得到复制master binary log 位置: 你需要master ...

  3. MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分. MySQL有几种不同的日志文件.通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志能够帮助我们定位mysqld ...

  4. 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标:

    17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标: 你需要master ...

  5. 关于binary log那些事——认真码了好长一篇

    本文介绍binlog的作用以及几个重要参数的使用方法,同时通过实验来描述binlog内部记录内容:row .statement跟mixed的设置下,记录了哪些东西,最后会简单介绍下binlog ser ...

  6. 【MySQL】通过Binary Log简单实现数据回滚(一)

    一.前言 对,没错,我又水了好一阵子,深刻反思寄几.前段时间,工作项目上出于对excel等批量操作可能出现误操作的问题,要求提供一个能够根据操作批次进行数据回滚的能力.在开发的过程中接触到了MySQL ...

  7. MySQL5.7基于binary log的主从复制

    MySQL5.7基于binary log的主从复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 基于binary log 的复制是指主库将修改操作写入binary log 中, ...

  8. MySQL 组提交(group commit)

    目录 前言 改进 原理 实现 参数 注意 前言 操作系统使用页面缓存来填补内存和磁盘访问的差距 对磁盘文件的写入会先写入道页面缓存中 由操作系统来决定何时将修改过的脏页刷新到磁盘 确保修改已经持久化到 ...

  9. [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程

    [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程 http://mysqllover.com/?p=581 尽管Mariadb以及Facebook在long ...

随机推荐

  1. mysql学习(五)-字段属性

    字段属性: unsigned: 无符号类型,只能修饰数值类型: create table if not exists t1(id int unsigned); zerofill:前端填0 //只能修饰 ...

  2. 1.offsetParent,offsetLeft,offsetTop

    offsetParent <!doctype html> <html> <head> <meta charset="utf-8"> ...

  3. Sublime Text2使用技巧

    推荐Lucifr和JerryQu的几篇博文: Sublime Text 2 入门及技巧 via: http://lucifr.com/139225/sublime-text-2-tricks-and- ...

  4. c代码中调用c++,c++代码中调用c代码

    注意这里的c调用c++或者c++调用c的意思是.c文件中调用.cpp文件中的代码,或者相反 集成开发环境如vc++6.0或者vs都是通过文件后缀来区别当前要编译的是C代码还是C++代码,然后采用相应的 ...

  5. Python urllib和urllib2模块学习(一)

    (参考资料:现代魔法学院 http://www.nowamagic.net/academy/detail/1302803) Python标准库中有许多实用的工具类,但是在具体使用时,标准库文档上对使用 ...

  6. ThinkPHP框架下基于RBAC的权限控制模式详解

    这几天因为要做一个项目,需要可以对Web应用中通用功能进行封装,其中一个很重要的涉及到了对用户.角色和权限部分的灵活管理.所以基于TP框架自己封装了一个对操作权限和菜单权限进行灵活配置的可控制模式. ...

  7. Balsamiq Mockups registration code

    最近使用Mockups 进行页面原型设计,发现是未注册的,于是网上查询了下注册码,居然有效,在此记录下.    有需要的朋友也可以试试. Name:Rick Dong     Key:eNrzzU/O ...

  8. node.js介绍

    官网说明: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...

  9. Qt学习--部件深入--烤猪蹄

    1,进程条--向用户显示程序的当前状态,向用户提示该任务需要多长时间才能够完成. Qt-ProgressBar创建进程条,QProgressBar,为了使进程条担当起进程指示功能,需要执行定义进程条的 ...

  10. [置顶] 学习VB.NET编程最基本的三个问题

    1.什么是对象和属性,他们之间的联系是? 对象:将对象看做一个实物或者事物的一种概念.比如说窗体和控件都是对象. 属性:属性阐明了与对象相关的或是控制对象行为的信息,例如,对象的名字.颜色.尺寸或者位 ...