Задать вопрос
  • Почему не удается авторизоваться под юзером postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    # DO NOT DISABLE!
    # If you change this first entry you will need to make sure that the
    # database superuser can access the database using some other method.
    # Noninteractive access to all databases is required during automatic
    # maintenance (custom daily cronjobs, replication, and similar tasks).
    #
    # Database administrative login by Unix domain socket
    local   all             postgres                                peer
    
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
    # "local" is for Unix domain socket connections only
    local   all             all                                     peer
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            scram-sha-256


    по умолчанию ubuntu создаёт примерно такого смысла pg_hba.conf

    Обращу отдельное внимание, что первой строкой идёт peer авторизация именно для postgres'а и это будет плохая мысль её ломать.

    sudo -u postgres psql
    здесь вы зашли от unix пользователя postgres и запустили psql, имя unix пользователя совпадает с именем пользователя базы - это достаточное условие для прохождения peer аутентификации, вы получили доступ к базе. Это обычный вариант использования суперпользователя базы (dba впрочем чаще делают sudo -iu postgres, т.к. нужен не только psql)

    sudo psql -U postgres -d testdb
    Здесь вы хотите запустить psql от рута и авторизоваться пользователем postgres. "postgres" != "root", поэтому peer аутентификация не пускает авторизацию. То что root это root операционной системы не очень интересует postgresql, делает то что сказано в pg_hba (и pg_ident, но это тема отдельного обсуждения)
    sudo здесь совершенно лишний и не выполняет никакого смысла.

    Изменение
    host all all 127.0.0.1/32 md5
    эффекта не имеет, потому что host тип подключения для TCP/IP подключений, а по-умолчанию psql подключается по unix sock.
    psql -h 127.0.0.1 форсирует подключение по TCP/IP

    задал пароль вручную через passwd, проверил - зашел пользователем postgres через ssh - пускает

    Пользователь ОС не имеет отношения к пользователю внутри СУБД, это разные сущности.
    Пароль postgres пользователя базы можно изменить через psql командой \password

    Тем не менее,
    sudo -u postgres psql
    достаточно для административного доступа. Не работайте от суперпользователя постоянно.
    Ответ написан
    Комментировать
  • Как подружить анализатор PostgreSQL со своим составным типом?

    Kwisatz
    @Kwisatz Автор вопроса
    Больше web-приложений, хороших и разных
    Сам спросил сам отвечу

    Все дело было в том что оператору = необходимо было указать опции restrict и join.
    Для этого надо внимательно читать не только
    https://www.postgresql.org/docs/current/sql-create...
    но так же
    https://www.postgresql.org/docs/current/xoper-opti...

    Прикладываю выдержку любезно выданную мне клодом.

    RESTRICT = eqsel
    RESTRICT — функция селективности для WHERE-условий
    Логика работы eqsel:

    Если значение есть в most_common_vals → берет частоту из most_common_freqs
    Если нет статистики → использует формулу 1 / n_distinct
    Для уникальных значений → возвращает очень малую селективность

    JOIN = eqjoinsel
    JOIN — функция селективности для JOIN-операций:
    Анализирует статистику обеих таблиц
    Оценивает количество совпадающих пар
    Учитывает кардинальность (количество уникальных значений)

    Так же приложу описание моего типа в полном объеме, возможно кому то понадобится.
    Сделал я его потому, что для выборок стали делать текстовое generated поле которое объединяло 2.5 (на самом деле поля 3, но 2 из них это id/uid) через разделитель, чтобы искать через any($param::text[]) то есть по факту, если хранить id/uid разными полями, получалось 4 поля в каждой таблице и более сложные запросы. Сделав же составной тип и описав в php для него классы типы доктрины, все стало удобней и лаконичней и в бд и в коде.

    create type entity_pointer as
    (
        type_name varchar,
        id        int,
        uid       uuid
    );
    
    ------------------------------------------------------------------------------
    -- Функция для полного сравнения
    
    create or replace function entity_pointer_cmp(entity_pointer, entity_pointer)
        returns integer as
    $$
    begin
        -- Обработка NULL значений
        if $1 is null and $2 is null then return 0; end if;
        if $1 is null then return -1; end if;
        if $2 is null then return 1; end if;
    
    -- Сравнение через ROW конструктор
        return case
                   when row (coalesce($1.type_name, ''), coalesce($1.id, 0), coalesce($1.uid, '00000000-0000-0000-0000-000000000000'::uuid)) <
                        row (coalesce($2.type_name, ''), coalesce($2.id, 0), coalesce($2.uid, '00000000-0000-0000-0000-000000000000'::uuid))
                       then -1
                   when row (coalesce($1.type_name, ''), coalesce($1.id, 0), coalesce($1.uid, '00000000-0000-0000-0000-000000000000'::uuid)) >
                        row (coalesce($2.type_name, ''), coalesce($2.id, 0), coalesce($2.uid, '00000000-0000-0000-0000-000000000000'::uuid))
                       then 1
                   else 0
            end;
    end;
    $$ language plpgsql immutable;
    
    ------------------------------------------------------------------------------
    -- хэш функция для соответствующего индекса
    
    create or replace function entity_pointer_hash(entity_pointer)
        returns integer as
    $$
    begin
        -- комбинируем значения хешей всех полей
        return coalesce(hashtext($1.type_name), 0) #
               coalesce(hashint4($1.id), 1) #
               coalesce(hashtext($1.uid::text), 2);
    end;
    $$ language plpgsql immutable
                        strict;
    
    ------------------------------------------------------------------------------
    -- Функции сравнения (нужны потому что для операторского класса функции должны возвращать bool)
    
    create or replace function entity_pointer_equal(entity_pointer, entity_pointer)
        returns boolean as
    $$
    begin
        return entity_pointer_cmp($1, $2) = 0;
    end;
    $$ language plpgsql immutable;
    
    
    create or replace function entity_pointer_ne(entity_pointer, entity_pointer)
        returns boolean as
    $$
    begin
        return entity_pointer_cmp($1, $2) <> 0;
    end;
    $$ language plpgsql immutable;
    
    
    -- Функции для других операторов сравнения (необходимы для B-tree)
    
    create or replace function entity_pointer_lt(entity_pointer, entity_pointer)
        returns boolean as
    $$
    begin
        return entity_pointer_cmp($1, $2) < 0;
    end;
    $$ language plpgsql immutable;
    
    create or replace function entity_pointer_le(entity_pointer, entity_pointer)
        returns boolean as
    $$
    begin
        return entity_pointer_cmp($1, $2) <= 0;
    end;
    $$ language plpgsql immutable;
    
    create or replace function entity_pointer_gt(entity_pointer, entity_pointer)
        returns boolean as
    $$
    begin
        return entity_pointer_cmp($1, $2) > 0;
    end;
    $$ language plpgsql immutable;
    
    create or replace function entity_pointer_ge(entity_pointer, entity_pointer)
        returns boolean as
    $$
    begin
        return entity_pointer_cmp($1, $2) >= 0;
    end;
    $$ language plpgsql immutable;
    
    ------------------------------------------------------------------------------
    -- Создание операторов
    
    create operator = (
        leftarg = entity_pointer,
        rightarg = entity_pointer,
        function = entity_pointer_equal,
        commutator = =,
        negator = <>,
        restrict = eqsel,
        join = eqjoinsel,
        hashes,
        merges
        );
    
    create operator <> (
        leftarg = entity_pointer,
        rightarg = entity_pointer,
        function = entity_pointer_ne,
        commutator = <>,
        negator = =,
        restrict = neqsel,
        join = neqjoinsel
        );
    
    create operator < (
        leftarg = entity_pointer,
        rightarg = entity_pointer,
        function = entity_pointer_lt,
        commutator = >,
        negator = >=,
        restrict = scalarltsel,
        join = scalarltjoinsel
        );
    
    create operator <= (
        leftarg = entity_pointer,
        rightarg = entity_pointer,
        function = entity_pointer_le,
        commutator = >=,
        negator = >,
        restrict = scalarltsel,
        join = scalarltjoinsel
        );
    
    create operator > (
        leftarg = entity_pointer,
        rightarg = entity_pointer,
        function = entity_pointer_gt,
        commutator = <,
        negator = <=,
        restrict = scalargtsel,
        join = scalargtjoinsel
        );
    
    create operator >= (
        leftarg = entity_pointer,
        rightarg = entity_pointer,
        function = entity_pointer_ge,
        commutator = <=,
        negator = <,
        restrict = scalargtsel,
        join = scalargtjoinsel
        );
    
    ------------------------------------------------------------------------------
    
    create operator class btree_entity_pointer_ops
        default for type entity_pointer using btree as
        operator 1 < ,
        operator 2 <= ,
        operator 3 = ,
        operator 4 >= ,
        operator 5 > ,
        function 1 entity_pointer_cmp(entity_pointer, entity_pointer);
    
    create operator class hash_entity_pointer_ops
        default for type entity_pointer using hash as
        operator 1 = ,
        function 1 entity_pointer_hash(entity_pointer);


    PS сложность средний, ага, смешная шутка...
    PSPS кстати, клод еще упоминает likesel но его я вообще в документации не нашел
    Ответ написан
    4 комментария
  • Как по локалке управлять другим компьютером?

    ky0
    @ky0 Куратор тега Системное администрирование
    Миллиардер, филантроп, патологический лгун
    Разберитесь, почему не работает RDP.
    Ответ написан
    Комментировать
  • Как корректно завершить процесс postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Отсутствие реакции на SIGTERM при продолжающемся потреблении CPU это примечательно. Но без -dbgsym и GDB ничего определённого выяснить фактически не удастся. Суть - как-то попали в какую-то ветвь кода, которая не считалась что может занимать продолжительное время и вызов обработчика сигналов CHECK_FOR_INTERRUPTS там не был предусмотрен. Из вариантов навскидку где возможно в 16.х наступить - dblink или fdw, create index using hash. Традиционно, ещё могут быть index scan по gin или gist, не в первый раз находятся у них такие грабли.
    Как минимум, удостовериться, что используется свежая минорная версия. Завтра 16.9 выходит.

    Ну, это из предположения что весьма подозрительный watchdog: BUG: soft lockup тут ни при чём. Что это такое я вряд ли подскажу. Выглядит нехорошо.

    Такс, это всё про оставшийся процесс.
    Про сам the database system is shutting down
    При crash recovery делается immediate stop, все backend которые не завершаться за 5 секунд получат SIGKILL. Который, естественно, проигнорировать уже не могут, потому что процессу про SIGKILL никто даже и не скажет, его просто снимет ядро ОС.
    Значит, перед всеми the database system is shutting down был received smart shutdown request или received fast shutdown request, который кто-то скомандовал явным образом. Оба режима штатного выключения не делают SIGKILL, а именно дождутся корректного завершения процесса. В случае с багом, когда процесс не отреагировал на SIGTERM, ну, вечно ждать и будет. Других вариантов кроме SIGKILL тут нет.

    Если логи ещё сохранились на дату shutdown request - то смотреть что там делали с системой, что кто-то скомандовал stop или restart базе. Если не вмешательство администратора, то может быть какой-то аналог unattended-upgrades?
    Ответ написан
    Комментировать
  • Как узнать первые признаки, что ноутбук больше не включится?

    VoidVolker
    @VoidVolker Куратор тега Железо
    Dark side eye. А у нас печеньки! А у вас?
    Никак. ПК может проработать как пять минут и двинуть кони, так и запросто 10-20 лет без поломок. Надо просто периодически обслуживать (менять термопасту, чистить от грязи, пыли и т.п.), эксплуатировать в нормальных условиях, не допускать перегрева, следить за показаниями смарта дисков и прочее. Выход железа из строя практически всегда происходит внезапно. Да, бывают неисправности, которые приводят к частичному отказу - нестабильное поведение, перезагрузки, падение ПО и прочее. Но это тоже случается непредсказуемо.

    Не может что прям все идеально работает, а завтра не включится.

    Может и случается регулярно - это вполне обычное явление.
    Ответ написан
    Комментировать
  • Как работать с датой записанной в поле формата числа с плавающей точкой?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Этот способ хранения даты тянется ещё с Lotus 1-2-3. Когда Microsoft добавляла дату/время в Excel, то для совместимости использовали тот же формат.
    Отсчёт ведётся от 30.12.1899. Целая часть - количество дней, прошедших с этой даты, дробная часть - время. Если дробную часть умножить на 24*60*60, то получим количество секунд с начала дня.
    Встроенных функция для преобразования в PostgreSQL нет, так что, видимо, это прямой перенос из чего-то типа MSAccess.
    45672.38114849537 соответствует 2025-01-15 09:08:51.230
    Получить можно, например, так:
    SELECT
      date_lotus,
      '1899-12-30'::date + MAKE_INTERVAL(days => date_lotus::int, secs => ((date_lotus - date_lotus::int) * 24*60*60)::int) AS datetime
      FROM test;
    
    | date_lotus        | datetime            |
    | ----------------- | ------------------- |
    | 45672.38114849537 | 2025-01-15 09:08:51 |
    Ответ написан
    Комментировать
  • Как работает \G в регулярных выражениях?

    @dodo512
    Якорный метасимвол \G в PHP и Ruby соответствует началу текущего совпадения, а в Perl. java.util.regex и языках .NET – концу предыдущего совпадения.
    В подавляющем большинстве случаев конец предыдущего совпадения и начало текущего совпадения это одно и то же, но в некоторых редких случаях эти две позиции могут различаться.

    https://www.rexegg.com/regex-anchors.php#G

    Например, строка A=1:2:3 B=1:2:3 A=1:2:3:4:5 B=1:2:3

    Шаблон поиска ((?:A=|\G)\d):
    Строка замены $1.

    Результат A=1.2.3 B=1:2:3 A=1.2.3.4.5 B=1:2:3

    https://regex101.com/r/nuWRBb/1

    Как работает \G подробнее в книге Джеффри Фридла "Регулярные выражения".
    Ответ написан
    Комментировать
  • Jumbo frame для игрового сервера есть смысл включать?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Улучшает, если этот размер MTU поддерживается на всём пути между сервером и клиентом. В противном случае - ухудшает.
    Ответ написан
    Комментировать
  • Крон внутри докера?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    Лучше не надо

    UPD
    Появилось некое решение supercronic - ещё не тестировал, но судя по описанию выглядит перспективно.
    Ответ написан
    Комментировать
  • Крон внутри докера?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Не нужно "именно внутри контейнера".

    Делайте отдельный контейнер, запускайте с хоста или юзайте оркестратор, в котором есть CronJob.
    Ответ написан
    Комментировать
  • 10к строк по базе размером 500кк?

    @galaxy
    SELECT * FROM base WHERE domain LIKE '%habr%' LIMIT 10000;


    проще всего так, наверно:

    CREATE EXTENSION pg_trgm;
    
    CREATE INDEX trgm_domain_base_idx ON base USING GIST (domain gist_trgm_ops);
    
    EXPLAIN ANALYZE SELECT * FROM base WHERE domain LIKE '%habr%' LIMIT 10000;


    https://www.postgresql.org/docs/current/pgtrgm.html
    Ответ написан
    Комментировать
  • Почему сервер не может подключиться к Postgres внутри контейнера?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Между контейнерами коннектиться не по 127.0.0.1, а по имени контейнера.
    Ответ написан
    Комментировать
  • Как выглядит sudoers?

    postgres не нужно прописывать в sudoers, если ты не знаешь, что именно нужно запускать через sudo от имени этого пользователя
    Ответ написан
    Комментировать
  • Нужно ли покупать доменное имя для AD?

    akelsey
    @akelsey
    домен лучше приобрести сразу, хотя это не необходимо, но стоит копейки, когда созреете - его займут.
    а по неймингу в АД отвечал давно тут
    Плоское имя типа "KITRUS" как рекоммендуют выше, так же не исползьуйте.
    Ответ написан
    3 комментария
  • Как перенаправить Nginx на три разных контейнера Docker?

    Каждое из приложений должно понимать, что оно работает по адресу /webX. Если не понимает, возможны перенаправления на url, которые вы не учли. В целом, для современных сложны приложений, так работать не будет.
    Ответ написан
    Комментировать
  • Почему вместо 100, по проводу 95?

    @ElxkoT
    Потому что 100 мегабит у вас на канальном уровне. С учётом размера заголовков пакетов и прочих технических накладных расходов в 100мб линк как раз можно впихнуть в районе 94-95мб реальной полезной нагрузки
    Ответ написан
    16 комментариев
  • Как работают явные блокировки в PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Блокировки строк и блокировки таблиц (и прочих объектов) - два разных механизма. (а serializable изоляция и вовсе частично третий)

    Блокировки строк отмечают информацию о себе специальными флагами в заголовке самой заблокированной строки. Запросы, которым нужна блокировка строки сначала проверяют, не отмечена ли эта строка блокировкой, затем проверяют что сейчас с той транзакцией, идентификатор transaction ID которой указан в информации о блокировке. Если транзакция ещё в работе - то начинаем ждать её завершение (или пропускаем строку для skip locked или кидает ошибку если nowait)
    Блокировки строк, будь то select for share/for update или пишущие запросы, всегда работают с самой актуальной версией строки.

    В то же самое время, любой запрос, трогающий таблицу (даже select) берёт блокировку на эту таблицу соответствующего своим потребностям уровня. Пока не возьмёт блокировку на таблицу - вообще не начнёт выполняться. Информация об этих блокировках размещается в сегменте shared memory памяти, потому доступны всем процессам базы. Если другие бекенды не держат блокировку таблицы конфликтующую с желаемым нашей транзакцией (или ещё только ждут блокировку более высокого уровня), то запрос блокировки удовлетворяется и работа продолжается.
    Ответ написан
    Комментировать
  • Секционирование таблицы по хэшу. В чем принцип?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как-как. Вызывается некоторая хэш-функция для значений ключа партицирования, её результат делится нацело на 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;


    на слишком малых выборках хэш ожидаемо может быть не столь равномерно распределён.
    Ответ написан
    Комментировать
  • Как определить MAC-адрес в ОС AstraLinux активной сетевой карты?

    ip --json link | jq -r '.[]|select(.operstate=="UP").address'
    Ответ написан
    Комментировать
  • Какой отечественный linux выбрать для веб-разработки?

    @AlexVWill
    Какой отечественный linux выбрать для веб-разработки?

    Никакой. Для web-разработки абсолютно фиолетово какой у тебя Linux, отечественный или нет. И если нет какой то особой осознанной нужды в использовании именно отечественных изделий, то лучше держаться от них подальше.
    Ответ написан
    3 комментария