Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Какова правильная практика использования уникального идентификатора(Postgres SERIAL)?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как Вы поняли в поле "а" вписывается ответ "no" или "yes" .

    телепатические навыки какого уровня для это нужны? Нет, вообще не очевидно.
    А если поле для булевых значений - то почему тип данных такой странный? про название таблицы ответов лучше спрашивать даже не буду.

    В моем бизнесе вопросы собраны в Репорт (Репорты разные. В зависимости от Репорта имеют от 10 до 70 вопросов). Таким образом ответы заходящие в таблицу user нужно разделять по Репортам.

    Хотелось бы знать, как из первого вытекает второе.

    Если у вас есть некие "репорты", состоящие из некоторого числа вопросов, а на вопросы отвечают пользователи то совершенно очевидно у вас есть:
    таблица пользователей
    таблица репортов
    таблица вопросов с полем-ссылкой на репорт
    таблица ответов из 3 полей: id пользователя, id вопроса, значение ответа. Primary key на первые два поля.
    Ответ написан
    Комментировать
  • Что происходит с памятью после удалении записи с типом varchar в postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    мне сно , при апдейте кортежа в varchar запись удаляется с диска и вписывается на новое место в памяти

    Ммм. Сомневаюсь что действительно что-то ясно.

    Для начала:
    на диске данные существуют ровно в том же виде, что и затем обрабатываются в памяти. Как побочного следствие именно этого, кстати, базы postgresql физически не переносимы на другие процессорные архитектуры, только dump/restore или ещё какую логическую репликацию. А ещё есть забавный фокус выравнивания структур данных в памяти. Из-за чего при разном порядке столбцов в таблице идентичный объём записанных данных может различаться по требуемому месту на дисках.

    postgresql - mvcc база. При удалении строки запись не удаляется. Вообще. Только проставляется xmax и страничка отмечается грязной. Операции обновления строки не существует вовсе. Update - это всегда delete + insert. Обновлённая запись при этом попадает в отличающееся место таблицы, так, что в таблице одновременно существую и старая и новая версии строки. И их может быть много.
    (enterprisedb грозятся доделать zheap в pg13, так что может будет веселее, но в версиях до 11 гарантированно как я описал, в 12 - только если вы смелый человек и будете собирать экспериментальные расширения)
    Итак, далее приходит autovacuum или vacuum, строки которые уже никому не могут быть видны вычищаются и считаются пустым пространством, в том числе по free space map.

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

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

    занимаемой процессом памяти на жестком диске

    Что это такое?
    Если интересен формат датафайлов - то вам дорога в исходники базы. Для ОС выделяются блоки на диске по 8кб и в них хранится какая-то бинарная штука.

    Касательно private памяти backend'а - в postgresql есть менеджер памяти, называемый memory context. backend память запрашивает у ОС блоками, что-то делает что ему надо используя эту память под всякую мелочь или не очень мелочь, затем memory context обнуляется или удаляется и память возвращается ОС. Большинство контекстов существуют не долго, на транзакцию или на запрос, например.
    Отладчик широко распространён - gdb. Без dbg сборки, впрочем, там явно будет ничего не понятно.
    Ответ написан
    Комментировать
  • Существует ли какая нибудь возможность узнать пароль пользователя в Postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Пароли скорей всего сохранены как md5. Метод scram-sha-256 появился только в 10 и включая 12 релиз ещё не используется по-умолчанию (проблем с базой нет, сообщество даёт время на реализацию этого протокола в клиентских библиотеках, чтобы не как с mysql 8.0 получилось).

    Хэши паролей md5 можно найти в pg_authid таблице системного каталога, считаются как
    select rolpassword = ('md5' || md5('some password' || rolname)) from pg_authid where rolname = 'username';

    То есть восстановить исходный пароль невозможно. Можно попробовать подобрать коллизию для хэша.
    Ответ написан
    Комментировать
  • Можно ли гарантированно записать информацию в две базы данных?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    отключение света или kill процесса,

    Отдельно обращаю пристальное внимание на настройки редиса. Он не запишет данные с настройкой fsync по-умолчанию. Дефолтный fsync для AOF режима лога записи у него - раз в секунду. То есть все данные до секунды работы длительности вы можете потерять при крахе ОС.

    Redis не поддерживает протокол двухфазного коммита. И вы не можете сделать durable fsync в два места атомарно.
    Поэтому просто это никак не сделать.
    Что сделать можно - переделать логику, чтобы одна из баз могла при аварии привести данные в консистентный вид используя данные ведущей базы.
    Ответ написан
    Комментировать
  • Как создать индекс в postgresql для view?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Никак.
    view не хранит никаких данных, а раз нет данных - то не по чему строить индекс.
    Пример принципиальной проблемы индекса на view: если сделать view вида select foo, avg(bar) from tablename group by foo; - как пересчитывать данные при изменении строк в tablename?

    Индекс может быть создан на материализованном представлении (materialized view) - потому что такое представление данные хранит непосредственно. Но обновлять эти данные требуется вручную запросом REFRESH MATERIALIZED VIEW, который выполнит запрос, запишет его результат в новый heap, затем заменит старый heap новым (если не указан concurrently) либо обновит несовпадающие строки (для concurrently)
    Ответ написан
    4 комментария
  • Как лучше написать SELECT для переводов товара?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select ...
    from product as p
    join lateral (
    select title, description from product_translate as pt
    where pt.product_id = p.id order by language_id = ? limit 1
    ) on true
    where ....


    Как обычно мог напутать направление сортировки - допишите desc если перевод есть, но выбирается не он.

    Идея выбирать любой другой язык в случае отсутствия нужного - странная. Но запрос я написал именно такой.
    Если переводов нет вообще - сейчас такой товар не будет выводиться. Если нужен с NULL вместо текста - заменить джойн на left join.
    Ответ написан
    Комментировать
  • Как быстрее записать в базу PosgresQl?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Быстрее всего - COPY запросом.
    При том, сразу из csv файла, локального к СУБД.

    Через приложение - сильно лучше тоже COPY. В PDO интерфейс для COPY, впрочем, ужасен.
    Хуже - относительно большими insert
    ещё хуже - кучей запросов в транзакции
    кучей запросов вне общей общей транзакции - очевидно будет очень медленно.
    Ответ написан
    Комментировать
  • Как решить ошибку SQLSTATE[57014]: Query canceled: 7 ERROR: canceling statement due to statement timeout"?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ищите где выставлен statement_timeout. Такая ошибка именно по срабатывании этой настройки. И включать её надо намеренно. Так что ищите где ставится, от конфига СУБД, настроек базы и пользователя до руками сделанного set в приложении.
    Ответ написан
    Комментировать
  • Почему так мало соединений с базой данных на 1ГБ оперативной памяти?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Вот честно могу ответить - ни малейших представлений как можно абстрактно сказать, сколько памяти займёт client backend процесс базы.
    Это будет меняться от:
    - очевидно версии базы, плюс от компилятора и настроек сборки
    - session_preload_libraries, work_mem (к слову о work_mem - вы знаете, что один запрос может использовать несколько work_mem?), temp_buffers. Да ещё maintenance_work_mem для некоторых операций
    - величины системного каталога - как pinned таблиц, так и затем кэшированных при обращениях
    - выполняемых ранее запросов. Тот же кэш хранимых процедур у каждого backend свой

    Один backend вполне и десятки гб памяти может использовать и такие настройки может иметь смысл делать для, например, построения индекса.

    Помимо собственной private памяти на каждое активное соединение всё множество max_connections резервирует себе некоторое место в сегменте разделяемой памяти, независимо от того, сколько соединений вы затем используете.

    Чтобы админить калькуляторы и чайники обычно DBA не нанимают. Тем более если на том же самом калькуляторе помимо базы ещё и приложение отъедает непредсказуемо сколько памяти. Чего там от этого 1гб останется? Видимо даже shared_buffers с 128мб поднимать некуда, а то может и уменьшать придётся. Так что по опыту сложно что-то сказать о такой конфигурации.

    Скорей всего не трогайте max_connections. Оставьте дефолтные 100.

    Правильно ли я понимаю, что пул соединений не помогает в плане экономии оперативной памяти

    Смотря какой пул и как работает приложение.
    pgbouncer в pool_mode = transaction вполне может свести пару сотен подключений к баунсеру на десяток коннектов в базе. Ну а 10 процессов базы будут использовать наверняка поменьше памяти чем 200.
    Для pool_mode = session - да, только сгладить стоимость fork годится.
    Ответ написан
    1 комментарий
  • Как получить даты, которые соответствуют названиям дней недели в Postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select day /*, ... */ 
    from tablename 
    join lateral generate_series(start_date, end_date, interval '1day') as day on true 
    where to_char(day, 'Day') = week_day


    если в лоб и у вашего week_day (который с весьма не ясной причиной хранится в varchar) написание совпадает с to_char.
    Ответ написан
    1 комментарий
  • Как посмотреть соотношение каталогов и баз в PgSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    физически бэкапить определённые базы

    Не сможете.
    Ну в смысле скопировать отдельные файлы можете. А вот восстановить потом - нет. Никогда.
    Бекапить можно только целиком весь datadir, со всеми симлинками. Правильно объяснив базе что вы её бекапите и соблюдая ожидания базы по методу её бекапа чтобы из этого потом можно было восстановиться.

    А директории баз называются идентично полю oid в pg_database
    Ответ написан
    3 комментария
  • Почему не используется GIN индекс в Postgresql с установкой веса?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    index (func1, func2) - это в корне не то же самое что func1 || func2
    Выражения для оператора разные, поэтому индекс отбрасывается как неподходящий.

    В общем случае фильтр по выражению может работать по индексу только построенному в точности по такому же выражению.
    Ответ написан
    6 комментариев
  • Как импортировать csv файл в postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ответ написан
    Комментировать
  • Pg_basebackup, зависит ли скорость копирования от типа данных преобладающих в БД и можно ли как-то увеличить скорость копирования средствами postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    basebackup - это буквально копирование почти всего из PGDATA тупо на уровне файликов.
    Строго в один поток. (ну, на самом деле в отдельном потоке walreceiver ещё если wal method выставлен stream)

    Смотрите внимательнее куда упираетесь. Диск на чтение откуда снимаете? Диск куда пишете? Сеть? Одно ядро CPU на базе с которой снимаете? На которую пишете?
    Несколько гигабит занять в общем-то не проблема.
    Ответ написан
  • Исключение PDO за номером 42601, как исправить?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    СУБД однозначно отвечает, что не согласна с синтаксисом.

    Если не читать списки зарезервированных слов - то да, может быть не совсем очевидно почему этот запрос синтаксически неверен. Но тем не менее слово user всё равно зарезервировано и стандартами SQL и конкретной реализацией в postgresql. А потому не может использоваться в качестве unquoted идентификатора.
    Ответ написан
    1 комментарий
  • Enum что не так?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Я не знаю java, но где вы вообще передаёте 4 параметр в запрос?

    Ошибка говорит о том, что java по extended протоколу заявляет, что передаёт данные типа varchar, вместо типа gender. Да, для extended протокола это разные вещи и автоматически менять тип не будем.

    Попробуйте так:
    VALUES (?,?,?,cast(? as gender))
    Ответ написан
    1 комментарий
  • Как обеспечить отказоустойчивость БД Postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    как правильно обеспечить надежность и безотказность ее работы?

    Использовать адекватное железо и не мешать базе работать шаловливыми ручками.

    доступен 24 часа 7 дней в неделю.

    бекап

    Объясните, пожалуйста, как это по вашему мнению между собой связано?
    Бекапы необходимы, но как они связаны с высокой доступностью?

    в случае проблем с доступностью, перезапускать/запускать саму СУБД.

    Простой вопрос: зачем?
    Если база сложилась и даже не смогла подняться самостоятельно - значит проблема капительная и разбираться надо детально. Рестартом по кругу вы можете скорее сделать совсем плохо, чем что-либо починить.
    При том обычно проблемы начинаются от того что разработчики выкатили новую версию приложения и та начинает делать что-то странное. Например, забыли сделать индекс на 50гб табличку и засунули запрос с поиском по ней на главную сайта. Рестартом базы это, разумеется, не исправляется. А делает только больнее.

    Многолетней давности pg_postmaster_start_time() впечатлять не буду - мы периодически ставим минорные апдейты на свои базы. И вам тоже весьма рекомендую обновиться до 10.7 или лучше уже на следующих выходных сразу до 10.8.

    А так, если не трогать - то годами будет работать. Мониторинг и алерты от него, разумеется, нужны. Какая-то автоматика при наступлении алерта - обычно приносит куда больше головной боли, чем помогает.

    какие операции, запросы или их комбинации нежелательны для БД и могут привести к проблемам.

    Большая часть инцидентов с недоступностью сервиса с точки зрения приложения - про уровни блокировок. Кто-нибудь попробует сделать create index вместо create index concurrently и привет ожидание блокировки на всю запись в таблицу. Большинство форм alter table сюда же, но они и чтение заблокируют.
    Ответ написан
    Комментировать
  • В чем причины ошибки "Out of shared memory: You might need to increase max_locks_per_transaction"?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    https://www.postgresql.org/docs/current/runtime-co...
    This parameter controls the average number of object locks allocated for each transaction; individual transactions can lock more objects as long as the locks of all transactions fit in the lock table. This is not the number of rows that can be locked; that value is unlimited. The default, 64, has historically proven sufficient, but you might need to raise this value if you have queries that touch many different tables in a single transaction, e.g. query of a parent table with many children.


    Не имеет отношения к размерам таблиц. Имеет отношение к размеру внутренней таблицы локов и количеству затронутых объектов (например, таблиц) в транзакции. Строго говоря: максимальное число локов объектов одновременно всеми активными транзакциями.
    Не имеет никакого отношения к shared_buffers (не вычитается из него, а прибавляется сверху. shared_buffers - строго буфер страниц, даже без учёта структур данных по управлению этим буфером. Сегмент разделяемой памяти всегда больше shared_buffers) или work_mem или чему-то ещё (кроме как max_connections + max_prepared_transactions). Тем более не имеет никакого отношения к дедлокам.

    Дефолтного значения обычно более чем достаточно. Может быть злоупотребляете партицированием.
    Ответ написан
    Комментировать
  • Возможно ли делать ALTER на PG10?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ибо эат команда, разумеется, уже не работает.

    Почему "разумеется"?
    pglogical никуда не делся. Как был сторонним модулем, так и остался. Релиз с поддержкой PG11 тоже уже был.

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если в директории C:\Program Files\PostgreSQL\9.1\data (далее буду называть $PGDATA) лежат директории base, global, pg_xlog и всякое прочее преимущественно с префиксом pg_* - то надежда есть. Если в pg_xlog лежат куча странных файлов, а pg_tblspc пусто либо ссылки из него живые. Сделайте бекап $PGDATA и содержимого pg_tblspc (если там были ссылки).

    Затем ставите сервер версии 9.1.24. Настраиваете data_directory смотреть в ваш $PGDATA. Пробуете запустить СУБД и смотрите в лог базы что происходит.

    pg_upgrade требует заведомо работающих и корректно остановленных кластеров и старой версии и новой. Откажется работать даже если база была выключена аварийно.
    Ответ написан
    Комментировать