LINUX.ORG.RU

82
Всего сообщений: 769

Системный администратор Linux, удалённая работа

Требуется системный администратор GNU/Linux на удалённую работу.

40 часов в неделю, желательно работать по часовому поясу UTC+6

умение писать скрипты - bash, perl, awk знание postgresql

Зарплата - 150 т.р./мес.

Подробности - в телеграмм @ A2154242153085202020

 , , , ,

shimajima ()

При update таблицы идет seq scan

Использую Postgresql, есть запрос в котором нужно обновить таблицу новыми значениями, а тех записей которых нет, вернуть.

Приблизительно запрос выглядит так:

WITH ...(
.
.
.),
documents AS (
   SELECT
       ad."DocId"
	   d."EndDate",
	   d."Responsible",
	   d."Account"
   FROM documents_raw d
   LEFT JOIN "ActualDocument" ad
   ON (d."Account"=ad."Account" AND d."Responsible"=ad."Responsible")     
)
documents_upd AS(
   UPDATE "ActualDocument"
   SET "ActualDocument"."EndDate" = documents."EndDate"
   FROM documents
   WHERE "ActualDocument"."DocId"= documents."DocId" 
)
SELECT *
FROM documents_upd
WHERE "DocId" IS NULL

Проблема возникает при обновлении в CTE documents_upd в плане Hash Join идет Seq Scan по таблице «ActualDocument».

Хочется чтобы использовался индекс по первичному ключу «DocId» таблицы «ActualDocument». Например когда использую EXISTS или INNER JOIN в CTE, то используется индекс по первичному ключу «DocId»

WITH (...
.
.
.),
documents AS (
   SELECT
       ad."DocId"
	   d."EndDate",
	   d."Responsible",
	   d."Account"
   FROM documents_raw d
   LEFT JOIN "ActualDocument" ad
   ON (d."Account"=ad."Account" AND d."Responsible"=ad."Responsible")     
)
SELECT *
FROM "ActualDocument"
WHERE EXISTS (
SELECT TRUE
FROM documents
WHERE
"ActualDocument"."DocId"= documents."DocId" 
)

 , ,

polin11 ()

Cloud IDE на планшете

Еду в командировку, с собой будет только планшет и интернет, хотелось бы покодить даже в ущерб производительности, подскажите пожалуйста, какие сейчас актуальные платные cloud ide существуют? Стек Web-development: Java, Spring, TypeScript, PostgreSQL. gitpod,Codespaces,Eclipse Che,Codeanywhere и др., непонятно какие из них будут получше, если кто пользовался - поделитесь пожалуйста информацией, буду очень признателен.

 , , , ,

wall_jvm ()

Zabbix housekeeping на TimescaleDB

Всем привет,

я выборочно почитал про Zabbix, но так и не понял:

после перехода на TimescaleDB хаускипер продолжит работать в обычном режиме, или теперь он только отбрасывает данные чанками? Например, если чанки удаляются через год, могу ли я для отдельных items настроить удаление через неделю по-старинке, с помощью DELETE? Это будет работать?

Я в курсе, что с пожатыми чанками так нельзя.

 , ,

muon ()

Оптимизировать запрос в котором группируется большое кол-во данных

Иcпользую СУБД PostgreSQL

Запрос

 WITH         
		ar AS(
		    SELECT *
		    FROM "ActualDocuments"
		    WHERE 
			"Account" = ANY('{3344433}'::bigint[]) AND
			"MinimalDate" < '2021-09-20'::date 			 
		),      
        user_null AS(
            SELECT
                   DISTINCT
                pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp           
                INNER JOIN ar ON (
			        pp."Account" = ar."Account" AND
				    pp."Event" = ar."Event"
			    )          
            WHERE               
                pp."User" IS NULL                
            GROUP BY pp."Account", pp."User", pp."Event"
        ),
        user_not_null AS(
            SELECT DISTINCT
                pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp         
                INNER JOIN ar ON (
			        pp."Account" = ar."Account" AND
				    pp."Event" = ar."Event"
			    )
            WHERE                
                pp."User" IS NOT NULL                
            GROUP BY pp."Account", pp."User", pp."Event"
        )
		SELECT *
		FROM user_not_null 
		UNION
		SELECT *
		FROM user_null

