arrival 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +3 -0
- data/Dockerfile +13 -11
- data/Dockerfile2.2 +39 -0
- data/Rakefile +3 -4
- data/arrival.gemspec +3 -4
- data/bin/console +1 -1
- data/config.yml +4 -0
- data/configuration.rb +1 -4
- data/db/config.yml +15 -0
- data/departure_error.log +80 -0
- data/docker-compose.yml +9 -7
- data/lib/active_record/connection_adapters/{percona_adapter.rb → arrival_adapter.rb} +14 -19
- data/lib/arrival.rb +28 -22
- data/lib/arrival/cli_generator.rb +27 -22
- data/lib/arrival/command.rb +20 -16
- data/lib/arrival/configuration.rb +3 -3
- data/lib/arrival/railtie.rb +14 -23
- data/lib/arrival/version.rb +1 -1
- data/replica/mysql_replica.env +2 -2
- data/setup_replication.sh +46 -0
- data/test_database.rb +20 -17
- metadata +13 -47
- data/.codeclimate.yml +0 -8
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
- data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- data/config.yml.erb +0 -4
- data/lib/arrival/dsn.rb +0 -24
- data/lib/arrival/log_sanitizers/password_sanitizer.rb +0 -22
- data/lib/arrival/logger_factory.rb +0 -16
- data/lib/arrival/null_logger.rb +0 -15
- data/lib/lhm.rb +0 -23
- data/lib/lhm/adapter.rb +0 -107
- data/lib/lhm/column_with_sql.rb +0 -96
- data/lib/lhm/column_with_type.rb +0 -29
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'arrival/dsn'
|
2
1
|
require 'arrival/option'
|
3
2
|
require 'arrival/alter_argument'
|
4
3
|
require 'arrival/connection_details'
|
@@ -12,41 +11,47 @@ module Arrival
|
|
12
11
|
# www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html#cmdoption-pt-online-schema-change--[no]check-alter # rubocop:disable Metrics/LineLength
|
13
12
|
#
|
14
13
|
class CliGenerator
|
15
|
-
# COMMAND_NAME = 'pt-online-schema-change'.freeze
|
16
14
|
COMMAND_NAME = 'gh-ost'.freeze
|
17
15
|
DEFAULT_OPTIONS = Set.new(
|
18
16
|
[
|
19
17
|
Option.new('execute'),
|
20
|
-
Option.new('
|
21
|
-
Option.new('
|
22
|
-
Option.new('
|
18
|
+
Option.new('max-load', 'Threads_running=150'),
|
19
|
+
Option.new('critical-load', 'Threads_running=4000'),
|
20
|
+
Option.new('chunk-size', '1000'),
|
21
|
+
Option.new('throttle-control-replicas', 'mysql-replica'),
|
22
|
+
Option.new('max-lag-millis', '3000'),
|
23
|
+
Option.new('user', 'replica_user'),
|
24
|
+
Option.new('password', 'replica_pass'),
|
25
|
+
Option.new('host', 'mysql-replica'),
|
26
|
+
Option.new('database', 'arrival_test'),
|
27
|
+
Option.new('dml-batch-size', '1000'),
|
28
|
+
Option.new('alter', '"CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"'),
|
29
|
+
Option.new('assume-rbr'),
|
30
|
+
Option.new('cut-over', 'default'),
|
31
|
+
Option.new('exact-rowcount'),
|
32
|
+
Option.new('concurrent-rowcount'),
|
33
|
+
Option.new('default-retries', '1200'),
|
34
|
+
Option.new('cut-over-lock-timeout-seconds', '10'),
|
35
|
+
Option.new('panic-flag-file', '/tmp/ghost.panic.downloads.flag'),
|
36
|
+
Option.new('assume-master-host', 'mysql-main'),
|
37
|
+
# Option.new('postpone-cut-over-flag-file', '/tmp/ghost.postpone.downloads.flag'),
|
38
|
+
Option.new('verbose'),
|
23
39
|
]
|
24
40
|
).freeze
|
25
41
|
|
26
|
-
# TODO: Better doc.
|
27
|
-
#
|
28
|
-
# Constructor. Specify any arguments to pass to pt-online-schema-change
|
29
|
-
# passing the PERCONA_ARGS env var when executing the migration
|
30
|
-
#
|
31
|
-
# @param connection_data [Hash]
|
32
|
-
def initialize(connection_details)
|
33
|
-
@connection_details = connection_details
|
34
|
-
end
|
35
|
-
|
36
42
|
# Generates the percona command. Fills all the connection credentials from
|
37
43
|
# the current AR connection, but that can be amended via ENV-vars:
|
38
44
|
# PERCONA_DB_HOST, PERCONA_DB_USER, PERCONA_DB_PASSWORD, PERCONA_DB_NAME
|
39
45
|
# Table name can't not be amended, it populates automatically from the
|
40
46
|
# migration data
|
41
47
|
#
|
42
|
-
# @param table_name [String]
|
48
|
+
# deprecated: @param table_name [String]
|
43
49
|
# @param statement [String] MySQL statement
|
44
50
|
# @return [String]
|
45
|
-
def generate(
|
51
|
+
def generate(_table_name=nil, statement)
|
46
52
|
alter_argument = AlterArgument.new(statement)
|
47
|
-
dsn = DSN.new(connection_details.database, table_name)
|
48
53
|
|
49
|
-
"#{command} #{all_options} #{
|
54
|
+
"#{command} #{all_options} #{alter_argument} #{Option.new("table", alter_argument.table_name)}"
|
50
55
|
end
|
51
56
|
|
52
57
|
# Generates the percona command for a raw MySQL statement. Fills all the
|
@@ -59,9 +64,9 @@ module Arrival
|
|
59
64
|
# @return [String]
|
60
65
|
def parse_statement(statement)
|
61
66
|
alter_argument = AlterArgument.new(statement)
|
62
|
-
dsn = DSN.new(connection_details.database, alter_argument.table_name)
|
67
|
+
# dsn = DSN.new(connection_details.database, alter_argument.table_name)
|
63
68
|
|
64
|
-
"#{command} #{all_options} #{
|
69
|
+
"#{command} #{all_options} #{alter_argument} #{Option.new("table", alter_argument.table_name)}"
|
65
70
|
end
|
66
71
|
|
67
72
|
private
|
@@ -77,7 +82,7 @@ module Arrival
|
|
77
82
|
# @return [String]
|
78
83
|
def all_options
|
79
84
|
env_variable_options = UserOptions.new
|
80
|
-
global_configuration_options = UserOptions.new(Arrival.configuration.
|
85
|
+
global_configuration_options = UserOptions.new(Arrival.configuration.global_arrival_args)
|
81
86
|
options = env_variable_options.merge(global_configuration_options).merge(DEFAULT_OPTIONS)
|
82
87
|
options.to_a.join(' ')
|
83
88
|
end
|
data/lib/arrival/command.rb
CHANGED
@@ -37,22 +37,25 @@ module Arrival
|
|
37
37
|
|
38
38
|
attr_reader :command_line, :error_log_path, :logger, :status
|
39
39
|
|
40
|
+
# TODO: Update comment
|
40
41
|
# Runs the command in a separate process, capturing its stdout and
|
41
42
|
# execution status
|
42
43
|
def run_in_process
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
44
|
+
stdout = system(full_command)
|
45
|
+
@exit_code = $?
|
46
|
+
# Open3.capture2(full_command) do |_stdin, stdout, waith_thr|
|
47
|
+
# begin
|
48
|
+
# loop do
|
49
|
+
# IO.select([stdout])
|
50
|
+
# data = stdout.read_nonblock(8192)
|
51
|
+
# logger.write_no_newline(data)
|
52
|
+
# end
|
53
|
+
# rescue EOFError # rubocop:disable Lint/HandleExceptions
|
54
|
+
# # noop
|
55
|
+
# ensure
|
56
|
+
# @status = waith_thr.value
|
57
|
+
# end
|
58
|
+
# end
|
56
59
|
end
|
57
60
|
|
58
61
|
# Builds the actual command including stderr redirection to the specified
|
@@ -69,9 +72,10 @@ module Arrival
|
|
69
72
|
# @raise [SignalError] if the spawned process received a signal
|
70
73
|
# @raise [CommandNotFoundError] if pt-online-schema-change can't be found
|
71
74
|
def validate_status!
|
72
|
-
|
73
|
-
raise
|
74
|
-
raise
|
75
|
+
# binding.pry
|
76
|
+
# raise SignalError.new(status) if status.signaled? # rubocop:disable Style/RaiseArgs
|
77
|
+
# raise CommandNotFoundError if status.exitstatus == COMMAND_NOT_FOUND
|
78
|
+
# raise Error, error_message unless status.success?
|
75
79
|
end
|
76
80
|
|
77
81
|
# Returns the error message that appeared in the process' stderr
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Arrival
|
2
2
|
class Configuration
|
3
|
-
attr_accessor :tmp_path, :
|
3
|
+
attr_accessor :tmp_path, :global_arrival_args
|
4
4
|
|
5
5
|
def initialize
|
6
6
|
@tmp_path = '.'.freeze
|
7
|
-
@error_log_filename = '
|
8
|
-
@
|
7
|
+
@error_log_filename = 'departure_error.log'.freeze
|
8
|
+
@global_arrival_args = nil
|
9
9
|
end
|
10
10
|
|
11
11
|
def error_log_path
|
data/lib/arrival/railtie.rb
CHANGED
@@ -1,28 +1,19 @@
|
|
1
|
-
require '
|
2
|
-
require 'lhm' # It's our own Lhm adapter, not the gem
|
3
|
-
require 'rails'
|
1
|
+
# require 'activerecord/railtie'
|
4
2
|
|
5
3
|
module Arrival
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# PerconaAdapter. By doing this, all later ActiveRecord methods called in
|
11
|
-
# the migration will use this adapter instead of Mysql2Adapter.
|
12
|
-
#
|
13
|
-
# It also patches ActiveRecord's #migrate method so that it patches LHM
|
14
|
-
# first. This will make migrations written with LHM to go through the
|
15
|
-
# regular Rails Migration DSL.
|
16
|
-
initializer 'arrival.configure_rails_initialization' do
|
17
|
-
ActiveSupport.on_load(:active_record) do
|
18
|
-
Arrival.load
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
initializer 'arrival.configure' do |app|
|
23
|
-
Arrival.configure do |config|
|
24
|
-
config.tmp_path = app.paths['tmp'].first
|
25
|
-
end
|
4
|
+
ActiveSupport.on_load(:active_record) do
|
5
|
+
Arrival.load
|
6
|
+
Arrival.configure do |config|
|
7
|
+
# config.tmp_path = app.paths['tmp'].first
|
26
8
|
end
|
27
9
|
end
|
10
|
+
# class Railtie < ActiveRecord::Railtie
|
11
|
+
# railtie_name :arrival
|
12
|
+
|
13
|
+
# initializer 'departure.configure_rails_initialization' do
|
14
|
+
# ActiveSupport.on_load(:active_record) do
|
15
|
+
# Departure.load
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
# end
|
28
19
|
end
|
data/lib/arrival/version.rb
CHANGED
data/replica/mysql_replica.env
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Note, by default mysql root does not have a password. You need to restart a server to bring MYSQL_ROOT_PASSWORD working. Use "docker-compose restart" command.
|
2
2
|
MYSQL_ROOT_PASSWORD=111
|
3
3
|
MYSQL_PORT=3306
|
4
|
-
MYSQL_USER=
|
5
|
-
MYSQL_PASSWORD=
|
4
|
+
MYSQL_USER=replica_user
|
5
|
+
MYSQL_PASSWORD=replica_pass
|
6
6
|
MYSQL_DATABASE=mydb
|
7
7
|
MYSQL_LOWER_CASE_TABLE_NAMES=0
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
docker-compose down
|
4
|
+
rm -rf ./main/data/*
|
5
|
+
rm -rf ./replica/data/*
|
6
|
+
docker-compose build
|
7
|
+
docker-compose up -d
|
8
|
+
|
9
|
+
until docker-compose exec mysql-main sh -c 'export MYSQL_PWD=111; mysql -u root -e ";"'
|
10
|
+
do
|
11
|
+
echo "Waiting for mysql-main database connection..."
|
12
|
+
sleep 4
|
13
|
+
done
|
14
|
+
|
15
|
+
priv_stmt='GRANT REPLICATION SLAVE ON *.* TO "replica_user"@"%" IDENTIFIED BY "replica_pass"; FLUSH PRIVILEGES;'
|
16
|
+
docker exec mysql-main sh -c "export MYSQL_PWD=111; mysql -u root -e '$priv_stmt'"
|
17
|
+
|
18
|
+
until docker-compose exec mysql-replica sh -c 'export MYSQL_PWD=111; mysql -u root -e ";"'
|
19
|
+
do
|
20
|
+
echo "Waiting for mysql-replica database connection..."
|
21
|
+
sleep 4
|
22
|
+
done
|
23
|
+
|
24
|
+
docker-ip() {
|
25
|
+
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
|
26
|
+
}
|
27
|
+
|
28
|
+
usage_statement='GRANT ALL PRIVILEGES ON *.* TO "replica_user"@"%"; FLUSH PRIVILEGES'
|
29
|
+
docker exec mysql-main sh -c "export MYSQL_PWD=111; mysql -u root -e '$usage_statement'"
|
30
|
+
|
31
|
+
|
32
|
+
MS_STATUS=`docker exec mysql-main sh -c 'export MYSQL_PWD=111; mysql -u root -e "SHOW MASTER STATUS"'`
|
33
|
+
CURRENT_LOG=`echo $MS_STATUS | awk '{print $6}'`
|
34
|
+
CURRENT_POS=`echo $MS_STATUS | awk '{print $7}'`
|
35
|
+
|
36
|
+
# CHANGE MASTER TO MASTER_HOST='172.22.0.2',MASTER_USER='replica_user',MASTER_PASSWORD='mydb_slave_pwd',MASTER_LOG_FILE='$CURRENT_LOG',MASTER_LOG_POS=$CURRENT_POS; START SLAVE;
|
37
|
+
|
38
|
+
start_slave_stmt="CHANGE MASTER TO MASTER_HOST='$(docker-ip mysql-main)',MASTER_USER='replica_user',MASTER_PASSWORD='replica_pass',MASTER_LOG_FILE='$CURRENT_LOG',MASTER_LOG_POS=$CURRENT_POS; START SLAVE;"
|
39
|
+
start_slave_cmd='export MYSQL_PWD=111; mysql -u root -e "'
|
40
|
+
start_slave_cmd+="$start_slave_stmt"
|
41
|
+
start_slave_cmd+='"'
|
42
|
+
docker exec mysql-replica sh -c "$start_slave_cmd"
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
docker exec mysql-replica sh -c "export MYSQL_PWD=111; mysql -u root -e 'SHOW SLAVE STATUS \G'"
|
data/test_database.rb
CHANGED
@@ -6,26 +6,24 @@ require 'active_record/connection_adapters/mysql2_adapter'
|
|
6
6
|
# the tests.
|
7
7
|
#
|
8
8
|
class TestDatabase
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@config = config
|
14
|
-
@database = config['database']
|
9
|
+
attr_reader :env_config
|
10
|
+
|
11
|
+
def initialize(_opts = {})
|
12
|
+
@database = env_config["database"]
|
15
13
|
end
|
16
14
|
|
17
15
|
# Creates the test database, the schema_migrations and the comments tables.
|
18
16
|
# It drops any of them if they already exist
|
19
17
|
def setup
|
20
18
|
setup_test_database
|
21
|
-
drop_and_create_schema_migrations_table
|
19
|
+
# drop_and_create_schema_migrations_table
|
22
20
|
end
|
23
21
|
|
24
22
|
# Creates the #{@database} database and the comments table in it.
|
25
23
|
# Before, it drops both if they already exist
|
26
24
|
def setup_test_database
|
27
25
|
drop_and_create_test_database
|
28
|
-
drop_and_create_comments_table
|
26
|
+
# drop_and_create_comments_table
|
29
27
|
end
|
30
28
|
|
31
29
|
# Creates the ActiveRecord's schema_migrations table required for
|
@@ -40,6 +38,10 @@ class TestDatabase
|
|
40
38
|
run_commands(sql)
|
41
39
|
end
|
42
40
|
|
41
|
+
def env_config
|
42
|
+
config.dup[ENV['RAKE_ENV'] || "development"]
|
43
|
+
end
|
44
|
+
|
43
45
|
private
|
44
46
|
|
45
47
|
attr_reader :config, :database
|
@@ -64,17 +66,18 @@ class TestDatabase
|
|
64
66
|
end
|
65
67
|
|
66
68
|
def run_commands(sql)
|
67
|
-
|
68
|
-
sql.each { |str|
|
69
|
-
|
69
|
+
connection.execute('START TRANSACTION')
|
70
|
+
sql.each { |str| connection.execute(str) }
|
71
|
+
connection.execute('COMMIT')
|
70
72
|
end
|
71
73
|
|
72
|
-
def
|
73
|
-
@
|
74
|
-
|
75
|
-
username: @config['username'],
|
76
|
-
password: @config['password'],
|
77
|
-
reconnect: true
|
74
|
+
def connection
|
75
|
+
@connection ||= ActiveRecord::Base.mysql2_connection(
|
76
|
+
env_config.reject { |k, _v| k == "database" }
|
78
77
|
)
|
79
78
|
end
|
79
|
+
|
80
|
+
def config
|
81
|
+
@config ||= YAML.safe_load(File.read('db/config.yml')).freeze
|
82
|
+
end
|
80
83
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arrival
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arno Fleming
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: railties
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 5.2.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 5.2.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: activerecord
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -47,7 +33,7 @@ dependencies:
|
|
47
33
|
version: 0.4.0
|
48
34
|
- - "<="
|
49
35
|
- !ruby/object:Gem::Version
|
50
|
-
version: 0.5.
|
36
|
+
version: 0.5.3
|
51
37
|
type: :runtime
|
52
38
|
prerelease: false
|
53
39
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -57,7 +43,7 @@ dependencies:
|
|
57
43
|
version: 0.4.0
|
58
44
|
- - "<="
|
59
45
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.5.
|
46
|
+
version: 0.5.3
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: rake
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,32 +94,18 @@ dependencies:
|
|
108
94
|
version: '1.2'
|
109
95
|
- !ruby/object:Gem::Dependency
|
110
96
|
name: pry
|
111
|
-
requirement: !ruby/object:Gem::Requirement
|
112
|
-
requirements:
|
113
|
-
- - ">="
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: '0'
|
116
|
-
type: :development
|
117
|
-
prerelease: false
|
118
|
-
version_requirements: !ruby/object:Gem::Requirement
|
119
|
-
requirements:
|
120
|
-
- - ">="
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version: '0'
|
123
|
-
- !ruby/object:Gem::Dependency
|
124
|
-
name: climate_control
|
125
97
|
requirement: !ruby/object:Gem::Requirement
|
126
98
|
requirements:
|
127
99
|
- - "~>"
|
128
100
|
- !ruby/object:Gem::Version
|
129
|
-
version: 0.
|
101
|
+
version: 0.12.2
|
130
102
|
type: :development
|
131
103
|
prerelease: false
|
132
104
|
version_requirements: !ruby/object:Gem::Requirement
|
133
105
|
requirements:
|
134
106
|
- - "~>"
|
135
107
|
- !ruby/object:Gem::Version
|
136
|
-
version: 0.
|
108
|
+
version: 0.12.2
|
137
109
|
description: Execute your ActiveRecord migrations with Github's `gh-ost`, a triggerless
|
138
110
|
online schema changer
|
139
111
|
email:
|
@@ -142,9 +114,7 @@ executables: []
|
|
142
114
|
extensions: []
|
143
115
|
extra_rdoc_files: []
|
144
116
|
files:
|
145
|
-
- ".
|
146
|
-
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
147
|
-
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
117
|
+
- ".dockerignore"
|
148
118
|
- ".gitignore"
|
149
119
|
- ".rspec"
|
150
120
|
- ".rubocop.yml"
|
@@ -152,6 +122,7 @@ files:
|
|
152
122
|
- CHANGELOG.md
|
153
123
|
- CODE_OF_CONDUCT.md
|
154
124
|
- Dockerfile
|
125
|
+
- Dockerfile2.2
|
155
126
|
- Gemfile
|
156
127
|
- LICENSE.txt
|
157
128
|
- README.md
|
@@ -162,37 +133,32 @@ files:
|
|
162
133
|
- bin/console
|
163
134
|
- bin/rspec
|
164
135
|
- bin/setup
|
165
|
-
- config.yml
|
136
|
+
- config.yml
|
166
137
|
- configuration.rb
|
138
|
+
- db/config.yml
|
139
|
+
- departure_error.log
|
167
140
|
- docker-compose-inspiration.yml
|
168
141
|
- docker-compose.yml
|
142
|
+
- lib/active_record/connection_adapters/arrival_adapter.rb
|
169
143
|
- lib/active_record/connection_adapters/for_alter.rb
|
170
|
-
- lib/active_record/connection_adapters/percona_adapter.rb
|
171
144
|
- lib/arrival.rb
|
172
145
|
- lib/arrival/alter_argument.rb
|
173
146
|
- lib/arrival/cli_generator.rb
|
174
147
|
- lib/arrival/command.rb
|
175
148
|
- lib/arrival/configuration.rb
|
176
149
|
- lib/arrival/connection_details.rb
|
177
|
-
- lib/arrival/dsn.rb
|
178
150
|
- lib/arrival/errors.rb
|
179
|
-
- lib/arrival/log_sanitizers/password_sanitizer.rb
|
180
151
|
- lib/arrival/logger.rb
|
181
|
-
- lib/arrival/logger_factory.rb
|
182
|
-
- lib/arrival/null_logger.rb
|
183
152
|
- lib/arrival/option.rb
|
184
153
|
- lib/arrival/railtie.rb
|
185
154
|
- lib/arrival/runner.rb
|
186
155
|
- lib/arrival/user_options.rb
|
187
156
|
- lib/arrival/version.rb
|
188
|
-
- lib/lhm.rb
|
189
|
-
- lib/lhm/adapter.rb
|
190
|
-
- lib/lhm/column_with_sql.rb
|
191
|
-
- lib/lhm/column_with_type.rb
|
192
157
|
- main/conf/mysql.conf.cnf
|
193
158
|
- main/mysql_main.env
|
194
159
|
- replica/conf/mysql.conf.cnf
|
195
160
|
- replica/mysql_replica.env
|
161
|
+
- setup_replication.sh
|
196
162
|
- test_database.rb
|
197
163
|
homepage: https://github.com/wetransfer/arrival
|
198
164
|
licenses:
|