Задать вопрос
  • Как правильно поставить индексы у MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    create index crm_exchanges_bittrex_currencies_market_time_idx on crm_exchanges_bittrex_currencies (MarketName, TimeStamp);
    Ответ написан
    2 комментария
  • Помрёт ли HDD при постоянной работе через USB?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Регулярный старт-стоп нужен для энергосбережения - то есть может быть нужен, не факт что на регулярный старт не будет потрачено больше энергии чем на поддержание постоянной скорости вращения - в зависимости от частоты уходя в сон.
    Для самого диска - исключительно вредно. Количество циклов парковки головок ограничено возможностями механики, старт массивного массива дисков даёт заметную нагрузку на двигатель (в серверах диски не редко сыпятся именно при старте, тогда как 5 минут до выключения были живые), при выключении диск остывает, при старте резко нагревается - а температурные колебания так же вредны для механики. В отличии от поддержания постоянной скорости вращения с примерно постоянной температурой - тепличные условия.

    1) долго ли протянет мой hdd при подключении через sata-usb с учётом того, что он никогда не прекращает вращение?

    Если не помрёт БП вместе с диском - то скорей всего дольше, чем при постоянной старт-стопе.

    2) можно ли получить доступ к данным SMART при таком подключении?

    Зависит от переходника, только экспериментировать.
    Ответ написан
    3 комментария
  • Можно ли сделать такой SQL-запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select org from tablename group by org having count(distinct active) > 1;
    Ответ написан
    2 комментария
  • Когда имеет смысл делать несколько таблиц с комментариями?

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

    Форум. Банальная страница профиля пользователя, достать последние 10 сообщений этого пользователя - как? union all по всем темам с filesort последующим вместо простого index scan по составному ключу даже без необходимости в сортировке?
    Статьи. Показать для модерации последние комментарии

    А распилить большую таблицу (только на самом деле большую, а не в смешные лям строк) на части - вещь неплохая. Только не так надо пилить. Есть у mysql штатное партицирование.
    Ответ написан
    Комментировать
  • Что учить администратору баз данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как человек в этом году неожиданно сменивший деятельность с senior php dev на DBA - хочу задать встречный вопрос:
    а вы вообще видите вакансии на начинающего-студента-DBA? Целую одну или хотя бы даже две? Для увидевшего SQL вот только что студента и уже желающего быть DBA всего через пару месяцев? Человека, который даже не написал, какую именно СУБД ему интересно изучать до уровня DBA?

    Отдельная позиция DBA в проекте - значит ни штатные системные администраторы (со стороны администрирования) ни старшие разработчики (со знанием SQL) уже не обладают достаточными познаниями в используемой СУБД. Но эта БД важна для бизнеса и ищется специалист по ней, который будет обеспечивать хорошую работу этой базы.
    Несколько позиций DBA в кампании чтобы брать стажера - это очень большой проект. Эти могут себе позволить отвлекать своих специалистов от работы и вкладывать деньги в выращивание нового специалиста. Если вы чем-то сильно заинтересуете кампанию.

    Я не знаю как стать DBA с нуля. Похоже DBA становятся только имея за плечами заметный опыт администрирования или разработки.

    Определитесь с конкретной СУБД и прочитайте полностью её мануал. Например мануал postgresql 10 в pdf занимает свыше 3 тысяч страниц A4. На пару месяцев этого уже хватит. А это только мануал. Только по непосредственно СУБД.
    Плюс необходимо знать базовое администрирование той ОС под которой эта СУБД используется (например, я как postgresql dba даже близко не представляю что делать с windows - такая экзотика в жизни не встречается. А вот для MS SQL наверняка необязательно разбираться в linux).
    Плюс теория: реляционная логика, обеспечение транзакционного, конкурентного доступа, восстановление после сбоев
    Плюс практика - активность в профильных сообществах, форумах. Читаете, проверяете, запоминаете, вежливо переспрашиваете в комментариях если вам кажется что предыдущий отвечающий ошибся, отвечаете на вопросы.

    Интересно? Вперёд. Но в DBA за 3 месяца из нулевого студента - не верю.
    Ответ написан
    2 комментария
  • Как посмотреть существующие триггеры событий (Event Trigger, postgresql)?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Они прописываются в системной view pg_event_trigger
    https://www.postgresql.org/docs/9.6/static/catalog...

    В psql есть сокращение \dy выполняющее вот такой запрос:
    SELECT evtname as "Name", evtevent as "Event", pg_catalog.pg_get_userbyid(e.evtowner) as "Owner",
     case evtenabled when 'O' then 'enabled'  when 'R' then 'replica'  when 'A' then 'always'  when 'D' then 'disabled' end as "Enabled",
     e.evtfoid::pg_catalog.regproc as "Procedure", pg_catalog.array_to_string(array(select x from pg_catalog.unnest(evttags) as t(x)), ', ') as "Tags"
    FROM pg_catalog.pg_event_trigger e ORDER BY 1
    Ответ написан
    Комментировать
  • Как правильно написать двойное обновление?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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
    Ответ написан
    Комментировать