从MySQL5.6开始,mysqlbinlog支持将远程服务器上的binlog实时复制到本地服务器上。
mysqlbinlog的实时二进制复制功能并非简单的将远程服务器的日志复制过来,它是通过MySQL 5.6公布的Replication API实时获取二进制事件。本质上,就相当于MySQL的从服务器。与普通服务器类似,主服务器发生事件后,一般都会在0.5~1秒内进行备份。
下面主要介绍mysqlbinlog的远程拉取日志命令及主要参数:
命令示例:mysqlbinlog -v --base64-output=DECODE-ROWS --read-from-remote-server --raw --host=x.x.x.x --port=3306 --user=root --password=123456 --stop-never mysql-bin.000001
--read-from-remote-server:用于备份远程服务器的binlog。如果不指定该选项,则会查找本地的binlog。
--raw:binlog日志会以二进制格式存储在磁盘中,如果不指定该选项,则会以文本形式保存,文本方式需要指定文件名称,否则打印在控制台。
--user:复制的MySQL用户,只需要授予REPLICATION SLAVE权限。
--stop-never:mysqlbinlog可以只从远程服务器获取指定的几个binlog,
也可将不断生成的binlog保存到本地。指定此选项,代表只要远程服务器不关闭或者连接未断开,
mysqlbinlog就会不断的复制远程服务器上的binlog。
mysql-bin.000001:代表从哪个binlog开始复制,只有结合--stop-never才可以按顺序复制没有出现在命令行的文件(比如mysql-bin.000002,mysql-bin.000003等, 如果只是想拉取指定的几个文件,多个文件之间用空格间隔即可)。
-v --base64-output=DECODE-ROWS 命令用于二进制日志文件sql命令base64的解码
--database 指定数据库名称
除了以上选项外,还有以下几个选项需要注意:
--stop-never-slave-server-id:在备份远程服务器的binlog时,mysqlbinlog本质上就相当于一个从服务器,
该选项就是用来指定从服务器的server-id的。默认为-1。
--to-last-log:代表mysqlbinlog不仅能够获取指定的binlog,还能获取其后生成的binlog,
获取完了,才终止。如果指定了--stop-never选项则会隐式打开--to-last-log选项。
--result-file:用于设置远程服务器的binlog,保存到本地的前缀(如果没有--row,则为文件名)。譬如对于mysql-bin.000001,
如果指定--result-file=/test/backup-,则保存到本地后的文件名为/test/backup-mysql-bin.000001。
注意:如果将--result-file设置为目录,则一定要带上目录分隔符“/”。譬如--result-file=/test/,
而不是--result-file=/test,不然保存到本地的文件名为/testmysql-bin.000001
--raw不支持--database,--start-datetime,--end-datetime,--end-position
--stop-never出现时,才是从目标文件(mysql-bin.000001)开始持续复制后续文件,否则只拉取目标文件
下面再展示一下命令
mysqlbinlog -v --base64-output=DECODE-ROWS mysql-bin.000002
执行后的示例结果(其中mysql-bin.000002为本地文件)
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#220720 15:07:06 server id 1 end_log_pos 0 CRC32 0xfc718567 Start: binlog v 4, server v 5.7.30-log created 220720 15:07:06
# at 123
#220720 17:19:00 server id 1 end_log_pos 1071 CRC32 0xe3719127 Anonymous_GTID last_committed=3 sequence_number=4 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 188
#220720 17:19:00 server id 1 end_log_pos 1151 CRC32 0x4fbd6189 Query thread_id=47 exec_time=0 error_code=0
SET TIMESTAMP=1658308740/*!*/;
SET @@session.pseudo_thread_id=47/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549120/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=45/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 268
#220720 17:19:00 server id 1 end_log_pos 1214 CRC32 0x58b5cbd4 Table_map: `mysql_shiyan`.`employee` mapped to number 110
# at 331
#220720 17:19:00 server id 1 end_log_pos 1259 CRC32 0xa71b0d0e Write_rows: table id 110 flags: STMT_END_F
### INSERT INTO `mysql_shiyan`.`employee`
### SET
### @1=5
### @2='Dog7'
### @3=NULL
# at 376
#220720 17:19:00 server id 1 end_log_pos 1290 CRC32 0x49c4796a Xid = 305
COMMIT/*!*/;
# at 407
#220720 17:24:41 server id 1 end_log_pos 1355 CRC32 0x21f52f84 Anonymous_GTID last_committed=4 sequence_number=5 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 472
#220720 17:24:41 server id 1 end_log_pos 1435 CRC32 0x4f39b2d6 Query thread_id=47 exec_time=0 error_code=0
SET TIMESTAMP=1658309081/*!*/;
BEGIN
/*!*/;
# at 552
#220720 17:24:41 server id 1 end_log_pos 1498 CRC32 0x04b33e43 Table_map: `mysql_shiyan`.`employee` mapped to number 110
# at 615
#220720 17:24:41 server id 1 end_log_pos 1639 CRC32 0x86990db1 Update_rows: table id 110 flags: STMT_END_F
### UPDATE `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog5'
### @3=NULL
### SET
### @1=5
### @2='Dog77'
### @3=NULL
### UPDATE `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog5'
### @3=NULL
### SET
### @1=5
### @2='Dog77'
### @3=NULL
### UPDATE `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog5'
### @3=NULL
### SET
### @1=5
### @2='Dog77'
### @3=NULL
### UPDATE `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog6'
### @3=NULL
### SET
### @1=5
### @2='Dog77'
### @3=NULL
### UPDATE `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog7'
### @3=NULL
### SET
### @1=5
### @2='Dog77'
### @3=NULL
# at 756
#220720 17:24:41 server id 1 end_log_pos 1670 CRC32 0x0dce8341 Xid = 361
COMMIT/*!*/;
# at 787
#220720 17:26:09 server id 1 end_log_pos 1735 CRC32 0xe778776d Anonymous_GTID last_committed=5 sequence_number=6 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 852
#220720 17:26:09 server id 1 end_log_pos 1815 CRC32 0xb766cc4f Query thread_id=47 exec_time=0 error_code=0
SET TIMESTAMP=1658309169/*!*/;
BEGIN
/*!*/;
# at 932
#220720 17:26:09 server id 1 end_log_pos 1878 CRC32 0x83f37203 Table_map: `mysql_shiyan`.`employee` mapped to number 110
# at 995
#220720 17:26:09 server id 1 end_log_pos 1968 CRC32 0xb3d7455c Delete_rows: table id 110 flags: STMT_END_F
### DELETE FROM `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog77'
### @3=NULL
### DELETE FROM `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog77'
### @3=NULL
### DELETE FROM `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog77'
### @3=NULL
### DELETE FROM `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog77'
### @3=NULL
### DELETE FROM `mysql_shiyan`.`employee`
### WHERE
### @1=5
### @2='Dog77'
### @3=NULL
# at 1085
#220720 17:26:09 server id 1 end_log_pos 1999 CRC32 0xf3a5f5f8 Xid = 377
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
从上面可以看到无论是增,删和改操作,binglog中都存储了相关记录的所有数据,其中@1,@2,@3为字段序号。
最后提醒一下,拉取日志的一方不需要安装mysql,只需要有mysqlbinlog执行文件(在已经安装mysql的bin目录下获取)即可。