Ответы пользователя по тегу PostgreSQL
  • Переход на postgresql (с mysql) в миграциях laravel?

    Melkij
    @Melkij
    PostgreSQL DBA
    Но в postgresql есть есть тип serial

    неа, нет его.
    Это именно синтаксический сахар вокруг create sequence + integer с DEFAULT nextval('users_id_seq'::regclass)
    Посмотрите в pg_dump, не найдёте ни одного serial

    вручную изменить тип поля на serial?

    alter table foo alter COLUMN i type serial;
    ERROR: type "serial" does not exist

    А вот не сможете, нет такого типа данных.

    2. unsigned
    Оказывается его нет в postgresql. Заменить на CHECK (имя_поля >= 0)? Или ещё какие варианты (если есть, то чем они лучше)?

    Да, unsigned типов нет. Можно check к полю добавлять, можно сделать create domain сразу с check и использовать имя этого домена в качестве типа данных.

    И опять-таки в миграциях лары нет никакого check()

    Я думаю в этих миграциях нет почти всего, даже из SQL92 стандарта. Утилиты миграций за исключением тех, что дают выполнять произвольный SQL, обычно ничего не умеют из возможностей базы, стоит лишь чуть копнуть вглубь.

    3. массивы
    Для mysql использовала string и туда записывала данные в виде json. Для postgresql пока выбрала прямо json. В миграциях он доступен. Или стоит выбрать тип массива? В чём разница между массивами и json в postgresql?

    Есть json. В json бывают массивы, бывают объекты, скаляры.
    Есть отдельно массивы в postgresql как отдельные типы данных. Вы можете сделать массив из json документов.
    Разница между json и массивами - разные наборы функций, операторов.

    Что-то laravel, как я пока вижу, мало адаптирован к работе с postgresql.

    Раз для mysql вместо json используется string (text видимо всё-таки) - то и для mysql не очень адаптирован. Ну или у вас mysql какой-то очень сильно древний.
    Такие конструкторы обычно адаптированы под людей, которые не знают и знать не хотят свою базу.
    Ответ написан
  • Postgres, как создать новую таблицу, которая полностью соответствует другой таблице?

    Melkij
    @Melkij
    PostgreSQL DBA
    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
    PostgreSQL DBA
    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
    PostgreSQL DBA
    Под периодическим обслуживанием я подразумеваю vacuum, reindex, analyze

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

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

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

    Ну а далее определитесь с требованиям к бекапам. Глобально возможности есть две, и обе никак не относятся к тому, где размещены бинарники базы. Можно выполнять вообще с другого хоста по сети.
    Во-первых, можно периодически снимать логический дамп данных с помощью 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
    PostgreSQL DBA
    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
    PostgreSQL DBA
    Так переинициализировать или перенести на другой хост?

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

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

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

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Запрос в вопросе делает 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
    PostgreSQL DBA
    json_agg есть нативный, если я верно понял о чём вы.
    Ответ написан
    Комментировать
  • Postgresql, как сделать запись на слейв?

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Например,
    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
    PostgreSQL DBA
    Поиск точного вхождения подстроки в строку? LIKE '%...%'
    Плюс триграммный индекс из pg_trgm contrib
    Ответ написан
  • Как скорректировать время в результате select?

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

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

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

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

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

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

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

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

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