class DBRotator
Constants
- TIME_FORMAT
Public Class Methods
new(config)
click to toggle source
# File lib/db_rotator.rb, line 6 def initialize(config) @config = config.config @schemas = [] populate_schemas rescue on_failure $! end
Public Instance Methods
import()
click to toggle source
# File lib/db_rotator.rb, line 31 def import import_dump populate_schemas end
refresh()
click to toggle source
# File lib/db_rotator.rb, line 24 def refresh download_dump import prune grant_access end
rotate()
click to toggle source
# File lib/db_rotator.rb, line 15 def rotate refresh update_db_yaml on_success rescue on_failure $! end
Private Instance Methods
bash_exec(cmd, skip_raise = false)
click to toggle source
# File lib/db_rotator.rb, line 146 def bash_exec(cmd, skip_raise = false) out = `#{cmd} || echo '__failed'` out = out.strip == "__failed" ? nil : out raise "Command failed: #{cmd}" if !skip_raise && !out out end
current_user()
click to toggle source
# File lib/db_rotator.rb, line 142 def current_user mysql_exec("SELECT current_user()").split("\n").last end
download_dump()
click to toggle source
# File lib/db_rotator.rb, line 50 def download_dump verbose_message "Downloading dump..." bash_exec "rm -f #{local_dump_path}" bash_exec "#{@config[:scp_command]} #{local_dump_path}" end
extra_pipe()
click to toggle source
# File lib/db_rotator.rb, line 106 def extra_pipe @config[:unarchive_extra_pipe] && "#{@config[:unarchive_extra_pipe].join(' | ')} |" end
grant_access()
click to toggle source
# File lib/db_rotator.rb, line 83 def grant_access verbose_message "Granting ..." mysql_exec "GRANT ALL ON #{todays_dbname}.* to #{current_user}" end
import_dump()
click to toggle source
# File lib/db_rotator.rb, line 56 def import_dump if reasonable_diskspace? verbose_message "Importing dump..." mysql_exec "DROP SCHEMA IF EXISTS #{todays_dbname}" mysql_exec "CREATE SCHEMA #{todays_dbname}" bash_exec %[#{@config[:unarchive_command]} #{local_dump_path} | #{extra_pipe} #{@config[:mysql_command]} #{todays_dbname}] else raise "not enough disk space: #{raw_diskspace}" end end
local_dump_path()
click to toggle source
# File lib/db_rotator.rb, line 122 def local_dump_path [@config[:local_dump_destination], @config[:dump_filename]].join('/') end
mysql_exec(cmd)
click to toggle source
# File lib/db_rotator.rb, line 154 def mysql_exec(cmd) bash_exec "#{@config[:mysql_command]} -B -e '#{cmd}'" end
on_failure(err)
click to toggle source
# File lib/db_rotator.rb, line 42 def on_failure(err) if @config[:on_failure] bash_exec "#{@config[:on_failure]} #{err.class.name} '#{err.message}'" else raise err end end
on_success()
click to toggle source
# File lib/db_rotator.rb, line 38 def on_success bash_exec "#{@config[:on_success]}" if @config[:on_success] end
populate_schemas()
click to toggle source
# File lib/db_rotator.rb, line 88 def populate_schemas @schemas = raw_schemas.split.each.with_object([]) do |schema_name, memo| memo << Schema.new(schema_name, schema_regex) if schema_name =~ schema_regex end end
prune()
click to toggle source
# File lib/db_rotator.rb, line 71 def prune if @config[:maximum_dbs] verbose_message "Pruning DBs..." if @schemas.count > (n = @config[:maximum_dbs].to_i) @schemas.sort_by(&:to_date).reverse[n..-1].each do |schema| mysql_exec "DROP SCHEMA IF EXISTS #{schema.name}" end end end end
raw_diskspace()
click to toggle source
# File lib/db_rotator.rb, line 134 def raw_diskspace bash_exec "df -h `mysql -B -e 'select @@datadir;' | tail -1` | tail -1 | awk '{ print $2 }'" end
raw_schemas()
click to toggle source
# File lib/db_rotator.rb, line 138 def raw_schemas mysql_exec "SHOW DATABASES" end
reasonable_diskspace?()
click to toggle source
# File lib/db_rotator.rb, line 126 def reasonable_diskspace? if @config[:reasonable_diskspace] return raw_diskspace.to_i >= @config[:reasonable_diskspace] end true end
schema_regex()
click to toggle source
# File lib/db_rotator.rb, line 118 def schema_regex /#{@config[:db_prefix]}([0-9]+)/ end
todays_dbname()
click to toggle source
# File lib/db_rotator.rb, line 114 def todays_dbname "#{@config[:db_prefix]}#{todays_stamp}" end
todays_stamp()
click to toggle source
# File lib/db_rotator.rb, line 110 def todays_stamp Time.now.strftime(TIME_FORMAT) end
update_db_yaml()
click to toggle source
# File lib/db_rotator.rb, line 94 def update_db_yaml if @config[:rails_db_yaml_path] hash = YAML.load(File.read(@config[:rails_db_yaml_path])) @config[:rails_environments].each do |env| hash[env.to_s]["database"] = todays_dbname end File.write(@config[:rails_db_yaml_path], hash.to_yaml) end end
verbose_message(msg)
click to toggle source
# File lib/db_rotator.rb, line 158 def verbose_message(msg) puts msg if @config[:verbose] end