mysql_truck 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/mysql_truck CHANGED
@@ -44,6 +44,14 @@ parser = OptionParser.new do |opts|
44
44
  options[:s3_secret_access_key] = key
45
45
  end
46
46
 
47
+ opts.on("-b", "--s3-bucket BUCKET", "S3 bucket") do |bucket|
48
+ options[:bucket] = bucket
49
+ end
50
+
51
+ opts.on("--bucket-dir BUCKET_DIR", "S3 bucket dir [defaults to database name]") do |dir|
52
+ options[:bucket_dir] = key
53
+ end
54
+
47
55
  opts.on("-t", "--skip-tables TABLES",
48
56
  "List of tables to skip separated by commas.") do |tables|
49
57
  options[:skip_tables] = tables.split(",")
@@ -69,7 +77,7 @@ begin
69
77
 
70
78
  missing_opts = []
71
79
  [ :s3_access_key, :s3_secret_access_key,
72
- :host, :username, :database
80
+ :host, :username, :database, :bucket
73
81
  ].each do |opt|
74
82
  missing_opts << opt unless options.include?(opt)
75
83
  end
@@ -1,3 +1,3 @@
1
1
  module MysqlTruck
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/mysql_truck.rb CHANGED
@@ -33,7 +33,7 @@ module MysqlTruck
33
33
  @s3 = RightAws::S3.new(
34
34
  config[:s3_access_key],
35
35
  config[:s3_secret_access_key])
36
- @bucket = @s3.bucket("8tr.db_backups")
36
+ @bucket = @s3.bucket(config[:bucket])
37
37
  end
38
38
 
39
39
  def db_connection_options
@@ -48,15 +48,32 @@ module MysqlTruck
48
48
  " --fields-enclosed-by=\\\" --fields-terminated-by=, "
49
49
  end
50
50
 
51
+ def initialize_directories
52
+ mkdir_p base_path
53
+ mkdir_p tmp_path
54
+ chmod 0777, tmp_path
55
+ end
56
+
57
+ def remove_directories
58
+ rm_r tmp_path, :force => true
59
+ end
60
+
51
61
  def tmp_path
52
- unless @tmp_path
53
- @tmp_path = config[:tmp_dir] || Pathname.new("/data/s3backup")
54
- @tmp_path = @tmp_path.join(@time.to_i.to_s) if @time # Only set with the Dumper class
55
- end
62
+ raise "@time not initialized yet" unless @time
63
+ base_path.join(@time.strftime("%Y-%m-%d-%H-%M"))
64
+ end
56
65
 
57
- @tmp_path
66
+ def base_path
67
+ if config[:tmp_dir]
68
+ config[:tmp_dir].is_a?(Pathname) ? config[:tmp_dir] : Pathname.new(config[:tmp_dir])
69
+ else
70
+ Pathname.new("/data/mysqltruck")
71
+ end
58
72
  end
59
73
 
74
+ def bucket_dir
75
+ "mysql/#{config[:bucket_dir] || config[:database]}/"
76
+ end
60
77
  end
61
78
 
62
79
  class Dumper
@@ -65,7 +82,7 @@ module MysqlTruck
65
82
 
66
83
  def initialize(config)
67
84
  @config = config
68
- @time = Time.now
85
+ @time = Time.now # Sets the directory for dump
69
86
 
70
87
  initialize_s3
71
88
  initialize_directories
@@ -76,7 +93,7 @@ module MysqlTruck
76
93
  upload
77
94
 
78
95
  ensure
79
- # rm_r tmp_path, :force => true
96
+ remove_directories
80
97
  end
81
98
 
82
99
  def dump_data
@@ -92,6 +109,7 @@ module MysqlTruck
92
109
  puts cmd
93
110
  `#{cmd}`
94
111
 
112
+ # `mysqldump` creates files with .txt extensions, so we rename it.
95
113
  path, file = csv_file.split
96
114
  csv_file = path.join("#{file.basename(".txt")}.csv")
97
115
  mv path.join(file), csv_file
@@ -115,9 +133,6 @@ module MysqlTruck
115
133
 
116
134
  private
117
135
 
118
- def initialize_directories
119
- mkdir_p tmp_path
120
- end
121
136
 
122
137
  def upload_file(local_file)
