Surprisingly, that's not gibberish.
That indeed appears at the top of binlogs whenever you do mysqlbinlog to a binary log generated using MySQL 5.1 and MySQL 5.5. You will not see that gibberish in binary logs for MySQL 5.0 and back.
This is why the start point for replication from an empty binary log is
- 107 for MySQL 5.5
- 106 for MySQL 5.1
- 98 for MySQL 5.0 and back
This is good to remember if you do MySQL Replication where the Master if MySQL 5.1 and the slave is MySQL 5.0. This could present a really big headache.
Replication from Master using 5.0 and Slave using 5.1 works fine, not the other way around.(According to MySQL Documentation, it is generally not supported for 3 reasons: 1) Binary Log Format, 2) Row-based Replication, 3) SQL Incompatibility).
Anyway, do a mysqlbinlog on the offending binary log on the master. If the resulting dump produces gibberish in the middle of the dump (which I have seen a couple of times in my DBA career) you may have to skip to position 98 (MySQL 5.0) or 106 (MySQL 5.1) or 107 (MySQL 5.5) of the master's next binary log and start replicating from there (SOB :( you may need to use MAATKIT tools mk-table-checksum and mk-table-sync to reload master changes not on the slave [if you want to be a hero]; even worse, mysqldump the master and reload the slave and start replication totally over [if you don't want to be a hero])
If the mysqlbinlog of the master is completely readable after the top gibberish you saw, it is possible the master's binary log is fine but the relay log on the slave is corrupt (due to transmission/CRC errors). If that's the case, just reload the relay logs by issuing the CHANGE MASTER TO command as follows:
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='< master-host ip or DNS >',
MASTER_PORT=3306,
MASTER_USER='< usernmae >',
MASTER_PASSWORD='< password >',
MASTER_LOG_FILE='< MMMM >',
MASTER_LOG_POS=< PPPP >;
START SLAVE;
Where
- MMMM is the last file used from the Master that was last processed on the Slave
- PPPP is the last position used from the Master that was last processed on the Slave
You can get MMMM and PPPP by doing SHOW SLAVE STATUS\G
and using
- Relay_Master_Log_File for MMMM
- Exec_Master_Log_Pos for PPPP
Try it out and let me know !!!
BTW running CHANGE MASTER TO command erases the slave's current relay logs and starts fresh.
I want to understand further is the Relay_Log_File, Relay_Log_Pos and Relay_Master_Log_File.
From SHOW SLAVE STATUS\G
, get two values
Relay_Log_File
: Current relay log accepting new entries during replication
Relay_Log_Pos
: Current position of the current relay log accepting new entries during replication
Relay_Master_Log_File
: Relay log file containing the last successfully executed SQL statement on the Master that was executed on the Slave.
- Master_Log_File : The log on the Master that corresponds to the current relay log file and current relay log position
The files are in binary so not able to view them right
Yes, you can view the relay logs. Since they have the same structure as a regular binary log, just run the mysqlbinlog program. For example to view the SQL within any of you relay logs, such as the last one, do this:
mysqlbinlog mysqld-relay-bin.000056 > /root/SQLForCurrentRelayLog.txt
less /root/SQLForCurrentRelayLog.txt
Best Answer
You don't need all binary logs from the master. Just the ones that your slave hasn't read yet.
On your slave you can do
show slave status\G
. Look for the linesMaster_Log_File
andRelay_Master_Log_File
. The first is the binary log file, that your master is using, the second is the log file that your slave is currently reading.You can then delete all binary logs on the master, that the slave has already read. For example, Relay_Master_Log_File is mysql-bin.011096, then you could execute the following statement on the master:
This is described in more detail here.
You can also configure your master to hold less binary logs by configuring the
expire_logs_days
variable. Read more about it here.I assume this already solves your storage problems.
UPDATE based on comment: You can simply copy the binary logs to the slave. Remember the position you already have from the
show slave status
output. Stop the slave. Then execute the binary logs on the slave withNote that the
--start-position
parameter is only applied to the first binlog file you specify as parameter. Make sure to specify the right one.Then read the last position from the last binary log with
and change the coordinates with
to the appropriate position and start the slave again.
Read more about this here (I guess)