天天看点

mysql binlog 常用命令及问题整理

1:开启binlog日志记录

# log-bin

log-bin = E:/log/logbin.log

查看备份的二进制文件

c:\mysql\bin\>mysqlbinlog e:/log/logbin.000001

">": 导入到文件中; ">>": 追加到文件中

c:\mysql\bin\> mysqlbinlog e:/log/logbin.000001 > e:/log/log.sql

c:\mysql\bin\> mysqlbinlog e:/log/logbin.000002 >> e:/log/log.sq

2.2 按指定位置导出:

c:\mysql\bin\>mysqlbinlog --start-position=185 --stop-position=338 e:/log/logbin.000001 > e:/log/log3.txt

2.3 按指定时间导出:

c:\mysql\bin\>mysqlbinlog --start-datetime="2010-01-07 11:25:56" --stop-datetime="2010-01-07 13:23:50" e:/log/logbin.000001 > e:/log/log_by_date22.txt

3:从备份恢复数据库

c:\mysql\bin\>mysqlbinlog e:/log/logbin.000001 | mysql -u root -p

mysqlbinlog d:/mysql/data/binlog.000001 | mysql -uroot -pxcg213

3.2 按指定位置恢复:

c:\mysql\bin\>mysqlbinlog --start-position=185 --stop-position=338 e:/log/logbin.000001 | mysql -u root -p

3.3 按指定时间恢复:

c:\mysql\bin\>mysqlbinlog --start-datetime="2010-01-07 11:25:56" --stop-datetime="2010-01-07 13:23:50" e:/log/logbin.000001 | mysql -u root -p

3.4 通过导出的脚本文件恢复

c:\mysql\bin\>mysql -e "source e:/log/log.sql"

4.其他常用操作

4.1 查看所有日志文件

Sql代码

复制代码 代码如下:

mysql>show master logs;

4.2 当前使用的binlog文件

>show binlog events;

mysql>show binlog events \g;

4.3 产生一个新的binlog日志文件

Sql代码

复制代码 代码如下:

mysql>flush logs;

4.4 删除所有二进制日志,并从新开始记录(注意:reset master命令会删除所有的二进制日志)

mysql > flush logs;

mysql > reset master;

4.5 快速备份数据到sql文件

c:\mysql\bin>mysqldump -u root -p --opt --quick interactive > e:/log/mysqldump.sql

为了方便查看,把从脚本恢复的命令在写一次

c:\mysql\bin\>mysql -e "source e:/log/mysqldump.sql"

更换策略:

使用索引来循环文件,在以下条件将循环至下一个索引

1。服务器重启

2。服务器被更新

3。日志到达了最大日志长度 max_binlog_size

4。日志被刷新 mysql> flush logs;

-------------------------------------------

2.记录到二进制日志知的内容配置

binlog-do-db=sales 只记录sales库

binlog-ignore-db=sales 除sales库不记录,其他都记录

但是如果在操作数据库之前,不使用use $dbname 那么所有的SQL都不会记录

如果使用了use $dbname,那么判断规则取决于这里的$dbname,而不是SQL中操作的库

----------------------------------------------------------------------------------

ERROR 1665 (HY000) at line 33: Cannot execute statement: impossible to write to

binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage

 engine limited to row-based logging. InnoDB is limited to row-logging when tran

saction isolation level is READ COMMITTED or READ UNCOMMITTED.

解决办法:

mysql> SET SESSION binlog_format = 'ROW';

   mysql> SET GLOBAL binlog_format = 'ROW';

解释参考:http://www.cnblogs.com/sunson/archive/2012/05/28.html

msyql>show variables like 'binlog%';

当然了,也能够在运行时动态修正binlog的款式。例如

mysql> SET SESSION binlog_format = 'STATEMENT';

mysql> SET SESSION binlog_format = 'ROW';

mysql> SET SESSION binlog_format = 'MIXED';

mysql> SET GLOBAL binlog_format = 'STATEMENT';

mysql> SET GLOBAL binlog_format = 'ROW';

mysql> SET GLOBAL binlog_format = 'MIXED';

-------------------------------------------------------------------------------------

3.二进制日志不准确的处理http://www.lampblog.net/2011/01/mysql-binlog%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%97%A5%E5%BF%97%E8%AF%A6%E8%A7%A3/

默认情况下,并不是每次写入时都将二进制日志与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能二进制日志中最后的语句丢失。

要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使二进制日志在每N次二进制日志写入后与硬盘同步。

即使sync_binlog设置为1,出现崩溃时,也有可能表内容和二进制日志内容之间存在不一致性。

如果崩溃恢复时MySQL服务器发现二进制日志变短了(即至少缺少一个成功提交的InnoDB事务),

如果sync_binlog =1并且硬盘/文件系统的确能根据需要进行同步(有些不需要)则不会发生,则输出错误消息 (“二进制日志<名>比期望的要小”)。

在这种情况下,二进制日志不准确,复制应从主服务器的数据快照开始。

为了您的安全,请只打开来源可靠的网址

继续阅读