db2s3 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
1
  spec/s3_config.rb
2
+ db2s3.gemspec
3
+ pkg
data/HISTORY CHANGED
@@ -1,3 +1,9 @@
1
+ 0.2.6
2
+ - Remove metrics task, since it was far too inaccurate
3
+ - Add statistics task to show you the size of your tables
4
+ - Only add username to mysql command line if provided in database.yml
5
+ 0.2.5
6
+ - Use host provided in database.yml
1
7
  0.2.4 (2 Sep 2009)
2
8
  - Fix credentials bug
3
9
  0.2.3
data/README CHANGED
@@ -5,7 +5,7 @@ So pony up you cheap bastard, and store your backups on S3
5
5
 
6
6
  Usage:
7
7
  # In config/environment.rb
8
- config.gem "xaviershay-db2s3", :lib => "db2s3", :source => "http://gems.github.com"
8
+ config.gem "db2s3", :source => "http://gemcutter.org"
9
9
 
10
10
  # In Rakefile
11
11
  require 'db2s3/tasks'
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.6
data/lib/db2s3.rb CHANGED
@@ -20,32 +20,11 @@ class DB2S3
20
20
  run "gunzip -c #{file.path} | mysql #{mysql_options}"
21
21
  end
22
22
 
23
- def metrics
24
- dump_file = dump_db
25
-
26
- storage_dollars_per_byte_per_month = 0.15 / 1024.0 / 1024.0 / 1024.0
27
- transfer_dollars_per_byte_per_month = 0.10 / 1024.0 / 1024.0 / 1024.0
28
- full_dumps_per_month = 30
29
-
30
- storage_cost = (dump_file.size * storage_dollars_per_byte_per_month * 100).ceil / 100.0
31
- transfer_cost = (dump_file.size * full_dumps_per_month * transfer_dollars_per_byte_per_month * 100).ceil / 100.0
32
- requests_cost = 0.02 # TODO: Actually calculate this, with incremental backups could be more
33
-
34
- {
35
- :db_size => dump_file.size,
36
- :storage_cost => storage_cost,
37
- :transfer_cost => transfer_cost,
38
- :total_cost => storage_cost + transfer_cost + requests_cost,
39
- :requests_cost => requests_cost,
40
- :full_backups_per_month => full_dumps_per_month
41
- }
42
- end
43
-
44
23
  private
45
24
 
46
25
  def dump_db
47
26
  dump_file = Tempfile.new("dump")
48
-
27
+
49
28
  #cmd = "mysqldump --quick --single-transaction --create-options -u#{db_credentials[:user]} --flush-logs --master-data=2 --delete-master-logs"
50
29
  cmd = "mysqldump --quick --single-transaction --create-options #{mysql_options}"
51
30
  cmd += " | gzip > #{dump_file.path}"
@@ -55,7 +34,8 @@ class DB2S3
55
34
  end
56
35
 
57
36
  def mysql_options
58
- cmd = " -u #{db_credentials[:username]} "
37
+ cmd = ''
38
+ cmd += " -u #{db_credentials[:username]} " unless db_credentials[:username].nil?
59
39
  cmd += " -p'#{db_credentials[:password]}'" unless db_credentials[:password].nil?
60
40
  cmd += " -h '#{db_credentials[:host]}'" unless db_credentials[:host].nil?
61
41
  cmd += " #{db_credentials[:database]}"
@@ -74,7 +54,7 @@ class DB2S3
74
54
  raise("error, process exited with status #{$?.exitstatus}") unless result
75
55
  end
76
56
 
77
- def db_credentials
57
+ def db_credentials
78
58
  ActiveRecord::Base.connection.instance_eval { @config } # Dodgy!
79
59
  end
80
60
 
@@ -98,7 +78,7 @@ class DB2S3
98
78
  def fetch(file_name)
99
79
  ensure_connected
100
80
  AWS::S3::S3Object.find(file_name, bucket)
101
-
81
+
102
82
  file = Tempfile.new("dump")
103
83
  open(file.path, 'w') do |f|
104
84
  AWS::S3::S3Object.stream(file_name, bucket) do |chunk|
data/spec/db2s3_spec.rb CHANGED
@@ -23,28 +23,4 @@ describe 'db2s3' do
23
23
  Person.find_by_name("Baxter").should_not be_nil
24
24
  end
25
25
  end
