MYSQL常用工具一文马上就要结束啦~尽管如此Amy可是丝毫不敢懈怠,始终抱着能够给大家带来诚意十足的干货的心态更新每一篇文章。大家学习之余别忘了看一下之前的文章哦,相信一定会有更多的收获!——MySQL常用工具和分布式事务数据库开发规范系列文章
mysqlbinlog可以将二进制日志和中继日志包含的事件以文本格式显示其内容,也可以作为binlog的备份程序。
调用:
shell> mysqlbinlog [options] log_file …
#mysqlbinlog支持读取本地服务器的二进制文件,也支持远程服务器的。当读取远程服务器时,其表现为一个客户端,故此需要用到客户端通用的连接等选项。mysqlbinlog选项可以从[mysqlbinlog]和[client]组读取。
输出:
如shell> mysqlbinlog binlog.0000003命令将显示该文件的包含的事件内容。对于基于语句的日志记录,事件信息包括sql语句,执行语句的服务器id,执行语句的时间戳,花费的时间等。对于基于行的日志记录,该事件表示行的更改而不是sql语句。
事件之前是头注释,包含其他信息,例如事件在文件中的偏移或或起始位置、事件时间戳指示语句在源服务器上的起始时间(对于复制,该时间戳传播到从服务器)、源服务器id、下一事件起始位置、执行语句的线程id、在源服务器上exec_time为执行耗时而在从上为语句执行结束事件减去语句在源开始时间、执行事件的结果0表示没有错误发生。格式如下:
at 141
#100309 9:28:36 server id 123 end_log_pos 245 Query thread_id=3350 exec_time=11 error_code=0
注意:When using event groups, the file offsets of events may be grouped together and the comments of events may be grouped together. Do not mistake these grouped events for blank file offsets.
当读取一个大文件时,注意文件系统空间是否足够容纳结果文件。要配置临时文件所使用的文件夹,使用TMPDIR环境变量。
mysqbinlog在执行任何sql前设置pseudo_slave_mode=1。
mysqlbinlog的输出可以重新执行(如输入到mysql中)。可以用于奔溃恢复操作,也可以用于基于时间点的恢复。
可以将mysqlbinlog的输出通过管道输入到mysql中。
shell> mysqlbinlog binlog.000001 | mysql -u root -p
shell> mysqlbinlog binlog.[0-9]* | mysql -u root -p
#若mysqlbinlog包含blob,使用mysql --binary-mode。
也可以先输出到文件,修改后再输入到mysql
shell> mysqlbinlog binlog.000001 > tmpfile
shell> … edit tmpfile …
shell> mysql -u root -p < tmpfile
如果你需要将多个binlog导入mysql,安全的方法是使用一个会话:(否则可能因为临时表被删除等导致不一致)
shell> mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!
以上两个命令的用法是不安全的,要使用下面的方法:
shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
mysqlbinlog可以将load data语句转换成本地的load data local语句,需要在默认的系统决定的目录或–local-load指定的目录保存该语句需要的文件,文件的格式类似original_file_name-#-#。
#注意:这里默认值是不再选用“程序名 --no-defaults --help”打印的输出,而是指未指定时内部初始值,该值可被自身选项显示指定,也可能会受其他互斥选项、相关选项更改。只写出启用的布尔型,以及有内部值的选项。有内部值的选项可以不显示给出。
2.1 所有客户端共有选项
2.1.1 影响选项文件读取的选项
2.1.2 帮助与版本
2.1.2 连接的建立
连接方式参数说明:优先级–protocol>–pipe>-h;
linux两种连接方式:若未指定–host和-h,或指定为localhost,或指定为空(–host=或–host=’’),则使用unix套接字;否则使用tcp/ip。
windows三种连接方式:若未指定–host和-h,或指定为localhost,且服务端开启了共享内存,则使用共享内存;若指定为.,或tcp禁用且socket未指定或主机指定为空(–host=),则使用命名管道;否则tcp。
连接方式举例
全平台使用tcp/ip:
mysql --protocol=tcp [-h127.0.0.1] [–port=3306]
mysql -h127.0.0.1 [–port=3306]
unix使用socket:
mysql [–host=localhost] [–socket=/tmp/mysql.sock]
windows使用命名管道:需在服务端开启命名管道支持
mysql --protocol=pipe
mysql --pipe
mysql --host=.
windows使用共享内存:未知,存在问题。理论上应当在服务上开启共享内存后使用
mysql [–host=localhost] --shared-memory-base-name=MYSQL,但是实际上使用的tcp,或者
mysql --protocol=memory --shared-memory-base-name=MYSQL,但是会报错ERROR 2046 (HY000): Can’t open shared memory; cannot send request event to server (5);
2.1.3 字符集
2.1.4 调试日志
2.2 mysqlbinlog特定选项
hexdump使mysqlbinlog生成十六进制输出,包含#开头的注释行,如
shell> mysqlbinlog --hexdump master-bin.000001
/*!40019 SET @@SESSION.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
at 4
#051024 17:24:13 server id 1 end_log_pos 98
Position Timestamp Type Master ID Size Master Pos Flags
00000004 9d fc 5c 43 0f 01 00 00 00 5e 00 00 00 62 00 00 00 00 00
00000017 04 00 35 2e 30 2e 31 35 2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|
00000027 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |og..............|
00000037 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000047 00 00 00 00 9d fc 5c 43 13 38 0d 00 08 00 12 00 |.......C.8......|
00000057 04 04 04 04 12 00 00 4b 00 04 1a |.......K...|
Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13
at startup
ROLLBACK;
目前,十六进制输出包含以下元素:
• Position: The byte position within the log file.
• Timestamp: The event timestamp. In the example shown, '9d fc 5c 43' is the representation of '051024 17:24:13'in hexadecimal.
• Type: The event type code.
• Master ID: The server ID of the master that created the event.
• Size: The size in bytes of the event.
• Master Pos: The position of the next event in the original master log file.
• Flags: Event flag values.
base64-output=DECODE-ROWS 和–verbose选项可用于影响行事件输出。
假如执行如下语句:
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;
4.1 默认情况下mysql用BINLOG显示编码为base-64的行事件:
shell> mysqlbinlog log_file
...
at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
...
at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
...
at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
4.2 要添加行事件的伪sql显示,使用-v。输出中的行sql以###开头
shell> mysqlbinlog -v log_file
...
at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
INSERT INTO test.t
SET
@1=1
@2='apple'
@3=NULL
...
at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
UPDATE test.t
WHERE
@1=1
@2='apple'
@3=NULL
SET
@1=1
@2='pear'
@3='2009:01:01'
...
at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
DELETE FROM test.t
WHERE
@1=1
@2='pear'
@3='2009:01:01'
4.3 指定两次-v如-vv,在伪sql语句中还包含额外的注释以显示数据类型和一些列元数据
shell> mysqlbinlog -vv log_file
...
at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
INSERT INTO test.t
SET
@1=1 /* INT meta=0 nullable=0 is_null=0 */
@2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
@3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
...
at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
UPDATE test.t
WHERE
@1=1 /* INT meta=0 nullable=0 is_null=0 */
@2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
@3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
SET
@1=1 /* INT meta=0 nullable=0 is_null=0 */
@2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
@3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
...
at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
DELETE FROM test.t
WHERE
@1=1 /* INT meta=0 nullable=0 is_null=0 */
@2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
@3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
4.4 可以使用–base64-output=DECODE-ROWS取消BINLOG语句的显示。可以方便地查看行事件的伪sql语句
...
at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
INSERT INTO test.t
SET
@1=1
@2='apple'
@3=NULL
...
at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
UPDATE test.t
WHERE
@1=1
@2='apple'
@3=NULL
SET
@1=1
@2='pear'
@3='2009:01:01'
...
at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
DELETE FROM test.t
WHERE
@1=1
@2='pear'
@3='2009:01:01'
mysqlbinlog可以将服务器上的二进制日志备份到客户端本地。
至少需–read-from-remote-server和–raw选项,可选–stop-never、–stop-never-slave-server-id=id、–result-file等
5.1 静态备份:
查看服务器binlog日志组文件名
mysql> SHOW BINARY LOGS;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000130 | 27459 |
| binlog.000131 | 13719 |
| binlog.000132 | 43268 |
+---------------+-----------+
使用以下两个语句备份:
mysqlbinlog --read-from-remote-server --host=host_name --raw binlog.000130 binlog.000131 binlog.000132
或
mysqlbinlog --read-from-remote-server --host=host_name --raw --to-last-log binlog.000130
#两个语句的不同之处在于if the server happens to open binlog.000133 before mysqlbinlog reaches the end of binlog.000132, the first command will not read it, but the second command will.
5.2 动态备份:
mysqlbinlog --read-from-remote-server --host=host_name --raw --stop-never binlog.000130
此时输出文件的名称如下所述:
无–raw时,mysqlbinlog在–result-file或stdout生成文本输出;
有–raw时,不改变复制过来的文件名字,但–result-file可以给文件指定位置并加前缀。当–result-file指定为目录时不改名字,但目录要以/结尾
5.3 举例:mysqldump和mysqlbinlog用来备份还原
备份binlog:
mysqlbinlog --read-from-remote-server --host=host_name --raw --stop-never binlog.000999
备份数据:
mysqldump --host=host_name --all-databases --events --routines --master-data=2> dump_file
当需要还原时,先将最近备份还原:
mysql --host=host_name -u root -p < dump_file
随后从dump_file中找到-- CHANGE MASTER TO MASTER_LOG_FILE=‘binlog.001002’, MASTER_LOG_POS=27284;
然后用二进制备份恢复自己想要恢复的内容:
mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004 | mysql --host=host_name -u root -p
mysqlbinlog备份限制
mysqlbinlog与服务器连接丢失后不会重连;
在5.7.19前,即便sync_binlog=1,mysqlbinlog也不一定得到所有的提交;
备份延时和复制延时类似。
当使用–read-from-remote-server 选项调用时,mysqlbinlog连接到MySQL服务器,报告用于标识自身的服务器ID,并从服务器请求二进制日志文件。您可以使用 mysqlbinlog以多种方式从服务器请求日志文件:
显示指定多个文件:对于每个文件, mysqlbinlog连接并发出一个Binlog dump命令。服务器发送文件并断开连接。每个文件有一个连接。
指定起始文件和–to-last-log:mysqlbinlog连接并为所有文件发出一个Binlog dump 命令。服务器发送所有文件后断开连接。
指定起始文件和–stop-never:mysqlbinlog连接并为所有文件发出一个Binlog dump 命令。服务器发送所有文件后保持连接。
当仅指定–read-from-remote-server选项,mysqlbinlog使用0作为服务id(0表示发送完请求后断开连接);当还指定–stop-never,以65535或–stop-never-slave-server-id连接,非零值使服务器不断开连接;这样,因为0所以前两种断开,给定–stop-never而非0故不断开。