class Backup::Database::RemoteMySQL
Attributes
Additional “mysqldump” or “innobackupex (backup creation)” options
Default is :mysqldump (which is built in MySQL
and generates a textual SQL file), but can be changed to :innobackupex, which has more feasible restore times for large databases. See: www.percona.com/doc/percona-xtrabackup/
Connectivity options
Name of the database that needs to get dumped To dump all databases, set this to `:all` or leave blank.
Tables to dump. This in only valid if `name` is specified. If none are given, the entire database will be dumped.
Credentials for the specified database
Connectivity options
If true (which is the default behaviour), the backup will be prepared after it has been successfuly created. This option is only valid if :backup_engine is set to :innobackupex.
Additional innobackupex log preparation phase (“apply-logs”) options
server options
Tables to skip while dumping the database
If `name` is set to :all (or not specified), these must include a database name. e.g. 'name.table'. If `name` is given, these may simply be table names.
Connectivity options
If set the backup engine command block is executed as the given user
Credentials for the specified database
If set, do not suppress innobackupdb output (useful for debugging)
Public Class Methods
Backup::Database::Base::new
# File lib/backup/database/remote_mysql.rb, line 82 def initialize(model, database_id = nil, &block) super instance_eval(&block) if block_given? @name ||= :all @backup_engine ||= :mysqldump @prepare_backup = true if @prepare_backup.nil? end
Public Instance Methods
# File lib/backup/database/remote_mysql.rb, line 151 def build_server_ssh_options ssh_options = {} v = self.server_ssh_user ssh_options[:user] = v if v v = self.server_ssh_password ssh_options[:password] = v if v v = self.server_ssh_key ssh_options[:key] = v if v v = self.server_ssh_port ssh_options[:port] = v if v self.server_ssh_options = ssh_options end
Performs the mysqldump or innobackupex command and outputs the dump file in the dump_path
using dump_filename
.
<trigger>/databases/MySQL[-<database_id>].[sql|tar][.gz]
Backup::Database::Base#perform!
# File lib/backup/database/remote_mysql.rb, line 96 def perform! super # prepare build_server_ssh_options # pipeline = Pipeline.new dump_ext = sql_backup? ? 'sql' : 'tar' pipeline << sudo_option(sql_backup? ? mysqldump : innobackupex) model.compressor.compress_with do |command, ext| pipeline << command dump_ext << ext end if model.compressor dump_remote_file = File.join('/tmp', dump_filename+"."+dump_ext) pipeline << "#{ utility(:cat) } > '#{ dump_remote_file }'" # generate backup on remote server cmd_remote = pipeline.commands.join(" | ") remote = Backup::Remote::Command.new res_generate = remote.run_ssh_cmd(server_host, server_ssh_options, cmd_remote) if res_generate[:res]==0 raise "Cannot create backup on server. #{res_generate[:error]}" end # download backup dump_file = File.join(dump_path, dump_filename+"."+dump_ext) res_download = remote.ssh_download_file(server_host, server_ssh_options, dump_remote_file, dump_file) if res_download[:res]==0 raise 'Cannot download file from server' end #puts "pipe: #{pipeline.commands.inspect}" #puts "cmd: #{cmd_remote}" # download dump from server #pipeline.run #if pipeline.success? # log!(:finished) #else # raise Error, "Dump Failed!\n" + pipeline.error_messages #end end
Private Instance Methods
# File lib/backup/database/remote_mysql.rb, line 187 def connectivity_options return "--socket='#{ socket }'" if socket opts = [] opts << "--host='#{ host }'" if host opts << "--port='#{ port }'" if port opts.join(' ') end
# File lib/backup/database/remote_mysql.rb, line 180 def credential_options opts = [] opts << "--user=#{ Shellwords.escape(username) }" if username opts << "--password=#{ Shellwords.escape(password) }" if password opts.join(' ') end
# File lib/backup/database/remote_mysql.rb, line 219 def dump_all? name == :all end
# File lib/backup/database/remote_mysql.rb, line 227 def innobackupex # Creation phase "#{ utility(:innobackupex) } #{ credential_options } " + "#{ connectivity_options } #{ user_options } " + "--no-timestamp #{ temp_dir } #{ quiet_option } && " + innobackupex_prepare + # Move files to tar-ed stream on stdout "#{ utility(:tar) } --remove-files -cf - " + "-C #{ File.dirname(temp_dir) } #{ File.basename(temp_dir) }" end
# File lib/backup/database/remote_mysql.rb, line 238 def innobackupex_prepare return "" unless @prepare_backup # Log applying phase (prepare for restore) "#{ utility(:innobackupex) } --apply-log #{ temp_dir } " + "#{ user_prepare_options } #{ quiet_option } && " end
# File lib/backup/database/remote_mysql.rb, line 172 def mysqldump #"#{ utility(:mysqldump) } #{ user_options } #{ credential_options } " + u = utility_remote(:mysqldump) "#{u} #{ user_options } #{ credential_options } " + "#{ connectivity_options } #{ name_option } " + "#{ tables_to_dump } #{ tables_to_skip }" end
# File lib/backup/database/remote_mysql.rb, line 204 def name_option dump_all? ? '--all-databases' : name end
# File lib/backup/database/remote_mysql.rb, line 253 def quiet_option verbose ? "" : " 2> /dev/null " end
# File lib/backup/database/remote_mysql.rb, line 223 def sql_backup? backup_engine.to_sym == :mysqldump end
# File lib/backup/database/remote_mysql.rb, line 245 def sudo_option(command_block) return command_block unless sudo_user "sudo -s -u #{ sudo_user } -- <<END_OF_SUDO\n" + "#{command_block}\n" + "END_OF_SUDO\n" end
# File lib/backup/database/remote_mysql.rb, line 208 def tables_to_dump Array(only_tables).join(' ') unless dump_all? end
# File lib/backup/database/remote_mysql.rb, line 212 def tables_to_skip Array(skip_tables).map do |table| table = (dump_all? || table['.']) ? table : "#{ name }.#{ table }" "--ignore-table='#{ table }'" end.join(' ') end
# File lib/backup/database/remote_mysql.rb, line 257 def temp_dir File.join(dump_path, dump_filename + ".bkpdir") end
# File lib/backup/database/remote_mysql.rb, line 196 def user_options Array(additional_options).join(' ') end
# File lib/backup/database/remote_mysql.rb, line 200 def user_prepare_options Array(prepare_options).join(' ') end