Class: Backup::Database::RemoteMySQL

Inherits:
Base
  • Object
show all
Includes:
SSHKit::DSL
Defined in:
lib/backup/database/remote_mysql.rb

Defined Under Namespace

Classes: Error

Instance Attribute Summary collapse

Attributes inherited from Base

#database_id, #dump_path, #model

Instance Method Summary collapse

Methods included from Config::Helpers

included

Methods included from Utilities::Helpers

#utility_remote

Constructor Details

#initialize(model, database_id = nil, &block) ⇒ RemoteMySQL

Returns a new instance of RemoteMySQL.



79
80
81
82
83
84
85
86
# File 'lib/backup/database/remote_mysql.rb', line 79

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

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Backup::Config::Helpers

Instance Attribute Details

#additional_optionsObject

Additional “mysqldump” or “innobackupex (backup creation)” options



52
53
54
# File 'lib/backup/database/remote_mysql.rb', line 52

def additional_options
  @additional_options
end

#backup_engineObject

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/



63
64
65
# File 'lib/backup/database/remote_mysql.rb', line 63

def backup_engine
  @backup_engine
end

#hostObject

Connectivity options



35
36
37
# File 'lib/backup/database/remote_mysql.rb', line 35

def host
  @host
end

#nameObject

Name of the database that needs to get dumped To dump all databases, set this to ‘:all` or leave blank.



27
28
29
# File 'lib/backup/database/remote_mysql.rb', line 27

def name
  @name
end

#only_tablesObject

Tables to dump. This in only valid if ‘name` is specified. If none are given, the entire database will be dumped.



48
49
50
# File 'lib/backup/database/remote_mysql.rb', line 48

def only_tables
  @only_tables
end

#passwordObject

Credentials for the specified database



31
32
33
# File 'lib/backup/database/remote_mysql.rb', line 31

def password
  @password
end

#portObject

Connectivity options



35
36
37
# File 'lib/backup/database/remote_mysql.rb', line 35

def port
  @port
end

#prepare_backupObject

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.



69
70
71
# File 'lib/backup/database/remote_mysql.rb', line 69

def prepare_backup
  @prepare_backup
end

#prepare_optionsObject

Additional innobackupex log preparation phase (“apply-logs”) options



56
57
58
# File 'lib/backup/database/remote_mysql.rb', line 56

def prepare_options
  @prepare_options
end

#server_backup_pathObject

Returns the value of attribute server_backup_path.



21
22
23
# File 'lib/backup/database/remote_mysql.rb', line 21

def server_backup_path
  @server_backup_path
end

#server_hostObject

server options



17
18
19
# File 'lib/backup/database/remote_mysql.rb', line 17

def server_host
  @server_host
end

#server_ssh_keyObject

Returns the value of attribute server_ssh_key.



20
21
22
# File 'lib/backup/database/remote_mysql.rb', line 20

def server_ssh_key
  @server_ssh_key
end

#server_ssh_passwordObject

Returns the value of attribute server_ssh_password.



19
20
21
# File 'lib/backup/database/remote_mysql.rb', line 19

def server_ssh_password
  @server_ssh_password
end

#server_ssh_userObject

Returns the value of attribute server_ssh_user.



18
19
20
# File 'lib/backup/database/remote_mysql.rb', line 18

def server_ssh_user
  @server_ssh_user
end

#skip_tablesObject

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.



43
44
45
# File 'lib/backup/database/remote_mysql.rb', line 43

def skip_tables
  @skip_tables
end

#socketObject

Connectivity options



35
36
37
# File 'lib/backup/database/remote_mysql.rb', line 35

def socket
  @socket
end

#sudo_userObject

If set the backup engine command block is executed as the given user



73
74
75
# File 'lib/backup/database/remote_mysql.rb', line 73

def sudo_user
  @sudo_user
end

#usernameObject

Credentials for the specified database



31
32
33
# File 'lib/backup/database/remote_mysql.rb', line 31

def username
  @username
end

#verboseObject

If set, do not suppress innobackupdb output (useful for debugging)



77
78
79
# File 'lib/backup/database/remote_mysql.rb', line 77

def verbose
  @verbose
end

Instance Method Details

#perform!Object

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]


93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/backup/database/remote_mysql.rb', line 93

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

  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_user, server_ssh_password, cmd_remote)

  if res_generate[:res]==0
    raise 'Cannot create backup on server'
  end

  # download backup
  dump_file = File.join(dump_path, dump_filename+"."+dump_ext)

  res_download = remote.ssh_download_file(server_host, server_ssh_user, server_ssh_password, 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