MySQL Binary log的安全性
时间:2006-11-15 来源:gladness
以下引用了中文官方文档:
----
当innodb_flush_log_at_trx_commit被 设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。当这个值为1(默认值)之时,在每个 事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新。当设置为2之时,在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷 新。尽管如此,在对日志文件的刷新在值为2的情况也每秒发生一次。我们必须注意到,因为进程安排问题,每秒一次的刷新不是100%保证每秒都发生。你可以 通过设置这个值不为1来获得较好的性能,但随之你会在一次崩溃中损失二分之一价值的事务。如果你设置这个值为0,那么任何mysqld进程的崩溃会删除崩 溃前最后一秒的事务,如果你设置这个值为2,那么只有操作系统崩溃或掉电才会删除最后一秒的事务。尽管如此,InnoDB的崩溃恢复不受影响,而且因为这 样崩溃恢复开始作用而不考虑这个值。注意,许多操作系统和一些磁盘硬件会欺骗刷新到磁盘操作。尽管刷新没有进行,你可以告诉mysqld刷新已经进行。即 使设置这个值为1,事务的持久程度不被保证,且在最坏情况下掉电甚至会破坏InnoDB数据库。在SCSI磁盘控制器中,或在磁盘自身中,使用有后备电池 的磁盘缓存会加速文件刷新并且使得操作更安全。你也可以试着使用Unix命令hdparm来在硬件缓存中禁止磁盘写缓存,或使用其它一些对硬件提供商专用 的命令。这个选项的默认值是1。
为在复制中建立中最大可能的可靠和一致性,你应该在主服务器上的my.cnf文件里使用innodb_flush_log_at_trx_commit=1和sync-binlog=1。
----
以下是我翻译了一段5.0的英文文档:
----
sync_binlog
如果这个变量的值是正的,MySQL服务器每写二进制日志sync_binlog次就把日志同步到硬盘上(使用fdatasync())。注意如果使用了 autocommit,那么每执行一条SQL(增、删、改)都会写二进制日志,否则是每个事务写一次。缺省值是0,不依据写日志的次数同步。1是最安全的 选择,在崩溃时最多丢失一条SQL或者事务,由于没有同步到硬盘上。但这也是最慢的选择(除非硬盘有一个电池备份的cache,会让同步非常快)。
如果sync_binlog是0(缺省值),没有额外的刷新。MYSQL依赖操作系统把日志文件刷新到硬盘上,就像其他普通文件一样。
----
看来为了安全,sync_binlog=1是一个重要设置。但它会对性能有多大影响也需要确认。
----
当innodb_flush_log_at_trx_commit被 设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。当这个值为1(默认值)之时,在每个 事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新。当设置为2之时,在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷 新。尽管如此,在对日志文件的刷新在值为2的情况也每秒发生一次。我们必须注意到,因为进程安排问题,每秒一次的刷新不是100%保证每秒都发生。你可以 通过设置这个值不为1来获得较好的性能,但随之你会在一次崩溃中损失二分之一价值的事务。如果你设置这个值为0,那么任何mysqld进程的崩溃会删除崩 溃前最后一秒的事务,如果你设置这个值为2,那么只有操作系统崩溃或掉电才会删除最后一秒的事务。尽管如此,InnoDB的崩溃恢复不受影响,而且因为这 样崩溃恢复开始作用而不考虑这个值。注意,许多操作系统和一些磁盘硬件会欺骗刷新到磁盘操作。尽管刷新没有进行,你可以告诉mysqld刷新已经进行。即 使设置这个值为1,事务的持久程度不被保证,且在最坏情况下掉电甚至会破坏InnoDB数据库。在SCSI磁盘控制器中,或在磁盘自身中,使用有后备电池 的磁盘缓存会加速文件刷新并且使得操作更安全。你也可以试着使用Unix命令hdparm来在硬件缓存中禁止磁盘写缓存,或使用其它一些对硬件提供商专用 的命令。这个选项的默认值是1。
为在复制中建立中最大可能的可靠和一致性,你应该在主服务器上的my.cnf文件里使用innodb_flush_log_at_trx_commit=1和sync-binlog=1。
----
以下是我翻译了一段5.0的英文文档:
----
sync_binlog
如果这个变量的值是正的,MySQL服务器每写二进制日志sync_binlog次就把日志同步到硬盘上(使用fdatasync())。注意如果使用了 autocommit,那么每执行一条SQL(增、删、改)都会写二进制日志,否则是每个事务写一次。缺省值是0,不依据写日志的次数同步。1是最安全的 选择,在崩溃时最多丢失一条SQL或者事务,由于没有同步到硬盘上。但这也是最慢的选择(除非硬盘有一个电池备份的cache,会让同步非常快)。
如果sync_binlog是0(缺省值),没有额外的刷新。MYSQL依赖操作系统把日志文件刷新到硬盘上,就像其他普通文件一样。
----
看来为了安全,sync_binlog=1是一个重要设置。但它会对性能有多大影响也需要确认。
相关阅读 更多 +