Задать вопрос
  • Как удалить строку из view таблицы в Postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если материализованное view - то refresh materialized view
    Если не материализованное - то закешировано быть не могло. Смотрите определение view и исследуйте, откуда строка в резуультате этого запроса получается.
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку "Ошибочная минута"?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ну я бы тоже удивился если бы меня попросили что-то сделать в 6:320. Каким стандартом этот формат времени описывается?
    Ответ написан
    1 комментарий
  • Для чего используют функции serialize/unserialize?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    если открыть файл сессии текстовым редактором

    То вы как раз и найдёте serialize/unserialize, которые механизм сессий и использует для чтения/записи данных в файле. (разумеется, если не говорить о кастомных sessionhandler - там может быть что угодно)

    кусок кода корзины товаров (добавляет товар в корзину):

    Здесь serialize/unserialize не нужны и никакого смысла либо пользы не несут.

    serialize выполняет представление переменной PHP в некий бинарный вид (и это важно! результат serialize не текст, а именно бинарный блоб, в том числе может штатно использоваться NUL-байт). unserialize это представление восстанавливает обратно. Обратите внимание на большой варнинг в документации и не используйте unserialize на данных которые вы не контролируете полностью.

    А если я попробую просто записать в ячейку не сериализованный массив?

    Получите слово Array вместо данных и предупреждение от языка за некорректное использование массива.
    Ответ написан
    Комментировать
  • Есть ли разница между выражением и транзакцией?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Можем ли мы быть уверены, что в следующей конструкции обновление обязательно произойдет (считаем что SELECT вернул какие-то данные)?

    Нет, не можем.
    Два конкурентных запроса могут увидеть одни и те же версии строк в cte (не пересекутся на читающих блокировках даже с конкурентными писателями т.к. mvcc) и затем пойдут обновлять одни и те же строки. На блокировках обновления строк их транзакции и сериализуются. Кстати, можно и deadlock словить если строк к обновлению будет несколько и они вернутся из запроса в разном порядке.

    приостановить запрос и посмотреть что будет, если произойдет X?

    gdb может приостановить всё что угодно. Правда далее уже интересный момент что надо найти куда именно break point ставить.
    Ответ написан
    Комментировать
  • Как увеличить свободное пространство для раздела в LVM?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Посмотрите в vgdisplay есть ли Free PE. Если 0 - расширять просто нечем.

    Если free есть - то lvresize или lvextend. Затем расширить файловую систему (resize2fs для ext2/3/4 который у вас вероятно и есть)
    Если free нет - то необходимо добавлять новый диск или уменьшать другие разделы. Например, /home . Впрочем, судя по его размеру и 45мб занятых - вы разрезали диск неверно для своей задачи (а зачем вообще резали отдельно /var и /home ?). Может лучше будет вовсе перемонтировать раздел с /home куда-нибудь, скопировать в корневой /home данные и удалить этот том полностью.
    Если /home вам нужен отдельный - то опять же resize2fs или какая у вас там файловая система стоит. Сжимаете до какого-то размера (если возможно), проверяете что сжалась, затем уменьшаете логический том (lvresize). Имеет смысл запросить resize2fs меньше размера на который хотите уменьшить раздел. затем после lvresize ещё раз вызвать resize2fs и расширить раздел обратно - чтобы случайно не ошибиться на пару мегабайт и не повредить этим файловую систему.
    Ответ написан
    5 комментариев
  • Столбец удален, но не удален, как удалить столбец?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Мой хрустальный шар совершенно верно показал.
    Когда вы делаете add column columnname text - вы получаете NULL во всей этой колонке. Разумеется сразу после этого вы поставить NOT NULL не можете никак. Любая строка нарушает это ограничение и база отказывается ставить NOT NULL.
    Когда вы делаете add column columnname text NOT NULL - чтож, это может сработать в одном случае - у вас пустая таблица. Тогда ни одна строка не нарушает NOT NULL ограничение, у вас просто 0 строк. Если хоть одна строка есть - это невозможно. Вы просите default NULL и одновременно NOT NULL - так не бывает. В сообщении об ошибке говорится именно о добавляемой в этот момент колонке, не о какой-то другой существовавшей ранее.

    Вы должны указать какой-то не NULL default если хотите поставить NOT NULL на создаваемое поле. Либо очистить таблицу.
    Либо создать без NOT NULL, заполнить поле, потом уже делать NOT NULL.

    В postgresql действительно колонка не удаляется никогда. Но это деталь реализации и к сути вашего вопроса отношения не имеет.
    Ответ написан
    2 комментария
  • Какой есть аналог JSONB_OBJECT_KEYS для значений?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    json_each / jsonb_each
    Ответ написан
    Комментировать
  • Зачем нужен DEFERRABLE INITIALLY DEFERRED в результате sqlmigrate для миграции добавления модели?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ваш сгенерированный SQL невалиден для postgresql. Ключевого слова AUTOINCREMENT не существует.

    А про deferred constraints:
    cc=> begin;
    BEGIN
    cc=> insert into blog_post (author_id) values (100);
    INSERT 0 1
    cc=> commit;
    ERROR:  insert or update on table "blog_post" violates foreign key constraint "blog_post_author_id_fkey"
    ПОДРОБНОСТИ:  Key (author_id)=(100) is not present in table "auth_user".

    Непосредственно insert отработал. Именно из-за deferred ограничения.
    Если вы проверяете вне транзакции - то insert будет транзакцией сам по себе и потому нет разницы
    Ответ написан
  • PostgresSQL не работает idle_in_transaction_session_timeout?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Но сессии в статусе idle, не удаляюся(

    idle != idle in transaction
    Для сурерпользователя настройка действует тоже. Сделайте begin; и подождите. Через указанный таймаут сессия будет убита (при том, клиентское приложение возможно это заметит только при попытке отправить запрос)
    Ответ написан
    Комментировать
  • Может кто дать совет по PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Пропущены настройки autovacuum и bgwriter. Поведение на ненастроенный автовакуум в общем-то похоже. Плюс возможно у вас открытая транзакция болтается и дополнительно мешает. Либо неактивный слот логической репликации.

    WAL: поскольку чекпойнт говорит 0 removed, 0 recycled - значит кто-то мешает. Это могут быть:
    неактивные replication slot - проверяйте pg_replication_slots
    ошибки archiver - проверяйте pg_stat_archiver, archive_mode, archive_command
    wal_keep_segments

    swap - см. vm.swappiness
    Ответ написан
  • Не могу создать процедуру в PostgreSQL. Что делать?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Проверьте вашу версию postgresql.
    Синтаксис CREATE PROCEDURE и CALL присутствуют только в postgresql 11 и новее.
    Ответ написан
    Комментировать
  • Почему не делается update в цикле foreach?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    update чего именно? У вас в коде написано: на каждой итерации цикла обнови все строки таблицы.
    Совершенно логично, что в результате выполнения скрипта все строки таблицы будут содержать данные с последней итерации цикла.
    Ответ написан
    4 комментария
  • Как организовать синхронную репликацию БД PostgreSQL на географически удаленных серверах?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Берёте и настраиваете.
    По настройкам сети - любые извращения, лишь бы у вас был открыт tcp порт (тот на котором слушает ведущий, 5432 обычно) от реплики к ведущему.
    За синхронность репликации отвечает synchronous_standby_names при включенном synchronous_commit

    Учтите что синхронная репликация при географическом распределении - больно. Именно жирным шрифтом. Как по производительности, так и по стабильности работы на запись данных - если чуть что с сетью - то ведущая база у вас ничего писать не будет пока не почините сеть. Потому что синхронная репликация.
    Ответ написан
    Комментировать
  • Помощь в расшифровки логов postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Не "оператор" потому что а statement - и будет сразу немного понятнее о чём речь.

    Первый delete пришёл через extended protocol так же известный как prepared statements. Рядом помимо execute должны быть ещё parse и bind.
    Второй - через simple query протокол, то есть просто текст запроса.
    Ответ написан
    2 комментария
  • Есть ли способ спросить у PostgreSQL, с какими запросами у него возникают наибольшие сложности?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Поставить pg_stat_statements, спустя какое-то время посмотреть что тот собрал. Например, нашим отчётом
    Ответ написан
    1 комментарий
  • Как указать доктрине, какой неймспейс использовать?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Слово namespace здесь неверно.
    Ищите по schema name и конкретно search_path

    Странно что вы не знаете что такое search_path, но он у вас модифицирован. В дефолтную настройку схема public включена и потому оба ваших запроса обычно делают одно и то же.

    В доктрине начиная с 2.5 схема указывается так:
    /**
     * Clerk
     *
     * @Table(schema="schema")
     */
    class Clerk { }

    Не уверен что будет работать для public схемы если доктрина предполагает что оно в search_path есть и так.
    Ответ написан
    1 комментарий
  • Где находится файл конфигурации OPcache?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    На вопрос может точно ответить phpinfo()
    Смотрите секции Loaded Configuration File, Additional .ini files parsed
    Ответ написан
    Комментировать
  • Зачем делают ID в формате sha1?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Чтобы:
    - без особой пользы в разы увеличить объём хранимых данных. Тем более если использовать строки.
    - постараться запутать планировщик базы
    - дополнительно увеличить стоимость записи индексов (значения случайны = значения пишутся в случайные места дерева, вы постоянно "пачкаете" разные страницы)

    Если это ключ партицирования - да, встречается такая схема партицирования. Но если это ключ партицирования - то вы бы и так уже знали почему используется не число.
    Ответ написан
  • #1071 - Указан слишком длинный ключ. Максимальная длина ключа составляет 767 байт. Как решить?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    См. настройки в частях innodb_large_prefix, innodb_page_size, innodb_file_format
    https://mariadb.com/kb/en/library/innodb-limitations/
    https://dev.mysql.com/doc/refman/8.0/en/innodb-res...

    Какое-то из условий не было выполнено и база ограничена в 767 байт на длину одного элемента в индексе.
    Ответ написан
    Комментировать
  • Как сделать репликацию PostgreSQL и распределение нагрузки с учётом нагрузки от записи, а не чтения?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Внимание вопрос: зачем?

    100 записей в секунду и 5 чтений в минуту - это ни о чём.
    Писать 10000 записей в секунду - ну и? Никакой проблемы держать на одной железке и это в обычном OLTP, а не 99% write/1% read как у вас.

    Взять адекватные диски, выкинуть к чертям докер. А для hot standby масштабировать запись не нужно. Простая и надёжная потоковая реплика.

    монго можно разделить на X нод без шаманских танцев с бубном

    Спасибо, хорошая шутка.

    На всякий случай: вы ведь поминаете что никакая репликация для масштабирования записи не может помочь? Если каждый хост должен содержать копию данных - значит он должен все данные записать. Для масштабирования записи - шардирование верное слово. Только это не про сотни транзакций записей.
    Ответ написан
    1 комментарий