Class: MysqlBackup::Librarian

Inherits:
Object
  • Object
show all
Includes:
NamedArguments
Defined in:
lib/mysql_backup/librarian.rb,
lib/mysql_backup/librarian/backup.rb,
lib/mysql_backup/librarian/backup_collection.rb

Overview

backup_data_files

Save the binary backups

backup_mysqldump

Send the mysqldump to s3

backup_binary_logs

Send the logs to S3

Defined Under Namespace

Classes: Backup, BackupCollection

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = {}) ⇒ Librarian

Takes a required argument to specify the location of the log files:

:log_bin_dir => '/var/lib/mysql'

Takes required arguments for S3:

:access_key_id     => 'abc',
:secret_access_key => '123'
:bucket => 'name_of_the_backup_bucket'

Takes these arguments for the connection to MySQL:

:host
:user
:password
:db
:port
:sock
:flag

Many installations just need to specify :host and :user.



58
59
60
# File 'lib/mysql_backup/librarian.rb', line 58

def initialize args = {}
  super
end

Instance Attribute Details

#access_key_idObject

S3 parameters



35
36
37
# File 'lib/mysql_backup/librarian.rb', line 35

def access_key_id
  @access_key_id
end

#bucketObject

S3 parameters



35
36
37
# File 'lib/mysql_backup/librarian.rb', line 35

def bucket
  @bucket
end

#connectionObject

The connection to MySQL



29
30
31
# File 'lib/mysql_backup/librarian.rb', line 29

def connection
  @connection
end

#dbObject

MySQL connection parameters



20
21
22
# File 'lib/mysql_backup/librarian.rb', line 20

def db
  @db
end

#flagObject

MySQL connection parameters



20
21
22
# File 'lib/mysql_backup/librarian.rb', line 20

def flag
  @flag
end

#hostObject

MySQL connection parameters



20
21
22
# File 'lib/mysql_backup/librarian.rb', line 20

def host
  @host
end

#logObject

The logger. Default is to log via STDERR.



23
24
25
# File 'lib/mysql_backup/librarian.rb', line 23

def log
  @log
end

#mysql_serverObject



94
95
96
# File 'lib/mysql_backup/librarian.rb', line 94

def mysql_server
  @mysql_server ||= MysqlBackup::Server.new :connection => create_connection, :log => log
end

#passwordObject

MySQL connection parameters



20
21
22
# File 'lib/mysql_backup/librarian.rb', line 20

def password
  @password
end

#portObject

MySQL connection parameters



20
21
22
# File 'lib/mysql_backup/librarian.rb', line 20

def port
  @port
end

#secret_access_keyObject

S3 parameters



35
36
37
# File 'lib/mysql_backup/librarian.rb', line 35

def secret_access_key
  @secret_access_key
end

#sockObject

MySQL connection parameters



20
21
22
# File 'lib/mysql_backup/librarian.rb', line 20

def sock
  @sock
end

#storageObject

A MysqlBackup::Storage object.



26
27
28
# File 'lib/mysql_backup/librarian.rb', line 26

def storage
  @storage
end

#userObject

MySQL connection parameters



20
21
22
# File 'lib/mysql_backup/librarian.rb', line 20

def user
  @user
end

Instance Method Details

#backup_binary_logsObject



75
76
77
78
79
80
# File 'lib/mysql_backup/librarian.rb', line 75

def backup_binary_logs
  logs_obj = mysql_server.create_logs_obj
  logs_obj.save do |args|
    storage.conditional_save args
  end
end

#backup_data_filesObject



62
63
64
65
66
# File 'lib/mysql_backup/librarian.rb', line 62

def backup_data_files
  MysqlBackup::Entity::Files.create_tar_files :log => log, :mysql_server => mysql_server, :mysql_files => [innodb_files, myisam_files] do |args|
    storage.conditional_save args
  end
end

#backup_mysqldumpObject



68
69
70
71
72
73
# File 'lib/mysql_backup/librarian.rb', line 68

def backup_mysqldump
  m = MysqlBackup::Entity::Mysqldump.new :log => log
  m.create do |args|
    storage.conditional_save args
  end
end

#create_backup_group_collection_from_storageObject



