Задать вопрос
  • Как посмотреть логи изменений в базе данных MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    - изобрести машину времени
    - вернуться на дату 90 дней назад
    - включить логирование всех запросов либо настроить ведение и непрерывное архивирование бинарного лога
    - вернуться в настоящее время и анализировать настроенный в прошлом шаге лог

    Если вы не настроили вести лог изменений - то его никто хранить не будет. Даже mvcc версионник innodb будет стараться вычищать старые версии строк. Потому что зачем хранить кучу данных, если не было изложено требования их хранить?
    Ответ написан
    Комментировать
  • Чем бекапить все базы Postgres без прерывания доступа к сервису?

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

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

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

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

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA Team для вашего 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 Team для вашего 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 Team для вашего PostgreSQL?
    # Failed opening .rdb for saving: Read-only file system

    ну?

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA Team для вашего 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 Team для вашего 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 комментарий