Задать вопрос
  • Есть ли штатный способ разбить большой UPDATE на транзакционные части?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как делить одну большую операцию на части - необходимо базе объяснять.

    PG14 - нагенерировать запросов
    update ... where ctid between '(N,1)' and '(N+1000,1)'

    где N от 0 до relpages из pg_class и запустить.

    Если хочется - можно обернуть в анонимку DO, каждую очередную итерацию делая commit.

    На более старых версиях - выбрать какой-нибудь индекс скоррелированный с физическим расположением данных и идти вдоль него, нагенерировав запросов
    update ... where somecolumn between ? and ?
    кусками некоторого размера. Не имеет решающего значения соблюдение размера одного обновления, лишь бы выполнялся за разумное время.

    Во время миграции поглядывайте, успевает ли autovacuum за вами, успевают ли реплики и archiver (если есть).
    Ответ написан
    Комментировать
  • Как изменить директорию для postgresql wal?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    У initdb и pg_basebackup есть ключи запуска для этого.
    А на уже существующей базе - остановить базу, скопировать wal'ы в нужное место, заменить директорию wal'ов в PGDATA симлинком на новое место, запустить базу.
    Ответ написан
    1 комментарий
  • Почему иногда практикуется отсутствие связей в БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Не связано с микросервисами никак. Может встретиться в любых приложениях, работающих с базой.

    Кто-то забывает делать ограничения в схеме БД. Кто-то может вовсе не знать, что FK и check constraints существуют. Кто-то считает что проверки на приложении достаточно. (в этом случае бывает забавно показать примеры уже лежащих в БД данных, невозможных с точки зрения логики приложения)

    Сознательный, реально обоснованный отказ от FK - штука крайне редкая
    Ответ написан
    Комментировать
  • Почему периодически пакет для openjdk-11-jre становится не доступным?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Разве дебиан удаляет старую версию из репозитория?

    В список пакетов debian как правило публикует только одну доступную версию пакетов для этого релиза. (я не знаю примеров исключений этого правила, но не могу гарантировать что так всегда)
    При обновлении пакета, список пакетов начинает указывать на другую версию, старая версия пакета более в списке пакетов не числится и поэтому apt не может поставить эту конкретную версию.

    melkij@melkij:~$ apt-cache policy openjdk-11-jre
    openjdk-11-jre:
      Установлен: (отсутствует)
      Кандидат:   11.0.16+8-1~deb10u1
      Таблица версий:
         11.0.16+8-1~deb10u1 500
            500 http://security.debian.org buster/updates/main amd64 Packages
         11.0.14+9-1~deb10u1 500
            500 http://ftp.ru.debian.org/debian buster/main amd64 Packages

    Вот так смотрится какие версии доступны в загруженных репозиториях.

    Если вы хотите жёстко зафиксировать определённые пакеты - вам вероятно нужен собственный репозиторий, запиненный более высоким приоритетом относительно штатных. Принимая попутно все сопутствующие риски и работу сопровождения обновлений, в первую очередь security.
    Либо не фиксировать конкретную версию пакета.
    Ответ написан
    Комментировать
  • Как определить источник обращение к БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Используйте более подробный log_line_prefix. В частности, нужен %h

    log_line_prefix = '%m %p %u@%d from %h [vxid:%v txid:%x] [%i] '

    Мы такой используем если нет значимых причин для иного.
    Ответ написан
    1 комментарий
  • Как решить ошибку "string indices must be integers" в postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В postgresql такого текста ошибки нет.

    Этот запрос висит вечно

    Значит другие транзакции не дают вам получить access exclusive lock. (note: пока такой alter table в очереди ожидания - проект лежит)
    Посмотрите в pg_stat_activity что у вас запущено. например вот так
    Ответ написан
  • Как влияет полное шифрование диска на срок его службы?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для полноты картины добавлю: по соображениям криптостойкости шифрование диска наверняка отключит использование TRIM (см. конкретную реализацию шифрования). Что при шифровании всей доступной ёмкости диска существенно ухудшит производительность I/O на дешёвых SSD - они не смогут использовать неиспользуемое пространство flash для ускорения записи (так называемый SLC кеш) потому что будут думать, что вся ёмкость занята полезными данными, а избыточной подменной ёмкости flash ради удешевления там конечно практически нет.
    Скорей всего SMR HDD тоже рады не будут (да они вообще ничему не рады).

    И не забудьте заранее позаботиться о бекапах.
    Ответ написан
    Комментировать
  • Почему nextcloud не может писать в папке home?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    У www-data нет x прав на директорию /home/username/
    Ответ написан
    Комментировать
  • Показывать IP клиента NASу за NAT в Mikrotik, возможно?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Но по таким правилам все клиенты попадают в NAS от IP роутера (то есть типа изнутри).

    Так а зачем вы делаете маскарад на входящий трафик?
    https://help.mikrotik.com/docs/display/ROS/NAT
    Ответ написан
    Комментировать
  • Как правильно составить запрос INSERT в postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    ... DO UPDATE SET payment_date = info.payment_date + interval '23 hours';

    Данные конфликтующей строки доступны
    The SET and WHERE clauses in ON CONFLICT DO UPDATE have access to the existing row using the table's name (or an alias), and to rows proposed for insertion using the special excluded table.

    имени таблицы (или алиаса указанного в запросе) - та версия строки что есть
    псевдоним excluded - те значения что этот insert предполагал записать
    Ответ написан
    2 комментария
  • Правильно ли организовано логирование?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Документация отвечает однозначно
    Current date and time (start of current transaction);

    current_timestamp - это всегда время начала транзакции. Сколько бы транзакция ни заняла времени, до её окончания current_timestamp будет возвращать одно и то же значение.
    А правильно это для вашей задачи или нужно использовать другую из функций датывремени - это только к вам вопрос.
    Ответ написан
    1 комментарий
  • Как ускорить работу слота репликации на PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Скорей всего упираетесь в производительность IO на временных файлах, увеличение logical_decoding_work_mem с этим должно помочь.
    Затем посмотрите, не упираетесь ли в 100% cpu на этом процессе. logical decoding однопоточный, ему важна производительность в один поток. Тут ничего не поможет. Прочитать, понять и переупорядочить данные среди гигабайтов wal'ов всё равно придётся.
    Ответ написан
    Комментировать
  • С чего начинать тестирование двухюнитовых серверов с 16 планками U-DIMM и 24 хардами в Linux?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    CPU(s):                          256
    On-line CPU(s) list:             0-255
    Thread(s) per core:              2
    Core(s) per socket:              64
    Socket(s):                       2

    Я не понял проблематику ситуации. 40 ядер, несколько сотен гигов RAM да пара десятков дисков - средняя железка, какие там у вас специфические проблемы такие? 40 ядер нынче не проблема даже одним сокетом получить.

    Что касается памяти тут отдельная история, поступила жалоба, что U-DIMMы работают только при полной сборке (все 16), либо подключенные последовательно (с1 по 4 место например), но подключая в 1,3,7,12(например) места некоторые планки не определяются, либо сервер работает не корректно (не запускается, не стартует).

    См. документацию к материнке. Там будет описано, в каком порядке необходимо заполнять слоты. Да, это стандартное требование JEDEC для DIMM'ов, что серверных, что десктопных. Технически связано с терминаторами. Затем, после требований стандарта, идёт логика как не повесить всю имеющуюся память на один и тот же канал памяти одного и того же CPU. NUMA всё-таки.
    Вы правда занимаетесь серверами?
    Ответ написан
  • Почему я могу установить NULL в колонку mark, если у меня есть CHECK(mark in (1,2,3))?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Нет, не должен. Значение NULL не противоречит такому check constraint. На самом деле даже в исходниках самого postgresql есть замечания, что такое поведение несколько неожиданно, но таков стандарт SQL.
    Ответ написан
    Комментировать
  • Что лучше, 2 ядра 4 Гц или 8 ядер 1.6 Гц (цифры рандом)?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    То что в прикладной вашей задаче будет давать лучше результат.

    Когда-то давно, когда в десктопах были преимущество одноядерные CPU, маркетинг любил называть частоты. Потом полюбил козырять числом ядер. Потом ещё чем-нибудь. Одна характеристика чтобы доказать собственное превосходство над конкурентом (и что не менее важно - над предыдущим поколением собственной же продукции) - это же так здорово! Только нихрена это так просто не работает.

    Вот уже которое десятилетие единственный корректный ответ в выборе CPU - сравнить в конкретных условиях. Задача со звёздочкой: сравнить корректно.

    В частности, вы не указали, одной ли микроархитектуры два сравниваемых CPU. А этот маленький нюанс моментально лишает всякого смысла декларируемую частоту работы. Двухкратная разница производительности на одной частоте? Почему нет, история знает такие примеры. Потом кэши, организация памяти, а из недавнего - состояние защит от атак на спекулятивное выполнение. Ежели всё это идентично и из различий только число ядер и частота - то опять же упрёмся в необходимые задачи. Однопоточному приложению будет безразлично, есть ли ещё 7 ядер или только второе.
    Ответ написан
    Комментировать
  • Как удалить null из выборки?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    array_agg(attr.name) filter(where ...)
    Ответ написан
    2 комментария
  • Как поменять значение max_stack_depth в postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Сначала внимательно посмотрите на свой триггер, не пускаете ли вы его в бесконечную рекурсию. Нет, postgresql не будет вам мешать делать бесконечно-рекурсивный триггер и никак не будет препятствовать его выполнению до тех пор пока это будет возможно физически. И вот тут stack depth limit обычно и заканчивается первым.
    Ответ написан
    3 комментария
  • Как вставить аргумент функции между $$ $$ строкой в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Напрямую запросом, без лишнего execute
    CREATE OR REPLACE FUNCTION example(arg int)
    RETURNS int4
    LANGUAGE plpgsql
    AS $$
    declare
       out int;
       BEGIN
       --function body
       SELECT field * arg into out FROM randomtable;
       return out;
       END
       $$;
    select example(1);


    Или, если действительно нужно генерировать динамический SQL, то передать параметром в using:
    CREATE OR REPLACE FUNCTION example(arg int)
    RETURNS int4
    LANGUAGE plpgsql
    AS $$
    declare
       out int;
       somequery text;
       BEGIN
       --function body
       somequery := $q1$ SELECT field * $1 FROM randomtable $q1$;
       EXECUTE somequery into out using arg;
       return out;
       END
       $$;
    Ответ написан
    Комментировать
  • Как надёжен RAID на простой, не серверной, плате?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Это так называемый fake raid. Удивительная поделка, объединяющая недостатки одновременно аппаратного и программного рейда, но не обладающая никакими из их достоинств.
    Использовать можно только если скучно и хочется приключений.

    Не забудьте настроить бекапы. Рейды с избыточностью данных это про снижение простоя, а не замена бекапам.
    Ответ написан
    Комментировать
  • Увеличение LVM раздела на внешней хранилки?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    pvresize. Затем lvresize с resize2fs или lvcreate дальнейшие или ещё чего, смотря зачем увеличивали.
    Ответ написан
    Комментировать