class Backup::Database::MySQL
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
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
# File lib/backup/database/mysql.rb, line 62 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
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]
# File lib/backup/database/mysql.rb, line 76 def perform! super 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 pipeline << "#{ utility(:cat) } > " + "'#{ File.join(dump_path, dump_filename) }.#{ dump_ext }'" 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/mysql.rb, line 115 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/mysql.rb, line 108 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/mysql.rb, line 147 def dump_all? name == :all end
# File lib/backup/database/mysql.rb, line 155 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/mysql.rb, line 166 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/mysql.rb, line 102 def mysqldump "#{ utility(:mysqldump) } #{ user_options } #{ credential_options } " + "#{ connectivity_options } #{ name_option } " + "#{ tables_to_dump } #{ tables_to_skip }" end
# File lib/backup/database/mysql.rb, line 132 def name_option dump_all? ? '--all-databases' : name end
# File lib/backup/database/mysql.rb, line 181 def quiet_option verbose ? "" : " 2> /dev/null " end
# File lib/backup/database/mysql.rb, line 151 def sql_backup? backup_engine.to_sym == :mysqldump end
# File lib/backup/database/mysql.rb, line 173 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/mysql.rb, line 136 def tables_to_dump Array(only_tables).join(' ') unless dump_all? end
# File lib/backup/database/mysql.rb, line 140 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/mysql.rb, line 185 def temp_dir File.join(dump_path, dump_filename + ".bkpdir") end
# File lib/backup/database/mysql.rb, line 124 def user_options Array(additional_options).join(' ') end
# File lib/backup/database/mysql.rb, line 128 def user_prepare_options Array(prepare_options).join(' ') end