Browse Source
BUG#48738: Backport patch for Bug 34582 to 5.0 codebase.
BUG#48738: Backport patch for Bug 34582 to 5.0 codebase.
From BUG 34582 commit message:
Issuing 'FLUSH LOGS' does not close and reopen indexfile.
Instead a SEEK_SET is performed.
This patch makes index file to be closed and reopened whenever a
rotation happens (FLUSH LOGS is issued or binary log exceeds
maximum configured size).
pull/374/head
3 changed files with 226 additions and 4 deletions
-
44mysql-test/r/binlog_delete_and_flush_index.result
-
176mysql-test/t/binlog_delete_and_flush_index.test
-
10sql/log.cc
@ -0,0 +1,44 @@ |
|||
RESET MASTER; |
|||
CREATE TABLE t1 (a int); |
|||
### assertion: index file contains regular entries |
|||
SET @index=LOAD_FILE('MYSQLD_DATADIR/master-bin.index'); |
|||
master-bin.000001 |
|||
|
|||
### assertion: show original binlogs |
|||
show binary logs; |
|||
Log_name File_size |
|||
master-bin.000001 # |
|||
### assertion: binlog contents from regular entries |
|||
show binlog events from <binlog_start>; |
|||
Log_name Pos Event_type Server_id End_log_pos Info |
|||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a int) |
|||
FLUSH LOGS; |
|||
### assertion: index file contains renamed binlog and the new one |
|||
SET @index=LOAD_FILE('MYSQLD_DATADIR/master-bin.index'); |
|||
master-bin-b34582.000001 |
|||
master-bin.000002 |
|||
|
|||
### assertion: original binlog content still exists, despite we |
|||
### renamed and changed the index file |
|||
show binlog events from <binlog_start>; |
|||
Log_name Pos Event_type Server_id End_log_pos Info |
|||
master-bin-b34582.000001 # Query # # use `test`; CREATE TABLE t1 (a int) |
|||
### assertion: user changed binlog index shows correct entries |
|||
show binary logs; |
|||
Log_name File_size |
|||
master-bin-b34582.000001 # |
|||
master-bin.000002 # |
|||
DROP TABLE t1; |
|||
### assertion: purging binlogs up to binlog created after instrumenting index file should work |
|||
PURGE BINARY LOGS TO 'master-bin.000002'; |
|||
### assertion: show binary logs should only contain latest binlog |
|||
show binary logs; |
|||
Log_name File_size |
|||
master-bin.000002 # |
|||
### assertion: assert that binlog files were indeed purged (using file_exists calls) |
|||
### assertion: assert that not purged binlog file exists |
|||
### assertion: show index file contents and these should match show binary logs issued above |
|||
SET @index=LOAD_FILE('MYSQLD_DATADIR/master-bin.index'); |
|||
master-bin.000002 |
|||
|
|||
RESET MASTER; |
|||
@ -0,0 +1,176 @@ |
|||
# BUG#34582: FLUSH LOGS does not close and reopen the binlog index |
|||
# file |
|||
# |
|||
# WHAT |
|||
# ==== |
|||
# |
|||
# We want to test that FLUSH LOGS closes and reopens binlog index |
|||
# file. |
|||
# |
|||
# HOW |
|||
# === |
|||
# |
|||
# PREPARE: |
|||
# 1. create some binlog events |
|||
# 2. show index content, binlog events and binlog contents |
|||
# for mysql-bin.000001 |
|||
# 3. copy the mysql-bin.000001 to mysql-bin-b34582.000001 |
|||
# 4. change the index file so that mysql-bin.000001 is replaced |
|||
# with mysql-bin-b34582.000001 |
|||
# 5. FLUSH the logs so that new index is closed and reopened |
|||
# |
|||
# ASSERTIONS: |
|||
# 1. index file contents shows mysql-bin-b34582.000001 and |
|||
# mysql-bin.000002 |
|||
# 1. show binary logs shows current index entries |
|||
# 2. binlog contents for mysql-bin-b34582.000001 are displayed |
|||
# 3. Purge binlogs up to the latest one succeeds |
|||
# 4. SHOW BINARY LOGS presents the latest one only after purging |
|||
# 5. Purged binlogs files don't exist in the filesystem |
|||
# 6. Not purged binlog file exists in the filesystem |
|||
# |
|||
# CLEAN UP: |
|||
# 1. RESET MASTER |
|||
# |
|||
|
|||
-- source include/have_log_bin.inc |
|||
|
|||
RESET MASTER; |
|||
|
|||
-- let $datadir= $MYSQLTEST_VARDIR/log |
|||
-- let $index=$datadir/master-bin.index |
|||
-- chmod 0666 $index |
|||
|
|||
# action: issue one command so that binlog gets some event |
|||
CREATE TABLE t1 (a int); |
|||
|
|||
-- echo ### assertion: index file contains regular entries |
|||
-- replace_regex /[\\\/].*master/MYSQLD_DATADIR\/master/ |
|||
-- eval SET @index=LOAD_FILE('$index') |
|||
if (`SELECT convert(@@version_compile_os using latin1) |
|||
IN ('Win32','Win64','Windows')`) |
|||
{ |
|||
-- disable_query_log |
|||
-- disable_result_log |
|||
-- let $a= `SELECT REPLACE (@index, '$datadir\', '')` |
|||
-- enable_result_log |
|||
-- enable_query_log |
|||
|
|||
-- echo $a |
|||
|
|||
} |
|||
if (!`SELECT convert(@@version_compile_os using latin1) |
|||
IN ('Win32','Win64','Windows')`) |
|||
{ |
|||
-- disable_query_log |
|||
-- disable_result_log |
|||
-- let $a= `SELECT REPLACE (@index, '$datadir/', '')` |
|||
-- enable_result_log |
|||
-- enable_query_log |
|||
|
|||
-- echo $a |
|||
} |
|||
|
|||
--echo ### assertion: show original binlogs |
|||
-- source include/show_binary_logs.inc |
|||
|
|||
--echo ### assertion: binlog contents from regular entries |
|||
-- source include/show_binlog_events.inc |
|||
|
|||
# action: copy binlogs to other names and change entries in index file |
|||
-- copy_file $datadir/master-bin.000001 $datadir/master-bin-b34582.000001 |
|||
-- let newbinfile=$datadir/master-bin-b34582.000001 |
|||
let INDEX_FILE=$index; |
|||
perl; |
|||
$newbinfile= $ENV{'newbinfile'}; |
|||
$file= $ENV{'INDEX_FILE'}; |
|||
open(FILE, ">$file") || die "Unable to open $file."; |
|||
truncate(FILE,0); |
|||
print FILE $newbinfile . "\n"; |
|||
close ($file); |
|||
EOF |
|||
|
|||
# action: should cause rotation, and creation of new binlogs |
|||
FLUSH LOGS; |
|||
|
|||
# file is not used anymore - remove it (mysql closed on flush logs). |
|||
-- remove_file $datadir/master-bin.000001 |
|||
|
|||
-- echo ### assertion: index file contains renamed binlog and the new one |
|||
-- replace_regex /[\\\/].*master/MYSQLD_DATADIR\/master/ |
|||
-- eval SET @index=LOAD_FILE('$index') |
|||
if (`SELECT convert(@@version_compile_os using latin1) |
|||
IN ('Win32','Win64','Windows')`) |
|||
{ |
|||
-- disable_query_log |
|||
-- disable_result_log |
|||
-- let $a= `SELECT REPLACE (@index, '$datadir\', '')` |
|||
-- enable_result_log |
|||
-- enable_query_log |
|||
|
|||
-- echo $a |
|||
|
|||
} |
|||
if (!`SELECT convert(@@version_compile_os using latin1) |
|||
IN ('Win32','Win64','Windows')`) |
|||
{ |
|||
-- disable_query_log |
|||
-- disable_result_log |
|||
-- let $a= `SELECT REPLACE (@index, '$datadir/', '')` |
|||
-- enable_result_log |
|||
-- enable_query_log |
|||
|
|||
-- echo $a |
|||
} |
|||
|
|||
-- echo ### assertion: original binlog content still exists, despite we |
|||
-- echo ### renamed and changed the index file |
|||
-- source include/show_binlog_events.inc |
|||
|
|||
-- echo ### assertion: user changed binlog index shows correct entries |
|||
-- source include/show_binary_logs.inc |
|||
|
|||
DROP TABLE t1; |
|||
|
|||
-- echo ### assertion: purging binlogs up to binlog created after instrumenting index file should work |
|||
-- let $current_binlog= query_get_value(SHOW MASTER STATUS, File, 1) |
|||
-- eval PURGE BINARY LOGS TO '$current_binlog' |
|||
|
|||
-- echo ### assertion: show binary logs should only contain latest binlog |
|||
-- source include/show_binary_logs.inc |
|||
|
|||
-- echo ### assertion: assert that binlog files were indeed purged (using file_exists calls) |
|||
-- error 1 |
|||
-- file_exists $datadir/master-bin-b34852.000001 |
|||
|
|||
-- echo ### assertion: assert that not purged binlog file exists |
|||
-- file_exists $datadir/$current_binlog |
|||
|
|||
-- echo ### assertion: show index file contents and these should match show binary logs issued above |
|||
-- replace_regex /[\\\/].*master/MYSQLD_DATADIR\/master/ |
|||
-- eval SET @index=LOAD_FILE('$index') |
|||
if (`SELECT convert(@@version_compile_os using latin1) |
|||
IN ('Win32','Win64','Windows')`) |
|||
{ |
|||
-- disable_query_log |
|||
-- disable_result_log |
|||
-- let $a= `SELECT REPLACE (@index, '$datadir\', '')` |
|||
-- enable_result_log |
|||
-- enable_query_log |
|||
|
|||
-- echo $a |
|||
|
|||
} |
|||
if (!`SELECT convert(@@version_compile_os using latin1) |
|||
IN ('Win32','Win64','Windows')`) |
|||
{ |
|||
-- disable_query_log |
|||
-- disable_result_log |
|||
-- let $a= `SELECT REPLACE (@index, '$datadir/', '')` |
|||
-- enable_result_log |
|||
-- enable_query_log |
|||
|
|||
-- echo $a |
|||
} |
|||
|
|||
RESET MASTER; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue