backup 3.2.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -5
- data/lib/backup/archive.rb +11 -1
- data/lib/backup/cli.rb +252 -141
- data/lib/backup/database/base.rb +50 -24
- data/lib/backup/database/mongodb.rb +101 -127
- data/lib/backup/database/mysql.rb +50 -76
- data/lib/backup/database/postgresql.rb +44 -70
- data/lib/backup/database/redis.rb +61 -66
- data/lib/backup/database/riak.rb +64 -43
- data/lib/backup/dependency.rb +1 -1
- data/lib/backup/model.rb +10 -7
- data/lib/backup/storage/cloudfiles.rb +2 -0
- data/lib/backup/storage/cycler.rb +2 -1
- data/lib/backup/storage/dropbox.rb +66 -5
- data/lib/backup/utilities.rb +29 -14
- data/lib/backup/version.rb +1 -1
- data/templates/cli/archive +2 -0
- data/templates/cli/database/mongodb +1 -4
- data/templates/cli/database/mysql +0 -3
- data/templates/cli/database/postgresql +0 -3
- data/templates/cli/database/redis +11 -9
- data/templates/cli/database/riak +11 -14
- metadata +2 -2
data/lib/backup/database/base.rb
CHANGED
@@ -6,47 +6,73 @@ module Backup
|
|
6
6
|
include Backup::Utilities::Helpers
|
7
7
|
include Backup::Configuration::Helpers
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def initialize(model)
|
9
|
+
attr_reader :model, :database_id, :dump_path
|
10
|
+
|
11
|
+
def initialize(model, database_id = nil)
|
13
12
|
@model = model
|
13
|
+
@database_id = database_id.to_s.gsub(/\W/, '_') if database_id
|
14
|
+
@dump_path = File.join(Config.tmp_path, model.trigger, 'databases')
|
14
15
|
load_defaults!
|
15
16
|
end
|
16
17
|
|
17
|
-
##
|
18
|
-
# Super method for all child (database) objects. Every database object's #perform!
|
19
|
-
# method should call #super before anything else to prepare
|
20
18
|
def perform!
|
19
|
+
log!(:started)
|
21
20
|
prepare!
|
22
|
-
log!
|
23
21
|
end
|
24
22
|
|
25
23
|
private
|
26
24
|
|
27
|
-
##
|
28
|
-
# Defines the @dump_path and ensures it exists by creating it
|
29
25
|
def prepare!
|
30
|
-
|
31
|
-
Config.tmp_path,
|
32
|
-
@model.trigger,
|
33
|
-
'databases',
|
34
|
-
self.class.name.split('::').last
|
35
|
-
)
|
36
|
-
FileUtils.mkdir_p(@dump_path)
|
26
|
+
FileUtils.mkdir_p(dump_path)
|
37
27
|
end
|
38
28
|
|
39
29
|
##
|
40
|
-
#
|
30
|
+
# Sets the base filename for the final dump file to be saved in +dump_path+,
|
31
|
+
# based on the class name. e.g. databases/MySQL.sql
|
32
|
+
#
|
33
|
+
# +database_id+ will be appended if it is defined.
|
34
|
+
# e.g. databases/MySQL-database_id.sql
|
35
|
+
#
|
36
|
+
# If multiple Databases of the same class are defined and no +database_id+
|
37
|
+
# is defined, the user will be warned and one will be auto-generated.
|
38
|
+
#
|
39
|
+
# Model#initialize calls this method *after* all defined databases have
|
40
|
+
# been initialized so `backup perform --check` can report these warnings.
|
41
|
+
def dump_filename
|
42
|
+
@dump_filename ||= begin
|
43
|
+
unless database_id
|
44
|
+
if model.databases.select {|d| d.class == self.class }.count > 1
|
45
|
+
sleep 1; @database_id = Time.now.to_i.to_s[-5, 5]
|
46
|
+
Logger.warn Errors::Database::ConfigurationError.new(<<-EOS)
|
47
|
+
Database Identifier Missing
|
48
|
+
When multiple Databases are configured in a single Backup Model
|
49
|
+
that have the same class (MySQL, PostgreSQL, etc.), the optional
|
50
|
+
+database_id+ must be specified to uniquely identify each instance.
|
51
|
+
e.g. database MySQL, :database_id do |db|
|
52
|
+
This will result in an output file in your final backup package like:
|
53
|
+
databases/MySQL-database_id.sql
|
54
|
+
|
55
|
+
Backup has auto-generated an identifier (#{ database_id }) for this
|
56
|
+
database dump and will now continue.
|
57
|
+
EOS
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
self.class.name.split('::').last + (database_id ? "-#{ database_id }" : '')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
41
65
|
def database_name
|
42
|
-
self.class.to_s.sub('Backup::', '')
|
66
|
+
@database_name ||= self.class.to_s.sub('Backup::', '') +
|
67
|
+
(database_id ? " (#{ database_id })" : '')
|
43
68
|
end
|
44
69
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
70
|
+
def log!(action)
|
71
|
+
msg = case action
|
72
|
+
when :started then 'Started...'
|
73
|
+
when :finished then 'Finished!'
|
74
|
+
end
|
75
|
+
Logger.info "#{ database_name } #{ msg }"
|
50
76
|
end
|
51
77
|
end
|
52
78
|
end
|
@@ -29,202 +29,176 @@ module Backup
|
|
29
29
|
attr_accessor :additional_options
|
30
30
|
|
31
31
|
##
|
32
|
-
#
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
##
|
40
|
-
# Path to the mongo utility (optional)
|
41
|
-
attr_accessor :mongo_utility
|
42
|
-
|
43
|
-
##
|
44
|
-
# 'lock' dump meaning wrapping mongodump with fsync & lock
|
32
|
+
# Forces mongod to flush all pending write operations to the disk and
|
33
|
+
# locks the entire mongod instance to prevent additional writes until the
|
34
|
+
# dump is complete.
|
35
|
+
#
|
36
|
+
# Note that if Profiling is enabled, this will disable it and will not
|
37
|
+
# re-enable it after the dump is complete.
|
45
38
|
attr_accessor :lock
|
46
39
|
|
47
40
|
##
|
48
|
-
# Creates a
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
41
|
+
# Creates a dump of the database that includes an oplog, to create a
|
42
|
+
# point-in-time snapshot of the state of a mongod instance.
|
43
|
+
#
|
44
|
+
# If this option is used, you would not use the `lock` option.
|
45
|
+
#
|
46
|
+
# This will only work against nodes that maintain a oplog.
|
47
|
+
# This includes all members of a replica set, as well as master nodes in
|
48
|
+
# master/slave replication deployments.
|
49
|
+
attr_accessor :oplog
|
56
50
|
|
51
|
+
def initialize(model, database_id = nil, &block)
|
52
|
+
super
|
57
53
|
instance_eval(&block) if block_given?
|
58
|
-
|
59
|
-
@mongodump_utility ||= utility(:mongodump)
|
60
|
-
@mongo_utility ||= utility(:mongo)
|
61
54
|
end
|
62
55
|
|
63
|
-
##
|
64
|
-
# Performs the mongodump command and outputs the data to the
|
65
|
-
# specified path based on the 'trigger'. If the user hasn't specified any
|
66
|
-
# specific collections to dump, it'll dump everything. If the user has specified
|
67
|
-
# collections to dump, it'll loop through the array of collections and invoke the
|
68
|
-
# 'mongodump' command once per collection
|
69
56
|
def perform!
|
70
57
|
super
|
71
58
|
|
72
59
|
lock_database if @lock
|
73
|
-
|
60
|
+
dump!
|
61
|
+
package!
|
74
62
|
|
75
|
-
rescue => err
|
76
|
-
raise Errors::Database::MongoDBError.wrap(err, 'Database Dump Failed!')
|
77
63
|
ensure
|
78
64
|
unlock_database if @lock
|
79
|
-
package! unless err
|
80
65
|
end
|
81
66
|
|
82
67
|
private
|
83
68
|
|
84
69
|
##
|
85
|
-
#
|
70
|
+
# Performs all required mongodump commands, dumping the output files
|
71
|
+
# into the +dump_packaging_path+ directory for packaging.
|
86
72
|
def dump!
|
87
|
-
|
88
|
-
end
|
73
|
+
FileUtils.mkdir_p dump_packaging_path
|
89
74
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
75
|
+
collections = Array(only_collections)
|
76
|
+
if collections.empty?
|
77
|
+
run(mongodump)
|
78
|
+
else
|
79
|
+
collections.each do |collection|
|
80
|
+
run("#{ mongodump } --collection='#{ collection }'")
|
81
|
+
end
|
97
82
|
end
|
98
83
|
end
|
99
84
|
|
100
85
|
##
|
101
|
-
#
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
##
|
108
|
-
# If a compressor is configured, packages the dump_path into a
|
109
|
-
# single compressed tar archive, then removes the dump_path.
|
110
|
-
# e.g.
|
111
|
-
# if the database was dumped to:
|
112
|
-
# ~/Backup/.tmp/databases/MongoDB/
|
113
|
-
# then it will be packaged into:
|
114
|
-
# ~/Backup/.tmp/databases/MongoDB-<timestamp>.tar.gz
|
86
|
+
# Creates a tar archive of the +dump_packaging_path+ directory
|
87
|
+
# and stores it in the +dump_path+ using +dump_filename+.
|
88
|
+
#
|
89
|
+
# <trigger>/databases/MongoDB[-<database_id>].tar[.gz]
|
90
|
+
#
|
91
|
+
# If successful, +dump_packaging_path+ is removed.
|
115
92
|
def package!
|
116
|
-
|
93
|
+
pipeline = Pipeline.new
|
94
|
+
dump_ext = 'tar'
|
117
95
|
|
118
|
-
pipeline
|
119
|
-
|
120
|
-
dump_dir = File.basename(@dump_path)
|
121
|
-
timestamp = Time.now.to_i.to_s[-5, 5]
|
122
|
-
outfile = @dump_path + '-' + timestamp + '.tar'
|
96
|
+
pipeline << "#{ utility(:tar) } -cf - " +
|
97
|
+
"-C '#{ dump_path }' '#{ dump_filename }'"
|
123
98
|
|
124
|
-
|
125
|
-
"#{ database_name } started compressing and packaging:\n" +
|
126
|
-
" '#{ @dump_path }'"
|
127
|
-
)
|
128
|
-
|
129
|
-
pipeline << "#{ utility(:tar) } -cf - -C '#{ base_dir }' '#{ dump_dir }'"
|
130
|
-
@model.compressor.compress_with do |command, ext|
|
99
|
+
model.compressor.compress_with do |command, ext|
|
131
100
|
pipeline << command
|
132
|
-
|
133
|
-
end
|
101
|
+
dump_ext << ext
|
102
|
+
end if model.compressor
|
103
|
+
|
104
|
+
pipeline << "#{ utility(:cat) } > " +
|
105
|
+
"'#{ File.join(dump_path, dump_filename) }.#{ dump_ext }'"
|
134
106
|
|
135
|
-
pipeline << "#{ utility(:cat) } > #{ outfile }"
|
136
107
|
pipeline.run
|
137
108
|
if pipeline.success?
|
138
|
-
|
139
|
-
|
140
|
-
" '#{ outfile }'"
|
141
|
-
)
|
142
|
-
FileUtils.rm_rf(@dump_path)
|
109
|
+
FileUtils.rm_rf dump_packaging_path
|
110
|
+
log!(:finished)
|
143
111
|
else
|
144
112
|
raise Errors::Database::PipelineError,
|
145
|
-
|
146
|
-
"'#{ outfile }'\n" +
|
147
|
-
pipeline.error_messages
|
113
|
+
"#{ database_name } Dump Failed!\n" + pipeline.error_messages
|
148
114
|
end
|
149
115
|
end
|
150
116
|
|
151
|
-
|
152
|
-
|
153
|
-
|
117
|
+
def dump_packaging_path
|
118
|
+
File.join(dump_path, dump_filename)
|
119
|
+
end
|
120
|
+
|
121
|
+
def mongodump
|
122
|
+
"#{ utility(:mongodump) } #{ name_option } #{ credential_options } " +
|
123
|
+
"#{ connectivity_options } #{ ipv6_option } #{ oplog_option } " +
|
124
|
+
"#{ user_options } --out='#{ dump_packaging_path }'"
|
125
|
+
end
|
126
|
+
|
127
|
+
def name_option
|
154
128
|
"--db='#{ name }'" if name
|
155
129
|
end
|
156
130
|
|
157
|
-
##
|
158
|
-
# Builds the MongoDB credentials syntax to authenticate the user
|
159
|
-
# to perform the database dumping process
|
160
131
|
def credential_options
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
132
|
+
opts = []
|
133
|
+
opts << "--username='#{ username }'" if username
|
134
|
+
opts << "--password='#{ password }'" if password
|
135
|
+
opts.join(' ')
|
165
136
|
end
|
166
137
|
|
167
|
-
##
|
168
|
-
# Builds the MongoDB connectivity options syntax to connect the user
|
169
|
-
# to perform the database dumping process
|
170
138
|
def connectivity_options
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
139
|
+
opts = []
|
140
|
+
opts << "--host='#{ host }'" if host
|
141
|
+
opts << "--port='#{ port }'" if port
|
142
|
+
opts.join(' ')
|
175
143
|
end
|
176
144
|
|
177
|
-
##
|
178
|
-
# Returns the mongodump syntax for enabling ipv6
|
179
145
|
def ipv6_option
|
180
|
-
|
146
|
+
'--ipv6' if ipv6
|
181
147
|
end
|
182
148
|
|
183
|
-
|
184
|
-
|
185
|
-
# additional options specified by the user
|
186
|
-
def user_options
|
187
|
-
@additional_options.join(' ')
|
149
|
+
def oplog_option
|
150
|
+
'--oplog' if oplog
|
188
151
|
end
|
189
152
|
|
190
|
-
|
191
|
-
|
192
|
-
# e.g. ~/Backup/.tmp/databases/MongoDB/<databases here>/<database collections>
|
193
|
-
def dump_directory
|
194
|
-
"--out='#{ @dump_path }'"
|
153
|
+
def user_options
|
154
|
+
Array(additional_options).join(' ')
|
195
155
|
end
|
196
156
|
|
197
|
-
##
|
198
|
-
# Locks and FSyncs the database to bring it up to sync
|
199
|
-
# and ensure no 'write operations' are performed during the
|
200
|
-
# dump process
|
201
157
|
def lock_database
|
202
|
-
lock_command = <<-EOS.gsub(/^ +/, '
|
158
|
+
lock_command = <<-EOS.gsub(/^ +/, '')
|
203
159
|
echo 'use admin
|
204
|
-
db.
|
160
|
+
db.setProfilingLevel(0)
|
161
|
+
db.fsyncLock()' | #{ mongo_shell }
|
205
162
|
EOS
|
206
163
|
|
207
164
|
run(lock_command)
|
208
165
|
end
|
209
166
|
|
210
|
-
##
|
211
|
-
# Unlocks the (locked) database
|
212
167
|
def unlock_database
|
213
|
-
unlock_command = <<-EOS.gsub(/^ +/, '
|
168
|
+
unlock_command = <<-EOS.gsub(/^ +/, '')
|
214
169
|
echo 'use admin
|
215
|
-
db
|
170
|
+
db.fsyncUnlock()' | #{ mongo_shell }
|
216
171
|
EOS
|
217
172
|
|
218
173
|
run(unlock_command)
|
219
174
|
end
|
220
175
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
176
|
+
def mongo_shell
|
177
|
+
cmd = "#{ utility(:mongo) } #{ connectivity_options }".rstrip
|
178
|
+
cmd << " #{ credential_options }".rstrip
|
179
|
+
cmd << " #{ ipv6_option }".rstrip
|
180
|
+
cmd << " '#{ name }'" if name
|
181
|
+
cmd
|
226
182
|
end
|
227
183
|
|
184
|
+
attr_deprecate :utility_path, :version => '3.0.21',
|
185
|
+
:message => 'Use Backup::Utilities.configure instead.',
|
186
|
+
:action => lambda {|klass, val|
|
187
|
+
Utilities.configure { mongodump val }
|
188
|
+
}
|
189
|
+
|
190
|
+
attr_deprecate :mongodump_utility, :version => '3.3.0',
|
191
|
+
:message => 'Use Backup::Utilities.configure instead.',
|
192
|
+
:action => lambda {|klass, val|
|
193
|
+
Utilities.configure { mongodump val }
|
194
|
+
}
|
195
|
+
|
196
|
+
attr_deprecate :mongo_utility, :version => '3.3.0',
|
197
|
+
:message => 'Use Backup::Utilities.configure instead.',
|
198
|
+
:action => lambda {|klass, val|
|
199
|
+
Utilities.configure { mongo val }
|
200
|
+
}
|
201
|
+
|
228
202
|
end
|
229
203
|
end
|
230
204
|
end
|
@@ -19,42 +19,33 @@ module Backup
|
|
19
19
|
|
20
20
|
##
|
21
21
|
# Tables to skip while dumping the database
|
22
|
+
#
|
23
|
+
# If `name` is set to :all (or not specified), these must include
|
24
|
+
# a database name. e.g. 'name.table'.
|
25
|
+
# If `name` is given, these may simply be table names.
|
22
26
|
attr_accessor :skip_tables
|
23
27
|
|
24
28
|
##
|
25
|
-
# Tables to dump
|
29
|
+
# Tables to dump. This in only valid if `name` is specified.
|
30
|
+
# If none are given, the entire database will be dumped.
|
26
31
|
attr_accessor :only_tables
|
27
32
|
|
28
33
|
##
|
29
34
|
# Additional "mysqldump" options
|
30
35
|
attr_accessor :additional_options
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
attr_accessor :mysqldump_utility
|
35
|
-
|
36
|
-
attr_deprecate :utility_path, :version => '3.0.21',
|
37
|
-
:message => 'Use MySQL#mysqldump_utility instead.',
|
38
|
-
:action => lambda {|klass, val| klass.mysqldump_utility = val }
|
39
|
-
|
40
|
-
##
|
41
|
-
# Creates a new instance of the MySQL adapter object
|
42
|
-
def initialize(model, &block)
|
43
|
-
super(model)
|
44
|
-
|
45
|
-
@skip_tables ||= Array.new
|
46
|
-
@only_tables ||= Array.new
|
47
|
-
@additional_options ||= Array.new
|
48
|
-
|
37
|
+
def initialize(model, database_id = nil, &block)
|
38
|
+
super
|
49
39
|
instance_eval(&block) if block_given?
|
50
40
|
|
51
41
|
@name ||= :all
|
52
|
-
@mysqldump_utility ||= utility(:mysqldump)
|
53
42
|
end
|
54
43
|
|
55
44
|
##
|
56
|
-
# Performs the mysqldump command and outputs the
|
57
|
-
#
|
45
|
+
# Performs the mysqldump command and outputs the dump file
|
46
|
+
# in the +dump_path+ using +dump_filename+.
|
47
|
+
#
|
48
|
+
# <trigger>/databases/MySQL[-<database_id>].sql[.gz]
|
58
49
|
def perform!
|
59
50
|
super
|
60
51
|
|
@@ -62,100 +53,83 @@ module Backup
|
|
62
53
|
dump_ext = 'sql'
|
63
54
|
|
64
55
|
pipeline << mysqldump
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
56
|
+
|
57
|
+
model.compressor.compress_with do |command, ext|
|
58
|
+
pipeline << command
|
59
|
+
dump_ext << ext
|
60
|
+
end if model.compressor
|
71
61
|
|
72
62
|
pipeline << "#{ utility(:cat) } > " +
|
73
|
-
"'#{ File.join(
|
63
|
+
"'#{ File.join(dump_path, dump_filename) }.#{ dump_ext }'"
|
64
|
+
|
74
65
|
pipeline.run
|
75
66
|
if pipeline.success?
|
76
|
-
|
67
|
+
log!(:finished)
|
77
68
|
else
|
78
69
|
raise Errors::Database::PipelineError,
|
79
|
-
"#{ database_name } Dump Failed!\n" +
|
80
|
-
pipeline.error_messages
|
70
|
+
"#{ database_name } Dump Failed!\n" + pipeline.error_messages
|
81
71
|
end
|
82
72
|
end
|
83
73
|
|
84
74
|
private
|
85
75
|
|
86
|
-
##
|
87
|
-
# Builds the full mysqldump string based on all attributes
|
88
76
|
def mysqldump
|
89
|
-
"#{
|
90
|
-
"#{
|
77
|
+
"#{ utility(:mysqldump) } #{ credential_options } " +
|
78
|
+
"#{ connectivity_options } #{ user_options } #{ name_option } " +
|
79
|
+
"#{ tables_to_dump } #{ tables_to_skip }"
|
91
80
|
end
|
92
81
|
|
93
|
-
##
|
94
|
-
# Returns the filename to use for dumping the database(s)
|
95
|
-
def dump_filename
|
96
|
-
dump_all? ? 'all-databases' : name
|
97
|
-
end
|
98
|
-
|
99
|
-
##
|
100
|
-
# Builds the credentials MySQL syntax to authenticate the user
|
101
|
-
# to perform the database dumping process
|
102
82
|
def credential_options
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
83
|
+
opts = []
|
84
|
+
opts << "--user='#{ username }'" if username
|
85
|
+
opts << "--password='#{ password }'" if password
|
86
|
+
opts.join(' ')
|
107
87
|
end
|
108
88
|
|
109
|
-
##
|
110
|
-
# Builds the MySQL connectivity options syntax to connect the user
|
111
|
-
# to perform the database dumping process
|
112
89
|
def connectivity_options
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
90
|
+
return "--socket='#{ socket }'" if socket
|
91
|
+
|
92
|
+
opts = []
|
93
|
+
opts << "--host='#{ host }'" if host
|
94
|
+
opts << "--port='#{ port }'" if port
|
95
|
+
opts.join(' ')
|
117
96
|
end
|
118
97
|
|
119
|
-
##
|
120
|
-
# Builds a MySQL compatible string for the additional options
|
121
|
-
# specified by the user
|
122
98
|
def user_options
|
123
|
-
additional_options.join(' ')
|
99
|
+
Array(additional_options).join(' ')
|
124
100
|
end
|
125
101
|
|
126
|
-
|
127
|
-
# Returns the database name to use in the mysqldump command.
|
128
|
-
# When dumping all databases, the database name is replaced
|
129
|
-
# with the command option to dump all databases.
|
130
|
-
def db_name
|
102
|
+
def name_option
|
131
103
|
dump_all? ? '--all-databases' : name
|
132
104
|
end
|
133
105
|
|
134
|
-
##
|
135
|
-
# Builds the MySQL syntax for specifying which tables to dump
|
136
|
-
# during the dumping of the database
|
137
106
|
def tables_to_dump
|
138
|
-
only_tables.join(' ') unless dump_all?
|
107
|
+
Array(only_tables).join(' ') unless dump_all?
|
139
108
|
end
|
140
109
|
|
141
|
-
##
|
142
|
-
# Builds the MySQL syntax for specifying which tables to skip
|
143
|
-
# during the dumping of the database
|
144
110
|
def tables_to_skip
|
145
|
-
skip_tables.map do |table|
|
111
|
+
Array(skip_tables).map do |table|
|
146
112
|
table = (dump_all? || table['.']) ? table : "#{ name }.#{ table }"
|
147
113
|
"--ignore-table='#{ table }'"
|
148
114
|
end.join(' ')
|
149
115
|
end
|
150
116
|
|
151
|
-
##
|
152
|
-
# Return true if we're dumping all databases.
|
153
|
-
# `name` will be set to :all if it is not set,
|
154
|
-
# so this will be true by default
|
155
117
|
def dump_all?
|
156
118
|
name == :all
|
157
119
|
end
|
158
120
|
|
121
|
+
attr_deprecate :utility_path, :version => '3.0.21',
|
122
|
+
:message => 'Use Backup::Utilities.configure instead.',
|
123
|
+
:action => lambda {|klass, val|
|
124
|
+
Utilities.configure { mysqldump val }
|
125
|
+
}
|
126
|
+
|
127
|
+
attr_deprecate :mysqldump_utility, :version => '3.3.0',
|
128
|
+
:message => 'Use Backup::Utilities.configure instead.',
|
129
|
+
:action => lambda {|klass, val|
|
130
|
+
Utilities.configure { mysqldump val }
|
131
|
+
}
|
132
|
+
|
159
133
|
end
|
160
134
|
end
|
161
135
|
end
|