План

"HashAggregate  (cost=29881.28..29915.65 rows=3437 width=64) (actual time=4117.404..4151.053 rows=107270 loops=1)"
"  Group Key: user_not_null."Account", user_not_null."Responsible", user_not_null."Event", user_not_null."Subscriber", user_not_null."MinimalDate""
"  Buffers: shared hit=735944 dirtied=3, temp read=6722 written=8057"
"  CTE ar"
"    ->  Bitmap Heap Scan on "ActualDocuments"  (cost=36.30..1993.75 rows=465 width=73) (actual time=0.216..1.173 rows=120 loops=1)"
"          Recheck Cond: (("Account" = ANY ('{3344433}'::bigint[])) AND ("MinimalDate" IS NOT NULL))"
"          Filter: ("MinimalDate" < '2021-09-20'::date)"
"          Rows Removed by Filter: 119"
"          Heap Blocks: exact=277"
"          Buffers: shared hit=286"
"          ->  Bitmap Index Scan on "iMinimalDate"  (cost=0.00..36.18 rows=519 width=0) (actual time=0.171..0.172 rows=883 loops=1)"
"                Index Cond: ("Account" = ANY ('{3344433}'::bigint[]))"
"                Buffers: shared hit=9"
"  CTE user_null"
"    ->  HashAggregate  (cost=13603.55..13633.30 rows=2975 width=64) (actual time=1718.383..1718.436 rows=68 loops=1)"
"          Group Key: pp."Account", pp."User", pp."Event", array_agg(DISTINCT pp."Subscriber"), min(pp."EndDate")"
"          Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3080"
"          ->  GroupAggregate  (cost=13484.55..13566.36 rows=2975 width=64) (actual time=710.150..1714.046 rows=68 loops=1)"
"                Group Key: pp."Account", pp."User", pp."Event""
"                Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3080"
"                ->  Sort  (cost=13484.55..13491.99 rows=2975 width=37) (actual time=701.077..778.699 rows=343548 loops=1)"
"                      Sort Key: pp."Account", pp."User", pp."Event""
"                      Sort Method: external merge  Disk: 11032kB"
"                      Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3080"
"                      ->  Nested Loop  (cost=0.56..13312.91 rows=2975 width=37) (actual time=0.037..418.331 rows=343548 loops=1)"
"                            Buffers: shared hit=308557 dirtied=3"
"                            ->  CTE Scan on ar  (cost=0.00..9.30 rows=465 width=12) (actual time=0.001..0.143 rows=120 loops=1)"
"                            ->  Index Scan using "iUserNull" on "Documents" pp  (cost=0.56..28.55 rows=6 width=37) (actual time=0.012..3.119 rows=2863 loops=120)"
"                                  Index Cond: (("Account" = ar."Account") AND ("Event" = ar."Event"))"
"                                  Buffers: shared hit=308557 dirtied=3"
"  CTE user_not_null"
"    ->  Unique  (cost=14101.23..14108.16 rows=462 width=64) (actual time=2247.025..2294.759 rows=107202 loops=1)"
"          Buffers: shared hit=427387, temp read=3662 written=3677"
"          ->  Sort  (cost=14101.23..14102.38 rows=462 width=64) (actual time=2247.023..2260.200 rows=107202 loops=1)"
"                Sort Key: pp_1."Account", pp_1."User", pp_1."Event", (array_agg(DISTINCT pp_1."Subscriber")), (min(pp_1."EndDate"))"
"                Sort Method: external sort  Disk: 8032kB"
"                Buffers: shared hit=427387, temp read=3662 written=3677"
"                ->  GroupAggregate  (cost=14068.07..14080.78 rows=462 width=64) (actual time=1712.571..2077.099 rows=107202 loops=1)"
"                      Group Key: pp_1."Account", pp_1."User", pp_1."Event""
"                      Buffers: shared hit=427387, temp read=2658 written=2673"
"                      ->  Sort  (cost=14068.07..14069.23 rows=462 width=37) (actual time=1712.535..1783.618 rows=237252 loops=1)"
"                            Sort Key: pp_1."Account", pp_1."User", pp_1."Event""
"                            Sort Method: external merge  Disk: 11200kB"
"                            Buffers: shared hit=427387, temp read=2658 written=2673"
"                            ->  Nested Loop  (cost=0.56..14047.62 rows=462 width=37) (actual time=0.258..1412.308 rows=237252 loops=1)"
"                                  Buffers: shared hit=427387"
"                                  ->  CTE Scan on ar ar_1  (cost=0.00..9.30 rows=465 width=12) (actual time=0.218..1.511 rows=120 loops=1)"
"                                        Buffers: shared hit=286"
"                                  ->  Index Scan using "iUser" on "Documents" pp_1  (cost=0.56..30.18 rows=1 width=37) (actual time=0.235..11.441 rows=1977 loops=120)"
"                                        Index Cond: (("Account" = ar_1."Account") AND ("Event" = ar_1."Event"))"
"                                        Buffers: shared hit=427101"
"  ->  Append  (cost=0.00..103.11 rows=3437 width=64) (actual time=2247.028..4050.176 rows=107270 loops=1)"
"        Buffers: shared hit=735944 dirtied=3, temp read=6722 written=8057"
"        ->  CTE Scan on user_not_null  (cost=0.00..9.24 rows=462 width=64) (actual time=2247.027..2320.721 rows=107202 loops=1)"
"              Buffers: shared hit=427387, temp read=3662 written=4678"
"        ->  CTE Scan on user_null  (cost=0.00..59.50 rows=2975 width=64) (actual time=1718.393..1721.813 rows=68 loops=1)"
"              Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3379"
"Planning time: 0.961 ms"
"Execution time: 4164.426 ms"

