diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 8250d8a..a9e9504 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -2516,6 +2516,9 @@ static Exit_status dump_remote_log_entries(PRINT_EVENT_INFO *print_event_info, @param[in] logname Name of input binlog. + @param[in] stream_file Used to indicate that file is a stream and + therefore can't seek back and forth + @retval ERROR_STOP An error occurred - the program should terminate. @retval OK_CONTINUE No error, the program should continue. @retval OK_STOP No error, but the end of the specified range of @@ -2523,7 +2526,8 @@ static Exit_status dump_remote_log_entries(PRINT_EVENT_INFO *print_event_info, */ static Exit_status check_header(IO_CACHE* file, PRINT_EVENT_INFO *print_event_info, - const char* logname) + const char* logname, + bool stream_file) { DBUG_ENTER("check_header"); uchar header[BIN_LOG_HEADER_SIZE]; @@ -2540,14 +2544,22 @@ static Exit_status check_header(IO_CACHE* file, pos= my_b_tell(file); - /* fstat the file to check if the file is a regular file. */ - if (my_fstat(file->file, &my_file_stat) == -1) + if (!stream_file) + { + /* fstat the file to check if the file is a regular file. */ + if (my_fstat(file->file, &my_file_stat) == -1) + { + error("Unable to stat the file."); + DBUG_RETURN(ERROR_STOP); + } + if ((my_file_stat.st_mode & S_IFMT) == S_IFREG) + my_b_seek(file, (my_off_t)0); + } + if (stream_file && pos != (my_off_t)0) { - error("Unable to stat the file."); + error("Cannot rewind to header in a stream."); DBUG_RETURN(ERROR_STOP); } - if ((my_file_stat.st_mode & S_IFMT) == S_IFREG) - my_b_seek(file, (my_off_t)0); if (my_b_read(file, header, sizeof(header))) { @@ -2561,6 +2573,73 @@ static Exit_status check_header(IO_CACHE* file, } /* + The rest of this function tries to figure out binlog format etc by reading + some events. We have two codepaths based on whether it is streaming file + or not. This is because we cannot go back and forth in a stream. Since the + streaming file only needs to be supported for 5.0+ formats, the code for + streaming path is simpler than the non-streaming case that handles all + formats. + */ + if (stream_file) + { + for (;;) + { + pos= my_b_tell(file); + + if (pos >= start_position) + { + DBUG_RETURN(OK_CONTINUE); + } + + Log_event *ev; + if (!(ev= Log_event::read_log_event(file, glob_description_event, + opt_verify_binlog_checksum, + rewrite_db_filter))) + { + if (file->error) + { + error("Could not read a log_event at offset %llu;" + " this could be a log format error or read error.", + (ulonglong)pos); + DBUG_RETURN(ERROR_STOP); + } + // EOF + DBUG_RETURN(OK_CONTINUE); + } + + if (ev->get_type_code() != binary_log::FORMAT_DESCRIPTION_EVENT) + { + delete ev; + ev = NULL; + continue; + } + + Format_description_log_event *new_description_event = + static_cast(ev); + + if (opt_base64_output_mode == BASE64_OUTPUT_AUTO) + { + /* + process_event will delete *description_event and set it to + the new one, so we should not do it ourselves in this + case. + */ + Exit_status retval= process_event(print_event_info, + new_description_event, pos, + logname); + if (retval != OK_CONTINUE) + DBUG_RETURN(retval); + } + else + { + delete glob_description_event; + glob_description_event= new_description_event; + } + } + DBUG_RETURN(OK_CONTINUE); + } + + /* Imagine we are running with --start-position=1000. We still need to know the binlog format's. So we still need to find, if there is one, the Format_desc event, or to know if this is a 3.23 @@ -2705,7 +2784,8 @@ static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, my_close(fd, MYF(MY_WME)); return ERROR_STOP; } - if ((retval= check_header(file, print_event_info, logname)) != OK_CONTINUE) + if ((retval= check_header(file, print_event_info, logname, false)) + != OK_CONTINUE) goto end; } else @@ -2732,23 +2812,9 @@ static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, error("Failed to init IO cache."); return ERROR_STOP; } - if ((retval= check_header(file, print_event_info, logname)) != OK_CONTINUE) + if ((retval= check_header(file, print_event_info, logname, true)) + != OK_CONTINUE) goto end; - if (start_position) - { - /* skip 'start_position' characters from stdin */ - uchar buff[IO_SIZE]; - my_off_t length,tmp; - for (length= start_position_mot ; length > 0 ; length-=tmp) - { - tmp= min(static_cast(length), sizeof(buff)); - if (my_b_read(file, buff, (uint) tmp)) - { - error("Failed reading from file."); - goto err; - } - } - } } if (!glob_description_event || !glob_description_event->is_valid()) @@ -2980,6 +3046,13 @@ int main(int argc, char** argv) exit(1); } + if ((argc == 1) && (stop_position != (ulonglong)(~(my_off_t)0)) && + (!strcmp(argv[0], "-"))) + { + error("stop_position not allowed when input is STDIN"); + exit(1); + } + umask(((~my_umask) & 0666)); /* Check for argument conflicts and do any post-processing */ if (args_post_process() == ERROR_STOP) diff --git a/mysql-test/extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_1.inc b/mysql-test/extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_1.inc new file mode 100644 index 0000000..482eb71 --- /dev/null +++ b/mysql-test/extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_1.inc @@ -0,0 +1,60 @@ +# ==== Purpose ==== +# +# Auxiliary file used by main.mysqlbinlog-start-stop-streaming-input. +# +# This file runs mysqlbinlog for a streaming file with a fixed set of parameters +# specifying the source binlog, but varying how the start and stop positions/ +# datetime are specified. +# +# ==== Usage ==== +# +# --let $start_position= +# --let $stop_position= +# --let $start_datetime= +# --let $stop_datetime= +# --let $file_options= +# --source extra/binlog_tests/mysqlbinlog_start_stop_1.inc +# +# Parameters: +# $start_position +# Offset to pass to --start-position +# $stop_position +# Offset to pass to --stop-position +# $start_datetime +# Offset to pass to --start-datetime +# $stop_datetime +# Offset to pass to --stop-datetime +# $file_options +# Specifying which input file to read. + +--let $option= --base64-output=never +--let $error= 0 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc + +--let $option= --offset=2 +--let $error= 0 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc + +--let $option= --start-position=$start_position +--let $error= 0 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc + +--let $option= --stop-position=$stop_position +--let $error= 1 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc + +--let $option= --start-position=$start_position --stop-position=$stop_position +--let $error= 1 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc + +--let $option= "--start-datetime=$start_datetime" +--let $error= 0 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc + +--let $option= "--stop-datetime=$stop_datetime" +--let $error= 0 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc + +--let $option= "--start-datetime=$start_datetime" "--stop-datetime=$stop_datetime" +--let $error= 0 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc diff --git a/mysql-test/extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc b/mysql-test/extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc new file mode 100644 index 0000000..2546efc --- /dev/null +++ b/mysql-test/extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_2.inc @@ -0,0 +1,44 @@ +# ==== Purpose ==== +# +# Auxiliary file used by mysql-test/extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_1.inc +# +# This prints a header, then runs mysqlbinlog once with given parameters. +# +# ==== Usage ==== +# +# --let $options= X +# --let $file_options= Y +# --let $error= Z +# --source include/mysqlbinlog-start-stop-streaming-input_2.inc +# +# Parameters: +# +# $options +# Options that will be printed as a header in the test log. +# $file_options +# Streaming input files to mysqlbinlog +# $error +# Flag to determine if the execution expects an error or not + +# Pretty-print $option_text +--let $option_text= `SELECT SUBSTR(REPLACE('$option', '"', ''), 3)` +while (`SELECT LOCATE('=', '$option_text')`) +{ + --let $dash_pos= `SELECT LOCATE('--', '$option_text')` + --let $option_text= `SELECT CONCAT(SUBSTR('$option_text', 1, LOCATE('=', '$option_text') - 1), IF($dash_pos, CONCAT(' ', SUBSTR('$option_text', $dash_pos + 2)), ''))` +} +--echo +--echo ---- $option_text with streaming input---- + +# Print output +--replace_regex /SET @@SESSION.GTID_NEXT= '.*'/SET @@SESSION.GTID_NEXT= 'GTID';/ /([0-9A-F\-]{36})\:[0-9]+\-[0-9]+/UUID:#-#/ /_timestamp=[0-9A-Za-z:\(\)\. \-]*/_timestamp=TIMESTAMP/ + +if ($error) +{ + --error 1 + --exec cat $file_options | $MYSQL_BINLOG --short-form $option - +} +if (!$error) +{ + --exec cat $file_options | $MYSQL_BINLOG --short-form $option - +} diff --git a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result index 6152c97..27878cb 100644 --- a/mysql-test/r/mysqlbinlog.result +++ b/mysql-test/r/mysqlbinlog.result @@ -164,6 +164,59 @@ DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; +--- Broken LOAD DATA with streaming input -- +include/mysqlbinlog.inc +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +# [empty] +# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; +SET @@SESSION.GTID_NEXT= '#'/*!*/; +SET TIMESTAMP=#/*!*/; +SET @@session.pseudo_thread_id=#/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=#/*!*/; +LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; +SET @@SESSION.GTID_NEXT= '#'/*!*/; +SET TIMESTAMP=#/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=#/*!*/; +LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; +SET @@SESSION.GTID_NEXT= '#'/*!*/; +SET TIMESTAMP=#/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=#/*!*/; +insert into t1 values ("Alas") +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= '#' /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; --- --database -- include/mysqlbinlog.inc /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; @@ -269,6 +322,36 @@ DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; +--- --start-position with streaming input -- +include/mysqlbinlog.inc +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) +/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; +SET @@SESSION.GTID_NEXT= '#'/*!*/; +SET TIMESTAMP=#/*!*/; +SET @@session.pseudo_thread_id=#/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=#/*!*/; +insert into t1 values ("Alas") +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= '#' /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; --- Remote -- include/mysqlbinlog.inc /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; diff --git a/mysql-test/r/mysqlbinlog_start_stop_streaming_input.result b/mysql-test/r/mysqlbinlog_start_stop_streaming_input.result new file mode 100644 index 0000000..508c1ad --- /dev/null +++ b/mysql-test/r/mysqlbinlog_start_stop_streaming_input.result @@ -0,0 +1,725 @@ +CREATE TABLE t1 (a INT); +RESET MASTER; +SET TIMESTAMP= UNIX_TIMESTAMP("2031-01-01 12:00:00"); +INSERT INTO t1 VALUES(1); +SET TIMESTAMP= UNIX_TIMESTAMP("2032-01-01 12:00:00"); +INSERT INTO t1 VALUES(2); +SET TIMESTAMP= UNIX_TIMESTAMP("2033-01-01 12:00:00"); +INSERT INTO t1 VALUES(3); +FLUSH LOGS; +SET TIMESTAMP= UNIX_TIMESTAMP("2034-01-01 12:00:00"); +INSERT INTO t1 VALUES(4); +SET TIMESTAMP= UNIX_TIMESTAMP("2035-01-01 12:00:00"); +INSERT INTO t1 VALUES(5); +FLUSH LOGS; + +==== Local ==== + +---- base64-output with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- offset with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- start-position with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- stop-position with streaming input---- + +---- start-position stop-position with streaming input---- + +---- start-datetime with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- stop-datetime with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- start-datetime stop-datetime with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +==== Local with 2 binlogs on command line ==== + +---- base64-output with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2019718800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2019718800/*!*/; +INSERT INTO t1 VALUES(4) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2051254800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2051254800/*!*/; +INSERT INTO t1 VALUES(5) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- offset with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2019718800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2019718800/*!*/; +INSERT INTO t1 VALUES(4) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2051254800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2051254800/*!*/; +INSERT INTO t1 VALUES(5) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- start-position with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2019718800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2019718800/*!*/; +INSERT INTO t1 VALUES(4) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2051254800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2051254800/*!*/; +INSERT INTO t1 VALUES(5) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- stop-position with streaming input---- + +---- start-position stop-position with streaming input---- + +---- start-datetime with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2019718800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2019718800/*!*/; +INSERT INTO t1 VALUES(4) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2051254800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2051254800/*!*/; +INSERT INTO t1 VALUES(5) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- stop-datetime with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2019718800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2019718800/*!*/; +INSERT INTO t1 VALUES(4) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +---- start-datetime stop-datetime with streaming input---- +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +ROLLBACK/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1925024400/*!*/; +SET @@session.pseudo_thread_id=999999999/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8mb4 *//*!*/; +SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +BEGIN +/*!*/; +use `test`/*!*/; +SET TIMESTAMP=1925024400/*!*/; +INSERT INTO t1 VALUES(1) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1956560400/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1956560400/*!*/; +INSERT INTO t1 VALUES(2) +/*!*/; +COMMIT/*!*/; +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=1988182800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=1988182800/*!*/; +INSERT INTO t1 VALUES(3) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +# [empty] +# original_commit_timestamp=TIMESTAMP +# immediate_commit_timestamp=TIMESTAMP +/*!80001 SET @@session.original_commit_timestamp=TIMESTAMP*//*!*/; +SET @@SESSION.GTID_NEXT= 'GTID';/*!*/; +SET TIMESTAMP=2019718800/*!*/; +BEGIN +/*!*/; +SET TIMESTAMP=2019718800/*!*/; +INSERT INTO t1 VALUES(4) +/*!*/; +COMMIT/*!*/; +SET @@SESSION.GTID_NEXT= 'GTID'; /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +==== clean up ==== +DROP TABLE t1; diff --git a/mysql-test/suite/rpl_nogtid/r/rpl_row_mysqlbinlog.result b/mysql-test/suite/rpl_nogtid/r/rpl_row_mysqlbinlog.result index e502494..1144cd0 100644 --- a/mysql-test/suite/rpl_nogtid/r/rpl_row_mysqlbinlog.result +++ b/mysql-test/suite/rpl_nogtid/r/rpl_row_mysqlbinlog.result @@ -318,83 +318,9 @@ DELIMITER ; --- Test 6 reading stdin -- include/mysqlbinlog.inc -/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; -/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; -DELIMITER /*!*/; -ROLLBACK/*!*/; -# [empty] -# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; -SET @@SESSION.GTID_NEXT= '#'/*!*/; -use `test`/*!*/; -SET TIMESTAMP=#/*!*/; -SET @@session.pseudo_thread_id=#/*!*/; -SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; -SET @@session.sql_mode=1436549152/*!*/; -SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; -/*!\C utf8mb4 *//*!*/; -SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; -SET @@session.lc_time_names=0/*!*/; -SET @@session.collation_database=DEFAULT/*!*/; -DROP TABLE IF EXISTS `t1`,`t2`,`t3` /* generated by server */ -/*!*/; -# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; -SET @@SESSION.GTID_NEXT= '#'/*!*/; -SET TIMESTAMP=#/*!*/; -CREATE TABLE t1(word VARCHAR(20)) -/*!*/; -# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; -SET @@SESSION.GTID_NEXT= '#'/*!*/; -SET TIMESTAMP=#/*!*/; -CREATE TABLE t2(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY) -/*!*/; -# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; -SET @@SESSION.GTID_NEXT= '#'/*!*/; -SET TIMESTAMP=#/*!*/; -SET @@session.explicit_defaults_for_timestamp=1/*!*/; -CREATE TABLE t3(c1 INT NOT NULL PRIMARY KEY, c2 LONGBLOB, c3 TIMESTAMP, c4 TEXT, c5 FLOAT) -/*!*/; -SET @@SESSION.GTID_NEXT= '#' /* added by mysqlbinlog */ /*!*/; -DELIMITER ; -# End of log file -/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; -/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; --- Test 7 reading stdin w/position -- include/mysqlbinlog.inc -/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; -/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; -DELIMITER /*!*/; -ROLLBACK/*!*/; -# original_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -# immediate_commit_timestamp= MICROSECONDS-FROM-EPOCH (YYYY-MM-DD HOURS:MINUTES:SECONDS TZ) -/*!80001 SET @@session.original_commit_timestamp= MICROSECONDS-FROM-EPOCH*//*!*/; -SET @@SESSION.GTID_NEXT= '#'/*!*/; -use `test`/*!*/; -SET TIMESTAMP=#/*!*/; -SET @@session.pseudo_thread_id=#/*!*/; -SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; -SET @@session.sql_mode=1436549152/*!*/; -SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; -/*!\C utf8mb4 *//*!*/; -SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; -SET @@session.lc_time_names=0/*!*/; -SET @@session.collation_database=DEFAULT/*!*/; -SET @@session.explicit_defaults_for_timestamp=1/*!*/; -CREATE TABLE t3(c1 INT NOT NULL PRIMARY KEY, c2 LONGBLOB, c3 TIMESTAMP, c4 TEXT, c5 FLOAT) -/*!*/; -SET @@SESSION.GTID_NEXT= '#' /* added by mysqlbinlog */ /*!*/; -DELIMITER ; -# End of log file -/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; -/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; --- Test 8 switch internal charset -- stop slave; diff --git a/mysql-test/suite/rpl_nogtid/t/rpl_row_mysqlbinlog.test b/mysql-test/suite/rpl_nogtid/t/rpl_row_mysqlbinlog.test index 7b89fca..3b7fecf 100644 --- a/mysql-test/suite/rpl_nogtid/t/rpl_row_mysqlbinlog.test +++ b/mysql-test/suite/rpl_nogtid/t/rpl_row_mysqlbinlog.test @@ -259,6 +259,8 @@ select "--- Test 5 LOAD DATA --" as ""; # Bug#7853 (mysqlbinlog does not accept input from stdin) +--let $mysqlbinlog_allow_error= 1 + --disable_query_log ONCE select "--- Test 6 reading stdin --" as ""; let $MYSQLD_DATADIR= `select @@datadir;`; @@ -270,6 +272,8 @@ select "--- Test 7 reading stdin w/position --" as ""; --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR --let $mysqlbinlog_parameters= --short-form --start-position=$position --stop-position=$stop_position - < $MYSQLD_DATADIR/master-bin.000001 --source include/mysqlbinlog.inc + +--let $mysqlbinlog_allow_error= 0 # Bug#16217 (mysql client did not know how not switch its internal charset) --disable_query_log ONCE diff --git a/mysql-test/t/mysqlbinlog.test b/mysql-test/t/mysqlbinlog.test index bb787df..17fbd8f 100644 --- a/mysql-test/t/mysqlbinlog.test +++ b/mysql-test/t/mysqlbinlog.test @@ -57,6 +57,9 @@ let $MYSQLD_DATADIR= `select @@datadir`; --echo --- Broken LOAD DATA -- --let $mysqlbinlog_parameters= --short-form --local-load=$MYSQLTEST_VARDIR/tmp/ $MYSQLD_DATADIR/binlog.000002 2> /dev/null --source include/mysqlbinlog.inc +--echo --- Broken LOAD DATA with streaming input -- +--let $mysqlbinlog_parameters= --short-form --local-load=$MYSQLTEST_VARDIR/tmp/ - 2> /dev/null < $MYSQLD_DATADIR/binlog.000002 +--source include/mysqlbinlog.inc # this should show almost nothing --echo --- --database -- @@ -67,6 +70,9 @@ let $MYSQLD_DATADIR= `select @@datadir`; --echo --- --start-position -- --let $mysqlbinlog_parameters= --short-form --local-load=$MYSQLTEST_VARDIR/tmp/ --start-position=$binlog_start_pos $MYSQLD_DATADIR/binlog.000002 --source include/mysqlbinlog.inc +--echo --- --start-position with streaming input -- +--let $mysqlbinlog_parameters= --short-form --local-load=$MYSQLTEST_VARDIR/tmp/ --start-position=$binlog_start_pos - < $MYSQLD_DATADIR/binlog.000002 +--source include/mysqlbinlog.inc # These are tests for remote binlog. # They should return the same as previous test. diff --git a/mysql-test/t/mysqlbinlog_start_stop_streaming_input-master.opt b/mysql-test/t/mysqlbinlog_start_stop_streaming_input-master.opt new file mode 100644 index 0000000..af3a211 --- /dev/null +++ b/mysql-test/t/mysqlbinlog_start_stop_streaming_input-master.opt @@ -0,0 +1 @@ +--binlog-format=statement diff --git a/mysql-test/t/mysqlbinlog_start_stop_streaming_input.test b/mysql-test/t/mysqlbinlog_start_stop_streaming_input.test new file mode 100644 index 0000000..6e1c9a5 --- /dev/null +++ b/mysql-test/t/mysqlbinlog_start_stop_streaming_input.test @@ -0,0 +1,68 @@ +# ==== Purpose ==== +# +# Test the --[start|stop]-[position|datetime] options to mysqlbinlog, +# with one or two binary logs as streaming input. +# +# ==== Implementation ==== + +-- source include/have_binlog_format_mixed_or_statement.inc + +CREATE TABLE t1 (a INT); +RESET MASTER; + +# We need to set fixed timestamps in this test. +# Use a date in the future to keep a growing timestamp along the +# binlog (including the Start_log_event). This test will work +# unchanged everywhere, because mysql-test-run has fixed TZ, which it +# exports (so mysqlbinlog has same fixed TZ). +--let $datetime_1= 2031-01-01 12:00:00 +eval SET TIMESTAMP= UNIX_TIMESTAMP("$datetime_1"); +INSERT INTO t1 VALUES(1); +--let $pos_1= query_get_value(SHOW MASTER STATUS, Position, 1) + +--let $datetime_2= 2032-01-01 12:00:00 +eval SET TIMESTAMP= UNIX_TIMESTAMP("$datetime_2"); +INSERT INTO t1 VALUES(2); +--let $pos_2= query_get_value(SHOW MASTER STATUS, Position, 1) + +eval SET TIMESTAMP= UNIX_TIMESTAMP("2033-01-01 12:00:00"); +INSERT INTO t1 VALUES(3); + +--let $file_1= query_get_value(SHOW MASTER STATUS, File, 1) +FLUSH LOGS; + +SET TIMESTAMP= UNIX_TIMESTAMP("2034-01-01 12:00:00"); +INSERT INTO t1 VALUES(4); +--let $pos_3= query_get_value(SHOW MASTER STATUS, Position, 1) +--let $datetime_3= 2035-01-01 12:00:00 +eval SET TIMESTAMP= UNIX_TIMESTAMP("$datetime_3"); +INSERT INTO t1 VALUES(5); + +--let $file_2= query_get_value(SHOW MASTER STATUS, File, 1) +FLUSH LOGS; + +--let $MYSQLD_DATADIR= `select @@datadir` + +--echo +--echo ==== Local ==== + +--let $start_position= $pos_1 +--let $start_datetime= $datetime_1 + +--let $stop_position= $pos_2 +--let $stop_datetime= $datetime_2 +--let $file_options= $MYSQLD_DATADIR/$file_1 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_1.inc + +--echo +--echo ==== Local with 2 binlogs on command line ==== +# This is to verify that some options apply only to first, or last binlog + +--let $stop_position= $pos_3 +--let $stop_datetime= $datetime_3 +--let $file_options= $MYSQLD_DATADIR/$file_1 $MYSQLD_DATADIR/$file_2 +--source extra/binlog_tests/mysqlbinlog_start_stop_streaming_input_1.inc + +--echo +--echo ==== clean up ==== +DROP TABLE t1; diff --git a/sql/log_event.cc b/sql/log_event.cc index 47a6bb4..a2f5f08 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -939,6 +939,44 @@ void* Log_event::operator new(size_t size) } #ifdef MYSQL_SERVER +#define my_b_event_read my_b_read +#else +/** + * Wrapper around my_b_read to skip over any binlog_magic numbers + * we may see in the middle of stream. This can only happen if we + * are reading from stdin and input stream contains multiple binlog + * files. The first 4 bytes of an event are timestamp. It is possible + * that by coincidence the timestamp is same as binlog magic number + * (0xfe62696e i.e 4267862382) but that would only happen for one second + at Mon Mar 30 05:19:42 2105. We ignore that coincidence for now. + */ +int my_b_event_read(IO_CACHE* file, uchar *buf, int buflen) +{ + int read_status = 0; // assume success + int nbytes_already_read = 0; + if (file->file == fileno(stdin)) + { + read_status = my_b_read(file, buf, SIZEOF_BINLOG_MAGIC); + if (!read_status) + { + // read succeeded + if (memcmp(buf, BINLOG_MAGIC, SIZEOF_BINLOG_MAGIC)) + { + // does not match binlog magic number + nbytes_already_read = SIZEOF_BINLOG_MAGIC; + } + // else we got binlog magic number in middle of stream. Ignore. + } + } + if (!read_status) { + read_status = my_b_read(file, buf + nbytes_already_read, + buflen - nbytes_already_read); + } + return read_status; +} +#endif + +#ifdef MYSQL_SERVER inline int Log_event::do_apply_event_worker(Slave_worker *w) { DBUG_EXECUTE_IF("crash_in_a_worker", @@ -1496,7 +1534,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, LOCK_MUTEX; DBUG_PRINT("info", ("my_b_tell: %lu", (ulong) my_b_tell(file))); - if (my_b_read(file, (uchar *) head, header_size)) + if (my_b_event_read(file, (uchar *) head, header_size)) { DBUG_PRINT("info", ("Log_event::read_log_event(IO_CACHE*,Format_desc*) " "failed in my_b_read((IO_CACHE*)%p, (uchar*)%p, %u)", diff --git a/sql/log_event.h b/sql/log_event.h index db5a4af..46f1345 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -229,6 +229,7 @@ int ignored_error_code(int err_code); /* 4 bytes which all binlogs should begin with */ #define BINLOG_MAGIC "\xfe\x62\x69\x6e" +#define SIZEOF_BINLOG_MAGIC 4 /* The 2 flags below were useless :