123
138
  path = Pathname.new(local_file)
@@ -137,7 +152,7 @@ module MysqlTruck
137
152
  end
138
153
 
139
154
  def bucket_path
140
- @bucket_path ||= Pathname.new("mysql").join(@time.strftime("%Y-%m-%d-%H-%M"))
155
+ @bucket_path ||= Pathname.new(bucket_dir).join(@time.strftime("%Y-%m-%d-%H-%M"))
141
156
  end
142
157
  end # class Dumper
143
158
 
@@ -158,8 +173,9 @@ module MysqlTruck
158
173
  def load_latest
159
174
  prefix = backups.first
160
175
 
161
- tmp_dir = tmp_path.join(prefix.split("/").last)
162
- mkdir_p tmp_dir # Creates a directory for day of the backup downloaded
176
+ # Set directory where backup is downloaded to
177
+ @time = Time.new(*prefix.split("/").last.split("-"))
178
+ initialize_directories
163
179
 
164
180
  puts "Downloading backups ..."
165
181
  @bucket.keys(:prefix => prefix).each do |key|
@@ -168,20 +184,20 @@ module MysqlTruck
168
184
  next if filename.match(/\.csv\.gz$/) && skip_tables.include?(File.basename(filename, ".csv.gz"))
169
185
 
170
186
  print " - Downloading #{filename} ... "
171
- File.open(tmp_dir.join(filename), "wb") do |f|
187
+ File.open(tmp_path.join(filename), "wb") do |f|
172
188
  f.write key.get
173
189
  end
174
190
  print "complete.\n"
175
191
 
176
192
  # gunzip file
177
193
  print " -- Inflating #{filename} ... "
178
- `gunzip #{tmp_dir.join(filename)}`
194
+ `gunzip #{tmp_path.join(filename)}`
179
195
  print "complete.\n"
180
196
  end
181
197
 
182
198
  # Load schemas
183
199
  puts "Loading schema."
184
- cmd = "cat #{tmp_dir}/*.sql | "
200
+ cmd = "cat #{tmp_path}/*.sql | "
185
201
  cmd += "mysql #{db_connection_options}"
186
202
  puts cmd
187
203
  `#{cmd}`
@@ -191,7 +207,7 @@ module MysqlTruck
191
207
  puts "Loading data."
192
208
  cmd = "mysqlimport #{db_connection_options}"
193
209
  cmd += csv_options
194
- Dir["#{tmp_dir}/*.csv"].each do |table|
210
+ Dir["#{tmp_path}/*.csv"].each do |table|
195
211
  print " - Importing #{File.basename(table, ".csv")} ... "
196
212
  puts cmd + " " + table
197
213
  `#{cmd} #{table}`
@@ -200,7 +216,7 @@ module MysqlTruck
200
216
 
201
217
  puts "Backup loaded."
202
218
  ensure
203
- rm_r tmp_dir, :force => true
219
+ # remove_directories
204
220
  end
205
221
 
206
222
  # Get a list of backups stored on S3.
@@ -215,7 +231,7 @@ module MysqlTruck
215
231
  @backups = []
216
232
  # Backups are stored in the mysql/ directory
217
233
  @bucket.s3.interface.incrementally_list_bucket(@bucket.name, {
218
- :prefix => "mysql/", :delimiter => "/"
234
+ :prefix => "#{bucket_dir}", :delimiter => "/"
219
235
  }) do |item|
220
236
  @backups += item[:common_prefixes]
221
237
  end
@@ -232,8 +248,5 @@ module MysqlTruck
232
248
  @tables
233
249
  end
234
250
 
235
- def initialize_directories
236
- mkdir_p tmp_dir
237
- end
238
251
  end # class Loader
239
252
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mysql_truck
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,12 +10,12 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-09-15 00:00:00.000000000 -07:00
13
+ date: 2011-09-16 00:00:00.000000000 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: right_aws
18
- requirement: &2159027440 !ruby/object:Gem::Requirement
18
+ requirement: &2156700300 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,7 +23,7 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *2159027440
26
+ version_requirements: *2156700300
27
27
  description: Mysql database backup tool. Dumps/Loads to/from S3.
28
28
  email:
29
29
  - peter@paydrotalks.com