Задать вопрос
  • Что может быть с железом?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Сколько уже блоку питания? Лет 15? Славно потрудился, оставьте его отдыхать.

    Такой артефакт времён ATX1.3 хоть электрически и совместим с ATX2.x (верная схема подключения: 4-pin питание процессора к процессору, 20-пин в 24-пиновый разъём), но рассчитан на в принципе другой workload. Не издевайтесь над пенсионером.
    Ответ написан
    1 комментарий
  • Как перенести базу postgresql из нерабочей системы, если в chroot сервис не запускается?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Найдите, где datadir базы. Скорей всего /var/lib/postgresql/(версия базы)/main, но могла была быть перемещена, так же может стоять несколько кластеров базы и разные версии базы - в дебианах и убунтах это делается легко.

    Далее установить на новой системе postgresql идентичной major версии и не ниже minor версии что была там. Какая была major версия - смотрите файлик PG_VERSION в datadir. minor версию ставьте последнюю актуальную.
    Так понимаю, старая система в принципе не работает? Т.е. старая база выключена? Выключите и новую (пока пустую) базу. Проверьте, если не уверены, обе базы должна быть выключена.
    Переименовываете datadir на новом сервере (вообще, можно удалить, но можно и ошибиться консолью и дропнуть не то =) )
    Копируете каталог базы: rsync -a /olddatadir /newdatadir
    Копируете и правите если надо конфиги из /etc/postgresql/версия_базы
    Если каталог pg_tblspc/ в datadir не пуст - скопируйте и симлинки из него и все данные по этим симлинкам в аналогичные места на новой машине.
    Если pg_xlog/ является симлинком - его необходимо скопировать. Можно оставить симлинком, можно содержимое перекопировать.
    Пробуете запустить базу на новом месте. Смотрите в логи. Если на старом месте база не была повреждена (и ничего нужного скопировать не забыли) - то она запустится.
    Ответ написан
    1 комментарий
  • Как мне установить ограничение-проверки на два условия?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для перечислений можно использовать родной enum
    melkij=> create type gender as enum('M','W');
    CREATE TYPE
    melkij=> create table foo (f gender);
    CREATE TABLE
    melkij=> insert into foo values('M');
    INSERT 0 1
    melkij=> insert into foo values('F');
    ОШИБКА:  неверное значение для перечисления gender: "F"
    СТРОКА 1: insert into foo values('F');
                                     ^
    melkij=> insert into foo values('');
    ОШИБКА:  неверное значение для перечисления gender: ""
    СТРОКА 1: insert into foo values('');

    И явный check не нужен и добавлять значения проще, особенно если поле используется не в одном месте базы только.
    Ответ написан
    Комментировать
  • Как быстро удалить большое количество строк в postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Безопасный подход для больших таблиц:
    create unlogged table list_for_delete (id int);
    insert into list_for_delete values ....
    
    with to_rm as (
        select id from list_for_delete limit 10000
    ), rm as (
        delete from list_for_delete where id in (select id from to_rm)
    )
    delete from tablename  where id in (select id from to_rm);
    
    vacuum analyze tablename;
    drop table list_for_delete ;

    cte с delete повторять пока не будет affeted rows = 0. Смотреть на лаг репликации, добавлять задержки между запросами и увеличивать/уменьшать размер пачки в зависимости от влияния на прод.
    vacuum в конце, можно после половины пройтись дополнительно. С таким-то объёмом можно руками вакуум вообще не делать и оставить автовакууму. А для таблиц побольше при массовом изменении имеет смысл.
    Ответ написан
    Комментировать
  • Микротик - как можно заблокировать сайт без использования L7 фильтра?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Завернуть весь DNS трафик на микротик. Вписать вручную в /ip dns static соответствие хосту который надо заблокировать на что угодно другое, хоть на 127.0.0.1
    Ответ написан
    Комментировать
  • PostgreSQL 9.4.9. Текстовая колонка: какие-то значения были добавлены как string, другие как integer- может ли это привести к значения NULL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как добавляли, так и будет храниться и читаться.
    postgres=# create schema garage;
    CREATE SCHEMA
    postgres=# CREATE TABLE garage.users
    (
    car_id text COLLATE pg_catalog."default"
    )
    WITH (
    OIDS = FALSE
    )
    TABLESPACE pg_default;
    CREATE TABLE
    postgres=# insert into garage.users values ('1'), ($$'1'$$), (null);
    INSERT 0 3
    postgres=# select car_id, car_id is null from garage.users ;
     car_id | ?column? 
    --------+----------
     1      | f
     '1'    | f
            | t
    Ответ написан
    Комментировать
  • Как посмотреть логи изменений в базе данных 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 комментариев