Для некоторых аккаунтов получается большое количество записей, которые нужно сгруппировать, из-за этого запрос долго выполняется по времени и shared hit memory. У меня идей не осталось

 ,

polin11 ()

PSQL и trademark(?)-тролли?

https://www.postgresql.org/about/news/trademark-actions-against-the-postgresql-community-2302/

tl;dr: Какая-то испанская noname-организация Fundación PostgreSQL подала заявки на регистрацию торговых знаков «PostgreSQL» and «PostgreSQL Community» (а позже и «Postgres») в Евросоюзе и США вместо того, чтобы получить права на использование этих имён в рамках trademark-лицензии от PostgreSQL Community Association of Canada (PGCAC) — nonprofit-организация, которая управляет торговой маркой «PostgreSQL», доменными именами и другой интеллектуальной собственностью PostgreSQL Core Team. Почему PGCAC от такой перспективы не в восторге:

Actions like this put the name and reputation of the PostgreSQL project at risk should an unsanctioned 3rd party take control of PostgreSQL’s trademarks, and could be used to take over domain names and other items

На просьбу отозвать заявку на регистрацию торговых знаков глава Fundación PostgreSQL ответил отказом.

Другие подробности по ссылке.

 , ,

theNamelessOne ()

Индекс для UUID

Использую Postresql.

Есть таблица Documents с полями:

Account тип bigint Document тип bigint

User тип UUID

Есть 2 индекса

CREATE INDEX "AccountDocument" ON "Documents" USING btree ("Account" NULLS LAST, "Document" NULLS LAST)
WHERE ("Account" IS NOT NULL OR "Document" IS NOT NULL);
CREATE INDEX "AccountUserDocument" ON "Documents"  USING btree ("Account", "User", "Document")

Для простого запроса хочу, чтобы использовался индекс AccountUserDocument

