-
-
Save kazu0620/2a7735d15ba74f3fca19 to your computer and use it in GitHub Desktop.
Database-Backuper
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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