Skip to content

Instantly share code, notes, and snippets.

@kazu0620
Created December 2, 2015 12:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kazu0620/2a7735d15ba74f3fca19 to your computer and use it in GitHub Desktop.
Save kazu0620/2a7735d15ba74f3fca19 to your computer and use it in GitHub Desktop.
Database-Backuper
require 'yaml'
require 'socket'
require 'logger'
module DatabaseBackuper
class DBDumper
:public
def initialize( args )
database = args[:database]
@export_dir = args[:export_dir]
@is_compress = args[:is_compress]
@user = database["user"]
@host = database["host"]
@password = database["password"]
@port = database["port"]
@db_name = database["db_name"]
end
def dump
compress_command = @is_compress ? "| gzip" : ""
system("mysqldump #{mysql_command_options} #{compress_command} > #{export_path}")
end
:private
def mysql_command_options
"-u#{@user} -p#{@password} -P#{@port} #{@db_name}"
end
def export_path
db_dir_name = @host == 'localhost' ?
get_machine_ip() : @host
db_dir_path = "#{@export_dir}/#{db_dir_name}"
system("mkdir -p #{db_dir_path}") unless
File.exist?(db_dir_path)
"#{db_dir_path}/#{file_name}"
end
def file_name
day_in_week = Time.now.strftime("%A")
extension = @is_compress ? "gz" : "sql"
"#{@db_name}-#{day_in_week}.#{extension}"
end
def get_machine_ip
machine_ip = Socket.getaddrinfo(
Socket::gethostname, nil, Socket::AF_INET
)[0][3]
end
end
class DataSyncerToS3
:public
def initialize( args )
@bucket_name = args[:bucket_name]
@is_sync_deleted = args[:is_sync_deleted]
end
def sync( sync_dir )
system("/usr/local/bin/aws s3 sync #{sync_dir} s3://#{@bucket_name} #{delete_option}")
end
:private
def delete_option
@is_sync_deleted ? "--delete" : ""
end
end
end
module DatabaseBackuper
BackuperRootDir = File.expand_path("#{File.dirname(__FILE__)}/../")
DatabaseSettings = "#{BackuperRootDir}/config/database.yaml"
BackupDir = "#{BackuperRootDir}/backup_files"
S3_BucketName = "soragoto-backup-databases"
OutputLogDir = "#{BackuperRootDir}/log/"
end
# prapare logging
system("mkdir -p #{DatabaseBackuper::OutputLogDir}") unless
File.exist?(DatabaseBackuper::OutputLogDir)
log = Logger.new("#{DatabaseBackuper::OutputLogDir}/backup.log");
log.info("------- start database backup --------");
# dump databases
databases = YAML.load_file( DatabaseBackuper::DatabaseSettings )
databases.each do |database|
log.info("#{database['db_name']} dump start");
dummper = DatabaseBackuper::DBDumper.new(
:database => database,
:is_compress => TRUE,
:export_dir => DatabaseBackuper::BackupDir
).dump()
log.info("#{database['db_name']} dump finished");
end
# sync backup data
log.info("s3 sync start");
syncer = DatabaseBackuper::DataSyncerToS3.new(
:bucket_name => DatabaseBackuper::S3_BucketName,
:is_sync_deleted => FALSE
).sync( DatabaseBackuper::BackupDir )
log.info("s3 sync finished");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment