airblade-mysql_s3_backup 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/config/sample.yml CHANGED
@@ -15,4 +15,5 @@ s3:
15
15
  # S3 credentials
16
16
  access_key_id: XXXXXXXXXXXXXXX
17
17
  secret_access_key: XXXXXXXXXXXXXXXXXXXXXX
18
-
18
+ timeout: 30
19
+
@@ -1,61 +1,78 @@
1
1
  require 'tempfile'
2
2
  require 'lockfile'
3
+ require 'terminator'
3
4
 
4
5
  module MysqlS3Backup
5
6
  class Backup
6
- attr_reader :mysql, :bucket
7
-
8
- def initialize(mysql, bucket)
7
+ attr_reader :mysql, :bucket, :timeout
8
+
9
+ def initialize(mysql, bucket, timeout=30)
9
10
  @mysql = mysql
10
11
  @bucket = bucket
12
+ @timeout = timeout
11
13
  @bin_log_prefix = "#{@mysql.database}/bin_logs"
12
14
  end
13
-
15
+
14
16
  def full(name=make_new_name)
15
17
  lock do
16
- # When the full backup runs it delete any binary log files that might already exist
17
- # in the bucket. Otherwise the restore will try to restore them even though they’re
18
- # older than the full backup.
19
- @bucket.delete_all @bin_log_prefix
20
-
21
- with_temp_file do |file|
22
- @mysql.dump(file)
23
- @bucket.store(dump_file_name(name), file)
24
- @bucket.copy(dump_file_name(name), dump_file_name("latest"))
18
+ timeout do
19
+ # When the full backup runs it delete any binary log files that might already exist
20
+ # in the bucket. Otherwise the restore will try to restore them even though they’re
21
+ # older than the full backup.
22
+ @bucket.delete_all @bin_log_prefix
23
+
24
+ with_temp_file do |file|
25
+ @mysql.dump(file)
26
+ @bucket.store(dump_file_name(name), file)
27
+ @bucket.copy(dump_file_name(name), dump_file_name("latest"))
28
+ end
25
29
  end
26
30
  end
27
31
  end
28
-
32
+
29
33
  def incremental
30
34
  lock do
31
- @mysql.each_bin_log do |log|
32
- @bucket.store "#{@bin_log_prefix}/#{File.basename(log)}", log
35
+ timeout do
36
+ @mysql.each_bin_log do |log|
37
+ @bucket.store "#{@bin_log_prefix}/#{File.basename(log)}", log
38
+ end
33
39
  end
34
40
  end
35
41
  end
36
42
  alias :inc :incremental
37
-
43
+
38
44
  def restore(name="latest")
39
45
  lock do
40
- # restore from the dump file
41
- with_temp_file do |file|
42
- @bucket.fetch(dump_file_name(name), file)
43
- @mysql.restore(file)
44
- end
45
-
46
- if name == "latest"
47
- # Restoring binary log files
48
- @bucket.find("#{@bin_log_prefix}/").sort.each do |log|
49
- with_temp_file do |file|
50
- @bucket.fetch log, file
51
- @mysql.apply_bin_log file
46
+ timeout do
47
+ # restore from the dump file
48
+ with_temp_file do |file|
49
+ @bucket.fetch(dump_file_name(name), file)
50
+ @mysql.restore(file)
51
+ end
52
+
53
+ if name == "latest"
54
+ # Restoring binary log files
55
+ @bucket.find("#{@bin_log_prefix}/").sort.each do |log|
56
+ with_temp_file do |file|
57
+ @bucket.fetch log, file
58
+ @mysql.apply_bin_log file
59
+ end
52
60
  end
53
61
  end
54
62
  end
55
63
  end
56
64
  end
57
-
65
+
58
66
  private
67
+
68
+ def timeout
69
+ result = nil
70
+ Terminator.terminate @timeout do
71
+ result = yield
72
+ end
73
+ result
74
+ end
75
+
59
76
  def lock
60
77
  result = nil
61
78
  Lockfile("mysql_s3_backup_lock", :retries => 0) do
@@ -63,16 +80,16 @@ module MysqlS3Backup
63
80
  end
64
81
  result
65
82
  end
66
-
83
+
67
84
  def dump_file_name(name)
68
85
  raise ArgumentError, "Need a backup name" unless name.is_a?(String)
69
86
  "#{@mysql.database}/dumps/#{name}.sql.gz"
70
87
  end
71
-
88
+
72
89
  def make_new_name
73
90
  Time.now.utc.strftime("%Y%m%d%H%M")