SELECT *
FROM "Documents"
WHERE "Account" = 1
AND "USER" = 'dd758b54-55b3-442a-804b-8a3d311432ba'::UUID 
AND "Document" = 2
но используется индекс AccountDocument
"Index Scan using "AccountDocument" on "Documents"  (cost=0.29..8.31 rows=1 width=73) (actual time=0.016..0.016 rows=0 loops=1)"
"  Index Cond: ("Document" = 2)"
"  Filter: (("Account" = 1) AND ("USER" = 'dd758b54-55b3-442a-804b-8a3d311432ba'::uuid))"
"  Buffers: shared hit=2"
"Planning time: 1.026 ms"
"Execution time: 0.039 ms"
только есть указать у индекса AccountUserDocument тип индекса gist, то он используется
"Index Scan using "AccoutUserDocument" on "Documents"  (cost=0.28..8.30 rows=1 width=73) (actual time=3.626..3.626 rows=0 loops=1)"
"  Index Cond: (("User" = 'dd758b54-55b3-442a-804b-8a3d311432ba'::uuid) AND ("Document" = 2))"
"  Filter: ("Account" = 1)"
"  Buffers: shared hit=73"
"Planning time: 0.946 ms"
"Execution time: 3.652 ms"
Почитал инфу про тип gist он обычно используется для полнотекстового поиска.

Вопрос почему индекс не используется с типом btree, только из-за того, что в индексе есть поле UUID?

 , ,

polin11 ()

В архив БД не включены WAL-файлы

Всем привет

Иногда в архиве, сделанного с мастера Postgresql, отсутствуют WAL-файлы. Когда в архиве есть wal, их видно:

-rw------- postgres/postgres   16777216 2021-08-09 20:45 pg_wal/000000010000187900000093
-rw------- postgres/postgres          0 2021-08-09 20:46 pg_wal/archive_status/000000010000187900000093.done

Когда в архиве нет wal, последнее содержимое архива такое:

drwx------ postgres/postgres          0 2019-10-22 08:01 pg_tblspc/
-rw------- postgres/postgres         88 2019-10-22 08:01 postgresql.auto.conf
-rw------- postgres/postgres       8192 2021-08-15 20:43 global/pg_control

Архивация выполняется командной :

pg_basebackup -p ${PORT} -D - -Ft -U user -c fast -X fetch | pigz > $dump_path

Postgresql 10. Сами wal файлы физически есть, лежат и их никто не трогает. Что может быть\куда посмотреть еще?

 , , ,

Aborigen1020 ()

Хранить эфемерные статусы в постгресе, не записывая их на диск

Есть вроде бы очевидная задача на поверхности: в постгресе хранятся юзеры, которые могут залогиниться.

Хочется там же в постгресе хранить их статусы: онлайн/офлайн. Писать на диск это не хочется, лишняя ненужная запись. Хранить в редисе не хочется, потому что неудобно: надо вручную делать всякие сортировки, джойны и прочее.

Выглядит логичным завести таблицу в памяти и писать в неё, к ней же джойнить.

Правильно ли я понимаю, что у постгреса пока нет ничего для этого решения, которое вроде кажется разумным?

 

max_lapshin ()

Ошибки связи между репликами

Всем привет,

Имеется 4 сервака, между ними настроена каскадная потоковая репликация посредством слотов репликации используя repmgr. 1-й сервак - мастер, остальные - стендбаи в которые данные льются по цепочке 1->2->3->4. Первая пара серваков наодится в одной стране, вторая в другой. Между 2 и 3 серваками настроен VPN (wireguard). Раз в пару дней отваливаются 3-я и 4-я реплики. В логах:

2021-07-31 14:32:58.287 EEST [26816] LOG:  incorrect resource manager data checksum in record at 2F/AD7E97B8
2021-07-31 14:32:58.287 EEST [26838] FATAL:  terminating walreceiver process due to administrator command
2021-07-31 14:32:58.287 EEST [26816] LOG:  incorrect resource manager data checksum in record at 2F/AD7E97B8
2021-07-31 14:32:58.287 EEST [26816] LOG:  incorrect resource manager data checksum in record at 2F/AD7E97B8
...

repmgr cluster show говорит:

