Skip to content
This repository was archived by the owner on Apr 17, 2019. It is now read-only.

Commit f10edd6

Browse files
author
Murat Kabilov
committed
make autovacuum queue work only in pg >= 9.5
1 parent b5f828f commit f10edd6

File tree

1 file changed

+66
-63
lines changed

1 file changed

+66
-63
lines changed

configs/basic.yaml

Lines changed: 66 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -263,70 +263,73 @@ autovacuum:
263263

264264
autovacuum_queue:
265265
# https://gist.github.com/lesovsky/b0e4033380b0992789118ab35c4c323f
266-
query: >-
267-
WITH table_opts AS (
268-
SELECT
269-
c.oid, c.relname, c.relfrozenxid, c.relminmxid, n.nspname, array_to_string(c.reloptions, '') AS relopts
270-
FROM pg_class c
271-
INNER JOIN pg_namespace n ON c.relnamespace = n.oid
272-
WHERE c.relkind IN ('r', 't') AND n.nspname NOT IN ('pg_catalog', 'information_schema') AND n.nspname !~ '^pg_temp'
273-
),
274-
vacuum_settings AS (
266+
query:
267+
-9.5:
268+
select;
269+
9.5-:
270+
WITH table_opts AS (
271+
SELECT
272+
c.oid, c.relname, c.relfrozenxid, c.relminmxid, n.nspname, array_to_string(c.reloptions, '') AS relopts
273+
FROM pg_class c
274+
INNER JOIN pg_namespace n ON c.relnamespace = n.oid
275+
WHERE c.relkind IN ('r', 't') AND n.nspname NOT IN ('pg_catalog', 'information_schema') AND n.nspname !~ '^pg_temp'
276+
),
277+
vacuum_settings AS (
278+
SELECT
279+
oid, relname, nspname, relfrozenxid, relminmxid,
280+
CASE
281+
WHEN relopts LIKE '%autovacuum_vacuum_threshold%'
282+
THEN regexp_replace(relopts, '.*autovacuum_vacuum_threshold=([0-9.]+).*', E'\\1')::integer
283+
ELSE current_setting('autovacuum_vacuum_threshold')::integer
284+
END AS autovacuum_vacuum_threshold,
285+
CASE
286+
WHEN relopts LIKE '%autovacuum_vacuum_scale_factor%'
287+
THEN regexp_replace(relopts, '.*autovacuum_vacuum_scale_factor=([0-9.]+).*', E'\\1')::real
288+
ELSE current_setting('autovacuum_vacuum_scale_factor')::real
289+
END AS autovacuum_vacuum_scale_factor,
290+
CASE
291+
WHEN relopts LIKE '%autovacuum_analyze_threshold%'
292+
THEN regexp_replace(relopts, '.*autovacuum_analyze_threshold=([0-9.]+).*', E'\\1')::integer
293+
ELSE current_setting('autovacuum_analyze_threshold')::integer
294+
END AS autovacuum_analyze_threshold,
295+
CASE
296+
WHEN relopts LIKE '%autovacuum_analyze_scale_factor%'
297+
THEN regexp_replace(relopts, '.*autovacuum_analyze_scale_factor=([0-9.]+).*', E'\\1')::real
298+
ELSE current_setting('autovacuum_analyze_scale_factor')::real
299+
END AS autovacuum_analyze_scale_factor,
300+
CASE
301+
WHEN relopts LIKE '%autovacuum_freeze_max_age%'
302+
THEN least(regexp_replace(relopts, '.*autovacuum_freeze_max_age=([0-9.]+).*', E'\\1')::bigint,current_setting('autovacuum_freeze_max_age')::bigint)
303+
ELSE current_setting('autovacuum_freeze_max_age')::bigint
304+
END AS autovacuum_freeze_max_age,
305+
CASE
306+
WHEN relopts LIKE '%autovacuum_multixact_freeze_max_age%'
307+
THEN least(regexp_replace(relopts, '.*autovacuum_multixact_freeze_max_age=([0-9.]+).*', E'\\1')::bigint,current_setting('autovacuum_multixact_freeze_max_age')::bigint)
308+
ELSE current_setting('autovacuum_multixact_freeze_max_age')::bigint
309+
END AS autovacuum_multixact_freeze_max_age
310+
FROM table_opts
311+
)
275312
SELECT
276-
oid, relname, nspname, relfrozenxid, relminmxid,
277-
CASE
278-
WHEN relopts LIKE '%autovacuum_vacuum_threshold%'
279-
THEN regexp_replace(relopts, '.*autovacuum_vacuum_threshold=([0-9.]+).*', E'\\1')::integer
280-
ELSE current_setting('autovacuum_vacuum_threshold')::integer
281-
END AS autovacuum_vacuum_threshold,
282-
CASE
283-
WHEN relopts LIKE '%autovacuum_vacuum_scale_factor%'
284-
THEN regexp_replace(relopts, '.*autovacuum_vacuum_scale_factor=([0-9.]+).*', E'\\1')::real
285-
ELSE current_setting('autovacuum_vacuum_scale_factor')::real
286-
END AS autovacuum_vacuum_scale_factor,
287-
CASE
288-
WHEN relopts LIKE '%autovacuum_analyze_threshold%'
289-
THEN regexp_replace(relopts, '.*autovacuum_analyze_threshold=([0-9.]+).*', E'\\1')::integer
290-
ELSE current_setting('autovacuum_analyze_threshold')::integer
291-
END AS autovacuum_analyze_threshold,
292-
CASE
293-
WHEN relopts LIKE '%autovacuum_analyze_scale_factor%'
294-
THEN regexp_replace(relopts, '.*autovacuum_analyze_scale_factor=([0-9.]+).*', E'\\1')::real
295-
ELSE current_setting('autovacuum_analyze_scale_factor')::real
296-
END AS autovacuum_analyze_scale_factor,
297-
CASE
298-
WHEN relopts LIKE '%autovacuum_freeze_max_age%'
299-
THEN least(regexp_replace(relopts, '.*autovacuum_freeze_max_age=([0-9.]+).*', E'\\1')::bigint,current_setting('autovacuum_freeze_max_age')::bigint)
300-
ELSE current_setting('autovacuum_freeze_max_age')::bigint
301-
END AS autovacuum_freeze_max_age,
302-
CASE
303-
WHEN relopts LIKE '%autovacuum_multixact_freeze_max_age%'
304-
THEN least(regexp_replace(relopts, '.*autovacuum_multixact_freeze_max_age=([0-9.]+).*', E'\\1')::bigint,current_setting('autovacuum_multixact_freeze_max_age')::bigint)
305-
ELSE current_setting('autovacuum_multixact_freeze_max_age')::bigint
306-
END AS autovacuum_multixact_freeze_max_age
307-
FROM table_opts
308-
)
309-
SELECT
310-
current_database() as datname,
311-
count(CASE
312-
WHEN v.autovacuum_vacuum_threshold + (v.autovacuum_vacuum_scale_factor::numeric * c.reltuples) < s.n_dead_tup
313-
THEN true
314-
END) AS need_vacuum_cnt,
315-
count(CASE
316-
WHEN v.autovacuum_analyze_threshold + (v.autovacuum_analyze_scale_factor::numeric * c.reltuples) < s.n_mod_since_analyze
317-
THEN true
318-
END) AS need_analyze_cnt,
319-
count(CASE
320-
WHEN (age(v.relfrozenxid)::bigint > v.autovacuum_freeze_max_age) OR (mxid_age(v.relminmxid)::bigint > v.autovacuum_multixact_freeze_max_age)
321-
THEN true
322-
END) AS need_wraparound_cnt
323-
FROM pg_stat_user_tables s
324-
INNER JOIN pg_class c ON s.relid = c.oid
325-
INNER JOIN vacuum_settings v ON c.oid = v.oid
326-
WHERE
327-
(v.autovacuum_vacuum_threshold + (v.autovacuum_vacuum_scale_factor::numeric * c.reltuples) < s.n_dead_tup)
328-
OR (v.autovacuum_analyze_threshold + (v.autovacuum_analyze_scale_factor::numeric * c.reltuples) < s.n_mod_since_analyze)
329-
OR (age(v.relfrozenxid)::bigint > v.autovacuum_freeze_max_age) OR (mxid_age(v.relminmxid)::bigint > v.autovacuum_multixact_freeze_max_age)
313+
current_database() as datname,
314+
count(CASE
315+
WHEN v.autovacuum_vacuum_threshold + (v.autovacuum_vacuum_scale_factor::numeric * c.reltuples) < s.n_dead_tup
316+
THEN true
317+
END) AS need_vacuum_cnt,
318+
count(CASE
319+
WHEN v.autovacuum_analyze_threshold + (v.autovacuum_analyze_scale_factor::numeric * c.reltuples) < s.n_mod_since_analyze
320+
THEN true
321+
END) AS need_analyze_cnt,
322+
count(CASE
323+
WHEN (age(v.relfrozenxid)::bigint > v.autovacuum_freeze_max_age) OR (mxid_age(v.relminmxid)::bigint > v.autovacuum_multixact_freeze_max_age)
324+
THEN true
325+
END) AS need_wraparound_cnt
326+
FROM pg_stat_user_tables s
327+
INNER JOIN pg_class c ON s.relid = c.oid
328+
INNER JOIN vacuum_settings v ON c.oid = v.oid
329+
WHERE
330+
(v.autovacuum_vacuum_threshold + (v.autovacuum_vacuum_scale_factor::numeric * c.reltuples) < s.n_dead_tup)
331+
OR (v.autovacuum_analyze_threshold + (v.autovacuum_analyze_scale_factor::numeric * c.reltuples) < s.n_mod_since_analyze)
332+
OR (age(v.relfrozenxid)::bigint > v.autovacuum_freeze_max_age) OR (mxid_age(v.relminmxid)::bigint > v.autovacuum_multixact_freeze_max_age)
330333

331334
metrics:
332335
- datname:

0 commit comments

Comments
 (0)