Class: Flydata::SourceMysql::MysqlCompatibilityCheck

Inherits:
CompatibilityCheck show all
Includes:
InitialSyncChecks
Defined in:
lib/flydata/source_mysql/mysql_compatibility_check.rb

Instance Method Summary collapse

Methods included from InitialSyncChecks

#check_writing_permissions

Methods inherited from CompatibilityCheck

#check

Methods included from CommandLoggable

#before_logging, #log_error_stderr, #log_info_stdout, #log_warn_stderr

Constructor Details

#initialize(dp_hash, de_hash, options = {}) ⇒ MysqlCompatibilityCheck

Returns a new instance of MysqlCompatibilityCheck.



14
15
16
17
18
19
20
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 14

def initialize(dp_hash, de_hash, options={})
  super
  @db_opts = FlydataCore::Mysql::Config.build_mysql_db_opts(de_hash)
  @dump_dir = options[:dump_dir] || nil
  @backup_dir = options[:backup_dir] || nil
  @tables = de_hash['tables']
end

Instance Method Details

#check_compatibility56_variableObject



31
32
33
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 31

def check_compatibility56_variable
  FlydataCore::Mysql::MySqlVersion57CompabilityChecker.new(@db_opts).do_check
end

#check_mysql_binlog_retentionObject



73
74
75
76
77
78
79
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 73

def check_mysql_binlog_retention
  if is_rds?
    run_rds_retention_check
  else
    run_mysql_retention_check
  end
end

#check_mysql_parameters_compatObject



64
65
66
67
68
69
70
71
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 64

def check_mysql_parameters_compat
  begin
    FlydataCore::Mysql::OptionalBinlogParameterChecker.new(@db_opts).do_check
  rescue FlydataCore::MysqlCompatibilityError => e
    log_warn_stderr(e.to_s)
  end
  FlydataCore::Mysql::RequiredBinlogParameterChecker.new(@db_opts).do_check
end

#check_mysql_protocol_tcp_compatObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 39

def check_mysql_protocol_tcp_compat
  query = FlydataCore::Mysql::CommandGenerator.generate_mysql_show_grants_cmd(@db_opts)

  Open3.popen3(query) do |stdin, stdout, stderr|
    stdin.close
    while !stderr.eof?
      lines = []
      while line = stderr.gets do
        lines << line.strip unless line =~ /Warning: Using a password on the command line interface can be insecure/
      end
      unless lines.empty?
        err_reason = lines.join(" ")
        log_error("Error occured during access to mysql server.", err: err_reason)
        raise FlydataCore::MysqlCompatibilityError, "Cannot connect to MySQL database. Please make sure you can connect with this command:\n      $ mysql -u #{@db_opts[:username]} -h #{@db_opts[:host]} -P #{@db_opts[:port]} #{@db_opts[:database]} --protocol=tcp -p"
      end
    end
  end
end

#check_mysql_table_typesObject

If table_type=‘VIEW’ or engine=‘MEMORY’, raise error.



82
83
84
85
86
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 82

def check_mysql_table_types
  return if @tables.empty?
  option = @db_opts.dup.merge(tables: @tables)
  FlydataCore::Mysql::TableTypeChecker.new(option).do_check
end

#check_mysql_user_compatObject



35
36
37
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 35

def check_mysql_user_compat
  FlydataCore::Mysql::SyncPermissionChecker.new(@db_opts).do_check
end

#check_rds_master_statusObject



58
59
60
61
62
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 58

def check_rds_master_status
  if is_rds?
    FlydataCore::Mysql::RdsMasterStatusChecker.new(@db_opts).do_check
  end
end

#is_rds?(hostname = ) ⇒ Boolean

Returns:

  • (Boolean)


109
110
111
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 109

def is_rds?(hostname = @db_opts[:host])
  hostname.match(/rds.amazonaws.com$/) != nil
end


22
23
24
25
26
27
28
29
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 22

def print_errors
  return if @errors.empty?
  log_error_stderr "There may be some compatibility issues with your MySQL credentials: "
  @errors.each do |error|
    log_error_stderr "  * #{error.message}"
  end
  raise "Please correct these errors if you wish to run FlyData Sync"
end

#run_mysql_retention_checkObject



88
89
90
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 88

def run_mysql_retention_check
  FlydataCore::Mysql::NonRdsRetentionChecker.new(@db_opts).do_check
end

#run_rds_retention_checkObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/flydata/source_mysql/mysql_compatibility_check.rb', line 92

def run_rds_retention_check
  FlydataCore::Mysql::RdsRetentionChecker.new(@db_opts).do_check
rescue Mysql2::Error => e
  if e.message =~ /command denied to user/
    retention_hours = FlydataCore::Mysql::RdsRetentionChecker::BINLOG_RETENTION_HOURS
    log_warn_stderr("[WARNING]Cannot verify RDS retention period on current MySQL user account.\n" +
                    "To see retention period, please run this on your RDS:\n" +
                    "  $> call mysql.rds_show_configuration;\n" +
                    "Please verify that the hours is not nil and is at least #{retention_hours} hours\n" +
                    "To set binlog retention hours, you can run this on your RDS:\n" +
                    "  $> call mysql.rds_set_configuration('binlog retention hours', #{retention_hours});\n"
                   )
  else
    raise e
  end
end