class ServerBackups::MysqlIncrementalBackup

Constants

REMOTE_FILENAME_REGEX

def parse_remote_binlog_filename(file)

filename = File.basename(file.key)
prefix, index, timestamp = REMOTE_FILENAME_REGEX.match(filename).captures
{
    key: file.key,
    file: file,
    prefix: prefix,
    index: index,
    timestamp: timestamp,
    datetime: Time.zone.strptime(timestamp, TIMESTAMP_FORMAT)
}

end

Public Class Methods

new(config_file, working_directory, database_name) click to toggle source
Calls superclass method ServerBackups::MysqlBackup::new
# File lib/server_backups/mysql_incremental_backup.rb, line 5
def initialize(config_file, working_directory, database_name)
    database_name = 'mysql' if database_name == 'all'

    super(config_file, working_directory, :incremental, database_name)
end

Public Instance Methods

do_backup() click to toggle source
# File lib/server_backups/mysql_incremental_backup.rb, line 22
def do_backup
    load_resources
    flush_logs
    each_bin_log do |file|
        index = BinlogFilename.new(file).log_index
        next if index.in?(already_stored_log_indexes)
        backup_single_bin_log(file)
    end
end
each_bin_log() { |log_file| ... } click to toggle source
# File lib/server_backups/mysql_incremental_backup.rb, line 40
def each_bin_log
    # execute 'flush logs'
    logs = Dir.glob("#{config.bin_log}.[0-9]*").sort_by { |f| f[/\d+/].to_i }
    logs_to_backup = logs[0..-2] # all logs except the last, which is in use
    logs_to_backup.each do |log_file|
        yield log_file
    end
end
flush_logs() click to toggle source
# File lib/server_backups/mysql_incremental_backup.rb, line 36
def flush_logs
    execute_sql('flush logs;')
end
s3_prefix() click to toggle source
# File lib/server_backups/mysql_incremental_backup.rb, line 32
def s3_prefix
    File.join(config.prefix, 'mysql_backup', 'incremental', '/')
end

Private Instance Methods

already_stored_log_indexes() click to toggle source
# File lib/server_backups/mysql_incremental_backup.rb, line 71
def already_stored_log_indexes
    remote_bin_logs.map do |s3object|
        _, index = REMOTE_FILENAME_REGEX.match(s3object.key).captures
        index
    end
end
backup_single_bin_log(file) click to toggle source
# File lib/server_backups/mysql_incremental_backup.rb, line 82
def backup_single_bin_log(file)
    logger.debug "Backing up #{file}."
    dest_filename = File.basename(file) + '.' + timestamp
    logger.info "Storing #{file} to #{dest_filename}"
    s3.save file, File.join(s3_prefix, dest_filename)
end
remote_bin_logs() click to toggle source
# File lib/server_backups/mysql_incremental_backup.rb, line 78
def remote_bin_logs
    s3.bucket.objects(prefix: s3_prefix)
end