
Viktor
12.09.2017
11:45:22
именованный лок может использоваться в любых сценариях, фреймворк никак не ограничивает; например, для того, чтобы задачи определенного типа не могли исполняться параллельно, только по одной штуке на единицу времени
сейчас сделал так - в repeatable read пытаюсь вставить строку, где ключ - имя блокировки
вставилось - значит блокировка "захвачена"

Mikhail
12.09.2017
11:47:48
Мой вам совет

Google

Mikhail
12.09.2017
11:48:06
Разберитесь в примере от Котерова
Что я скинул

Viktor
12.09.2017
11:48:47
да, я посмотрю обязательно, спасибо

Alexandr
12.09.2017
11:49:26
это нормально, что статья от 2008 года?

raksita
12.09.2017
11:49:49
для очередей есть ещё pgq
https://wiki.postgresql.org/wiki/PGQ_Tutorial

Mikhail
12.09.2017
11:49:56
Нормально

Dmitrii
12.09.2017
11:50:22

Mikhail
12.09.2017
11:50:34
С 2008 года ничего не поменялось тут кроме появления скиплокед
И пгку в 2008 тоже уже был
Ну и тоанзакционные адвизори добавились , да

Dmitrii
12.09.2017
11:51:50
Сделано через pg_try_advisory_lock/pg_try_advisory_unlock, когда лок захвачен для записи то мы ее выславлям в статус обработано

Mikhail
12.09.2017
11:52:18
Почитайте тоже пример от Котерова

Google

Dmitrii
12.09.2017
11:53:35
И что в статье не так чтоя написал? В середине сразу: "Собственно блокировка: pg_try_advisory_lock()"

Mikhail
12.09.2017
11:54:19
Посмотрите про хак с дофильтровкой
Так как есть не очевидная гонка
Может быть
В подобных решениях

Dmitrii
12.09.2017
12:00:16
Мы не селектим по блокировке, т.к. у нас крон запускается не на сотке серверов то мы просто выгребаем "потенциально" доступные для запуска джобы и каждый пытается поставить лок
У кого получится тот и выиграл. Не самый оптимальный путь зато дубовый ?

Mikhail
12.09.2017
12:02:01
Ну и ещё есть момент с выбором плана
В примере Котерова он тоже важен
Важно понимать когда pg будет функции выполнять из предиката
И не будет ли меняться план со временем
Например из за изменения статистики

Dmitrii
12.09.2017
12:04:02
Просто иногда когда хочешь сделать "идеально" то можно и ногу вот так прострелить как описывается в статье :)

Dmitry
12.09.2017
12:46:00
Миша, а можно пример с гонкой пояснить?
По моему, никто не гарантирует нам, что транзакция в сессии В закомитится раньше, чем начнется запрос A2. Соответственно, транзакция А не увидит изменений last_mail_at в транзакции В. И результирующая выборка А1 и А2 совпадет.
Или я что-то упустил?

Igor
12.09.2017
12:51:05
Всем привет! подскажите, делаю бекап базы:
pg_dump —create unit -f unit.backup.sql
в файле есть инструкция создать базу
CREATE DATABASE unit WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
но при попытке восстановления ругается на то, что база не существует
psql unit < unit.backup.sql
psql: FATAL: database "unit" does not exist
как восстановить базу без её создания?

Dmitry
12.09.2017
12:53:16
Вы пытаетесь подсоединиться через psql к несуществующей БД. Соединяйтесь к существующей.

Igor
12.09.2017
12:53:48

Dmitry
12.09.2017
12:54:00
У вас коннект к созданной БД в дампе есть?
У вса текстовый дамп, который из команд состоит. Вы его натравливаете на обычный psql.

Igor
12.09.2017
12:55:10

Google

Igor
12.09.2017
12:55:22
pg_dump —create unit -f unit.backup.sql

Maks
12.09.2017
12:56:22
может всё таки pg_restore?

Dmitry
12.09.2017
12:56:25
Вот там же посмотрите инструкцию соединения с БД которая в команде create создается. Она там есть?


Igor
12.09.2017
12:56:59
Вот там же посмотрите инструкцию соединения с БД которая в команде create создается. Она там есть?
$ cat unit.backup-create.sql
—
— PostgreSQL database dump
—
— Dumped from database version 9.6.3
— Dumped by pg_dump version 9.6.3
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
—
— Name: unit; Type: DATABASE; Schema: -; Owner: postgres
—
CREATE DATABASE unit WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
ALTER DATABASE unit OWNER TO postgres;
\connect unit
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
—
— Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
—
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
—
— Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
—
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
—
— PostgreSQL database dump complete
—


Dmitry
12.09.2017
12:57:48
> \connect unit
Во!!!
Есть же

Igor
12.09.2017
12:58:08
да, после создания

Dmitry
12.09.2017
12:59:25
psql < unit.backup.sql
Спасёт вас :)

