Задать вопрос
  • Чем бекапить все базы Postgres без прерывания доступа к сервису?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    pg_basebackup
    Сделает консистентную физическую копию базы. Соответственно размер бекапа примерно равен размеру кластера postgresql + накопленные за время копирования WAL.
    Восстанавливаться элементарно запустив postgresql с указанием PGDATA в место где лежит результат pg_basebackup.
    Им обычно реплики поднимают.

    pg_dump или pg_dumpall
    Логический бекап данных. Обычно не очень подходит по критерию быстро восстанавливаться т.к. при восстановлении будут перестраивать индексы, проверять fk и прочие constraint, зато как правило сильно (в пару раз без сжатия легко, со сжатием ещё больше разница) компактнее по размеру бекапа

    Все из штатной поставки Postgresql. И другие способы бекапа Postgresql в основе своей опираются на них же.
    Ответ написан
    1 комментарий
  • Почему в RAID 5 два виртуальных диска с RAID5?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как по скорости и надежности такая схема по сравнению с просто RAID5 из всех дисков

    По скорости лучше, т.к. запись можно просто распараллеливать. По чтению - надо замерять, хуже быть не должно.
    По надёжности лучше:
    raid5 переживёт выпадение одного любого диска из массива - но только одного. Два - развал массива со всеми данными.
    Два raid5 объединённых в логический диск - гарантированно переживут смерть одного любого диска, при определённой доле везения - переживут смерть второго диска (если тот отвалился из другого массива).
    С большим числом дисков (имхо, больше 6 дисков) лучше использовать RAID6, который переживёт смерть любых двух дисков массива, а по производительности одноклассник RAID5. Тем более раз вы один диск всё равно решили держать hotspare (который нифига не поможет пока не будет перестроен массив - для террабайтных томов 2-4 часа полной утилизации добавляемого диска и очень повышенный риск смерти кого-нибудь из остальных дисков массива вместе со всем массивом). Или пару RAID6 в логическую группу, что ещё надёжнее.

    3. Какой RAID предпочтительнее для виртуальных машин?

    RAID10. Т.к. даёт внятную производительность чтения/записи.
    Ответ написан
    Комментировать
  • Как извлечь данные из JSON?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если не нужен join со значениями, а только фильтр - то
    where array(select (j->>'category_id')::int from jsonb_array_elements(data->'items') j) && array[1,3,5];

    Можно загнать подзапрос с построением массива в immutable хранимку и повесить по ней gin или gist индекс.
    Ответ написан
    Комментировать
  • Как лучше сделать поиск по json ячейке?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Смотрим операторы: https://www.postgresql.org/docs/current/static/fun...
    Печально, прямого оператора как && overlap у массивов нет.
    ?| text[] Do any of these array strings exist as top-level keys?

    Зато тот вполне подходит. Значит, заменить json на jsonb затем запрос будет
    select * from t where jsonbfield ?| array['0', '5', '7']::text[];

    Если на входе удобен именно json массив, а не pg массив, то относительно просто переписывается одно в другое
    select * from t where jsonbfield ?| (select array_agg(t) from json_array_elements_text('["0","5","7"]') t);


    gin и gist индексы оператор ?| могут обрабатывать.
    Ответ написан
    Комментировать
  • SATA2 или SATA3?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ноутбучным HDD вы даже за возможности SATA1 очень сомневаюсь что выйдете. 150мб/с для HDD - это весьма приличная цифра.
    Для механики sata3 имеет смысл только в ту же цену, что и sata2.
    Ответ написан
    Комментировать
  • Почему array_key_exists значительно медленнее, чем isset?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    isset - конструкция языка
    array_key_exists - функция
    Очень разные накладные расходы на вызов функции и отсутствие вызова функции.
    Ответ написан
    4 комментария
  • Псевдо-персистентное соединение в PHP, возможно ли?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Используйте pgbouncer.
    Лучше всего в режиме transaction пула. Тогда backend postgresql будет выдаваться соединениям от приложения только на время выполнения транзакции. Что позволяет и очень эффективно утилизировать лишь небольшое число процессов postgresql и сохранить возможность транзакционной работы. В режиме транзакций не работают prepared statements, но PDO их и так эмулирует, так что проблемой это не является.

    pgbouncer легко держит тысячи открытых соединений с приложением, легко их открывает и закрывает, развлечения начинаются при попытке прокачать через баунсер с гигабит трафика (и обходится банально запуском второго баунсера тут же на другом порту). Обычно размещается на машине непосредственно с базой на 6432 порту.
    И вообще-то является фактическим стандартом для инсталляций postgresql.
    Ответ написан
    1 комментарий
  • Autoremove пытается удалить нужные пакеты в Ubuntu. Как исправить?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если autoremove предлагает удалить пакет автоматически - значит он был установлен по зависимостям, а теперь от него никто больше не зависит. Или каким-то образом были потеряны флаги о ручной установке этих пакетов.

    Пакету можно выставить флаг "установлено вручную" через apt-mark, тогда он не будет удаляться через autoremove.
    apt-mark manual имя_пакета
    Ответ написан
    Комментировать
  • Почему apache benchmark так быстро отрабатвает?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally.

    Максимум != общая продолжительность теста.
    https://httpd.apache.org/docs/2.4/programs/ab.html
    Читайте внимательнее описания опций.
    Ответ написан
    Комментировать
  • Способ уменьшить размер БД InnoDB без дампа?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если ненужные записи в разрезе логов = все старые логи, то делаете партицирование по дате. Ненужные более старые данные в будущем дропаются целиком всем разделом, просто и без длительных блокировок.

    2) Конвертируем таблицу (НЕ БАЗУ) в MyISAM (ALTER TABLE .... ну я просто поменял тип базы в "Операции" над таблицей), оптимизируем MyISAM таблицу.
    3) Конвертируем обратно в InnoDB (так же через phpMyAdmin).

    Блокировка записи на всё время перестроения. И, емнип, alter table tablename engine=innoodb; (даже если таблица уже в innodb) спровоцирует копирование таблицы с сопутствующим сжатием неиспользуемых пространств. Т.е. конвертирование в myisam избыточно.

    А так можно поиграться с созданием новой таблички идентичной старой, копированием через insert select в неё нужных данных, затем копированием актуальных данных и финальным rename и докопированием того что попало в старую табличку до rename. Это не сложно, если табличка именно логов - т.е. только insert и select. Если есть update или delete то надо опять же извращаться. Или согласовывать простой.
    Ответ написан
    1 комментарий
  • Время от времени падает Redis?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    # Failed opening .rdb for saving: Read-only file system

    ну?

    Настроено писать копию данных на диск. Писать копию не получается. Редис обижается и уходит в RO.
    Ответ написан
    3 комментария
  • Автоинкремент в INSERT INTO ... ON CONFLICT?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Никак. Работает как задумано.

    И уже при вставке идет разрыв в id.

    sequence не гарантирует неразрывность. И последовательность значений тоже не гарантирует.
    Гарантирует только уникальность значений.
    Ответ написан
    7 комментариев
  • Как убедиться что запрос к БД выполнен?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Переключите PDO::ATTR_ERRMODE в PDO::ERRMODE_EXCEPTION. Если exceptin прилетел - значит запрос выполнен не был.
    Не было исключения - значит запрос выполнен.

    их хеши со старым равны

    И это криптографически плохо. См. стандартные password_hash + password_verify
    Ответ написан
  • Как исправить ошибку подключения к интернету в гостевом Debian 8?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Разрешите получать ответы на DNS запросы. UDP 53 порт. В OUTPUT разрешено, а в INPUT DROP, конечно DNS работать и не будет.
    Ответ написан
    3 комментария
  • Какое DE принято в Debian 9 по умолчанию?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Официальный установщик из debian-9.1.0-amd64-DVD-1.iso выглядит вот так:
    49cf66d6f1cb4945bd783f678d730ec1.png
    То есть вообще-то сложно сказать, что здесь что-то принято по-умолчанию. Предлагается сразу 6 вариантов по вкусу. Если ничего не выбрать, то да, наверное это будет gnome, как первый в списке.
    Ответ написан
    1 комментарий
  • Как правильно делать бекапы базы Postgresql на продашн сервере?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Зависит от:
    0) какой промежуток времени вам допустимо потерять при восстановлении
    1) сколько места вы можете выделить для хранения бекапов
    2) какой запас времени вы хотите сохранять для возможности восстановить данные когда-то из более далёкого прошлого

    Может, на мыло тоже отправлять на всякий случай?

    Как через почту пропихнуть даже мелкие бекапы в десяток гигабайт?
    Или вы про совсем крошечные базы спрашиваете?

    Шифровать или нет - зависит от требований к безопасности и оценке риска в случае disaster recovery не восстановить ключ шифрования.

    Для хорошего point in time recovery - pg_basebackup + pg_receivexlog (archive_command только если уверены, что можете её сделать нормально). Или что-то, работающее поверх них.
    Отдельный случай pitr с хранением в амазоне - см. вполне внятный wal-e
    Если pitr не обязателен, то pg_dump делать. Да, лучше архивировать, сжимаются дампы весьма неплохо.

    Например, политика бекапа из практики: ежедневный pg_dumpall, хранятся за 1 число каждого месяца на протяжении года плюс 8 дней предыдущих ежедневных.

    Что-то ещё - регулярно пробовать восстановить и запустить базу из бекапа.
    Ответ написан
  • Как при создании нового кластера postgres указать иное расположение хранения баз?

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

    А теперь - что вы хотите сделать?
    * перенести директорию базы в другое место. Остановить базу, скопировать rsync'ом datadir куда надо, на старом месте сделать симлинк (datadir в конфиге в этом случае даже не надо править, если поправить пути в конфиге - то не обязателен симлинк)
    * оставить одни БД в дефолтном месте, а некоторые другие - в другом, но под управлением одного кластера. Вам необходимо сделать tablespace и использовать его. При create database можно указать tablespace, который и будет считаться по-умолчанию для всех объектов этой базы (но переопределить его можно для каждого объекта)
    * запустить отдельный кластер. В одно и то же место вы две базы просто не вставите. Соответствующий, и обычно обязательный, параметр в initdb плюс указать datadir в конфиге или строке запуска базы (зависит от того, как будет запускаться база и где лежать ещё конфиг). А для весьма приятного враппера в debian и ubuntu pg_createcluster параметр --datadir так же есть сразу

    см. также Как правильно изменить месторасположение базы postgresql-9.2.18.rl7?
    Ответ написан
    1 комментарий
  • Как мог бы выглядеть такой запрос?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    ... group by car_id
    Ответ написан
    Комментировать