MySQL的binlog, InnoDB的日志和Oracle的日志

    MySQL中有一个binlog的概念, 用于保存对数据库所作的修改, 这点上和Oracle的归档日志很接近, 但在原理上是很不一样的. 以InnoDB为例, InnoDB本身就有log文件, 和Oracle的联机日志一样, 用完了就重用, 但binlog并不是InnoDB的日志在重用前的拷贝, 而是另外写了一个文件. 因为binlog并不是专门为InnoDB设计的, 其他的存贮引挚如MyISAM也支持binlog, 它是MySQL备份及复制支持的重要基础, 因此不同于InnoDB的日志文件.

    如果MySQL用于很重要的系统, 需要事务支持, 并且要支持联机备份, 要保证没有数据丢失, 目前来说, 一般会用InnoDB存贮引挚, 并启用binlog, 为了保证事务的数据不丢失, 就得:

1, 在每次Commit时, 将修改写入InnoDB的日志文件
2, 在每次Commit时, 将修改写入binlog文件

    而在Oracle中只是保证写入到Oracle的联机日志就够了, 因此在性能测试中, 如果启用了binlog, 性能基本上下降了一半, 因为这中间要做两次写操作. 另外现在的版本中, 一个事务不能跨越binlog, 因此启用binlog的情况下, 就要少用大事务了. 查一下资料, 原来InnoDB也可以有Archived Log模式, 但在MySQL的手册中找到这样一段话, 好象功能已经过时了?

innodb_log_archive

Whether to log InnoDB archive files. This variable is present for historical reasons, but is unused. Recovery from a backup is done by MySQL using its own log files, so there is no need to archive InnoDB log files. The default for this variable is 0.

    过多的功能支持, 必然会造成衔接的松散, 从儿得不到最大化的性能. 理论上来说不够安全的成组提交是MySQL的亮点, Oracle10g好象也有这个功能的, 只不过默认情况下是关闭的.

    从这个结构来看, MySQL不太适合用于很重要的数据, 如财务数据等.

留言 (4)

As Fenng said.

Oracle bought InnoDB, 釜底抽薪.

这篇文章不错,我比较关心MySQL的事务处理一致性和数据恢复.

(我用的Google汉字输入法,比原来打汉字快了一点.)

我们现在用10.1,
就是喜欢10.2的Log无等待,成批事务提交特性,
本来打算这个月升级到10.2.0.3,
听Kamus说10.2 RAC 经常强制系统重新启动,
干脆明年一口气升级到11*得了.

单机来讲InnoDB的log就能保证数据持久性,由于MySQL复制是不同步的,用binlog并不能保证复制数据的一致。对于重要数据做同步复制一般用DRBD

从我们DBA的角度来说, 逻辑的复制要强于网络Mirror, 对于InnoDB的数据文件来说, 如果网格Mirror中出了一些问题, 则可能最后结果是无效的.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Have you seen Mr. Smith recently?
  • 最近你见过史密斯先生吗?
  • They've been working on this project since last year.
  • 他们从去年开始一直都在做这个项目.
  • I've been watching TV all night.
  • 我看了一整晚的电视.
  • The movie began as soon as we got there.
  • 我们一到那儿电影就开始了.
  • When I arrived at the station, the train had already left.
  • 我到车站时, 火车已经开了.