• PL/pgSQL. Не дает вернуть из функции значение типа setof record. Причина?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вариант записи допустимый, а вот вызываете неверно:
    melkij=> create or replace function myfunc()
    returns setof record
    as $$
    declare
    res record;
    begin
    execute 'select 1' into res;
    return next res;
    execute 'select 2' into res;
    return next res;
    return;
    end;
    $$
    language plpgsql;
    CREATE FUNCTION
    melkij=> select * from myfunc() as s(i int);
     i 
    ---
     1
     2
    (2 строки)
    
    melkij=> select myfunc();
    ERROR:  materialize mode required, but it is not allowed in this context
    КОНТЕКСТ:  PL/pgSQL function myfunc() line 6 at RETURN NEXT


    PS: прямой return query (или return query execute если это реально необходимо) будет проще и нагляднее перекладывания return next через лишнюю переменную.
    Ответ написан
  • Можно ли восстановить дамп кластера postgresql-12 ( oc Ubuntu ) на postgresql 14 ( ос Alpine )?

    Melkij
    @Melkij
    PostgreSQL DBA
    Да
    Ответ написан
    Комментировать
  • Удаление базы данных postgresql без запущенного демона?

    Melkij
    @Melkij
    PostgreSQL DBA
    Без запущенного экземпляра postgresql не предусматривается никакого эквивалента drop database.

    Можно удалить весь PGDATA и восстановить из бекапа весь кластер (если бекапы бинарные aka pitr) либо инициализировать заново через initdb, запустить и импортировать дамп (если бекап представляет собой дампы).
    Ответ написан
    Комментировать
  • Какой размер кэш процессора на одно ядро?

    Melkij
    @Melkij
    PostgreSQL DBA
    Может различаться для конкретных реализаций. Потому, необходимо уточнять в Datasheet конкретного процессора, если это для вас важно.

    Например, Intel 13 generation (Raptor Lake):
    64e36131e373d800849356.png
    L1 для данных (DFU) и L1 для инструкций (IFU) у каждого ядра свои собственные.
    L2 у каждого P-ядра свой собственный, но для E-ядер - используется общий.
    L3 общий
    Ответ написан
    3 комментария
  • Какой уровень блокировки строк по умолчанию в запросе SELECT?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ни один из перечисленных.
    Для простого SELECT нужны AccessShareLock на таблицу/индексы/etc. row-level блокировки не применяются за ненадобностью.
    Ответ написан
    Комментировать
  • Как сделать определение конфигурации поиска в другом столбце таблицы?

    Melkij
    @Melkij
    PostgreSQL DBA
    melkij=> \df to_tsvector
                                      Список функций
       Схема    |     Имя     | Тип данных результата | Типы данных аргументов |  Тип  
    ------------+-------------+-----------------------+------------------------+-------
     pg_catalog | to_tsvector | tsvector              | json                   | функ.
     pg_catalog | to_tsvector | tsvector              | jsonb                  | функ.
     pg_catalog | to_tsvector | tsvector              | regconfig, json        | функ.
     pg_catalog | to_tsvector | tsvector              | regconfig, jsonb       | функ.
     pg_catalog | to_tsvector | tsvector              | regconfig, text        | функ.
     pg_catalog | to_tsvector | tsvector              | text                   | функ.
    (6 строк)

    действительно не существует такой функции.

    Поправьте тип данных поля config на ожидаемый regconfig.
    Ответ написан
    Комментировать
  • Как узнать с какого IP-адреса оставляют заявки пользователи с формы на сайте?

    Melkij
    @Melkij
    PostgreSQL DBA
    $_SERVER['REMOTE_ADDR']

    Возможны варианты конфигурации, при которых адрес клиента необходимо получить каким-то другим способом, а не из REMOTE_ADDR, в этих случаях следуйте инструкции хостера или вашей группы эксплуатации.
    Ответ написан
    Комментировать
  • Почему тип столбца xml не проверяет входное значение?

    Melkij
    @Melkij
    PostgreSQL DBA
    melkij=> select 'hello'::xml;
      xml  
    -------
     hello
    (1 строка)
    
    melkij=> select '<foo>hello'::xml;
    ERROR:  invalid XML content
    СТРОКА 1: select '<foo>hello'::xml;
                     ^
    ПОДРОБНОСТИ:  line 1: Premature end of data in tag foo line 1
    <foo>hello
              ^
    line 1: chunk is not well balanced
    <foo>hello

    есть проверка.

    Если вам нужно проверить, что это не просто валидный xml, но целый документ - добавьте check constraint с проверкой на columnname is document
    Ответ написан
    2 комментария
  • Секционирование таблицы по хэшу. В чем принцип?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как-как. Вызывается некоторая хэш-функция для значений ключа партицирования, её результат делится нацело на modulus, строка попадёт в ту партицию, для которой совпадает remainder.

    create table part (i int) partition by hash (i);
    create table part_0 partition of part FOR VALUES WITH (MODULUS 2, REMAINDER 0);
    create table part_1 partition of part FOR VALUES WITH (MODULUS 2, REMAINDER 1);
    insert into part select generate_series(1,10);
    select * from only part_0;
    select * from only part_1;


    на слишком малых выборках хэш ожидаемо может быть не столь равномерно распределён.
    Ответ написан
    Комментировать
  • Как правильно очищать archived WAL логи PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Берёте pgbackrest.
    Ну или walg или barman какие.

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

    архивные логи ДО-момента backup'а уже не нужны

    до позиции LSN на момент запуска basebackup, самого старого из тех, который по вашей политике резервного копирования нужно хранить.
    Ответ написан
    2 комментария
  • Как линии pcie делятся между устройствами?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как решил производитель материнской платы разделить - так и будет. Обычно об ограничения упоминается в мануале.

    Видяха единственная станет работать по 8 линиям? Или если во втором слоте не видеокарта, то и линии не будут делиться?

    Каждая линия PCI-E - шина типа точка-точка, на одной шине не может быть нескольких устройств. Поэтому установка любого устройства (даже x1) в слот PCIE_4 переведёт слот PCIE_1 в режим x8.

    Использование PCIe 2.0 x16 не возможно, так как согласно спецификации материнки в случаи установки ssd в m2_2 (а он там установлен) этот слот не работает.

    Верно.

    Итого, при установленной видеокарте, ryzen 2700 и pci-e nvme SSD в слоте M2_2 вы не можете использовать остальные слоты PCI-E x16. Третий nvme тут ставить только или в ущерб устройства в первом PCI-E x16 или в x1 в ущерб полосе (но не латентности) самого nvme. Ну или в USB 3.2 адаптером.
    Ответ написан
    Комментировать
  • Почему пропускается отчистка?

    Melkij
    @Melkij
    PostgreSQL DBA
    skipping vacuum of \"%s\" --- lock not available - это не интересно, это штатное поведение. Причина именно та которая написана. Автовакуум тут хочет поработать, но какая-то другая запущенная транзакция держит конфликтующий лок на таблицу. Автовакуум не ждёт этот лок, а просто отменяется и попробует прийти попозже.

    А вот Segmentation fault - ну, это Segmentation fault, также известный как сегфолт. Ставите все доступные минорные обновления какие есть, если после этого по прежнему сегфолтится - то зовёте кого-то кто понимает в gdb или разбираетесь сами. Имея результаты изысканий, по возможности (но крайне рекомендуется) с обрезанным до воспроизводимого примера дампом, идёте к разработчику базы. Обратите внимание, поскольку вы говорите про 1с - то это точно НЕ postgresql global developing group, а какой-то местный форк. Потому что 1с не осилили работать с postgresql.
    Ответ написан
  • Как скопировать данный из RAID 1 диска?

    Melkij
    @Melkij
    PostgreSQL DBA
    raid1 - это решение поддержания high availability на случай физического отказа накопителя. Ну эти, старые добрые HDD, помирающие в случайный момент времени и спокойно заменяемые в hot swap корзине на аналогичный из коробки с запасными частями, без прерывания работы сервера и сервисов.

    Всё.

    Если вы почему-то решили, что raid1 должен как-то заменять бекапы и страховать ошибки оператора - подумайте ещё раз.
    Ответ написан
  • Как сделать выбрку по массиву JSON в Postgresql 9.6?

    Melkij
    @Melkij
    PostgreSQL DBA
    select (select j->>'name' from jsonb_array_elements(jsonb_field) as j where j->>'custom_twine' = 'custom_38') from tablename
    Ответ написан
    1 комментарий
  • Как хранятся имена сущностей в PSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Все unquoted identifiers принудительно приводятся парсером в нижний регистр.
    quoted identifiers - используются как есть.
    https://www.postgresql.org/docs/current/sql-syntax...
    Ответ написан
    Комментировать
  • Выбор между оперативной памятью. Двухканал или низкие тайминги?

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрим.

    DDR4-2400 даёт 19200мб/с, при CL17 имеет латентность 14.16 ns
    DDR4-3200 даёт 25600мб/с, при CL20 имеет латентность 12.5 ns

    Выше пропускная способность - лучше
    Ниже латентность - лучше

    Это даже не касаясь вопроса второго канала памяти, в теории дающего удвоение пропускной способности при той же латентности.

    CL имеет смысл сравнивать на одной частоте, а на разной частоте тайминги могут означать не то чем кажутся.
    Ответ написан
    Комментировать
  • Как проверить бекап postgres что он не битый?

    Melkij
    @Melkij
    PostgreSQL DBA
    Проверить бекап - путь только один, это восстановиться с него и посмотреть всё ли на месте. То самое известное, что все администраторы по наличию бекапов делятся на 3 типа: кто не делает бекапы, делает бекапы и тех, кто проверяет восстановление из бекапа.

    прервался ли pg_dump в какой-то момент - смотреть можно, как обычно, по коду возврата, а так же по stderr.

    PS: довольно тревожная мысль не сохранять права доступа
    Ответ написан
    5 комментариев
  • Как передавать один параметр, а не 3?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что необходимо в join описывать критерий объединения. (я вообще думал, что это требование стандарта и в [inner] join синтаксически обязателен on, using или natural)

    FROM views v JOIN memes m using(user_id) JOIN comments c using(user_id)
     WHERE user_id = 1
    Ответ написан
    Комментировать
  • Как скопировать данные с одной таблицы в другую и обновить данные?

    Melkij
    @Melkij
    PostgreSQL DBA
    при наличии уникального ограничения по phone
    insert into desc (phone, name, nickname)
    select phone, name, nickname from src
    on conflict (phone) do update name = excluded.name
    Ответ написан