diff --git a/go/logic/inspect.go b/go/logic/inspect.go index 844258a..ae56719 100644 --- a/go/logic/inspect.go +++ b/go/logic/inspect.go @@ -246,17 +246,14 @@ func (this *Inspector) applyBinlogFormat() error { // validateBinlogs checks that binary log configuration is good to go func (this *Inspector) validateBinlogs() error { - query := `select @@global.log_bin, @@global.log_slave_updates, @@global.binlog_format` - var hasBinaryLogs, logSlaveUpdates bool - if err := this.db.QueryRow(query).Scan(&hasBinaryLogs, &logSlaveUpdates, &this.migrationContext.OriginalBinlogFormat); err != nil { + query := `select @@global.log_bin, @@global.binlog_format` + var hasBinaryLogs bool + if err := this.db.QueryRow(query).Scan(&hasBinaryLogs, &this.migrationContext.OriginalBinlogFormat); err != nil { return err } if !hasBinaryLogs { return fmt.Errorf("%s:%d must have binary logs enabled", this.connectionConfig.Key.Hostname, this.connectionConfig.Key.Port) } - if !logSlaveUpdates { - return fmt.Errorf("%s:%d must have log_slave_updates enabled", this.connectionConfig.Key.Hostname, this.connectionConfig.Key.Port) - } if this.migrationContext.RequiresBinlogFormatChange() { if !this.migrationContext.SwitchToRowBinlogFormat { return fmt.Errorf("You must be using ROW binlog format. I can switch it for you, provided --switch-to-rbr and that %s:%d doesn't have replicas", this.connectionConfig.Key.Hostname, this.connectionConfig.Key.Port) @@ -286,6 +283,21 @@ func (this *Inspector) validateBinlogs() error { return nil } +// validateLogSlaveUpdates checks that binary log log_slave_updates is set. This test is not required when migrating on replica or when migrating directly on master +func (this *Inspector) validateLogSlaveUpdates() error { + query := `select @@global.log_slave_updates` + var logSlaveUpdates bool + if err := this.db.QueryRow(query).Scan(&logSlaveUpdates); err != nil { + return err + } + if !logSlaveUpdates && !this.migrationContext.InspectorIsAlsoApplier() { + return fmt.Errorf("%s:%d must have log_slave_updates enabled", this.connectionConfig.Key.Hostname, this.connectionConfig.Key.Port) + } + + log.Infof("binary logs updates validated on %s:%d", this.connectionConfig.Key.Hostname, this.connectionConfig.Key.Port) + return nil +} + // validateTable makes sure the table we need to operate on actually exists func (this *Inspector) validateTable() error { query := fmt.Sprintf(`show /* gh-ost */ table status from %s like '%s'`, sql.EscapeName(this.migrationContext.DatabaseName), this.migrationContext.OriginalTableName) diff --git a/go/logic/migrator.go b/go/logic/migrator.go index b709b15..03eccd6 100644 --- a/go/logic/migrator.go +++ b/go/logic/migrator.go @@ -828,6 +828,9 @@ func (this *Migrator) initiateInspector() (err error) { } else if this.migrationContext.InspectorIsAlsoApplier() && !this.migrationContext.AllowedRunningOnMaster { return fmt.Errorf("It seems like this migration attempt to run directly on master. Preferably it would be executed on a replica (and this reduces load from the master). To proceed please provide --allow-on-master") } + if err := this.inspector.validateLogSlaveUpdates(); err != nil { + return err + } log.Infof("Master found to be %+v", *this.migrationContext.ApplierConnectionConfig.ImpliedKey) return nil