Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Postgres, как создать новую таблицу, которая полностью соответствует другой таблице?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    create table new_city (like city including all);
    insert into new_city select * from city;


    Если условия позволяют, то быстрее будет сдампить, переименовать и записать обратно.
    pg_dump -t city -Fc -Z0 -f reimport.pgdump
    alter table city rename to new_city;
    pg_restore -f reimport.pgdump
    Быстрее на индексах, которые лучше строятся после записи данных.

    А чтобы сразу склонировать таблицу - такого вроде нет, очень узкий usecase
    Ответ написан
  • Как сделать ALTER TABLE для postgres pglogical?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://github.com/2ndQuadrant/pglogical/blob/REL2...
    Попробуйте указать запрос с полным наименованием таблицы.
    Вероятно в схеме public у вас таблица:
    SELECT pglogical.replicate_ddl_command('ALTER TABLE public.aaa_plc_banned_domains ADD Phone2 CHARACTER VARYING(20)');
    Ответ написан
    4 комментария
  • Как делаете периодическое обслуживание PostgreSQL, если у вас есть большие базы с большими таблицами на сотни ГБ?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Под периодическим обслуживанием я подразумеваю vacuum, reindex, analyze

    А зачем?
    Обратите внимание: это вопрос от postgresql DBA. Да, у нас есть таблицы и на несколько террабайт.

    После нормальной настройки автовакуума под железо (вместо дефолтных настроек под любую кофеварку) с вакуумом и analyze нормально справляется автовакуум.
    Вместо reindex - pgcompacttable, pg_repack, да хоть вручную или каким-нибудь своим скриптом create index concurrently + drop index concurrently
    Ответ написан
    Комментировать
  • Как правильно делать бекапы Postgresql, который "обитает" в докер контейнере?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для начала понять, нафига вам вообще нужная база в докере. Раз нужны бекапы - то очевидно база нужная. Не раз видел нужные базы без бекапов, а вот настроенных бекапов для ненужных - как-то не припоминаю. А раз нужная база - то зачем здесь докер? Внимательно осмыслить этот вопрос. Если сможете удивить меня - буду весьма благодарен, до сих пор ни один из опрошенных адептов докера с таким простым вопросом не справился.

    Ну а далее определитесь с требованиям к бекапам. Глобально возможности есть две, и обе никак не относятся к тому, где размещены бинарники базы. Можно выполнять вообще с другого хоста по сети.
    Во-первых, можно периодически снимать логический дамп данных с помощью pg_dump или pg_dumpall. Плюс: они компактнее, обычно сильно компактнее, плюс неплохо сжимаются, для форматов custom и directory возможно восстанавливать объекты выборочно, например только одну таблицу. Можно бекапить отдельные базы, исключать из дампа что-нибудь ненужное. Минусы: существенное время восстановления, в частности из-за необходимости построения всех индексов; восстановление возможно только на момент начала снимания дампа.
    Во-вторых, можно снимать бинарную копию и вести журнал WAL. Плюсы - возможность восстановления базы на произвольный момент времени от окончания pg_basebackup и до тех пор пока есть непрерывный архив WAL. Но basebackup занимает ровно столько же места сколько кластер, плюс архив WAL. Бекапить можно только весь кластер целиком. Восстанавливать так же можно только целиком.
    Чтобы не собирать самостоятельно вся обвязку вокруг pg_basebackup, посмотрите pgbackrest, barman. wal-g можно для хранения в s3.

    Вполне осмысленно можно использовать оба способа одновременно, архив wal для point-in-time recovery, а так же например раз в неделю/месяц логический дамп для более долговременного хранения. Бывает порой такое, а "давайте восстановим годовой давности табличку".
    Ответ написан
    Комментировать
  • Где найти информацию про знак :: в postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://www.postgresql.org/docs/current/sql-expres...
    CAST ( expression AS type )
    expression::type
    The CAST syntax conforms to SQL; the syntax with :: is historical PostgreSQL usage.


    Приводить конечно можно не всё. 'abc' вы к числу никак не приведёте, это не число.
    К serial, к слову, вы не сможете привести ничего. Такого типа на самом деле нет, это синтаксический сахар вокруг sequence и int.

    Свои правила можно добавлять через create cast
    Ответ написан
    Комментировать
  • Можно ли в postgres переинициализировать базу данных?

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

    переинициализировать - удалить директорию, сделать initdb.
    перенести на другой хост - выключить базу, скопировать весь PGDATA целиком включая всё содержимое по всем симлинкам, запустить базу. Либо вызвать штатный pg_basebackup и им скопировать запущенную базу (по протоколу репликации).
    Возможно только на той же аппаратной архитектуре.
    Ответ написан
    4 комментария
  • Как отследить foreign table в postgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В psql:
    \d имя_таблицы покажет имя fdw server и опции этой конкретной таблички
    \des+ fdw_server покажет всю информацию об этом FDW сервере.
    где в системном каталоге - запустите psql -E, будет выведено, откуда сам psql читает данные.

    Либо можно сделать pg_dump --schema-only и поглядеть команды пересоздания.

    ERROR: connection for foreign table "имя_таблицы" cannot be authenticated

    Это ответ postgresql
    В detail - ответ от удалённой базы, ORA коды ошибок - да, оракл обычно.
    Ответ написан
    Комментировать
  • Как синхронизировать таблицу и представление в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если вы говорите именно о view - то я вас вовсе не понимаю.
    В view в принципе нет и не может быть ни одной строки, в сам view невозможно ничего записать (writable view - это переписывание запроса). Когда вы обращаетесь к view - в запрос идёт запрос из объявления этого view и весело анализируется/переписывается как любой другой запрос.

    То есть что с чем вы пытаетесь синхронизировать? Запрос с другим запросом? У вас данные всего в одном месте, нечего синхронизировать здесь.

    Если вы говорите всё-таки о материализованном представлении - то вам нужен отдельный запрос refresh materialized view. Вообще matview by design для неактуальных данных и задаче периодической актуализации через refresh.
    Ответ написан
    4 комментария
  • Что такое WITH при создании пользователя в Postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Мусорное ключевое слово для совместимости со стандартом.
    От него ничего не зависит, ничего не делает.

    Если умеете читать грамматику: https://github.com/postgres/postgres/blob/REL_10_S... opt_with чуть ниже, никаких действий уже на этапе парсера, что он есть, что его нет.
    Ответ написан
    Комментировать
  • При асинхронной репликации postgresql-10 можно ли изменить конфиг слейва под другое железо или это исключено?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для потоковой репликации необходимо, чтобы на реплике были установлены следующие настройки:
    wal_level с мастера не ниже replica
    max_connections, max_worker_processes, max_prepared_transactions, max_locks_per_transaction равные или больше чем на мастере.
    Для порядка упомяну, что аппаратная архитектура процессора должна быть идентичная, с x86-64 на arm реплицировать не выйдет.
    Всё остальное может различаться. Главное чтобы диски на репликах успевали писать поток изменений.
    Ответ написан
    Комментировать
  • Дублируются значения при запросе с generate_series и left join?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Запрос в вопросе делает cross join views на items и разумеется данные в результате будут совершенно верные, но бессмысленные.

    Не думаю, что перебирать потенциально большие views и items полностью не прокидывая заведомо известные условия поиска по датам - хорошая мысль даже для аналитического запроса.
    select d as day,
    (select count(*) from views where created_at >= d and created_at < (d + interval '1 day')) as views_count,
    (select count(*) from items where created_at >= d and created_at < (d + interval '1 day')) as items_count
    from generate_series('2018-12-26'::date, '2018-12-30', '1 day' ) as dates(d)
    order by day desc

    Либо похожим образом
    select d as day, views_count, items_count
    from generate_series('2018-12-26'::date, '2018-12-30', '1 day' ) as dates(d)
    left join lateral (select count(*) as views_count from views where created_at >= d and created_at < (d + interval '1 day'))  as v on true
    left join lateral (select count(*) as views_count from items where created_at >= d and created_at < (d + interval '1 day'))  as i on true
    order by day desc

    И посмотреть, что по этому поводу думает планировщик
    Ответ написан
    Комментировать
  • Как можно на ProgreSQL ограничиться одной функцией при формировании JSON?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    json_agg есть нативный, если я верно понял о чём вы.
    Ответ написан
    Комментировать
  • Postgresql, как сделать запись на слейв?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Никак. Реплика строго readonly.
    Ответ написан
    Комментировать
  • Как сделать пакетную вставку данных в таблицу без конкатенации строк?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Например,
    insert into order_product_link (order_id, product_id) select 1, i from unnest(array[1,4,7,86]) as i;

    Как передать массив из go в массив postgresql - не подскажу. Уточняйте в используемой библиотеке go.

    Или copy from stdin и шлёте столько строк в copy сколько надо.
    Ответ написан
    Комментировать
  • Как осуществлять быстрый поиск по вхождениям?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Поиск точного вхождения подстроки в строку? LIKE '%...%'
    Плюс триграммный индекс из pg_trgm contrib
    Ответ написан
  • Как скорректировать время в результате select?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В таблице есть столбец с данными типа timestamp.
    Время там хранится UTC

    Мигрируете на timestamp with time zone
    Затем проставляете желаемый set timezone to '...'; и получаете всю обработку для timestamp with time zone корректную в этом часовом поясе.

    не красиво перечислять их все ради того, чтобы скорректировать один.

    Красиво - это перечислить явно и только те поля, которые в результате вам нужны.
    Если в этом дурацком засилье orm вы пишете запрос руками - значит вы явно должны знать, что именно и зачем вы хотите прочитать. Следовательно, select * показывает явный антипаттерн.
    Ответ написан
  • Postgresql-10 как работает логическая репликация из коробки(вопросы по теме под катом)?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    1) Можно ли создать логическую репликацию на уровне схемы

    Нет.
    Ответ есть даже в мануале: https://www.postgresql.org/docs/10/sql-createpubli...
    Банально нет даже синтаксиса для создания публикации схемы.

    2) Связи между таблицами также будут реплицыроватся?

    Что вы имеете в виду?
    DDL вы переносите на подписчиков сами. Реплицируются только данные
    TRUNCATE and DDL operations are not published.

    truncate начали реплицировать в pg11. Репликации DDL нет и не будет как минимум ещё в pg12, на данный момент нет ни черновых патчей ни даже обсуждений таковой реализации.

    То есть так, как вы, видимо, хотите настроить паблишера и он сам всем будет заниматься - не выйдет.

    PS: есть некоторая терминологическая путаница, как англоязычная так и русскоязычная, schema и схема как namespace или schema и схема говоря о структуре базы, т.е. DDL
    Ответ написан
    Комментировать
  • Насколько like с процентом на конце эквивалентен between?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если задумку реализовать корректно - то эквивалентны. Должны быть. У вас пока не эквивалентны, потому что
    melkij=> select '\uFFFF';
     ?column? 
    ----------
     \uFFFF

    Так unicode escapes не пишутся. E'\uFFFF'

    Хотя обычно берут штатный text_pattern_ops и like работает нормально.
    Ответ написан
    1 комментарий
  • Как работать с БД Postgres и 1с?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Долго и мучительно раскуривайте эту кладезь бреда и авгиевы конюшни говнокода под названием 1с.
    Эти люди в принципе не умеют работать с СУБД. И в базе там абсолютный ад и бардак, всё верно.

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А сколько у вас ядер на железке, чтобы пускать параллельно 1000 запросов? Хотя бы сотня ядер CPU под такое есть, чтобы за каждое ядро дрались и мешали друг другу всего десяток процессов?

    Если хотите снизить латентность - сохраняйте уже открытые соединения.
    Если хотите повысить пропускную способность - уменьшайте число активных процессов.
    Очень сильно лучше и то и другое сразу. Поэтому да, pgbouncer. Или хотя бы разумных размеров пул на приложении.
    Ответ написан
    2 комментария