1、查看mysql 二进制日志文件,输入以下命令
mysqlbinlog log.000007
log.000007 日志文件路径
2、mysqlbinlog 二进制内容说明
- ...
- 1 #090713 17:20:08 server id 1 end_log_pos 199
- Query thread_id=1 exec_time=0 error_code=0
- 2 use test/*!*/;
- 3 SET TIMESTAMP=1247476808/*!*/;
- 4 SET @@session.pseudo_thread_id=1/*!*/;
- 5 SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1,
- @@session.unique_checks=1, @@session.autocommit=1/*!*/;
- 6 SET @@session.sql_mode=0/*!*/;
- 7 SET @@session.auto_increment_increment=1,
- @@session.auto_increment_offset=1/*!*/;
- 8 /*!\C latin1 *//*!*/;
- 9 SET @@session.character_set_client=8,
- @@session.collation_connection=8,@@session.collation_server=8/*!*/;
- 10 SET @@session.lc_time_names=0/*!*/;
- 11 SET @@session.collation_database=DEFAULT/*!*/;
- 12 insert into t values ('12345')
- 13 /*!*/;
- 14 # at 199
- ...
从第1~14行记录了一条对数据库更改操作的SQL语句(第12行):insert into t values ('12345')。第1行记录内容如表11-6所示。
表11-6 记录内容说明
090713 17:20:08 | 该SQL语句执行时间 |
server id 1 | 执行SQL语句的ServerID,在数据库复制情形下, server id用于标识每个MySQL服务器 |
end_log_pos 199 | 表示该条记录的终止位置为199, 对应日志文件中的第14行 |
Query | SQL语句的类型 |
thread_id=1 | 发出SQL语句请求的线程ID。当每个客户端 连接到MySQL服务器时,MySQL会为该用户 分配一个唯一的ID,用以标识该用户的线程 |
exec_time=0 | SQL语句执行的时间 |
error_code=0 | SQL语句执行的错误代码。0表示SQL语句执行成功 |
日志的第2行表示切换到MySQL服务器的test数据库。第3~11行设置当前会话的一些环境变量,例如是否自动提交(session.autocommit)、是否检查外键约束(session.foreign_key_ checks)等。如果需要了解它们详细的参数和说明,可以参考MySQL使用手册的第5章第1小节。
日志第12行为该条记录的核心,即对数据库进行了更改操作的SQL语句(insert into t values ('12345'))。日志第14行表示该条日志记录的结束。
以上分析了MySQL二进制日志如何记录一条对数据库进行更改的SQL语句,对于其他SQL语句的记录格式与上面的类似。
3、mysqlbinlog 用法
mysqlbinlog支持下面的选项:
· ---help,-?
显示帮助消息并退出。
· ---database=db_name,-d db_name
只列出该数据库的条目(只用本地日志)。
· --force-read,-f
使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。
· --hexdump,-H
在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。
· --host=host_name,-h host_name
获取给定主机上的MySQL服务器的二进制日志。
· --local-load=path,-l pat
为指定目录中的LOAD DATA INFILE预处理本地临时文件。
· --offset=N,-o N
跳过前N个条目。
· --password[=password],-p[password]
当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。
· --port=port_num,-P port_num
用于连接远程服务器的TCP/IP端口号。
· --position=N,-j N
不赞成使用,应使用--start-position。
· --protocol={TCP | SOCKET | PIPE | -position
使用的连接协议。
· --read-from-remote-server,-R
从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。这些选项是--host、--password、--port、--protocol、--socket和--user。
· --result-file=name, -r name
将输出指向给定的文件。
· --short-form,-s
只显示日志中包含的语句,不显示其它信息。
· --socket=path,-S path
用于连接的套接字文件。
· --start-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如:
shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003
该选项可以帮助点对点恢复。
· --stop-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见--start-datetime选项。该选项可以帮助及时恢复。
· --start-position=N
从二进制日志中第1个位置等于N参量时的事件开始读。
· --stop-position=N
从二进制日志中第1个位置等于和大于N参量时的事件起停止读。
· --to-last-logs,-t
在MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求--read-from-remote-server。
· --disable-logs-bin,-D
禁用二进制日志。如果使用--to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。
· --user=user_name,-u user_name
连接远程服务器时使用的MySQL用户名。
· --version,-V
显示版本信息并退出。
还可以使用--var_name=value选项设置下面的变量:
· open_files_limit
指定要保留的打开的文件描述符的数量。
可以将mysqlbinlog的输出传到mysql客户端以执行包含在二进制日志中的语句。如果你有一个旧的备份,该选项在崩溃恢复时也很有用(参见5.9.1节,“数据库备份”):
shell> mysqlbinlog hostname-bin.000001 | mysql
或:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
如果你需要先修改含语句的日志,还可以将mysqlbinlog的输出重新指向一个文本文件。(例如,想删除由于某种原因而不想执行的语句)。编辑好文件后,将它输入到mysql程序并执行它包含的语句。
mysqlbinlog有一个--position选项,只打印那些在二进制日志中的偏移量大于或等于某个给定位置的语句(给出的位置必须匹配一个事件的开始)。它还有在看见给定日期和时间的事件后停止或启动的选项。这样可以使用--stop-datetime选项进行点对点恢复(例如,能够说“将数据库前滚动到今天10:30 AM的位置”)。
如果MySQL服务器上有多个要执行的二进制日志,安全的方法是在一个连接中处理它们。下面是一个说明什么是不安全的例子:
shell> mysqlbinlog hostname-bin.000001 | mysql # DANGER!!
shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!
使用与服务器的不同连接来处理二进制日志时,如果第1个日志文件包含一个CREATE TEMPORARY TABLE语句,第2个日志包含一个使用该临时表的语句,则会造成问题。当第1个mysql进程结束时,服务器撤销临时表。当第2个mysql进程想使用该表时,服务器报告 “不知道该表”。
要想避免此类问题,使用一个连接来执行想要处理的所有二进制日志中的内容。下面提供了一种方法:
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
另一个方法是:
shell> mysqlbinlog hostname-bin.000001 > /tmp/statements.sql
shell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql
shell> mysql -e "source /tmp/statements.sql"
mysqlbinlog产生的输出可以不需要原数据文件即可重新生成一个LOAD DATA INFILE操作。mysqlbinlog将数据复制到一个临时文件并写一个引用该文件的LOAD DATA LOCAL INFILE语句。由系统确定写入这些文件的目录的默认位置。要想显式指定一个目录,使用--local-load选项。
因为mysqlbinlog可以将LOAD DATA INFILE语句转换为LOAD DATA LOCAL INFILE语句(也就是说,它添加了LOCAL),用于处理语句的客户端和服务器必须配置为允许LOCAL操作。参见5.6.4节,“LOAD DATA LOCAL安全问题”。
警告:为LOAD DATA LOCAL语句创建的临时文件不会自动删除,因为在实际执行完那些语句前需要它们。不再需要语句日志后应自己删除临时文件。文件位于临时文件目录中,文件名类似original_file_name-#-#。
参考mysql 手册 http://dev.mysql.com/doc/refman/5.1/zh/client-side-scripts.html#mysqlbinlog