pgdexter 0.3.5 → 0.3.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -15
- data/LICENSE.txt +1 -1
- data/README.md +10 -10
- data/exe/dexter +4 -7
- data/lib/dexter.rb +8 -4
- data/lib/dexter/client.rb +19 -12
- data/lib/dexter/csv_log_parser.rb +1 -1
- data/lib/dexter/indexer.rb +19 -11
- data/lib/dexter/logging.rb +18 -3
- data/lib/dexter/processor.rb +2 -2
- data/lib/dexter/sql_log_parser.rb +1 -1
- data/lib/dexter/version.rb +1 -1
- metadata +19 -69
- data/.gitignore +0 -9
- data/.travis.yml +0 -18
- data/Gemfile +0 -4
- data/Rakefile +0 -11
- data/guides/Hosted-Postgres.md +0 -102
- data/guides/Linux.md +0 -72
- data/pgdexter.gemspec +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c604783bd2ae16f3bb648176f96664b31fb6ac50a0094e3d34df195e0a4bb9ee
|
4
|
+
data.tar.gz: 299487f0880aa486c2678063f1f6bed4fc2398603b5fd9f2ebeb1c27b31cfb26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cbec0f51a8b884d468c92ebca35a47267b82c30c86b281052ae15cd25aa3499d9ad26b4c27fb1c8232a8ecce28bfbf656a44a099d5e28bea6ccc9523f01abe4
|
7
|
+
data.tar.gz: 8a72520c058109b0f63c41efe79bc91c174fffdca423940c8201a28e94bd4465d4110d9918ba39c505b0fc674ce6e819108d4837ff416f5befaaff9c2bdff4e9
|
data/CHANGELOG.md
CHANGED
@@ -1,34 +1,55 @@
|
|
1
|
-
## 0.3.
|
1
|
+
## 0.3.10 (2021-03-25)
|
2
|
+
|
3
|
+
- Require pg_query < 2
|
4
|
+
|
5
|
+
## 0.3.9 (2020-11-23)
|
6
|
+
|
7
|
+
- Added `--tablespace` option
|
8
|
+
|
9
|
+
## 0.3.8 (2020-08-17)
|
10
|
+
|
11
|
+
- Colorize output
|
12
|
+
- Fixed error when unable to parse view definitions
|
13
|
+
|
14
|
+
## 0.3.7 (2020-07-10)
|
15
|
+
|
16
|
+
- Fixed help output
|
17
|
+
|
18
|
+
## 0.3.6 (2020-03-30)
|
19
|
+
|
20
|
+
- Fixed warning with Ruby 2.7
|
21
|
+
|
22
|
+
## 0.3.5 (2018-04-30)
|
2
23
|
|
3
24
|
- Added `sql` input format
|
4
25
|
- Fixed error for queries with double dash comments
|
5
26
|
- Fixed connection threading issue with `--pg-stat-activity` option
|
6
27
|
|
7
|
-
## 0.3.4
|
28
|
+
## 0.3.4 (2018-04-09)
|
8
29
|
|
9
30
|
- Fixed `--username` option
|
10
31
|
- Fixed `JSON::NestingError`
|
11
32
|
- Added `--pg-stat-activity` option
|
12
33
|
|
13
|
-
## 0.3.3
|
34
|
+
## 0.3.3 (2018-02-22)
|
14
35
|
|
15
36
|
- Added support for views and materialized views
|
16
37
|
- Better handle case when multiple indexes are found for a query
|
17
38
|
- Added `--min-cost-savings-pct` option
|
18
39
|
|
19
|
-
## 0.3.2
|
40
|
+
## 0.3.2 (2018-01-04)
|
20
41
|
|
21
42
|
- Fixed parsing issue with named prepared statements
|
22
43
|
- Fixed parsing issue with multiline queries in csv format
|
23
44
|
- Better explanations for indexing decisions
|
24
45
|
|
25
|
-
## 0.3.1
|
46
|
+
## 0.3.1 (2017-12-28)
|
26
47
|
|
27
48
|
- Added support for queries with bind variables
|
28
49
|
- Fixed error with streaming logs as csv format
|
29
50
|
- Handle malformed CSV gracefully
|
30
51
|
|
31
|
-
## 0.3.0
|
52
|
+
## 0.3.0 (2017-12-22)
|
32
53
|
|
33
54
|
- Added support for schemas
|
34
55
|
- Added support for csv format
|
@@ -36,12 +57,12 @@
|
|
36
57
|
- Added `--min-calls` option
|
37
58
|
- Fixed debug output when indexes not found
|
38
59
|
|
39
|
-
## 0.2.1
|
60
|
+
## 0.2.1 (2017-09-02)
|
40
61
|
|
41
62
|
- Fixed bad suggestions
|
42
63
|
- Improved debugging output
|
43
64
|
|
44
|
-
## 0.2.0
|
65
|
+
## 0.2.0 (2017-08-27)
|
45
66
|
|
46
67
|
- Added same connection options as `psql`
|
47
68
|
- Added support for multiple files
|
@@ -52,38 +73,38 @@ Breaking
|
|
52
73
|
|
53
74
|
- `-h` option changed to `--host` instead of `--help` for consistency with `psql`
|
54
75
|
|
55
|
-
## 0.1.6
|
76
|
+
## 0.1.6 (2017-08-26)
|
56
77
|
|
57
78
|
- Significant performance improvements
|
58
79
|
- Added `--include` option
|
59
80
|
|
60
|
-
## 0.1.5
|
81
|
+
## 0.1.5 (2017-08-14)
|
61
82
|
|
62
83
|
- Added support for non-`SELECT` queries
|
63
84
|
- Added `--pg-stat-statements` option
|
64
85
|
- Added advisory locks
|
65
86
|
- Added support for running as a non-superuser
|
66
87
|
|
67
|
-
## 0.1.4
|
88
|
+
## 0.1.4 (2017-07-02)
|
68
89
|
|
69
90
|
- Added support for multicolumn indexes
|
70
91
|
|
71
|
-
## 0.1.3
|
92
|
+
## 0.1.3 (2017-06-30)
|
72
93
|
|
73
94
|
- Fixed error with non-lowercase columns
|
74
95
|
- Fixed error with `json` columns
|
75
96
|
|
76
|
-
## 0.1.2
|
97
|
+
## 0.1.2 (2017-06-26)
|
77
98
|
|
78
99
|
- Added `--exclude` option
|
79
100
|
- Added `--log-sql` option
|
80
101
|
|
81
|
-
## 0.1.1
|
102
|
+
## 0.1.1 (2017-06-25)
|
82
103
|
|
83
104
|
- Added `--interval` option
|
84
105
|
- Added `--min-time` option
|
85
106
|
- Added `--log-level` option
|
86
107
|
|
87
|
-
## 0.1.0
|
108
|
+
## 0.1.0 (2017-06-24)
|
88
109
|
|
89
110
|
- Launched
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
The automatic indexer for Postgres
|
4
4
|
|
5
|
-
[Read about how it works](https://
|
5
|
+
[Read about how it works](https://ankane.org/introducing-dexter)
|
6
6
|
|
7
|
-
[![Build Status](https://
|
7
|
+
[![Build Status](https://github.com/ankane/dexter/workflows/build/badge.svg?branch=master)](https://github.com/ankane/dexter/actions)
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -12,8 +12,8 @@ First, install [HypoPG](https://github.com/HypoPG/hypopg) on your database serve
|
|
12
12
|
|
13
13
|
```sh
|
14
14
|
cd /tmp
|
15
|
-
curl -L https://github.com/HypoPG/hypopg/archive/1.
|
16
|
-
cd hypopg-1.
|
15
|
+
curl -L https://github.com/HypoPG/hypopg/archive/1.2.0.tar.gz | tar xz
|
16
|
+
cd hypopg-1.2.0
|
17
17
|
make
|
18
18
|
make install # may need sudo
|
19
19
|
```
|
@@ -146,10 +146,10 @@ dexter --interval 60 # seconds
|
|
146
146
|
|
147
147
|
## Examples
|
148
148
|
|
149
|
-
Ubuntu with PostgreSQL
|
149
|
+
Ubuntu with PostgreSQL 12
|
150
150
|
|
151
151
|
```sh
|
152
|
-
tail -F -n +1 /var/log/postgresql/postgresql-
|
152
|
+
tail -F -n +1 /var/log/postgresql/postgresql-12-main.log | sudo -u postgres dexter dbname
|
153
153
|
```
|
154
154
|
|
155
155
|
Homebrew on Mac
|
@@ -228,18 +228,18 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
|
|
228
228
|
- Write, clarify, or fix documentation
|
229
229
|
- Suggest or add new features
|
230
230
|
|
231
|
-
To get started, run:
|
231
|
+
To get started with development, run:
|
232
232
|
|
233
233
|
```sh
|
234
234
|
git clone https://github.com/ankane/dexter.git
|
235
235
|
cd dexter
|
236
|
-
bundle
|
237
|
-
rake install
|
236
|
+
bundle install
|
237
|
+
bundle exec rake install
|
238
238
|
```
|
239
239
|
|
240
240
|
To run tests, use:
|
241
241
|
|
242
242
|
```sh
|
243
243
|
createdb dexter_test
|
244
|
-
rake test
|
244
|
+
bundle exec rake test
|
245
245
|
```
|
data/exe/dexter
CHANGED
data/lib/dexter.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
|
2
|
-
require "slop"
|
1
|
+
# dependencies
|
3
2
|
require "pg"
|
4
3
|
require "pg_query"
|
5
|
-
require "
|
4
|
+
require "slop"
|
5
|
+
|
6
|
+
# stdlib
|
6
7
|
require "set"
|
7
|
-
require "
|
8
|
+
require "time"
|
9
|
+
|
10
|
+
# modules
|
11
|
+
require "dexter/version"
|
8
12
|
require "dexter/logging"
|
9
13
|
require "dexter/client"
|
10
14
|
require "dexter/collector"
|
data/lib/dexter/client.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
module Dexter
|
2
2
|
class Client
|
3
|
+
extend Logging
|
3
4
|
include Logging
|
4
5
|
|
5
6
|
attr_reader :arguments, :options
|
6
7
|
|
8
|
+
def self.start
|
9
|
+
Dexter::Client.new(ARGV).perform
|
10
|
+
rescue Dexter::Abort, PG::UndefinedFile => e
|
11
|
+
abort colorize(e.message.strip, :red)
|
12
|
+
end
|
13
|
+
|
7
14
|
def initialize(args)
|
8
15
|
@arguments, @options = parse_args(args)
|
9
16
|
end
|
@@ -31,9 +38,9 @@ module Dexter
|
|
31
38
|
def parse_args(args)
|
32
39
|
opts = Slop.parse(args) do |o|
|
33
40
|
o.banner = %(Usage:
|
34
|
-
dexter [options]
|
35
|
-
|
36
|
-
Options:
|
41
|
+
dexter [options])
|
42
|
+
o.separator ""
|
43
|
+
o.separator "Options:"
|
37
44
|
o.boolean "--analyze", "analyze tables that haven't been analyzed in the past hour", default: false
|
38
45
|
o.boolean "--create", "create indexes", default: false
|
39
46
|
o.array "--exclude", "prevent specific tables from being indexed"
|
@@ -49,9 +56,7 @@ Options:)
|
|
49
56
|
o.boolean "--pg-stat-activity", "use pg_stat_activity", default: false, help: false
|
50
57
|
o.boolean "--pg-stat-statements", "use pg_stat_statements", default: false, help: false
|
51
58
|
o.string "-s", "--statement", "process a single statement"
|
52
|
-
|
53
|
-
o.separator ""
|
54
|
-
o.separator "Connection options:"
|
59
|
+
o.string "--tablespace", "tablespace to create indexes"
|
55
60
|
o.on "-v", "--version", "print the version" do
|
56
61
|
log Dexter::VERSION
|
57
62
|
exit
|
@@ -60,10 +65,12 @@ Options:)
|
|
60
65
|
log o
|
61
66
|
exit
|
62
67
|
end
|
63
|
-
o.
|
64
|
-
o.
|
65
|
-
o.string "-
|
66
|
-
o.
|
68
|
+
o.separator ""
|
69
|
+
o.separator "Connection options:"
|
70
|
+
o.string "-d", "--dbname", "database name"
|
71
|
+
o.string "-h", "--host", "database host"
|
72
|
+
o.integer "-p", "--port", "database port"
|
73
|
+
o.string "-U", "--username", "database user"
|
67
74
|
end
|
68
75
|
|
69
76
|
arguments = opts.arguments
|
@@ -73,11 +80,11 @@ Options:)
|
|
73
80
|
|
74
81
|
# TODO don't use global var
|
75
82
|
$log_level = options[:log_level].to_s.downcase
|
76
|
-
|
83
|
+
raise Dexter::Abort, "Unknown log level" unless ["error", "info", "debug", "debug2", "debug3"].include?($log_level)
|
77
84
|
|
78
85
|
[arguments, options]
|
79
86
|
rescue Slop::Error => e
|
80
|
-
|
87
|
+
raise Dexter::Abort, e.message
|
81
88
|
end
|
82
89
|
end
|
83
90
|
end
|
data/lib/dexter/indexer.rb
CHANGED
@@ -4,6 +4,7 @@ module Dexter
|
|
4
4
|
|
5
5
|
def initialize(options)
|
6
6
|
@create = options[:create]
|
7
|
+
@tablespace = options[:tablespace]
|
7
8
|
@log_level = options[:log_level]
|
8
9
|
@exclude_tables = options[:exclude]
|
9
10
|
@include_tables = Array(options[:include].split(",")) if options[:include]
|
@@ -107,13 +108,13 @@ module Dexter
|
|
107
108
|
analyze_tables(tables) if tables.any? && (@analyze || @log_level == "debug2")
|
108
109
|
|
109
110
|
# create hypothetical indexes and explain queries
|
110
|
-
candidates = tables.any? ? create_hypothetical_indexes(queries.select(&:candidate_tables)
|
111
|
+
candidates = tables.any? ? create_hypothetical_indexes(queries.select(&:candidate_tables)) : {}
|
111
112
|
|
112
113
|
# see if new indexes were used and meet bar
|
113
114
|
new_indexes = determine_indexes(queries, candidates, tables)
|
114
115
|
|
115
116
|
# display and create new indexes
|
116
|
-
show_and_create_indexes(new_indexes, queries
|
117
|
+
show_and_create_indexes(new_indexes, queries)
|
117
118
|
end
|
118
119
|
|
119
120
|
private
|
@@ -123,9 +124,9 @@ module Dexter
|
|
123
124
|
begin
|
124
125
|
execute("CREATE EXTENSION IF NOT EXISTS hypopg")
|
125
126
|
rescue PG::UndefinedFile
|
126
|
-
|
127
|
+
raise Dexter::Abort, "Install HypoPG first: https://github.com/ankane/dexter#installation"
|
127
128
|
rescue PG::InsufficientPrivilege
|
128
|
-
|
129
|
+
raise Dexter::Abort, "Use a superuser to run: CREATE EXTENSION hypopg"
|
129
130
|
end
|
130
131
|
end
|
131
132
|
|
@@ -193,7 +194,7 @@ module Dexter
|
|
193
194
|
end
|
194
195
|
end
|
195
196
|
|
196
|
-
def create_hypothetical_indexes(queries
|
197
|
+
def create_hypothetical_indexes(queries)
|
197
198
|
candidates = {}
|
198
199
|
|
199
200
|
# get initial costs for queries
|
@@ -417,11 +418,11 @@ module Dexter
|
|
417
418
|
end
|
418
419
|
end
|
419
420
|
|
420
|
-
def show_and_create_indexes(new_indexes, queries
|
421
|
+
def show_and_create_indexes(new_indexes, queries)
|
421
422
|
# print summary
|
422
423
|
if new_indexes.any?
|
423
424
|
new_indexes.each do |index|
|
424
|
-
log "Index found: #{index[:table]} (#{index[:columns].join(", ")})"
|
425
|
+
log colorize("Index found: #{index[:table]} (#{index[:columns].join(", ")})", :green)
|
425
426
|
end
|
426
427
|
else
|
427
428
|
log "No new indexes found"
|
@@ -479,7 +480,8 @@ module Dexter
|
|
479
480
|
with_advisory_lock do
|
480
481
|
new_indexes.each do |index|
|
481
482
|
unless index_exists?(index)
|
482
|
-
statement = "CREATE INDEX CONCURRENTLY ON #{quote_ident(index[:table])} (#{index[:columns].map { |c| quote_ident(c) }.join(", ")})"
|
483
|
+
statement = String.new("CREATE INDEX CONCURRENTLY ON #{quote_ident(index[:table])} (#{index[:columns].map { |c| quote_ident(c) }.join(", ")})")
|
484
|
+
statement << " TABLESPACE #{quote_ident(@tablespace)}" if @tablespace
|
483
485
|
log "Creating index: #{statement}"
|
484
486
|
started_at = Time.now
|
485
487
|
begin
|
@@ -515,7 +517,7 @@ module Dexter
|
|
515
517
|
PG::Connection.new(config)
|
516
518
|
end
|
517
519
|
rescue PG::ConnectionBad => e
|
518
|
-
|
520
|
+
raise Dexter::Abort, e.message
|
519
521
|
end
|
520
522
|
|
521
523
|
def execute(query, pretty: true)
|
@@ -527,7 +529,7 @@ module Dexter
|
|
527
529
|
# as an extra defense against SQL-injection attacks.
|
528
530
|
# https://www.postgresql.org/docs/current/static/libpq-exec.html
|
529
531
|
query = squish(query) if pretty
|
530
|
-
log "
|
532
|
+
log colorize("[sql] #{query}", :cyan) if @log_sql
|
531
533
|
|
532
534
|
@mutex.synchronize do
|
533
535
|
conn.exec_params(query, []).to_a
|
@@ -596,7 +598,13 @@ module Dexter
|
|
596
598
|
|
597
599
|
view_tables = {}
|
598
600
|
result.each do |row|
|
599
|
-
|
601
|
+
begin
|
602
|
+
view_tables[row["table_name"]] = PgQuery.parse(row["definition"]).tables
|
603
|
+
rescue PgQuery::ParseError
|
604
|
+
if @log_level.start_with?("debug")
|
605
|
+
log colorize("ERROR: Cannot parse view definition: #{row["table_name"]}", :red)
|
606
|
+
end
|
607
|
+
end
|
600
608
|
end
|
601
609
|
|
602
610
|
view_tables
|
data/lib/dexter/logging.rb
CHANGED
@@ -1,11 +1,26 @@
|
|
1
1
|
module Dexter
|
2
2
|
module Logging
|
3
|
+
COLOR_CODES = {
|
4
|
+
red: 31,
|
5
|
+
green: 32,
|
6
|
+
yellow: 33,
|
7
|
+
cyan: 36
|
8
|
+
}
|
9
|
+
|
10
|
+
def output
|
11
|
+
$stdout
|
12
|
+
end
|
13
|
+
|
3
14
|
def log(message = "")
|
4
|
-
puts
|
15
|
+
output.puts(message) unless $log_level == "error"
|
5
16
|
end
|
6
17
|
|
7
|
-
def
|
8
|
-
|
18
|
+
def colorize(message, color)
|
19
|
+
if output.tty?
|
20
|
+
"\e[#{COLOR_CODES[color]}m#{message}\e[0m"
|
21
|
+
else
|
22
|
+
message
|
23
|
+
end
|
9
24
|
end
|
10
25
|
end
|
11
26
|
end
|
data/lib/dexter/processor.rb
CHANGED
@@ -37,7 +37,7 @@ module Dexter
|
|
37
37
|
begin
|
38
38
|
process_queries
|
39
39
|
rescue PG::ServerError => e
|
40
|
-
log "ERROR: #{e.class.name}: #{e.message}"
|
40
|
+
log colorize("ERROR: #{e.class.name}: #{e.message}", :red)
|
41
41
|
end
|
42
42
|
sleep(@interval)
|
43
43
|
end
|
@@ -47,7 +47,7 @@ module Dexter
|
|
47
47
|
begin
|
48
48
|
@log_parser.perform
|
49
49
|
rescue Errno::ENOENT => e
|
50
|
-
|
50
|
+
raise Dexter::Abort, "ERROR: #{e.message}"
|
51
51
|
end
|
52
52
|
|
53
53
|
process_queries
|
data/lib/dexter/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pgdexter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slop
|
@@ -16,102 +16,53 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 4.2
|
19
|
+
version: 4.8.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 4.2
|
26
|
+
version: 4.8.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pg
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.18.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.18.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pg_query
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "<"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
52
|
+
- - "<"
|
74
53
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
76
|
-
|
77
|
-
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: minitest
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
description:
|
98
|
-
email:
|
99
|
-
- andrew@chartkick.com
|
54
|
+
version: '2'
|
55
|
+
description:
|
56
|
+
email: andrew@ankane.org
|
100
57
|
executables:
|
101
58
|
- dexter
|
102
59
|
extensions: []
|
103
60
|
extra_rdoc_files: []
|
104
61
|
files:
|
105
|
-
- ".gitignore"
|
106
|
-
- ".travis.yml"
|
107
62
|
- CHANGELOG.md
|
108
|
-
- Gemfile
|
109
63
|
- LICENSE.txt
|
110
64
|
- README.md
|
111
|
-
- Rakefile
|
112
65
|
- exe/dexter
|
113
|
-
- guides/Hosted-Postgres.md
|
114
|
-
- guides/Linux.md
|
115
66
|
- lib/dexter.rb
|
116
67
|
- lib/dexter/client.rb
|
117
68
|
- lib/dexter/collector.rb
|
@@ -124,11 +75,11 @@ files:
|
|
124
75
|
- lib/dexter/query.rb
|
125
76
|
- lib/dexter/sql_log_parser.rb
|
126
77
|
- lib/dexter/version.rb
|
127
|
-
- pgdexter.gemspec
|
128
78
|
homepage: https://github.com/ankane/dexter
|
129
|
-
licenses:
|
79
|
+
licenses:
|
80
|
+
- MIT
|
130
81
|
metadata: {}
|
131
|
-
post_install_message:
|
82
|
+
post_install_message:
|
132
83
|
rdoc_options: []
|
133
84
|
require_paths:
|
134
85
|
- lib
|
@@ -136,16 +87,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
136
87
|
requirements:
|
137
88
|
- - ">="
|
138
89
|
- !ruby/object:Gem::Version
|
139
|
-
version: '
|
90
|
+
version: '2.2'
|
140
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
92
|
requirements:
|
142
93
|
- - ">="
|
143
94
|
- !ruby/object:Gem::Version
|
144
95
|
version: '0'
|
145
96
|
requirements: []
|
146
|
-
|
147
|
-
|
148
|
-
signing_key:
|
97
|
+
rubygems_version: 3.2.3
|
98
|
+
signing_key:
|
149
99
|
specification_version: 4
|
150
100
|
summary: The automatic indexer for Postgres
|
151
101
|
test_files: []
|
data/.gitignore
DELETED
data/.travis.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm: 2.4.1
|
3
|
-
cache: bundler
|
4
|
-
script: bundle exec rake test
|
5
|
-
addons:
|
6
|
-
postgresql: "9.6"
|
7
|
-
before_script:
|
8
|
-
- sudo apt-get install postgresql-server-dev-9.6
|
9
|
-
- git clone https://github.com/HypoPG/hypopg.git
|
10
|
-
- cd hypopg
|
11
|
-
- git checkout 1.1.1
|
12
|
-
- make
|
13
|
-
- sudo make install
|
14
|
-
- psql -c 'create database dexter_test;' -U postgres
|
15
|
-
notifications:
|
16
|
-
email:
|
17
|
-
on_success: never
|
18
|
-
on_failure: change
|
data/Gemfile
DELETED
data/Rakefile
DELETED
data/guides/Hosted-Postgres.md
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
# Hosted Postgres
|
2
|
-
|
3
|
-
Some hosted providers like Amazon RDS and Heroku do not support the HypoPG extension, which Dexter needs to run. Hopefully this will change with time. For now, we can spin up a separate database instance to run Dexter. It’s not super convenient, but can be useful to do from time to time.
|
4
|
-
|
5
|
-
### Install Postgres and Ruby
|
6
|
-
|
7
|
-
Linux
|
8
|
-
|
9
|
-
```sh
|
10
|
-
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
11
|
-
sudo apt-get install -y wget ca-certificates
|
12
|
-
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
|
13
|
-
sudo apt-get update
|
14
|
-
sudo apt-get install -y postgresql-9.6 postgresql-server-dev-9.6
|
15
|
-
sudo -u postgres createuser $(whoami) -s
|
16
|
-
sudo apt-get install -y ruby2.2 ruby2.2-dev
|
17
|
-
```
|
18
|
-
|
19
|
-
Mac
|
20
|
-
|
21
|
-
```sh
|
22
|
-
brew install postgresql
|
23
|
-
brew install ruby
|
24
|
-
```
|
25
|
-
|
26
|
-
### Install HypoPG and Dexter
|
27
|
-
|
28
|
-
HypoPG
|
29
|
-
|
30
|
-
```sh
|
31
|
-
cd /tmp
|
32
|
-
curl -L https://github.com/dalibo/hypopg/archive/1.0.0.tar.gz | tar xz
|
33
|
-
cd hypopg-1.0.0
|
34
|
-
make
|
35
|
-
make install # may need sudo
|
36
|
-
```
|
37
|
-
|
38
|
-
Dexter
|
39
|
-
|
40
|
-
```sh
|
41
|
-
gem install pgdexter # may need sudo
|
42
|
-
```
|
43
|
-
|
44
|
-
### Download logs
|
45
|
-
|
46
|
-
#### Amazon RDS
|
47
|
-
|
48
|
-
Create an IAM user with the policy below:
|
49
|
-
|
50
|
-
```
|
51
|
-
{
|
52
|
-
"Statement": [
|
53
|
-
{
|
54
|
-
"Action": [
|
55
|
-
"rds:DescribeDBLogFiles",
|
56
|
-
"rds:DownloadDBLogFilePortion"
|
57
|
-
],
|
58
|
-
"Effect": "Allow",
|
59
|
-
"Resource": "*"
|
60
|
-
}
|
61
|
-
]
|
62
|
-
}
|
63
|
-
```
|
64
|
-
|
65
|
-
And run:
|
66
|
-
|
67
|
-
```sh
|
68
|
-
aws configure
|
69
|
-
gem install pghero_logs # may need sudo
|
70
|
-
pghero_logs download <instance-id>
|
71
|
-
```
|
72
|
-
|
73
|
-
#### Heroku
|
74
|
-
|
75
|
-
Production-tier databases only
|
76
|
-
|
77
|
-
```sh
|
78
|
-
heroku logs -p postgres > postgresql.log
|
79
|
-
```
|
80
|
-
|
81
|
-
### Dump and restore
|
82
|
-
|
83
|
-
We recommend creating a new instance from a snapshot for the dump to avoid affecting customers.
|
84
|
-
|
85
|
-
```sh
|
86
|
-
pg_dump -v -j 8 -Fd -f /tmp/newout.dir <connection-options>
|
87
|
-
```
|
88
|
-
|
89
|
-
Then shutdown the dump instance. Restore with:
|
90
|
-
|
91
|
-
```sh
|
92
|
-
createdb dexter_restore
|
93
|
-
pg_restore -v -j 8 -x -O --format=d -d dexter_restore /tmp/newout.dir/
|
94
|
-
```
|
95
|
-
|
96
|
-
### Run Dexter
|
97
|
-
|
98
|
-
```sh
|
99
|
-
dexter dexter_restore postgresql.log* --analyze
|
100
|
-
```
|
101
|
-
|
102
|
-
:tada:
|
data/guides/Linux.md
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
# Linux Packages
|
2
|
-
|
3
|
-
Distributions
|
4
|
-
|
5
|
-
- [Ubuntu 16.04 (Xenial)](#ubuntu-1604-xenial)
|
6
|
-
- [Ubuntu 14.04 (Trusty)](#ubuntu-1404-trusty)
|
7
|
-
- [Debian 9 (Stretch)](#debian-9-stretch)
|
8
|
-
- [Debian 8 (Jesse)](#debian-8-jesse)
|
9
|
-
- [CentOS / RHEL 7](#centos--rhel-7)
|
10
|
-
- [SUSE Linux Enterprise Server 12](#suse-linux-enterprise-server-12)
|
11
|
-
|
12
|
-
### Ubuntu 16.04 (Xenial)
|
13
|
-
|
14
|
-
```sh
|
15
|
-
wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
|
16
|
-
sudo wget -O /etc/apt/sources.list.d/dexter.list \
|
17
|
-
https://dl.packager.io/srv/pghero/dexter/master/installer/ubuntu/16.04.repo
|
18
|
-
sudo apt-get update
|
19
|
-
sudo apt-get -y install dexter
|
20
|
-
```
|
21
|
-
|
22
|
-
### Ubuntu 14.04 (Trusty)
|
23
|
-
|
24
|
-
```sh
|
25
|
-
wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
|
26
|
-
sudo wget -O /etc/apt/sources.list.d/dexter.list \
|
27
|
-
https://dl.packager.io/srv/pghero/dexter/master/installer/ubuntu/14.04.repo
|
28
|
-
sudo apt-get update
|
29
|
-
sudo apt-get install dexter
|
30
|
-
```
|
31
|
-
|
32
|
-
### Debian 9 (Stretch)
|
33
|
-
|
34
|
-
```sh
|
35
|
-
sudo apt-get -y install apt-transport-https
|
36
|
-
wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
|
37
|
-
sudo wget -O /etc/apt/sources.list.d/dexter.list \
|
38
|
-
https://dl.packager.io/srv/pghero/dexter/master/installer/debian/9.repo
|
39
|
-
sudo apt-get update
|
40
|
-
sudo apt-get install dexter
|
41
|
-
```
|
42
|
-
|
43
|
-
### Debian 8 (Jesse)
|
44
|
-
|
45
|
-
```sh
|
46
|
-
sudo apt-get -y install apt-transport-https
|
47
|
-
wget -qO- https://dl.packager.io/srv/pghero/dexter/key | sudo apt-key add -
|
48
|
-
sudo wget -O /etc/apt/sources.list.d/dexter.list \
|
49
|
-
https://dl.packager.io/srv/pghero/dexter/master/installer/debian/8.repo
|
50
|
-
sudo apt-get update
|
51
|
-
sudo apt-get install dexter
|
52
|
-
```
|
53
|
-
|
54
|
-
### CentOS / RHEL 7
|
55
|
-
|
56
|
-
```sh
|
57
|
-
sudo wget -O /etc/yum.repos.d/dexter.repo \
|
58
|
-
https://dl.packager.io/srv/pghero/dexter/master/installer/el/7.repo
|
59
|
-
sudo yum install dexter
|
60
|
-
```
|
61
|
-
|
62
|
-
### SUSE Linux Enterprise Server 12
|
63
|
-
|
64
|
-
```sh
|
65
|
-
sudo wget -O /etc/zypp/repos.d/dexter.repo \
|
66
|
-
https://dl.packager.io/srv/pghero/dexter/master/installer/sles/12.repo
|
67
|
-
sudo zypper install dexter
|
68
|
-
```
|
69
|
-
|
70
|
-
## Credits
|
71
|
-
|
72
|
-
:heart: Made possible by [Packager](https://packager.io/)
|
data/pgdexter.gemspec
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
lib = File.expand_path("../lib", __FILE__)
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require "dexter/version"
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = "pgdexter"
|
9
|
-
spec.version = Dexter::VERSION
|
10
|
-
spec.authors = ["Andrew Kane"]
|
11
|
-
spec.email = ["andrew@chartkick.com"]
|
12
|
-
|
13
|
-
spec.summary = "The automatic indexer for Postgres"
|
14
|
-
spec.homepage = "https://github.com/ankane/dexter"
|
15
|
-
|
16
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
-
f.match(%r{^(test|spec|features)/})
|
18
|
-
end
|
19
|
-
spec.bindir = "exe"
|
20
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
-
spec.require_paths = ["lib"]
|
22
|
-
|
23
|
-
spec.add_dependency "slop", ">= 4.2.0"
|
24
|
-
spec.add_dependency "pg"
|
25
|
-
spec.add_dependency "pg_query"
|
26
|
-
|
27
|
-
spec.add_development_dependency "bundler"
|
28
|
-
spec.add_development_dependency "rake"
|
29
|
-
spec.add_development_dependency "minitest"
|
30
|
-
end
|