WARNING: node "drpg1" not found in "pg_stat_replication"
WARNING: node "drpg2" not found in "pg_stat_replication"
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string                                     
----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------
 1  | pg1   | primary | * running |          | default  | 100      | 1        | host=pg1 user=repmgr dbname=repmgr connect_timeout=2  
 2  | pg2   | standby |   running | pg1      | default  | 100      | 1        | host=pg2 user=repmgr dbname=repmgr connect_timeout=2  
 3  | drpg1 | standby |   running | ! pg2    | default  | 100      | 1        | host=drpg1 user=repmgr dbname=repmgr connect_timeout=2
 4  | drpg2 | standby |   running | ! drpg1  | default  | 100      | 1        | host=drpg2 user=repmgr dbname=repmgr connect_timeout=2

WARNING: following issues were detected
  - node "drpg1" (ID: 3) is not attached to its upstream node "pg2" (ID: 2)
  - node "drpg2" (ID: 4) is not attached to its upstream node "drpg1" (ID: 3)

Если перезапустить 3-ю и 4-ю реплики, то 3-я переходит в состояние catchup:

WARNING: node "drpg1" attached in state "catchup"
...
WARNING: following issues were detected
  - node "drpg1" (ID: 3) attached to its upstream node "pg2" (ID: 2) in state "catchup"

...и после подтягивания WAL, реплики 3 и 4 переходит в нормальное состояние.

Увеличивать connect_timeout нет смысла, так как соединение между серваками которые находятся в разных странах может может пропадать надолго.

ВОПРОС: есть ли какой-то способ заставить постгре на 3-й реплике перезапускать walreceiver в случае обнаружения проблем с контрольными суммами либо пропаданием коннекта?

З.Ы: можно наколхозить скрипт который будет перезапускать посгре на 3-м и 4-м серваках при возникновении выше описанных ошибок. Но хочется более элегантное решение.

 ,

iron ()

with recursive в PostgreSQL

Есть банальная таблица для хранения древовидной структуры:

CREATE TABLE test (
   tid serial PRIMARY KEY,
   pid INTEGER,
   name VARCHAR NOT NULL
   -- на самом деле тип name это домен с проверкой, но в данном случае это не важно КМК
   -- да и constraint'ы опустим.
);

И есть две задачи:

  • Найти запись в соответствии с заданным путём n1.n2.n3.n4
  • Найти ближайший элемент к заданному пути. Т.е. например для n1.n2.n3.n4 вернуть запись с путём n1.n2 т.к. у n1.n2 нет потомков.

Покопавшись с WITH RECURSIVE для первой задачи получилось такое себе решение:

WITH RECURSIVE r1 as (
  SELECT t1.tid, t1.pid, t1.name, cast( t1.name as text ) as path
  FROM test t1 WHERE pid is null and t1.name = split_part('n1.n2.n3.n4', '.', 1)
    UNION
  SELECT t2.tid, t2.pid, t2.name, r1.path || '.'|| t2.name as path
  FROM test t2
  join r1 on t2.pid = r1.id
)
select * from r1 where path = 'n1.n2.n3.n4';

Хотя меня несколько напрягает сравнение строк, но я не уверен как сделать быстрее.

И по второму вопросу не могу докумекать, как всё это реализовать. Может кто-нибудь чего подскажет?

 ,

WatchCat ()

Вакансия Senior Python Developer в компанию Тензор

Мы разрабатываем программное обеспечение, чтобы и малые предприятия, и крупные корпорации могли с комфортом весит и развивать свой бизнес. Главный продукт - программа СБИС - коммуникации, учет и управление в одной системе.

Контакты: 89159614437 телега, aa.kuleshova@tensor.ru
ЗП от 180 тыс.руб

В НАШИХ ПРОЕКТАХ ВАМ ПРЕДСТОИТ:

  • работать в большой команде как локальных, так и распределенных разработчиков;
  • разрабатывать один из модулей системы управления предприятием;
  • участвовать в процессе проектирования;
  • поддерживать существующую кодовую базу.

