mysql5.6自带工具集(一)

本文介绍了MySQL5.6中两个重要的自带工具,包括innochecksum用于离线检查InnoDB文件校验和,以及mysqlbinlog用于处理二进制日志文件的实用工具。
摘要由CSDN通过智能技术生成

一、innochecksum — Offline InnoDB File Checksum Utility

原理:按page读取并计算表空间文件中的所有page的checksum值,并和每个page中保存的checksum进行比较,如果checksum不一样就打印出不一样的地方。5.6.16以后可以支持校验2GB以上的文件。

限制:不能校验已经打开的文件

使用方式:innochecksum [options] file_name

二、mysqlbinlog — Utility for Processing Binary Log Files

使用方式:mysqlbinlog [options] log_file ...

返回:mysqlbinlog将二进制的binlog文件解析成文本格式并打印出来,statement格式的binlog打印出的event内容类似如下
# at 141
#100309  9:28:36 server id 123  end_log_pos 245
  Query thread_id=3350  exec_time=11  error_code=0
at:表示文件的偏移位置,或者是event的开始位置。
第二行开始:date 和 time表示产生这个event的server开始执行本条语句的时间,并且会随着复制传到从库。执行该语句的server id。
end_log_pos:表示该event结束的位置+1,即下一个event开始的位置。
第三行exec_time:在master上,表示执行该event的时间;在slave上,表示执行完该event的时间-master开始执行该event的时间。error_code表示event的执行结果。

用处:mysqlbinlog的输出可以重新执行,因此可以用来进行数据恢复。可以读本地的binlog,也可以读远程server的binlog(能应用到远程server上吗?)。

数据恢复:
shell> mysqlbinlog binlog.[0-9]* | mysql -u root -p [--binary-mode](如有blob数据加上这个参数)
或者
shell> mysqlbinlog binlog.000001 | mysql -u root -p [--binary-mode]
或者
shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

或者先导入一个文件,修改后再用mysql导入
shell> mysqlbinlog binlog.000001 > tmpfile
shell> ... edit tmpfile ...
shell> mysql -u root -p < tmpfile
亦或者全部导入一个文件修改
shell> mysqlbinlog binlog.000001 >  /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql
shell> mysql -u root -p -e "source /tmp/statements.sql"

问题:在恢复多个binlog的时候,不能一个一个地导入,如下语句会有问题。如果第一个binlog有create temporary table语句,并且第二个binlog正好用到,由于第一个连接执行完毕后temporary table就被drop了,因此第二个连接就会找不到该表。
shell> mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!
补充:对于LOAD DATA INFILE语句,mysqlbinlog先将数据拷贝一份到一个临时文件中( --local-load  该参数可以指定临时文件的路径),并生成LOAD DATA LOCAL INFILE语句load那个临时文件。因为mysqlbinlog将LOAD DATA INFILE转换成了LOAD DATA LOCAL INFILE,所以本地server必须开了此权限,并且client有这个权限。生成的临时文件不会自动删除,需要手动删除,文件名类似: original_file_name-#-# .

数据恢复

默认情况下,mysqlbinlog会以文本的形式输出,意味着row格式的binlog也会以文本形式输出。从5.6开始,输出的格式可以跟原来的格式一样,比如加上--raw选项,就可以指定输出为原格式。

基于时间的恢复:

基于点的恢复:

其它有用的参数:

--hexdump  :可以查看event的二进制格式
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;
http://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog-hexdump.html。可以查看每列的含义。

--verbose和:mysqlbinlog会将row格式的event编码成base-64格式字符串并显示。要想看到SQL语句(pseudo-SQL),需要加上该参数。以###开头的即是类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=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAAAEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### 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'
再加上--verbose选项,或者(-vv),会显示修改字段的数据类型以及其他元数据信息
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=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAAAEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### 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 */
  --base64-output=DECODE-ROWS 如果不想显示base64字符串信息,可以加上该参数,配合上-v参数,输出的结果比较易于观看。 但是,如果想要将输出的结果重新执行的话,就不能加这个参数了。
shell> mysqlbinlog -v --base64-output=DECODE-ROWS log_file
...
# 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'
binlog备份

mysqlbinlog还可以用来备份二进制文件。即可以做静态的备份(static backup):备份一系列binlog直到遇到最后一个binlog结束;也可以做持续备份(continuous (live) backup):server运行过程中一直备份,直到server停了,或者mysqlbinlog被强制停止了。并且停了以后即使server再次起来也不会自动重连。
备份的时候至少需要如下两个参数:
--read-from-remote-server (or -R) :该参数告诉mysqlbinlog去连server并且请求binlog(跟从库复制类似)。需要加上--host,--user,--password
--raw :按原来的格式输出。可能需要加上--stop-never--stop-never-slave-server-id=id--result-file(输出文件的前缀)。
如果仅仅加了--read-from-remote-server选项,那么mysqlbinlog默认的slave-server-id是0,当master将需要的文件传完后就断开连接;如果又加了--stop-never选项,则默认id是65535,并且连接会持续存在。

备份前指定的备份文件必须得存在,可以用show binary logs查看。
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
这两条语句的区别是:如果在mysqlbinlog读取最后一个binlog之前,又打开了binlog.000133,那么第一条语句不会读取该文件,而第二条语句会。

需要持续备份可使用如下命令:
mysqlbinlog --read-from-remote-server --host=host_name --raw
  --stop-never binlog.000130
用mysqldump+mysqlbinlog来进行备份和恢复方式见:
http://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog-backup.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值