26
-
27
- it 'provides estimated metrics' do
28
- db2s3 = DB2S3.new
29
- # 1 GB DB
30
- db2s3.stub!(:dump_db).and_return(stub("dump file", :size => 1024 * 1024 * 1024))
31
- metrics = db2s3.metrics
32
- metrics.should == {
33
- :storage_cost => 0.15, # 15c/GB-Month rounded up to nearest cent, we're only storing one backup
34
- :transfer_cost => 3.0, # 10c/GB-Month * 30 backups
35
- :db_size => 1024 * 1024 * 1024, # 1 GB
36
- :total_cost => 3.17,
37
- :requests_cost => 0.02,
38
- :full_backups_per_month => 30 # Default 1 backup/day
39
- }
40
- end
41
-
42
- it 'rounds transfer cost metric up to nearest cent' do
43
- db2s3 = DB2S3.new
44
- # 1 KB DB
45
- db2s3.stub!(:dump_db).and_return(stub("dump file", :size => 1024))
46
- metrics = db2s3.metrics
47
- metrics[:storage_cost].should == 0.01
48
- metrics[:transfer_cost].should == 0.01
49
- end
50
26
  end
data/tasks/tasks.rake CHANGED
@@ -9,32 +9,27 @@ namespace :db2s3 do
9
9
  task :restore => :environment do
10
10
  DB2S3.new.restore
11
11
  end
12
- end
13
12
 
14
- desc "Provide estimated costs for backing up your DB to S3"
15
- task :metrics => :environment do
16
- def format_size(size)
17
- units = %w{B KB MB GB TB}
18
- e = (Math.log(size)/Math.log(1024)).floor
19
- s = "%.3f" % (size.to_f / 1024**e)
20
- s.sub(/\.?0*$/, units[e])
21
- end
13
+ desc "Show table sizes for your database"
14
+ task :statistics => :environment do
15
+ # From http://mysqlpreacher.com/wordpress/tag/table-size/
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
22
27
 
23
- def format_cost(cost)
24
- "%.2f" % [cost]
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") }
25
33
  end
26
-
27
- metrics = DB2S3.new.metrics
28
- puts <<-EOS
29
- Estimates only, does not take into account metadata overhead
30
- Code has recently been added that keeps old backups around - this is not taken into account in these estimates
31
-
32
- DB Size: #{format_size(metrics[:db_size])}
33
- Full backups/month: #{metrics[:full_backups_per_month]}
34
- Storage Cost $US: #{format_cost(metrics[:storage_cost])}
35
- Transfer Cost $US: #{format_cost(metrics[:transfer_cost])}
36
- Requests Cost $US: #{format_cost(metrics[:requests_cost])}
37
- Total Cost $US: #{format_cost(metrics[:total_cost])}
38
- EOS
39
34
  end
40
35
  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.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Shay
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-07 00:00:00 +11:00
12
+ date: 2009-12-06 00:00:00 +11:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -26,7 +26,7 @@ files:
26
26
  - HISTORY
27
27
  - README
28
28
  - Rakefile
29
- - db2s3.gemspec
29
+ - VERSION
30
30
  - init.rb
31
31
  - lib/db2s3.rb
32
32
  - lib/db2s3/tasks.rb
data/db2s3.gemspec DELETED
@@ -1,55 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{db2s3}
8
- s.version = "0.2.5"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Xavier Shay"]
12
- s.date = %q{2009-11-07}
13
- s.description = %q{db2s3 provides rake tasks for backing up and restoring your DB to S3}
14
- s.email = %q{contact@rhnh.net}
15
- s.extra_rdoc_files = [
16
- "README"
17
- ]
18
- s.files = [
19
- ".gitignore",
20
- "HISTORY",
21
- "README",
22
- "Rakefile",
23
- "db2s3.gemspec",
24
- "init.rb",
25
- "lib/db2s3.rb",
26
- "lib/db2s3/tasks.rb",
27
- "rails/init.rb",
28
- "spec/db2s3_spec.rb",
29
- "spec/mysql_drop_schema.sql",
30
- "spec/mysql_schema.sql",
31
- "spec/s3_config.example.rb",
32
- "spec/spec_helper.rb",
33
- "tasks/tasks.rake"
34
- ]
35
- s.homepage = %q{http://github.com/xaviershay/db2s3}
36
- s.rdoc_options = ["--charset=UTF-8"]
37
- s.require_paths = ["lib"]
38
- s.rubygems_version = %q{1.3.4}
39
- s.summary = %q{Summarize your gem}
40
- s.test_files = [
41
- "spec/db2s3_spec.rb",
42
- "spec/s3_config.example.rb",
43
- "spec/spec_helper.rb"
44
- ]
45
-
46
- if s.respond_to? :specification_version then
47
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
48
- s.specification_version = 3
49
-
50
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
51
- else
52
- end
53
- else
54
- end
55
- end