@pgsql

Страница 473 из 1062
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 к несуществующей БД. Соединяйтесь к существующей.

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

У вса текстовый дамп, который из команд состоит. Вы его натравливаете на обычный psql.
там же есть CREATE DATABASE unit WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';

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

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

Igor
12.09.2017
12:56:59
может всё таки pg_restore?
он дамп от pg_dump не ресторит же

Вот там же посмотрите инструкцию соединения с БД которая в команде 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 Во!!!

Есть же

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

Igor
12.09.2017
13:00:01
psql < unit.backup.sql Спасёт вас :)
без указания базы?

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

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
да

Страница 473 из 1062