МЫ ЖДЕМ ОТ ВАС:

  • опыт разработки от 3 лет;
  • хорошее знание SQL(PostgreSQL);
  • знание основных паттернов проектирования;
  • понимание принципов работы web вообще в web-приложений в частности;
  • умение пользоваться GIT;
  • умение писать структурированный и рабочий код;
  • толерантность к чужому коду, умение разбираться в нем и править без полной переделки;
  • способность самостоятельно ставить задачи группе программистов.

ТАКЖЕ ПРИВЕТСТВУЮТСЯ:

  • если вы разбираетесь в javascript коде;
  • понимаете принципы работы RabbitMQ и Redis.

МЫ ПРЕДЛАГАЕМ:

  • заработную плату в зависимости от квалификации и уровня ответственности;
  • оформление по ТК РФ;
  • премии от 5 до 20% по итогам работы за месяц;
  • помощь опытного наставника на испытательный срок;
  • гибкое начало и окончание рабочего дня;
  • оборудованное место в комфортном офисе или возможность работать из дома в любимых тапочках;
  • корпоративные скидки и бонусы от наших партнеров (обучающие курсы, товары и т.д.);
  • компенсация спортивных абонементов, ДМС;
  • подарки от компании при заключении брака и рождении детей;
  • социальную поддержку при сложных жизненных ситуациях;
  • корпоративную библиотеку;
  • корпоративные праздники и различные совместные мероприятия.

 , ,

Lazypimple ()

PostgreSQL DBA (обеспечение качества СУБД)

Мы разрабатываем СУБД PostgreSQL и собственную версию поверх ванильной - СУБД Postgres Pro: её патчи, расширения и тулсет под самые разные операционные системы и платформы: Alt Linux, Astra Linux, Debian, RHEL, Ubuntu, Windows, Эльбрус, FreeBSD, MacOS и др.

После добавления новых функций в СУБД, в процессе обновления версий, или при исправлении багов все сборки СУБД тестируется в автоматическом режиме на билд-фермах. Иногда эти тесты не завершаются успешно, и перед нами стоит задача по поиску причины: это может быть баг в новой функциональности или регрессионном тесте; или же ложное срабатывание, или баг в операционной системе, или ранее незамеченный баг в «ванильной» версии PostgreSQL.

Мы ищем DBA-специалиста, в задачи которого будет входить расследование инцидентов в экосистеме PostgreSQL, поиск закономерностей возникновения ошибок в различных операционных системах и архитектурах, выработка рекомендаций по их исправлению. Одной из сложных задач является создание такого набора входных данных, который бы максимально покрывал бы все внутренние функции Postgres.
В своей работе мы используем Python (PyCharm) и мощный тестовый фреймворк pg-tests.

В работе подразумевается плотное взаимодействие внутри департамента разработки с другими коллегами - DBA, программистами, билд-инженерами.


От коллеги ожидаем:
● хорошее знание и опыт работы с PostgreSQL;
● опыт работы в Linux от 2х лет;
● знание Python (на уровне скриптования и выше);

Будет плюсом:
● навыки анализа производительности и проведения нагрузочного тестирования СУБД;
● знание языка Си;
● опыт работы с широким спектром архитектур, ОС и СУБД;


Мы предлагаем:
● официальное оформление: либо на удалённой форме занятости, либо в офисе в шаговой доступности от м. Академическая (Москва), либо комбинированный режим;
● возможность выбора направлений собственного профессионального развития;
● активное участие в процессе разработки СУБД - плотное взаимодействие с программистами ядра СУБД, релиз-инженерами, техническими писателями, DBA-командой;
● налаженные процессы ручного и автоматического тестирования, которые можно и нужно постоянно улучшать;
● работу над сложными и интересными задачами в профессиональном коллективе;
● участие в конференциях, продвижение в сообществе PostgreSQL;
● компенсация на спорт;
● медицинское страхование;
● своевременная заработная плата с ежегодным пересмотром (ориентир: 130'000 - 200'000 р.)

