mys3ql 1.2.1 → 1.3.0
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.
- checksums.yaml +5 -5
- data/README.md +6 -0
- data/bin/mys3ql +11 -4
- data/lib/mys3ql/conductor.rb +36 -16
- data/lib/mys3ql/mysql.rb +2 -2
- data/lib/mys3ql/s3.rb +8 -2
- data/lib/mys3ql/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 86d0a66ce7dab918b298c22eb4d667df2cb9ac7c
|
4
|
+
data.tar.gz: cd9527db20ae5a07349b3456e544a0aa3552f9bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25abe9f3cc7daee801c8402dbd07b8827608d139ed4a2ca95ec089ed1a7d4335dfbfaa8fd30f10ea06118159d3513fa90c866ac9fa09976b48dc8d05645ac105
|
7
|
+
data.tar.gz: 340d29d1230eda51d4408b8f5fb3597ed7da31276171608469092c10fbe04ceb5f3e0640f3758cbdbe14c2af99804bc5ebb81dd27e6097c661c492d4339d56f4
|
data/README.md
CHANGED
@@ -21,6 +21,12 @@ To restore from the latest backup (plus binlogs if present):
|
|
21
21
|
|
22
22
|
$ mys3ql restore
|
23
23
|
|
24
|
+
To restore a recent subset of binlogs:
|
25
|
+
|
26
|
+
$ mys3ql restore --after NUMBER
|
27
|
+
|
28
|
+
– where NUMBER is a 6-digit binlog file number.
|
29
|
+
|
24
30
|
By default mys3ql looks for a configuration file at `~/.mys3ql`. You can override this like so:
|
25
31
|
|
26
32
|
$ mys3ql [command] -c FILE
|
data/bin/mys3ql
CHANGED
@@ -6,14 +6,21 @@ require 'optparse'
|
|
6
6
|
|
7
7
|
params = {}
|
8
8
|
op = OptionParser.new do |opts|
|
9
|
-
opts.banner = 'Usage: mys3ql <full|incremental|restore> [<
|
9
|
+
opts.banner = 'Usage: mys3ql <full|incremental|restore> [<options>]'
|
10
|
+
|
11
|
+
opts.separator ''
|
12
|
+
opts.separator 'Common options:'
|
10
13
|
|
11
14
|
opts.on('-c', '--config CONFIG', 'Load configuration from YAML file (default ~/.mys3ql)') { |v| params[:config] = v }
|
12
|
-
opts.
|
13
|
-
opts.
|
15
|
+
opts.on('-d', '--debug', 'Be verbose') { |v| params[:debug] = v }
|
16
|
+
opts.on '-v', '--version', 'Print version' do
|
14
17
|
puts "mys3ql v#{Mys3ql::VERSION}"
|
15
18
|
exit
|
16
19
|
end
|
20
|
+
|
21
|
+
opts.separator ''
|
22
|
+
opts.separator 'restore options:'
|
23
|
+
opts.on('-a', '--after NUMBER', 'Use only the subset of binary logs after NUMBER') { |v| params[:after] = v }
|
17
24
|
end
|
18
25
|
op.parse! ARGV
|
19
26
|
|
@@ -23,4 +30,4 @@ unless %w[full incremental restore].include? params[:command]
|
|
23
30
|
exit 1
|
24
31
|
end
|
25
32
|
|
26
|
-
Mys3ql::Conductor.run params
|
33
|
+
Mys3ql::Conductor.run params
|
data/lib/mys3ql/conductor.rb
CHANGED
@@ -6,10 +6,16 @@ require 'mys3ql/s3'
|
|
6
6
|
module Mys3ql
|
7
7
|
class Conductor
|
8
8
|
|
9
|
-
def self.run(
|
10
|
-
conductor = Conductor.new(config)
|
11
|
-
conductor.debug = debug
|
12
|
-
|
9
|
+
def self.run(args)
|
10
|
+
conductor = Conductor.new args.fetch(:config, nil)
|
11
|
+
conductor.debug = args.fetch(:debug, false)
|
12
|
+
|
13
|
+
command = args.fetch(:command)
|
14
|
+
if command == 'restore'
|
15
|
+
conductor.restore args.fetch(:after, nil)
|
16
|
+
else
|
17
|
+
conductor.send command
|
18
|
+
end
|
13
19
|
end
|
14
20
|
|
15
21
|
def initialize(config_file = nil)
|
@@ -38,22 +44,36 @@ module Mys3ql
|
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
41
|
-
#
|
42
|
-
#
|
47
|
+
# When 'after' is nil:
|
48
|
+
#
|
49
|
+
# - downloads the latest dump from S3 and loads it into the database;
|
50
|
+
# - downloads each binary log from S3 and loads it into the database.
|
51
|
+
#
|
52
|
+
# When 'after' is given:
|
53
|
+
#
|
54
|
+
# - downloads each binary log following 'after' from S3 and loads it into the database.
|
55
|
+
#
|
43
56
|
# Downloaded files are removed from the file system.
|
44
|
-
def restore
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
57
|
+
def restore(after = nil)
|
58
|
+
unless after
|
59
|
+
# get latest dump
|
60
|
+
with_temp_file do |file|
|
61
|
+
@s3.retrieve :latest, file
|
62
|
+
@mysql.restore file
|
63
|
+
end
|
49
64
|
end
|
50
65
|
|
51
|
-
# apply
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
66
|
+
# apply bin logs
|
67
|
+
begin
|
68
|
+
tmpfiles = []
|
69
|
+
@s3.each_bin_log(after) do |log|
|
70
|
+
file = Tempfile.new 'mys3ql'
|
71
|
+
tmpfiles << file
|
72
|
+
@s3.retrieve log, file.path
|
56
73
|
end
|
74
|
+
@mysql.apply_bin_logs tmpfiles.map(&:path)
|
75
|
+
ensure
|
76
|
+
tmpfiles.each &:close!
|
57
77
|
end
|
58
78
|
|
59
79
|
# NOTE: not sure about this:
|
data/lib/mys3ql/mysql.rb
CHANGED
@@ -60,8 +60,8 @@ module Mys3ql
|
|
60
60
|
run "gunzip -c #{file} | #{@config.bin_path}mysql #{cli_options}"
|
61
61
|
end
|
62
62
|
|
63
|
-
def
|
64
|
-
cmd = "#{@config.bin_path}mysqlbinlog --database=#{@config.database} #{
|
63
|
+
def apply_bin_logs(*files)
|
64
|
+
cmd = "#{@config.bin_path}mysqlbinlog --database=#{@config.database} #{files.join ' '}"
|
65
65
|
cmd += " | #{@config.bin_path}mysql -u'#{@config.user}'"
|
66
66
|
cmd += " -p'#{@config.password}'" if @config.password
|
67
67
|
run cmd
|
data/lib/mys3ql/s3.rb
CHANGED
@@ -26,9 +26,15 @@ module Mys3ql
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def each_bin_log(&block)
|
29
|
+
def each_bin_log(after = nil, &block)
|
30
|
+
if after && after !~ /^\d{6}$/
|
31
|
+
puts 'Binary log file number must be 6 digits.'
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
|
30
35
|
bucket.objects(prefix: bin_logs_prefix)
|
31
36
|
.sort_by { |file| file.key[/\d+/].to_i }
|
37
|
+
.select { |file| after.nil? || (file.key[/\d+/].to_i > after.to_i) }
|
32
38
|
.each do |file|
|
33
39
|
yield file
|
34
40
|
end
|
@@ -52,7 +58,7 @@ module Mys3ql
|
|
52
58
|
|
53
59
|
def save(local_file_name, s3_key)
|
54
60
|
if bucket.object(s3_key).exists?
|
55
|
-
log "s3: skipped #{local_file_name} -
|
61
|
+
log "s3: skipped #{local_file_name} - already exists"
|
56
62
|
return
|
57
63
|
end
|
58
64
|
|
data/lib/mys3ql/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mys3ql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Stewart
|
@@ -77,7 +77,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
77
|
- !ruby/object:Gem::Version
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
|
-
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 2.5.2.3
|
81
82
|
signing_key:
|
82
83
|
specification_version: 4
|
83
84
|
summary: Simple backup of your MySql database onto Amazon S3.
|