细聊MySQL之常用工具及基本操作(一)
细聊MySQL之常用工具及基本操作(二)
细聊MySQL之常用工具及基本操作(三)
细聊MySQL之常用工具及基本操作(完)
十、binlog查看工具mysqlbinlog的使用。
在讲解mysqlbinlog时,我先提供mysqlbinlog的相关参数给大家熟悉下:
参数 | 描述 | 适用 | 弃用 |
---|---|---|---|
--base64-output=value | 该选项指定BINLOG如何被显示,有以下几个值供选择。 AUTO,自动显示BINLOG声明 NEVER,不显示BINLOG声明,如果有一个使用BINLOG显示的行事件,产生错误并退出。 DECODE-ROWS,指定解码显示行事件 |
||
--bind-address=ip_address | 同mysql命令 | ||
--binlog-row-event-max-size=# | 二进制日志记录的最大事件尺寸 | ||
--character-sets-dir=path | 同mysql命令 | ||
--database=db_name | 只显示指定的数据库条目 | ||
--debug[=debug_options] | 同mysql命令 | ||
--debug-check | 同mysql命令 | ||
--debug-info | 同mysql命令 | ||
--defaults-extra-file=file_name | 同mysql命令 | ||
--defaults-file=file_name | 同mysql命令 | ||
--defaults-group-suffix=str | 同mysql命令 | ||
--disable-log-bin | 关闭binlog | ||
--force-read | 强制读二进制文件,不管该文件是否打开或关闭是否正常 | ||
--help | 同mysql命令 | ||
--hexdump | 使用16进制显示binlog | ||
--host=host_name | 同mysql命令 | ||
--idempotent | 告诉服务器使用幂等模式使用更新 | 5.7.0 | |
--local-load=path | 在指定的目录中为LOAD DATA INFILE准备临时文件 | ||
--no-defaults | 同mysql命令 | ||
--offset=# | 设置读取binlog的偏移量 | ||
--password[=password] | 同mysql命令 | ||
--plugin-dir=path | 同mysql命令 | ||
--port=port_num | 同mysql命令 | ||
--print-defaults | 同mysql命令 | ||
--protocol=type | 同mysql命令 | ||
--raw | 写二进制格式到输出文件 | ||
--read-from-remote-master=type | 从主MYSQL服务器读二进制文件,而不是从本地。该选项有 BINLOG-DUMP-NON-GTIDS 和 BINLOG-DUMP-GTIDS两种。GTIDS功能后续会有介绍 | ||
--read-from-remote-server | 从服务器读二进制文件 | ||
--result-file=name | 将结果直接输出到文件 | ||
--server-id=id | 提取被指定server id创建的事件 | ||
--set-charset=charset_name | 同mysql命令 | ||
--shared-memory-base-name=name | 同mysql命令 | ||
--short-form | 仅仅显示包含在log里的声明语句 | ||
--skip-gtids[=true|false] | 不打印任何GTID | ||
--socket=path | 同mysql命令 | ||
--ssl | 同mysql命令 | 5.7.3 | |
--ssl-ca=file_name | 同mysql命令 | 5.7.3 | |
--ssl-capath=dir_name | 同mysql命令 | 5.7.3 | |
--ssl-cert=file_name | 同mysql命令 | 5.7.3 | |
--ssl-cipher=cipher_list | 同mysql命令 | 5.7.3 | |
--ssl-crl=file_name | 同mysql命令 | ||
--ssl-crlpath=dir_name | 同mysql命令 | ||
--ssl-key=file_name | 同mysql命令 | 5.7.3 | |
--ssl-verify-server-cert | 同mysql命令 | 5.7.3 | |
--start-datetime=datetime | 从指定的时间戳开始读binlog | ||
--start-position=# | 从指定的位置开始读binlog | ||
--stop-datetime=datetime | 读binlog直到指定的时间戳为止 | ||
--stop-never | 读取完binlog后保持与服务器的连接 | ||
--stop-never-slave-server-id=# | 连接服务器时报告从服务器的ID | ||
--stop-position=# | 读binlog直到指定的位置为止 | ||
--to-last-log | 该选项需要 --read-from-remote-server选项,一直读取知道最新的binlog的结尾 | ||
--user=user_name, | 同mysql命令 | ||
--verbose | 用SQL语句显示行事件 | ||
--verify-binlog-checksum | 验证binlog内的校验和 | ||
--version | 同mysql命令 |
要查看binlog,首先得有。如果服务器用默认的启动方式,mysql将不会生成binlog。所以在mysqld启动时,必须加上--log-bin参数。binlog文件通常在数据文件目录内,如/usr/local/mysql/data内,以xxx-bin.0000xx的形式命名。为了适用mysqlbinlog查看binlog,首先我们在test库执行一段SQL:
CREATE TABLE t ( id INT NOT NULL, name VARCHAR(20) NOT NULL, date DATE NULL ) ENGINE = InnoDB;
START TRANSACTION;
INSERT INTO t VALUES(1, 'apple', NULL);
UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1;
DELETE FROM t WHERE id = 1;
COMMIT;
以上步骤概括了创建表、插入数据、更新数据、删除数据的操作,并且是在一个事务内完成。
1、mysqlbinlog 16进制格式查看,语法如下:
shell> mysqlbinlog --hexdump master-bin.000001
输出大致如下:
#141203 0:03:50 server id 1 end_log_pos 300 CRC32 0xda824ff6
# Position Timestamp Type Master ID Size Master Pos Flags
# 78 e6 c3 7e 54 02 01 00 00 00 b4 00 00 00 2c 01 00 00 00 00
# 8b 04 00 00 00 00 00 00 00 04 00 00 21 00 00 00 00 |................|
# 9b 00 00 01 00 00 20 40 00 00 00 00 06 03 73 74 64 |.............std|
# ab 04 21 00 21 00 08 00 0c 01 74 65 73 74 00 74 65 |.........test.te|
# bb 73 74 00 43 52 45 41 54 45 20 54 41 42 4c 45 20 |st.CREATE.TABLE.|
# cb 74 0d 0a 28 0d 0a 20 20 69 64 20 20 20 49 4e 54 |t.......id...INT|
# db 20 4e 4f 54 20 4e 55 4c 4c 2c 0d 0a 20 20 6e 61 |.NOT.NULL.....na|
# eb 6d 65 20 56 41 52 43 48 41 52 28 32 30 29 20 4e |me.VARCHAR.20..N|
# fb 4f 54 20 4e 55 4c 4c 2c 0d 0a 20 20 64 61 74 65 |OT.NULL.....date|
# 10b 20 44 41 54 45 20 4e 55 4c 4c 0d 0a 29 20 45 4e |.DATE.NULL....EN|
# 11b 47 49 4e 45 20 3d 20 49 6e 6e 6f 44 42 f6 4f 82 |GINE...InnoDB.O.|
# 12b da |.|
# Query thread_id=4 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1417593830/*!*/;
SET @@session.pseudo_thread_id=4/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
CREATE TABLE t^M
(^M
id INT NOT NULL,^M
name VARCHAR(20) NOT NULL,^M
date DATE NULL^M
) ENGINE = InnoDB
/*!*/;
这里只截取了创建表t的这一段log。可以看到,结果中有Position Timestamp Type Master ID Size Master Pos Flags这几列。下面说明下这几列的意义。
Position: LOG文件的字节位置
Timestamp: 事件发生的时间戳
Type: 事件类型(以下表格是所有的事件类型)
类型 | 名称 | 意义 |
---|---|---|
00 | UNKNOWN_EVENT | 未知事件 |
01 | START_EVENT_V3 | This indicates the start of a log file written by MySQL 4 or earlier. |
02 | QUERY_EVENT | The most common type of events. These contain statements executed on the master. |
03 | STOP_EVENT | Indicates that master has stopped. |
04 | ROTATE_EVENT | Written when the master switches to a new log file. |
05 | INTVAR_EVENT | Used for AUTO_INCREMENT values or when the LAST_INSERT_ID() function is used in the statement. |
06 | LOAD_EVENT | Used for LOAD DATA INFILE in MySQL 3.23. |
07 | SLAVE_EVENT | Reserved for future use. |
08 | CREATE_FILE_EVENT | Used for LOAD DATA INFILE statements. This indicates the start of execution of such a statement. A temporary file is created on the slave. Used in MySQL 4 only. |
09 | APPEND_BLOCK_EVENT | Contains data for use in a LOAD DATA INFILE statement. The data is stored in the temporary file on the slave. |
0a | EXEC_LOAD_EVENT | Used for LOAD DATA INFILE statements. The contents of the temporary file is stored in the table on the slave. Used in MySQL 4 only. |
0b | DELETE_FILE_EVENT | Rollback of a LOAD DATA INFILE statement. The temporary file should be deleted on the slave. |
0c | NEW_LOAD_EVENT | Used for LOAD DATA INFILE in MySQL 4 and earlier. |
0d | RAND_EVENT | Used to send information about random values if the RAND() function is used in the statement. |
0e | USER_VAR_EVENT | Used to replicate user variables. |
0f | FORMAT_DESCRIPTION_EVENT | MYSQL5及以上版本log文件开始 |
10 | XID_EVENT | Event indicating commit of an XA transaction. |
11 | BEGIN_LOAD_QUERY_EVENT | Used for LOAD DATA INFILE statements in MySQL 5 and later. |
12 | EXECUTE_LOAD_QUERY_EVENT | Used for LOAD DATA INFILE statements in MySQL 5 and later. |
13 | TABLE_MAP_EVENT | Information about a table definition. Used in MySQL 5.1.5 and later. |
14 | PRE_GA_WRITE_ROWS_EVENT | Row data for a single table that should be created. Used in MySQL 5.1.5 to 5.1.17. |
15 | PRE_GA_UPDATE_ROWS_EVENT | Row data for a single table that needs to be updated. Used in MySQL 5.1.5 to 5.1.17. |
16 | PRE_GA_DELETE_ROWS_EVENT | Row data for a single table that should be deleted. Used in MySQL 5.1.5 to 5.1.17. |
17 | WRITE_ROWS_EVENT | 写事件 |
18 | UPDATE_ROWS_EVENT | 更新事件 |
19 | DELETE_ROWS_EVENT | 删除事件 |
1a | INCIDENT_EVENT | Something out of the ordinary happened. Added in MySQL 5.1.18. |
Master ID: 创建事件的服务ID
Size: 事件的字节大小
Master Pos: 原始日志文件下一个事件的位置
Flags: 标记
Flag | Name | Meaning |
---|---|---|
01 | LOG_EVENT_BINLOG_IN_USE_F | Log file correctly closed. (Used only in FORMAT_DESCRIPTION_EVENT.) If this flag is set (if the flags are, for example, '01 00') in a FORMAT_DESCRIPTION_EVENT, the log file has not been properly closed. Most probably this is because of a master crash (for example, due to power failure). |
02 | Reserved for future use. | |
04 | LOG_EVENT_THREAD_SPECIFIC_F | Set if the event is dependent on the connection it was executed in (for example, '04 00'), for example, if the event uses temporary tables. |
08 | LOG_EVENT_SUPPRESS_USE_F | Set in some circumstances when the event is not dependent on |
这里我就没翻译了,毕竟英语也不是太好,怕有差错。
2、事件的显示
shell> mysqlbinlog log_file
结果如下所示:
# at 379
#141203 0:03:50 server id 1 end_log_pos 491 CRC32 0xab45c565 Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1417593830/*!*/;
INSERT INTO t VALUES(1, 'apple', NULL)
/*!*/;
at代表log文件内字节位置
CRC32 0xab45c565 代表校验和
Query thread_id=4 代表执行的线程ID
end_log_pos 491 代表结束的字节位置
error_code=0 代表错误码
141203 可能代表事务标识,未验证
注释下面是具体的SQL操作记录
3、使用mysqlbinlog备份二进制文件
mysqlbinlog工具可以读取并显示二进制文件的内容,这种能力可以用来备份。mysqlbinlog能进行静态备份或者不间断的连续备份。mysqlbinlog能够一直运行知道服务器关闭,或者mysqlbinlog强制退出。当连接关闭时,mysqlbinlog不会等待或者重连,如果需要继续进行备份,必须重新启动mysqlbinlog。
二进制日志的备份需要调用mysqlbinlog的至少两个选项:
--read-from-remote-server (or -R) 选项告诉mysqlbinlog连接到一个服务器和请求binlog
--raw option 告诉mysqlbinlog写二进制输出而不是文本输出
在使用--read-from-remote-server选项时,通常要搭配--user、--host、--password等一起使用。
一些其它的选项也是比较有用的,与--raw一起搭配使用,如
--stop-never:一直保持连接
--stop-never-slave-server-id=id:当--stop-never开启时报告server id
--result-file:指定输出的文件名
下面用例子来描述下:
mysqlbinlog --read-from-remote-server --host=host_name --raw --to-last-log --result-file=xxx binlog.000130
此为静态备份,一次性备份binlog到xxx文件
mysqlbinlog --read-from-remote-server --host=host_name --raw --stop-never --result-file=xxx binlog.000130
加了--stop-never后为连续备份,直到服务器shutdown或强制退出mysqlbinlog
在运行此命令前需注意两点:
1、检查binlog.index内的路径是否正确,否则会出现找不到二进制日志的错误。
2、保证binlog文件没有异常,否则会出现备份不了的情况。
3、mysqld运行时必须指定server id。
数据库的常用工具与基本操作就介绍到这里。后续将会有一些更深入的研究和见解与大家分享。