pgslice 0.3.3 → 0.3.4
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +9 -3
- data/Rakefile +2 -1
- data/lib/pgslice.rb +40 -15
- data/lib/pgslice/version.rb +1 -1
- data/pgslice.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24b5596e6ea1c788ff5b367fb6ca05b0c76e626f
|
4
|
+
data.tar.gz: a6776fcdf658bd08f4a6adbeee3239b602eba91d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bb36f0e164418e57d54ebf9bb0192d75bf20977261fc6e83ff613d15afe3199aace4a0af343f8784518e6b4e460b245ba6029e61e427c5abd0405fff8a70acf
|
7
|
+
data.tar.gz: da11ed42838cd526441469108892379aadbee43bfcbaa657568b8d7c0721b19e5bc275af330bfd1e924c1bb54ae2109751ab62b207dc440332231b2277b7fa32
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -54,7 +54,13 @@ This will give you the `pgslice` command.
|
|
54
54
|
|
55
55
|
To sync data across different databases, check out [pgsync](https://github.com/ankane/pgsync).
|
56
56
|
|
57
|
-
6.
|
57
|
+
6. Analyze tables
|
58
|
+
|
59
|
+
```sh
|
60
|
+
pgslice analyze <table>
|
61
|
+
```
|
62
|
+
|
63
|
+
7. Swap the intermediate table with the original table
|
58
64
|
|
59
65
|
```sh
|
60
66
|
pgslice swap <table>
|
@@ -62,13 +68,13 @@ This will give you the `pgslice` command.
|
|
62
68
|
|
63
69
|
The original table is renamed `<table>_retired` and the intermediate table is renamed `<table>`.
|
64
70
|
|
65
|
-
|
71
|
+
8. Fill the rest (rows inserted between the first fill and the swap)
|
66
72
|
|
67
73
|
```sh
|
68
74
|
pgslice fill <table> --swapped
|
69
75
|
```
|
70
76
|
|
71
|
-
|
77
|
+
9. Back up the retired table with a tool like [pg_dump](https://www.postgresql.org/docs/current/static/app-pgdump.html) and drop it
|
72
78
|
|
73
79
|
```sql
|
74
80
|
pg_dump -c -Fc -t <table>_retired $PGSLICE_URL > <table>_retired.dump
|
data/Rakefile
CHANGED
data/lib/pgslice.rb
CHANGED
@@ -37,8 +37,10 @@ module PgSlice
|
|
37
37
|
unswap
|
38
38
|
when "unprep"
|
39
39
|
unprep
|
40
|
+
when "analyze"
|
41
|
+
analyze
|
40
42
|
when nil
|
41
|
-
log "Commands: add_partitions, fill, prep, swap, unprep, unswap"
|
43
|
+
log "Commands: add_partitions, analyze, fill, prep, swap, unprep, unswap"
|
42
44
|
else
|
43
45
|
abort "Unknown command: #{@command}"
|
44
46
|
end
|
@@ -242,6 +244,7 @@ CREATE OR REPLACE FUNCTION #{trigger_name}()
|
|
242
244
|
end
|
243
245
|
|
244
246
|
primary_key = self.primary_key(table)
|
247
|
+
abort "No primary key" unless primary_key
|
245
248
|
max_source_id = max_id(source_table, primary_key)
|
246
249
|
|
247
250
|
max_dest_id =
|
@@ -264,6 +267,11 @@ CREATE OR REPLACE FUNCTION #{trigger_name}()
|
|
264
267
|
|
265
268
|
i = 1
|
266
269
|
batch_count = ((max_source_id - starting_id) / batch_size.to_f).ceil
|
270
|
+
|
271
|
+
if batch_count == 0
|
272
|
+
log_sql "/* nothing to fill */"
|
273
|
+
end
|
274
|
+
|
267
275
|
while starting_id < max_source_id
|
268
276
|
where = "#{primary_key} > #{starting_id} AND #{primary_key} <= #{starting_id + batch_size}"
|
269
277
|
if starting_time
|
@@ -280,9 +288,7 @@ INSERT INTO #{dest_table} (#{fields})
|
|
280
288
|
WHERE #{where}
|
281
289
|
SQL
|
282
290
|
|
283
|
-
|
284
|
-
log_sql
|
285
|
-
execute(query)
|
291
|
+
run_query(query)
|
286
292
|
|
287
293
|
starting_id += batch_size
|
288
294
|
i += 1
|
@@ -339,6 +345,17 @@ INSERT INTO #{dest_table} (#{fields})
|
|
339
345
|
run_queries(queries)
|
340
346
|
end
|
341
347
|
|
348
|
+
def analyze
|
349
|
+
table = arguments.first
|
350
|
+
parent_table = options[:swapped] ? table : intermediate_name(table)
|
351
|
+
|
352
|
+
abort "Usage: pgslice analyze <table>" if arguments.length != 1
|
353
|
+
|
354
|
+
existing_tables = self.existing_tables(like: "#{table}_%").select { |t| /\A#{Regexp.escape("#{table}_")}\d{6,8}\z/.match(t) }
|
355
|
+
analyze_list = existing_tables + [parent_table]
|
356
|
+
run_queries_without_transaction analyze_list.map { |t| "ANALYZE VERBOSE #{t};" }
|
357
|
+
end
|
358
|
+
|
342
359
|
# arguments
|
343
360
|
|
344
361
|
def parse_args(args)
|
@@ -420,21 +437,29 @@ INSERT INTO #{dest_table} (#{fields})
|
|
420
437
|
execute("SET LOCAL client_min_messages TO warning") unless options[:dry_run]
|
421
438
|
log_sql "BEGIN;"
|
422
439
|
log_sql
|
423
|
-
queries
|
424
|
-
log_sql query
|
425
|
-
log_sql
|
426
|
-
unless options[:dry_run]
|
427
|
-
begin
|
428
|
-
execute(query)
|
429
|
-
rescue PG::ServerError => e
|
430
|
-
abort("#{e.class.name}: #{e.message}")
|
431
|
-
end
|
432
|
-
end
|
433
|
-
end
|
440
|
+
run_queries_without_transaction(queries)
|
434
441
|
log_sql "COMMIT;"
|
435
442
|
end
|
436
443
|
end
|
437
444
|
|
445
|
+
def run_query(query)
|
446
|
+
log_sql query
|
447
|
+
unless options[:dry_run]
|
448
|
+
begin
|
449
|
+
execute(query)
|
450
|
+
rescue PG::ServerError => e
|
451
|
+
abort("#{e.class.name}: #{e.message}")
|
452
|
+
end
|
453
|
+
end
|
454
|
+
log_sql
|
455
|
+
end
|
456
|
+
|
457
|
+
def run_queries_without_transaction(queries)
|
458
|
+
queries.each do |query|
|
459
|
+
run_query(query)
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
438
463
|
def server_version_num
|
439
464
|
execute("SHOW server_version_num")[0]["server_version_num"].to_i
|
440
465
|
end
|
data/lib/pgslice/version.rb
CHANGED
data/pgslice.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pgslice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slop
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description:
|
70
84
|
email:
|
71
85
|
- andrew@chartkick.com
|
@@ -103,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
117
|
version: '0'
|
104
118
|
requirements: []
|
105
119
|
rubyforge_project:
|
106
|
-
rubygems_version: 2.6.
|
120
|
+
rubygems_version: 2.6.11
|
107
121
|
signing_key:
|
108
122
|
specification_version: 4
|
109
123
|
summary: Postgres partitioning as easy as pie
|