Задать вопрос
  • Как правильно написать двойное обновление?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Вы сильно заблуждаетесь, если думаете, что ваш cte выполняется последовательно.
    The sub-statements in WITH are executed concurrently with each other and with the main query. Therefore, when using data-modifying statements in WITH, the order in which the specified updates actually happen is unpredictable. All the statements are executed with the same snapshot (see Chapter 13), so they cannot "see" one another's effects on the target tables.

    https://www.postgresql.org/docs/9.6/static/queries...

    Вы выполняете на одном слепке данных одних и тех строк различающиеся действия. Не надо так. Я понятий не имею, какой эффект от этого будет.
    К тому же вы элементарно переписываетесь в один просто запрос
    UPDATE "TABLE1"
    SET
      "Value2" = (NOT EXISTS(
        SELECT NULL
        FROM "TABLE2"
        WHERE "что-то" = "кое-что"
    )
          AND NOT EXISTS(
        SELECT NULL
        FROM "TABLE3"
        WHERE "что-то" = "кое-что"
    ))
    WHERE "кое-что" = ANY ($1 :: INT [])
    Ответ написан
    Комментировать
  • На чем делать кластер postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Для начала задаёте себе и отвечаете на вопрос "зачем?"
    Потому что геморроя, проблем и граблей очень много. Бонусы - сомнительны. Основной пласт проблем - как решить, что пора переключать мастер на другой хост, а не вернётся старый мастер из-за недолгого (а то и вовсе планового) лага сети? Это организационный вопрос и автоматикой он не решается. Самое счастье с автоматикой - схлопотать split brain и получить на этом долгий и увлекательный квест "как бы разъехавшиеся данные теперь подружить воедино"
    мастер-мастер = головная боль перманентно. Потому что фундаментальная CAP теорема, которую никто пока внятно не решил. Или у вас проблемы с консистентностью или с медленной из-за распределённых транзакций записью.

    Автоматика для failover'а, которую я не придумал как спровоцировать на split brain - patroni. Вроде работает. Но в продакшене видел пока только однажды.

    Процедуры (да и вообще запросы) имеет смысл делить:
    - пишущие. Любые, какие что-то пишут в базе (включая create temporary table). Это должны роутиться строго на мастер
    - читающие. Идут на реплики
    - долго читающие. Идут на отдельные slow реплики, которые могут заметно отставать от мастера, но которые не будут мешать деятельности проекта
    Ответ написан
    4 комментария
  • Как при запросе получить в ячейке больший объем символов?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    pg_stat_activity.query ограничен сверху конфигурационным параметром track_activity_query_size. Дефолтно 1024 байта.

    PS: current_query оно называлось до postgresql 9.2, которые уже давно EOL и сам 9.2 уже EOL. Планируйте обновление.
    Ответ написан
  • Ошибки при восстановлении dump?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Судя по всему вы делали дамп без --clean и пытаетесь восстановить в уже не пустую базу.
    Ответ написан
  • TRIM на SSD в mdadm RAID 1?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Вы так говорите будто инсталлятор сделает raid чем-то иным нежели linux raid (aka mdadm).

    Поддержка trim под linux raid - вопрос версии ядра linux (ну может ещё каких крайне нестандартных ядер).
    Ответ написан
    Комментировать
  • Экземпляр класса из строкового значения?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Директивы use - синтаксический сахар времени компиляции. В рантайме где вы в переменной помещаете имя класса этих директив уже нет и потому в переменной должно быть полное имя класса.
    Ответ написан
    1 комментарий
  • Какая база луче подойдет на рабочий портал?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Сейчас разработчики пишут портал

    Вот у разработчиков и спрашивайте, какую СУБД они лучше знают. И админов своих спросите, какую СУБД те лучше знают. DBA у вас явно нет, иначе вопрос бы так не стоял.

    Сам headhunter использует postgresql. Но там и своя команда админов классная, и вдобавок опытная команда DBA моих нынешних коллег, специализирующихся именно на postgresql.

    Я достаточно хорошо знаю обе СУБД с точки зрения разработчика, но не умею админить mysql, так что моё мнение будет предвзятым.
    Если делаете коммерческий проект - то используйте ту СУБД, которую лучше знает ваша команда. Если разработчики попрятались за своими ORM'ами и носу не заглядывают в базу - то без разницы, в таких условиях любая СУБД будет работать одинаково плохо. Если же хоть кто-то в команде понимает, что надо делать с базой - доверьте выбор ему и поинтересуйтесь о причинах выбора.
    Ответ написан
    Комментировать
  • Как в Ruby on Rails поле created_at использовать в mysql-запросе?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Из комментариев created_at является нормальным timestamp или datetime полем. Поэтому его не только не нужно приводить к строке и парсить повторно в дату (с неверным форматом к тому же), но ещё и очень вредно так делать, т.к. исключает возможность использования индекса.

    created_at < STR_TO_DATE('01.01.2017', '%d.%m.%Y')
    Дату возможно отформатировать в Y-m-d формат на приложении, это уже как удобнее.
    Ответ написан
    Комментировать
  • Что может быть с железом?

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

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

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

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

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