Почта для связи/резюме: a.naumenko@postgrespro.ru (tg: @ooprizrakoo )
--
Алексей Науменко

 , , ,

ooprizrakoo ()

Размеры дампов MySQL и PostgreSQL

Я уже лет 10 использую self-hosted RSS-агрегатор Tiny Tiny RSS. Все это время использовалась база данных MySQL, которая все эти 10 лет потихоньку увеличивалась и в итоге выросла до 111 МБ (в сжатом виде с помощью gzip).
В последнее время у этого проекта кое-что изменилось, у них теперь установка по умолчанию с помощью docker, MySQL поменяли на PostgreSQL, а прежнюю объявили deprecated. Ну я и решил мигрировать на новую установку с конвертированием MySQL в PostgreSQL с помощью их специально написанного скрипта для обеспечения миграции. Миграция прошла успешно, никакие данные не побились. Но я заметил, что бэкап базы PostgreSQL вырос почти в 2 раза, до 213 МБ в сжатом виде. В несжатом она вообще 665 МБ занимает. Это нормально вообще, что размер базы данных PostgreSQL намного больше, чем в MySQL?

 , , , ,

Rinaldus ()

Scala разработчик в международный стартап

Vivid Money - европейский финтех стартап. Основной продукт - мобильное приложение.

Запустились в Германии, Франции, Испании и Италии (основатели экс-топы из Тинькофф).

Ищем Scala-разработчиков c production опытом на Scala в офис в Москве или по России на удаленку.

Задачи: разработка бэкенда в сore-платформе и платежах.

FP cтек технологий: ZIO, scalates, cats, tofu, typed schema, tagless final, circe, fs2, droste etc. Другое: Redis, Consul, Postgresql, Kubernetes, Helm, DynamoDB, Kibana (ELK), Grafana, Prometheus, gRPC. Условия: зп от 200 тыс. на руки и выше (ориентируемся на уровень кандидата + учитываем итоги интервью), опционы, бенефиты с едой, спортом, англ.

Описание вакансии: https://jobs.vivid.money/jobs/Careers/33579000001439340/Backend-Developer-Sca...

Подробности в личке @Dante2707(телега)

 , ,

Kenjuy ()

ERROR: tuple concurrently updated в чем проблема?

Использую СУБД Postgresql, Есть запрос, при помощи него получаю записи в которых значение поля «Person» (поле текстового формата) невозможно привести в типу UUID


 CREATE OR REPLACE FUNCTION uuid_or_null(str text)
           RETURNS uuid AS $$
           BEGIN
                 RETURN str::uuid;
           EXCEPTION WHEN invalid_text_representation THEN
                 RETURN NULL;
           END;
           $$ LANGUAGE plpgsql;
   
             SELECT DISTINCT "Id", "Person"
           FROM "Document"
           WHERE "Person" IS NOT NULL AND uuid_or_null("Person") IS NULL  

Возникла проблема с 1 БД (на двух других БД без ошибок), падает ошибка tuple concurrently updated в чем проблема не могу разобраться?

 

polin11 ()

backup БД postgresql с помощью barman

Здравствуйте, подскажите пожалуйста, настраиваю backup’ы для postgresql через barman (один хост с postgresql, второй хост - непосредственно с barman). Все настроил, backup’ы корректно создаются, но когда я пытаюсь восстановиться из backup’a, то восстановление вроде проходит успешно (barman выводит сообщение «Recovery completed. Your PostgreSQL server has benn successfully prepared for recovery»), но по факту данные не были восстановлены (например, в БД на момент бэкапа были 2 таблицы, для проверки удалил одну из таблиц, сделал восстановление из бэкапа - также осталась одна таблица)

Восстановление БД делаю так:

  • на хосте с postgresql останавливаю postgresql: systemctl stop postgresql-11
  • на хосте с barman выполняю: barman recover --remote-ssh-command "ssh postgres@barman-postgresql" barman-postgresql 20210521T133328 /var/lib/pgsql/11/data
  • на хосте с postgresql запускаю postgresql: systemctl start postgresql-11 Пробовал также запускать postgresql в режиме восстановления: /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data start результат такой же