Igor
12.09.2017
13:00:01

Dmitry
12.09.2017
13:00:02
Без unit. unit - имя БД

Dmitriy
12.09.2017
13:00:03
Коллеги, снова вопрос:
Есть таблица размером 2.5GB. В нее идет постоянная запись, все инсерты обрабатываются триггером (В триггере есть update и delete из таблицы). Пишется раз в минуту примерно 2500 записей. Есть несколько составных индексов и один индекс по условию. Вот если делать выборку с индексом по условию то запрос выполняется оооочень долго.

Dmitry
12.09.2017
13:00:52
без указания базы?
Да. Вы должны соединяться к любой существующей БД на кластере. По умолчанию это postgres

Igor
12.09.2017
13:01:09

Dmitry
12.09.2017
13:03:33

Dmitriy
12.09.2017
13:03:56

Dmitry
12.09.2017
13:04:27
Запрос, план. Желательно explain (analyze, buffers)

Dmitriy
12.09.2017
13:05:03
если explain analyze делать, то инсерты в очередь становятся

Google

Dmitriy
12.09.2017
13:05:10
что критично
Табличка
CREATE TABLE public.flowlog
(
timestart integer,
timeend integer,
insideip inet,
outsideip inet,
startport integer,
endport integer
)
CREATE INDEX active_idx
ON public.flowlog
USING btree
(timeend)
WHERE timeend = 0;
индекс

Dmitry
12.09.2017
13:05:52
Выполнение запроса останавливает инсерты? Селект в PG неблокирующий. Что-то вы заливаете

Dmitriy
12.09.2017
13:08:41
ну выполняются дольше в смысле

Dmitry
12.09.2017
13:08:45
Запрос хотя бы покажите

Dmitriy
12.09.2017
13:08:51
select * from flowlog where timeend = 0
выполняется уже 2 минуты

Darafei
12.09.2017
13:09:22
а explain?

Dmitry
12.09.2017
13:09:41
А план? Есть подозрение, что ваш индекс не используется

Dmitriy
12.09.2017
13:09:47

Darafei
12.09.2017
13:10:26
не используется, или опух

Dmitriy
12.09.2017
13:10:50
размер 418 МБ

Darafei
12.09.2017
13:11:12
ну, это не на две минуты, если косяков в дисковой подсистеме нет

Dmitry
12.09.2017
13:11:13
Я думаю, индекс перестраивается постоянно

Dmitriy
12.09.2017
13:11:21
это возможно
timeend постоянно меняется

Darafei
12.09.2017
13:11:41
50000 строк выглядит как правда?

Dmitriy
12.09.2017
13:11:53

Google

Dmitry
12.09.2017
13:11:58
Попробуйте индекс без условия сделать

Darafei
12.09.2017
13:12:10
не меняйте timeend :)

Dmitriy
12.09.2017
13:12:21
еще предложения?

Darafei
12.09.2017
13:12:38
вообще надо explain (analyze, verbose, buffers) хоть раз дождаться и посмотреть в buffers

Dmitriy
12.09.2017
13:12:39
Страшный триггер
BEGIN
IF NEW.timeend > 0
THEN
DELETE FROM flowlog WHERE
timestart = NEW.timestart AND
timeend = 0 AND
insideip = NEW.insideip AND
outsideip = NEW.outsideip AND
startport = NEW.startport AND
endport = NEW.endport;
END IF;
UPDATE flowlog SET timeend = NEW.timestart
WHERE
timestart < NEW.timestart
AND timeend = 0
AND outsideip = NEW.outsideip
AND startport = NEW.startport
AND endport = NEW.endport;
RETURN NEW;
END;
это на каждый инсерт

Darafei
12.09.2017
13:13:59
подозреваю, что в индексе лежит очень много отсылок на старые страницы и неподходящие под условия таплы, и перебрать их занимает время

Dmitriy
12.09.2017
13:14:32
по-другому я не знаю как решить проблему актуальности данных

Darafei
12.09.2017
13:14:51
в идеале в схеме не должно быть апдейтов
таблица, в которой каждую строку будут апдейтить - кошмар MVCC

Dmitriy
12.09.2017
13:15:37
delete + insert?

Darafei
12.09.2017
13:15:55
нет, просто два инсерта и тип "начало" и "конец"

Dmitriy
12.09.2017
13:16:09
вот тут главная проблема
опишу сейчас
Есть сенсор flow. По UDP прилетают пачки данных о старте сессии - timeend = 0 и завершени сесии , timeend = unix_time
udp бывают теряются, соотвественно приходится изощряться
Условие апдейта расчитано на то, чтобы в любом случае перекрыть активную сессию

Darafei
12.09.2017
13:18:30
делай это на чтении во view, например, оконными функциями

Dmitriy
12.09.2017
13:19:25
т.е. сделать insert only таблицы и все остальное отсекать группировками?

Darafei
12.09.2017
13:20:05
да