Ответы пользователя по тегу PostgreSQL
  • Как вывести значения со всеми id из таблицы PostgeSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вы удалили предыдущий вопрос и у меня нет желания набирать ответ повторно. Поэтому буду краток.
    На одну ошибку указал Rsa97 , вторая ошибка:
    SELECT id FROM Users;
    SELECT id FROM "Users";

    Это обращения к разным таблицам.

    Разберитесь, где вы потеряли сами сообщения об ошибках pg.
    Ответ написан
  • В чем проблема в этом триггере?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вы в after insert триггере на табличке со странным названием lechenie выполняете безусловный insert в эту же самую таблицу. Вопрос к вам: почему вы в результате ожидаете что-то кроме бесконечной рекурсии?
    Ответ написан
    6 комментариев
  • Как переписать данную строку при портировании с MySQL на PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    В postgresql все текстовые типы следуют кодировке базы. case insensitive utf8 в pg не предусмотрено.
    Поэтому если у вас база в utf8 - то "STEM" varchar(50) not null
    Если база не в utf8 - не надо так делать.
    Ответ написан
    Комментировать
  • Почему возникает ошибка, когда передаешь кортеж из 1 элемента в sql запрос?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что синтаксически там запятой быть не может.
    Если запятую ставите вы - сделайте так, чтобы её там не было.
    Если запятую ставит ваше ORM или прочий библиотечный код - значит или вы неверное используете библиотеку или это баг этой библиотеки.
    Ответ написан
    Комментировать
  • Как отслеживать изменения в СУБД при конкурентной записи?

    Melkij
    @Melkij
    PostgreSQL DBA
    Возьмите pgq и пишите в очередь перед коммитом как найти нужные данные. Или триггером сразу при записи в таблицы шлите сообщения через pgq.
    При экспорте соответственно читаете сообщения из pgq. Всё.

    Или напишите или возьмите какой-нибудь готовый logical decoding. Сможете читать вообще поток репликации

    В общем случае в общем-то нужна всё равно очередь. Из транзакции в таблички очереди пишете метки какие данные изменились, читатель читает эту метки и получает все изменения независимо от времени коммита.
    Ответ написан
    Комментировать
  • Как сделать ограничение доступа к базе данных в Mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Не говорите никому пароль от роли владельца, и никто не сможет подключиться к этой БД.

    Вы таки удивитесь.
    Дефолтно база доступна всем пользователям. И даже есть права на создание объектов. Удалить таблицу сможет суперпользователь или владелец этой таблицы. А вот создать - кто угодно.

    Поэтому в postgresql после создания базы необходимо отзывать дефолтные права:
    create database newdb;
    \c newdb
    GRANT CONNECT ON DATABASE newdb TO newdb_user ;
    REVOKE ALL ON DATABASE newdb FROM public;
    REVOKE ALL ON SCHEMA public FROM public;
    GRANT USAGE ON SCHEMA public TO newdb_user;

    Если при create database указать owner - то выдавать ему права на схему public будет избыточно, но делать revoke таки необходимо.

    Сходная ситуация с mysql.
    Ответ написан
  • Как работает вирус monero распространяемый через postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Всё очевидно:
    суперпользователь базы - лицо доверенное и база доверяет этому пользователю. И суперпользователь множеством хитрых и не очень способов способен сделать с сервером на котором запущена база всё на что хватит прав у пользователя, от которого запущен postgres.
    Например, запустить любую произвольную команду даже простой и очевидной командой copy, не говоря уже о каких-то извращениях.

    Конкретная атака по-видимому уже разобрана и описана вот тут: https://habrahabr.ru/post/351452/

    Никогда не используйте trust, уж тем более в мир. В нормальном состоянии база вообще не должна быть открыта в мир.
    Ответ написан
    3 комментария
  • Как выбрать следующие 100 строк из большой таблицы?

    Melkij
    @Melkij
    PostgreSQL DBA
    2. Нужно ли включать order by в таких огромных таблицах?

    Не зависит от размера базы.
    Или у вас есть order by и поведение ожидаемое или у вас нет order by и СУБД имеет полное право на каждый запрос выдавать любые подходящие под фильтр данные в любом порядке.
    Запрос выдающий неправильные данные обычно никому не нужен, даже если он и быстрый.

    offset для пагинации вообще вещь неуклюжая. https://use-the-index-luke.com/no-offset
    Быстрая пагинация - это передача уникального идентификатора, последнего на просматриваемой странице. Т.е. запрос на выборку следующих 100 записей начиная после такого-то id.
    Бонусом консистентное поведение, если, например, что-то из строк предыдущей страницы удалили. Оффсет тупо потеряет строку из выборки и пользователь может не найти то что искал.

    3. Ну типа берем сначала вытаскиваем данные с одной таблицы, потом по результату смотрим id, по нему вытаскиваем данные связанные со второй таблицы, затем смотрим новый результат и так же вытаскиваем с третьей. Получается в бд не будет строится огромная временная таблица из трех больших таблиц.

    Вы изобрели то что делает джойн. База в общем случае его сделает лучше.
    Будет ли огромная временная таблица - смотрите план.
    Ответ написан
    Комментировать
  • Как перенести дамп базы данных с Ubuntu на Windows?

    Melkij
    @Melkij
    PostgreSQL DBA
    К каким бы то ни было паролям базы источника отношения не имеет.
    Вопрос исключительно к настройке вашей базы в этом экзотическом окружении windows.

    Во-первых неясно пароль какого пользователя запрашивается?

    Того, к которому вы сказали подключиться psql. Поскольку вы не указали соответствующий ключ -U и, скорей всего, не определили переменную окружения - то psql пытается использовать имя пользователя аналогичное имени пользователю открытой консоли.

    Ошибка прямым текстом говорил, что была использована парольная аутентификация, в результате пользователя с таким паролем в базе не оказалось. Разберитесь как авторизоваться в базе в вашей системе, к дампам отношения не имеет никакого.
    Ответ написан
    4 комментария
  • Какую утилиту лучше использовать для реорганизации таблиц PostgreSQL (например: pg_repack vs pgcompactor vs подстройка автовакума)?

    Melkij
    @Melkij
    PostgreSQL DBA
    pg_repack - это community extension, форк более раннего pg_reorg. И не отрицая вклад участников pgpro в разработку postgresql в целом - я не вижу их среди контрибьютеров pg_repack.

    Мы активно используем обе. Основные моменты касательно pg_repack vs pgcompacttable в общем-то именно я и изложил в README компактора. Если говорить на русском:
    - pg_repack делает копию таблицы, т.е. требуется двукратный запас диска. Компактор работает в рамках одной таблицы и требует место только под копию наиболее толстого индекса и то, толстые индексы обрабатываются самыми последними. Т.е. расчёт на работу когда места уже мало.
    - компактор намеренно выполняется медленно чтобы не задевать работающий проект
    - компактор не может обрабатывать toast таблицы. Репак - может.
    - pg_repack характеризуется очень заметными пиками io и wal. Вся таблица едет одной транзакцией и это никак не регулируется. Поэтому может аффектить прод на неважных дисках и в том числе оторвать реплики при недостатке сетевой полосы.
    - pg_repack умеет перемещать между tablespace и может делать команду cluster

    (или лучше подстроить автовакум)?

    Конечно необходимо настроить автовакуум и не мешать ему работать - т.е. исключить долгие транзакции. Но всё равно бывают хитрые моменты, когда репак или компактор бывают нужны.
    Ответ написан
    2 комментария
  • Как вы измеряете профиль нагрузки (соотношение кол-ва чтений/кол-ву записей) в PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Посмотрите в циферки что собирает stats collector, их много разных. https://www.postgresql.org/docs/10/static/monitori...
    например, запись буферов на диски - это buffers_checkpoint, buffers_clean и buffers_backend в pg_stat_bgwriter
    pg_stat_database c blks_read, blks_hit, blk_read_time и blk_write_time

    И разумеется pg_stat_statements с детализацией ресурсов по отдельным запросам.

    Вот кстати, хорошая картинка куда смотреть за детализацией каких подсистем базы
    postgres-observability-9.6.png
    Ответ написан
  • Как получить от PostgreSQL массив данных сразу в Json формате для Symfony?

    Melkij
    @Melkij
    PostgreSQL DBA
    В postgresql есть штатная агреггирующая функция json_agg. Поэтому возможно даже без привлечения хранимок.
    Ответ написан
    6 комментариев
  • Как написать функцию итератор?

    Melkij
    @Melkij
    PostgreSQL DBA
    Это называется не итератором.

    insert into terms (term, freq) values (?, 1) on conflict (term) do update freq = excluded.freq + 1 returning freq;

    В функцию завернуть по желанию. 9.5+
    Ответ написан
    Комментировать
  • Почему не выводит строки при корректном запросе postgre?

    Melkij
    @Melkij
    PostgreSQL DBA
    А с кавычками выводит "ничего" т.е. ноль полей.

    С какими именно?

    user='40'
    'user'='40'
    "user"='40'

    Это три абсолютно различных условия, выполняющих совершенно разные вещи.

    user - зарезервированное слово по требованию стандарта. По стандарту не уверен что обозначает в контексте where, надо искать (может как часть create user и подобных только зарезервирован), а в postgresql обозначает имя текущего пользователя. Имеет тип name, что и провоцирует ошибку.
    Т.е. первое условие в принципе не имеет никакого отношения к каким-либо пользовательским таблицам.

    'user' - просто текстовая константа. Никто не мешает в условии сравнивать одну константу с другой, where 1=1 в некоторых query builder отсюда же.

    "user" - обращение к объекту, игнорируя зарезервированные слова. То есть если у вас в таблице proxy есть поле user - то запрос должен быть записан как
    select * from proxy where "user"='40'

    Но общая практика - лучше не надо использовать зарезервированные слова в качестве идентификаторов.
    Ответ написан
    1 комментарий
  • Как избавиться от блокировок при обслуживание партиций внешней таблицы в БД PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    vacuum full и reindex требуют тяжёлую блокировку и держать блокировку будут долго. Поэтому обычно их избегают.
    drop разумеется тоже требует эксклюзивную блокировку, но на короткое время. Важно понимать скользкую ситуацию - если вы пытаетесь взять эксклюзивную блокировку, но не можете её получить из-за других выполняемых транзакций - вы будете ждать окончания этих мешающих транзакций, но уже будете блокировать работу последующих транзакций.

    Если вы считаете, что много места пропало впустую - то это можно посчитать (поставив contrib расширение pgstattuple) вот этими нашими запросами: для таблиц и для индексов
    Если да, проблема с местом в этом - то вам помогут pgcompacttable или pg_repack

    Если данные по большей части архивные - имеет смысл заменить btree индексы на brin. Они медленнее, но очень сильно компактнее по диску.

    А отцеплять партиции - посмотреть в pg_stat_activity что вообще происходит, нет ли аномально длинных транзакций или idle in transaction (т.е. затупов на приложении). Затем с statement_timeout и lock_timeout в 1 секунду (или меньше даже) пробовать отцепить пока не получится.
    Ответ написан
    4 комментария
  • Есть ли возможность восстановить данные базы postgree?

    Melkij
    @Melkij
    PostgreSQL DBA
    У postgresql есть всего одна директория - data_directory (aka PGDATA). Для работы необходима консистентная копия всей директории целиком, включая содержимое по всем симлинкам.

    Можете поковырять pg_filedump, но лучше достаньте бекап.
    Ответ написан
    2 комментария
  • Почему не работает подключение к Postgres без разрешения IPv6?

    Melkij
    @Melkij
    PostgreSQL DBA
    Значит подключаетесь вы именно через ipv6.
    На локалхосте обычно unixsock используют вообще, а не tcp loopback.

    Но вообще вполне обычная практика предпочитать ipv6, если приложение не указывало протокол явно, а адреса хоста известны и для v6 и для v4. У вас ведь наверняка в /etc/hosts для localhost указаны оба адреса.
    Ответ написан
    3 комментария
  • Как избежать увеличения автоинкремента при неуспешном запросе?

    Melkij
    @Melkij
    PostgreSQL DBA
    Никак.
    Сиквент гарантированно уникальный и не транзакционный. Ничего о последовательности выдачи значений и уж тем более без пропусков он не говорит.
    Ответ написан
    Комментировать
  • Что использовать: pgpool II или pgbouncer + haproxy?

    Melkij
    @Melkij
    PostgreSQL DBA
    pgpool - это в общем больно в поддержке. Лучше не надо.
    Далее надо учитывать что автофейловер - это свой букет проблем и особенностей. И зачастую проблем от него больше, чем без него. Тест на понимание repmgr: "как именно выбирается новый мастер?". Обычно используется штатная потоковая репликация и мастер переключается вручную. Потому что основная сложность в определении, что надо переключаться, а не это кратковременный сбой, например, сети.
    pgbouncer + haproxy вполне широко используются для балансировки по равнозначным репликам (и по нескольким pgbouncer если вы до гигабита трафика доросли). По равнозначным - то есть не надо на OLTP реплики пихать OLAP запросы аналитики - для этого нужны отдельные реплики специально для этого настроенные.

    Упомянутый Александр Кузнецов patroni - во всяком случае я не смог спровоцировать его на split brain, поэтому в целом он мне нравится. Да и в паре мест в продакшене уже видел. Умеет и синхронные и асинхронные реплики, с haproxy дружит вполне штатно для опроса где нынче мастер и так авторами и используется.
    Ответ написан
    1 комментарий
  • Что такое РОЛИ в PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    объясните, пожалуйста, смысл ролей в постгрес

    Пользователь - это алиас для системы ролей.

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

    Это ложь. Необходимости нет.

    Поэтому для созданного нами ранее пользователя с именем sammy соответствующая роль будет по умолчанию пытаться соединиться с базой данных sammy

    А это верно. Но только если имя базы для подключения не переопределено, например, переменной окружения PGDATABASE. Ну и конечно его можно просто задавать аргументом подключения.

    можно ли так: несколько ролей и одна база данных?

    Разумеется. Хоть дерево со множественным наследованием ролей.

    Только важный момент - роли глобальны в пределах кластера. Вы не можете сделать пользователя user в базе foo с одним паролем и пользователя user в базе bar с другим паролем. А вот дать readonly на одну базу и полные права на другую - это пожалуйста.
    Ответ написан
    1 комментарий