Что я делаю не так?

 ,

wiremann ()

Postgresql

Привет всем, необходимо обновить psql с 9.2 до 10*. Ни разу не делал этого), сделал pg_dumpall > example.bak Дальше не могу понять как лучше сделать, некоторые пишут мол удаляй старый postgres и ставь новый, а некоторые пишут что сразу ставь новый а потом крути верти. хелп ми

 

papahappa ()

настройка мониторинга postgresql в zabbix, ошибка

Здравствуйте, подскажите пожалуйста, настраиваю мониторинг postgresql через zabbix 4.2. Я использую стандартный встроенный шаблон postgresql. Все данные отображаются корректно, кроме метрик из запроса pgsql.query.time.sql, данные из pgsql.query.time.sql не отображаются

Пытаюсь вручную выполнить запрос данный запрос, получаю ошибку:

psql -qtAX -h "$1" -p "$2" -U "$3" -d "$4" -v tmax=$5 -f "/var/lib/zabbix/postgresql/pgsql.query.time.sql"
psql:/var/lib/zabbix/postgresql/pgsql.query.time.sql:31: ОШИБКА:  ошибка синтаксиса (примерное положение: ")")
СТРОКА 22: ...'epoch' FROM (clock_timestamp() - query_start)) > )::integer...

Вот сам запрос из /var/lib/zabbix/postgresql/pgsql.query.time.sql:

WITH T AS
        (SELECT db.datname,
                        coalesce(T.query_time_max, 0) query_time_max,
                        coalesce(T.tx_time_max, 0) tx_time_max,
                        coalesce(T.mro_time_max, 0) mro_time_max,
                        coalesce(T.query_time_sum, 0) query_time_sum,
                        coalesce(T.tx_time_sum, 0) tx_time_sum,
                        coalesce(T.mro_time_sum, 0) mro_time_sum,
                        coalesce(T.query_slow_count, 0) query_slow_count,
                        coalesce(T.tx_slow_count, 0) tx_slow_count,
                        coalesce(T.mro_slow_count, 0) mro_slow_count
        FROM pg_database db NATURAL
        LEFT JOIN (
                SELECT datname,
                        extract(epoch FROM now())::integer ts,
                        coalesce(max(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle', 'idle in transaction', 'idle in transaction (aborted)') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) query_time_max,
                        coalesce(max(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) tx_time_max,
                        coalesce(max(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query ~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) mro_time_max,
                        coalesce(sum(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle', 'idle in transaction', 'idle in transaction (aborted)') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) query_time_sum,
                        coalesce(sum(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) tx_time_sum,
                        coalesce(sum(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query ~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) mro_time_sum,

                        coalesce(sum((extract('epoch' FROM (clock_timestamp() - query_start)) > :tmax)::integer * (state NOT IN ('idle', 'idle in transaction', 'idle in transaction (aborted)') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) query_slow_count,
                        coalesce(sum((extract('epoch' FROM (clock_timestamp() - query_start)) > :tmax)::integer * (state NOT IN ('idle') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) tx_slow_count,
                        coalesce(sum((extract('epoch' FROM (clock_timestamp() - query_start)) > :tmax)::integer * (state NOT IN ('idle') AND query ~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) mro_slow_count
                FROM pg_stat_activity
                WHERE pid <> pg_backend_pid()
                GROUP BY 1) T
        WHERE NOT db.datistemplate )
SELECT json_object_agg(datname, row_to_json(T))
FROM T

 ,

wiremann ()

Как добавить столбец к таблице?

Делаю селект с юнионом и селектом, но нужно чтобы второй селект брал просроченные date_death_line в таблицу справа столбец где executor == executor добавить столбец task Сейчас пока вот так: https://ibb.co/tZyJrX8 Вообщем нужна эта таблица плюс столбец task с просроченными date_death_line меньше now() то есть последние две строчки в картинке нужно вытащить из них только task и вставить справа к исходной таблице где executor равен executor

 , ,

bad_master ()