Задать вопрос
  • 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 комментария
  • SSD+HDD или один SSD?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Какая разница с потерей данных?
    Данные нужны? Значит у вас есть бекапы.
    Если нет бекапа - значит данные не нужны и не важно, какого типа расходник там сдох. Всё равно долго и дорого восстанавливать, даже если удастся нужные файлы восстановить.
    Ответ написан
    Комментировать
  • Как делаете периодическое обслуживание 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, а так же например раз в неделю/месяц логический дамп для более долговременного хранения. Бывает порой такое, а "давайте восстановим годовой давности табличку".
    Ответ написан
    Комментировать
  • Почему не получается запустить миграцию(php yii migrate)?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Access denied for user 'yii2user'@'localhost' (using password: YES)'

    База вас слушает и слышит. И ей не нравится как вы представились.
    Проверяйте, есть ли таковой пользователь, точно ли у него такой пароль.
    Ответ написан
    3 комментария
  • Где найти информацию про знак :: в 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 комментария
  • Как выполнить подзапрос в Doctrine DQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Тупая доктрина не умеет подзапросы в from.

    И более того, вовсе не собираются реализовывать.
    Используйте нормальный SQL.
    Ответ написан
    Комментировать
  • Что такое WITH при создании пользователя в Postgres?

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

    Если умеете читать грамматику: https://github.com/postgres/postgres/blob/REL_10_S... opt_with чуть ниже, никаких действий уже на этапе парсера, что он есть, что его нет.
    Ответ написан
    Комментировать
  • Есть ли смысл ставить Linux, если локального админа на Винде легко взломать?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    можно через LiveCD

    Если есть физический доступ - элементарно взламывается всё.
    Например, зачем взламывать вообще, если можно поставить свою систему и скопировать нужные данные. Диск зашифрован? Так если у вас нет пароля - то как вы с системой работали ранее?
    Ответ написан
    Комментировать
  • Какова важность использования оператора use при подгрузке пространства имён?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Use - синтаксический сахар, чтобы можно было писать new ClassName вместо new \Test\File2\ClassName.
    Существует только на этапе компиляции конкретного файла, никак не влияет на autoload и прочие include.
    Ответ написан
    3 комментария
  • При асинхронной репликации 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 есть нативный, если я верно понял о чём вы.
    Ответ написан
    Комментировать
  • Почему не перехватывается исключение PDO?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Версия PHP 5.13

    Не существует такой.

    mysql позволяет соединяться без указания имени базы данных. Имя базы данных можно выбрать позже.
    pdo_mysql не ругается на неизвестные параметры в DSN.
    У всех всё хорошо, а раз никто не кинул exception - то чего тут ловить try catch?

    А ошибку вы получаете где-то дальше.
    Ответ написан
    1 комментарий
  • 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 сколько надо.
    Ответ написан
    Комментировать