db2s3 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +4 -1
- data/README +2 -4
- data/VERSION +1 -1
- data/lib/db2s3.rb +44 -0
- data/tasks/tasks.rake +25 -20
- metadata +2 -2
data/HISTORY
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0 (6 Dec 2009)
|
2
|
+
- Added db2s3:backup:clean task to delete old backups
|
3
|
+
- Added dependency on activesupport for the clean task
|
4
|
+
0.2.6 (6 Dec 2009)
|
2
5
|
- Remove metrics task, since it was far too inaccurate
|
3
6
|
- Add statistics task to show you the size of your tables
|
4
7
|
- Only add username to mysql command line if provided in database.yml
|
data/README
CHANGED
@@ -27,11 +27,9 @@ Usage:
|
|
27
27
|
rake db2s3:backup:incremental # Unimplemented
|
28
28
|
|
29
29
|
# Handy tasks
|
30
|
-
rake db2s3:
|
30
|
+
rake db2s3:statistics # Shows you the size of your DB
|
31
31
|
rake db2s3:backup:restore # You should be testing this regularly
|
32
|
-
|
33
|
-
Caveats:
|
34
|
-
Currently does not clean up old back ups
|
32
|
+
rake db2s3:backup:clear # Clean up old backups - cron this
|
35
33
|
|
36
34
|
Kudos:
|
37
35
|
http://github.com/pauldowman/blog_code_examples/tree/master/mysql_s3_backup
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/db2s3.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'activesupport'
|
1
2
|
require 'aws/s3'
|
2
3
|
require 'tempfile'
|
3
4
|
|
@@ -20,6 +21,38 @@ class DB2S3
|
|
20
21
|
run "gunzip -c #{file.path} | mysql #{mysql_options}"
|
21
22
|
end
|
22
23
|
|
24
|
+
# TODO: This method really needs specs
|
25
|
+
def clean
|
26
|
+
to_keep = []
|
27
|
+
filelist = store.list
|
28
|
+
files = filelist.reject {|file| file.ends_with?(most_recent_dump_file_name) }.collect do |file|
|
29
|
+
{
|
30
|
+
:path => file,
|
31
|
+
:date => Time.parse(file.split('-').last.split('.').first)
|
32
|
+
}
|
33
|
+
end
|
34
|
+
# Keep all backups from the past day
|
35
|
+
files.select {|x| x[:date] >= 1.day.ago }.each do |backup_for_day|
|
36
|
+
to_keep << backup_for_day
|
37
|
+
end
|
38
|
+
|
39
|
+
# Keep one backup per day from the last week
|
40
|
+
files.select {|x| x[:date] >= 1.week.ago }.group_by {|x| x[:date].strftime("%Y%m%d") }.values.each do |backups_for_last_week|
|
41
|
+
to_keep << backups_for_last_week.sort_by{|x| x[:date].strftime("%Y%m%d") }.first
|
42
|
+
end
|
43
|
+
|
44
|
+
# Keep one backup per week since forever
|
45
|
+
files.group_by {|x| x[:date].strftime("%Y%W") }.values.each do |backups_for_week|
|
46
|
+
to_keep << backups_for_week.sort_by{|x| x[:date].strftime("%Y%m%d") }.first
|
47
|
+
end
|
48
|
+
|
49
|
+
to_destroy = filelist - to_keep.uniq.collect {|x| x[:path] }
|
50
|
+
to_destroy.delete_if {|x| x.ends_with?(most_recent_dump_file_name) }
|
51
|
+
to_destroy.each do |file|
|
52
|
+
store.delete(file.split('/').last)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
23
56
|
private
|
24
57
|
|
25
58
|
def dump_db
|
@@ -88,6 +121,17 @@ class DB2S3
|
|
88
121
|
file
|
89
122
|
end
|
90
123
|
|
124
|
+
def list
|
125
|
+
ensure_connected
|
126
|
+
AWS::S3::Bucket.find(bucket).objects.collect {|x| x.path }
|
127
|
+
end
|
128
|
+
|
129
|
+
def delete(file_name)
|
130
|
+
if object = AWS::S3::S3Object.find(file_name, bucket)
|
131
|
+
object.delete
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
91
135
|
private
|
92
136
|
|
93
137
|
def bucket
|
data/tasks/tasks.rake
CHANGED
@@ -10,26 +10,31 @@ namespace :db2s3 do
|
|
10
10
|
DB2S3.new.restore
|
11
11
|
end
|
12
12
|
|
13
|
-
desc "
|
14
|
-
task :
|
15
|
-
|
16
|
-
results = ActiveRecord::Base.connection.execute(<<-EOS)
|
17
|
-
SELECT
|
18
|
-
engine,
|
19
|
-
ROUND(data_length/1024/1024,2) total_size_mb,
|
20
|
-
ROUND(index_length/1024/1024,2) total_index_size_mb,
|
21
|
-
table_rows,
|
22
|
-
table_name article_attachment
|
23
|
-
FROM information_schema.tables
|
24
|
-
WHERE table_schema = 'rhnh_production'
|
25
|
-
ORDER BY 3 desc;
|
26
|
-
EOS
|
27
|
-
|
28
|
-
rows = []
|
29
|
-
header = [["Type", "Data MB", "Index", "Rows", "Name"], []]
|
30
|
-
results.each {|x| rows << x.to_a }
|
31
|
-
rows.sort_by {|x| -x[3].to_i }
|
32
|
-
puts (header + rows).collect {|x| x.join("\t") }
|
13
|
+
desc "Keep all backups for the last day, one per day for the last week, and one per week before that. Delete the rest."
|
14
|
+
task :clean => :environment do
|
15
|
+
DB2S3.new.clean
|
33
16
|
end
|
34
17
|
end
|
18
|
+
|
19
|
+
desc "Show table sizes for your database"
|
20
|
+
task :statistics => :environment do
|
21
|
+
# From http://mysqlpreacher.com/wordpress/tag/table-size/
|
22
|
+
results = ActiveRecord::Base.connection.execute(<<-EOS)
|
23
|
+
SELECT
|
24
|
+
engine,
|
25
|
+
ROUND(data_length/1024/1024,2) total_size_mb,
|
26
|
+
ROUND(index_length/1024/1024,2) total_index_size_mb,
|
27
|
+
table_rows,
|
28
|
+
table_name article_attachment
|
29
|
+
FROM information_schema.tables
|
30
|
+
WHERE table_schema = 'rhnh_production'
|
31
|
+
ORDER BY 3 desc;
|
32
|
+
EOS
|
33
|
+
|
34
|
+
rows = []
|
35
|
+
header = [["Type", "Data MB", "Index", "Rows", "Name"], []]
|
36
|
+
results.each {|x| rows << x.to_a }
|
37
|
+
rows.sort_by {|x| -x[3].to_i }
|
38
|
+
puts (header + rows).collect {|x| x.join("\t") }
|
39
|
+
end
|
35
40
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db2s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xavier Shay
|
@@ -61,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
61
61
|
requirements: []
|
62
62
|
|
63
63
|
rubyforge_project:
|
64
|
-
rubygems_version: 1.3.
|
64
|
+
rubygems_version: 1.3.5
|
65
65
|
signing_key:
|
66
66
|
specification_version: 3
|
67
67
|
summary: Summarize your gem
|