98
99
100
101
102
103
104
105
106
107
# File 'lib/mysql_backup/librarian.rb', line 98

def create_backup_group_collection_from_storage
  unless @backups
    c = MysqlBackup::Librarian::BackupCollection.new
    storage.yield_identifiers do |i|
      c.add_identifier i
    end
    @backups = c
  end
  @backups
end

#create_connectionObject



173
174
175
176
# File 'lib/mysql_backup/librarian.rb', line 173

def create_connection 
  ENV["MYSQL_UNIX_PORT"] ||= '/var/lib/mysql/mysql.sock'
  @connection ||= Mysql.connect(@host, @user, @pass, @db, @port, @sock, @flag)
end

#find_group(f) ⇒ Object



169
170
171
# File 'lib/mysql_backup/librarian.rb', line 169

def find_group f
  create_backup_group_collection_from_storage.find_group f
end

#get(f, directory) ⇒ Object



124
125
126
127
128
129
130
131
# File 'lib/mysql_backup/librarian.rb', line 124

def get f, directory
  case f
  when /^full:type_binary/
    get_full_binary f, directory
  when /^full:type_mysqldump/
    get_mysqldump f, directory
  end
end

#get_backup(f, &block) ⇒ Object

Always call this with a block that will do something with the raw data retrieved from S3.

Raises:

  • (RuntimeError)


161
162
163
164
165
166
167
# File 'lib/mysql_backup/librarian.rb', line 161

def get_backup f, &block
  b = find_group f
  raise RuntimeError, "Failed to find backup for #{f}" unless b
  if b
    storage.retrieve_backup_and_then_yield_file(b, &block)
  end
end

#get_full_binary(f, destination_dir = '/tmp') ⇒ Object



133
134
135
136
137
# File 'lib/mysql_backup/librarian.rb', line 133

def get_full_binary f, destination_dir = '/tmp'
  get_backup f do |tempfile|
    run_cmd "( cd #{destination_dir}; zcat #{tempfile.path} | tar xf - )"
  end
end

#get_logs(destination_dir = '/tmp') ⇒ Object



145
146
147
148
149
150
151
152
# File 'lib/mysql_backup/librarian.rb', line 145

def get_logs destination_dir = '/tmp'
  create_backup_group_collection_from_storage.each_log do |g|
    log && log.info("Looking at backup #{g.to_s}")
    storage.retrieve_backup_and_then_yield_file g do |tempfile|
      run_cmd "( cd #{destination_dir}; zcat #{tempfile.path} | tar xf - )"
    end
  end
end

#get_mysqldump(f, destination_dir = '/tmp') ⇒ Object



139
140
141
142
143
# File 'lib/mysql_backup/librarian.rb', line 139

def get_mysqldump f, destination_dir = '/tmp'
  get_backup f do |tempfile|
    run_cmd "( cd #{destination_dir}; zcat #{tempfile.path} > #{f})"
  end
end

#innodb_filesObject



82
83
84
# File 'lib/mysql_backup/librarian.rb', line 82

def innodb_files
  @innodb_files ||= mysql_server.create_innodb_files_obj
end

#log_filesObject



90
91
92
# File 'lib/mysql_backup/librarian.rb', line 90

def log_files
  @log_files ||= mysql_server.create_logs_obj
end

#ls(klass = Object) ⇒ Object



109
110
111
112
113
114
115
# File 'lib/mysql_backup/librarian.rb', line 109

def ls klass = Object
  result = []
  create_backup_group_collection_from_storage.each_group(klass) do |g|
    result << g.to_s
  end
  result
end

#myisam_filesObject



86
87
88
# File 'lib/mysql_backup/librarian.rb', line 86

def myisam_files
  @myisam_files ||= mysql_server.create_myisam_files_obj
end

#rm(backup_name) ⇒ Object



117
118
119
120
121
122
# File 'lib/mysql_backup/librarian.rb', line 117

def rm backup_name
  g = find_group backup_name
  g.each_identifier do |i|
    storage.rm i
  end
end

#run_cmd(cmd) ⇒ Object



154
155
156
157
# File 'lib/mysql_backup/librarian.rb', line 154

def run_cmd cmd
  log && log.debug("Run command: #{cmd}")
  system cmd
end