74
91
  end
75
-
92
+
76
93
  def with_temp_file
77
94
  dump_file = Tempfile.new("mysql-dump")
78
95
  yield dump_file.path
@@ -81,4 +98,4 @@ module MysqlS3Backup
81
98
  dump_file.close!
82
99
  end
83
100
  end
84
- end
101
+ end
@@ -3,28 +3,29 @@ require "yaml"
3
3
  module MysqlS3Backup
4
4
  class Config
5
5
  attr_reader :mysql_config, :s3_config, :bucket
6
-
6
+
7
7
  def initialize(config)
8
8
  config = config.symbolize_keys
9
9
  @mysql_config = config[:mysql].symbolize_keys
10
10
  @s3_config = config[:s3].symbolize_keys
11
11
  @bucket = @s3_config.delete(:bucket)
12
+ @timeout = @s3_config.delete(:timeout)
12
13
  end
13
-
14
+
14
15
  def mysql
15
16
  MysqlS3Backup::Mysql.new(@mysql_config)
16
17
  end
17
-
18
+
18
19
  def bucket
19
20
  MysqlS3Backup::Bucket.new(@bucket, @s3_config)
20
21
  end
21
-
22
+
22
23
  def backup
23
- MysqlS3Backup::Backup.new(mysql, bucket)
24
+ MysqlS3Backup::Backup.new(mysql, bucket, @timeout)
24
25
  end
25
-
26
+
26
27
  def self.from_yaml_file(file)
27
28
  new YAML.load_file(file)
28
29
  end
29
30
  end
30
- end
31
+ end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "airblade-mysql_s3_backup"
3
- s.version = "0.0.2"
3
+ s.version = "0.0.3"
4
4
 
5
5
  s.authors = ["Marc-Andre Cournoyer", "Andrew Stewart"]
6
6
  s.email = "boss@airbladesoftware.com"
@@ -14,4 +14,5 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.add_dependency "aws-s3"
16
16
  s.add_dependency "lockfile"
17
+ s.add_dependency "terminator"
17
18
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airblade-mysql_s3_backup
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 25
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 2
9
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
10
11
  platform: ruby
11
12
  authors:
12
13
  - Marc-Andre Cournoyer
@@ -15,16 +16,18 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2010-05-17 00:00:00 +01:00
19
+ date: 2010-08-18 00:00:00 +01:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
22
23
  name: aws-s3
23
24
  prerelease: false
24
25
  requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
25
27
  requirements:
26
28
  - - ">="
27
29
  - !ruby/object:Gem::Version
30
+ hash: 3
28
31
  segments:
29
32
  - 0
30
33
  version: "0"
@@ -34,14 +37,30 @@ dependencies:
34
37
  name: lockfile
35
38
  prerelease: false
36
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
37
41
  requirements:
38
42
  - - ">="
39
43
  - !ruby/object:Gem::Version
44
+ hash: 3
40
45
  segments:
41
46
  - 0
42
47
  version: "0"
43
48
  type: :runtime
44
49
  version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: terminator
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ type: :runtime
63
+ version_requirements: *id003
45
64
  description:
46
65
  email: boss@airbladesoftware.com
47
66
  executables:
@@ -51,6 +70,7 @@ extensions: []
51
70
  extra_rdoc_files: []
52
71
 
53
72
  files:
73
+ - airblade-mysql_s3_backup-0.0.3.gem
54
74
  - bin/mysql_s3_backup
55
75
  - config/sample.yml
56
76
  - lib/mysql_s3_backup/backup.rb
@@ -78,23 +98,27 @@ rdoc_options: []
78
98
  require_paths:
79
99
  - lib
80
100
  required_ruby_version: !ruby/object:Gem::Requirement
101
+ none: false
81
102
  requirements:
82
103
  - - ">="
83
104
  - !ruby/object:Gem::Version
105
+ hash: 3
84
106
  segments:
85
107
  - 0
86
108
  version: "0"
87
109
  required_rubygems_version: !ruby/object:Gem::Requirement
110
+ none: false
88
111
  requirements:
89
112
  - - ">="
90
113
  - !ruby/object:Gem::Version
114
+ hash: 3
91
115
  segments:
92
116
  - 0
93
117
  version: "0"
94
118
  requirements: []
95
119
 
96
120
  rubyforge_project:
97
- rubygems_version: 1.3.6
121
+ rubygems_version: 1.3.7
98
122
  signing_key:
99
123
  specification_version: 3
100
124
  summary: A simple backup script for Mysql and S3 with incremental backups.