Задать вопрос
  • Как вы измеряете профиль нагрузки (соотношение кол-ва чтений/кол-ву записей) в PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Посмотрите в циферки что собирает stats collector, их много разных. https://www.postgresql.org/docs/10/static/monitori...
    например, запись буферов на диски - это buffers_checkpoint, buffers_clean и buffers_backend в pg_stat_bgwriter
    pg_stat_database c blks_read, blks_hit, blk_read_time и blk_write_time

    И разумеется pg_stat_statements с детализацией ресурсов по отдельным запросам.

    Вот кстати, хорошая картинка куда смотреть за детализацией каких подсистем базы
    postgres-observability-9.6.png
    Ответ написан
  • TINYINT vs ENUM: в ситуации, когда возможных целочисленных значений всего несколько?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Enum с числовыми полями работает описанным в мануале способом, но этот способ... Скажем так, иногда вызывает удивление.

    mysql> create temporary table speedlimit (i int, lim ENUM('20', '30', '40', '50', '60'));
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> insert into speedlimit values (1, 60);
    Query OK, 1 row affected, 1 warning (0.04 sec)
    
    mysql> insert into speedlimit values (2, 5);
    Query OK, 1 row affected (0.04 sec)
    
    mysql> insert into speedlimit values (3, '60');
    Query OK, 1 row affected (0.04 sec)
    
    mysql> select * from speedlimit;
    +------+------+
    | i    | lim  |
    +------+------+
    |    1 |      |
    |    2 | 60   |
    |    3 | 60   |
    +------+------+
    4 rows in set (0.00 sec)
    
    mysql> select * from speedlimit where lim > 20;
    Empty set (0.00 sec)
    
    mysql> select * from speedlimit where lim > '20';
    +------+------+
    | i    | lim  |
    +------+------+
    |    2 | 60   |
    |    3 | 60   |
    +------+------+
    2 rows in set (0.00 sec)


    Если вы понимаете, почему поведение именно такое и знаете, что это поведение не будет удивлять других разработчиков - можно использовать. По размеру enum до 255 значений занимает 1 байт, как и tinyint. Но я не рекомендую использовать enum с числовыми значениями.
    Ответ написан
    6 комментариев
  • Как организовать базу дневных температур в mysql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Общее правило - сначала нормальная форма, потом денормализация. Не наоборот.

    Возможно лучше вовсе time-series базы посмотреть.
    Ответ написан
    2 комментария
  • Почему не работает LIMIT в этом подготовленном запросе?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    limit можно передавать параметром. Проблема в комбинации двух фактов:
    1) эмуляция prepared statements в pdo дефолтно передаёт строки
    2) парсер mysql утверждает, что limit обязан быть числом

    Поэтому необходимо исправить один любой из этих нюансов:
    1) указать тип параметра явно:
    $q = $dbh->prepare("select ... limit :limit");
    $q->bindValue(':limit', 10, PDO::PARAM_INT);
    $q->execute();

    2) либо отключить эмуляцию prepared statements: PDO::ATTR_EMULATE_PREPARES => false в настройках соединения.
    Ответ написан
    1 комментарий
  • Как перенести данные из Postgres в Mysql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если у вас в дампе только insert'ы (и именно они, а не copy; например после pg_dump --inserts --data-only) - то попробуйте импортировать в mysql как есть.
    Возможно sql_mode надо будет подправить в ANSI quotes, а данные вроде корректно переезжают.

    Ну или сделать дампы в csv - команды copy в postgresql и load data infile в mysql.
    Ответ написан
    Комментировать
  • Как получить от PostgreSQL массив данных сразу в Json формате для Symfony?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    В postgresql есть штатная агреггирующая функция json_agg. Поэтому возможно даже без привлечения хранимок.
    Ответ написан
    6 комментариев
  • Куда подключать спикер на этой мамке Intel D945GCLF2D?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Не предусмотрено конструктивно.
    https://www.intel.com/content/dam/support/us/en/do...
    These beep codes can be heard through a speaker attached to the board’s line out jack

    Сигналы POST выводятся на line-out аудиоразъём.
    Ответ написан
    Комментировать
  • Как написать функцию итератор?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Это называется не итератором.

    insert into terms (term, freq) values (?, 1) on conflict (term) do update freq = excluded.freq + 1 returning freq;

    В функцию завернуть по желанию. 9.5+
    Ответ написан
    Комментировать
  • Как отследить почему падает MySQL too many connections?

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

    Для mysql коннекты не такие тяжёлые относительно того же postgresql и max_connections вполне можно увеличивать.
    Какие коннекты открыты и откуда можно посмотреть в show processlist
    Ответ написан
    2 комментария
  • Почему не выводит строки при корректном запросе postgre?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    А с кавычками выводит "ничего" т.е. ноль полей.

    С какими именно?

    user='40'
    'user'='40'
    "user"='40'

    Это три абсолютно различных условия, выполняющих совершенно разные вещи.

    user - зарезервированное слово по требованию стандарта. По стандарту не уверен что обозначает в контексте where, надо искать (может как часть create user и подобных только зарезервирован), а в postgresql обозначает имя текущего пользователя. Имеет тип name, что и провоцирует ошибку.
    Т.е. первое условие в принципе не имеет никакого отношения к каким-либо пользовательским таблицам.

    'user' - просто текстовая константа. Никто не мешает в условии сравнивать одну константу с другой, where 1=1 в некоторых query builder отсюда же.

    "user" - обращение к объекту, игнорируя зарезервированные слова. То есть если у вас в таблице proxy есть поле user - то запрос должен быть записан как
    select * from proxy where "user"='40'

    Но общая практика - лучше не надо использовать зарезервированные слова в качестве идентификаторов.
    Ответ написан
    1 комментарий
  • Как обновляют структуру БД и данные на продакшене?

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

    Начать необходимо вот отсюда: https://habrahabr.ru/post/146901/
    И, собственно, придти к выводу, что лучше оставить как есть в одном поле. Если в каких-то местах нужны другие формы обращений - прописать их явно, а не конструируя по имеющимся заблуждениям о фио.

    А так:
    0) делается дополнительный бекап
    1) выкатывается alter table добавляющий новый поля
    2) выкатывается приложение, умеющее писать синхронно старую и новую структуру, но читающее только старую
    3) отдельным процессом в цикле небольшими частями преобразуются данные - это если подлежит автоматической обработке
    4) выкатывается приложение использующее только новую структуру
    5) архивируется и удаляется исходная структура

    Для всего-то тысячи записей может проще будет залочить табличку на несколько секунд.

    Если тривиальной автоматике обработка не подлежит, то часто вместо 3 пункта делают выгрузку primary key, source_data, как-нибудь изменяют и готовят csv primary key, source_data, new_data, копируют в temporary table, затем делают слияние мультитабличным update этих двух таблиц с recheck'ом по source_data. Затем выгружают данные для которых не было обновления, разбираются, ещё раз обновляют и т.д. до заполнения всего.
    Ответ написан
    2 комментария
  • Какую выставить частоту оперативной памяти?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    CPU-z на вкладке SPD пишет то, что в SPD модуля, а не текущее состояние. Текущее состояние - в memory. А в Max Bandwidth указан максимальный стандартный по JEDEC режим.

    что будет если вставить в сокет К процессор

    Ничего не изменится.

    поэтому интресует вопрос будет с таким процессором память работать на 2400

    Будут, оба процессора.
    XMP профили - интела разработка и есть. В спецификациях интел давно уже занижает режимы памяти относительно поддерживаемых делителей частоты памяти. Де юре - разгон, де факто - автоматическая настройка. Лет 10+ назад попадалась память с отдельной инструкцией мол заявленный режим работы памяти протестирован, но настроить вы его должны сами в BIOS.

    И какую частоту выставить на данный момент? 1600 или 2400?

    Какую хотите.
    Ответ написан
    4 комментария
  • Почему strip_tags обрезает такую строку?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Неужели он не может отличить это <-+KennY+-> от html тега?

    Даже не пытается. Простой state machine

    А зачем вам strip_tags вообще понадобился? Ломать пользовательский ввод вы не должны, вы должны его правильно отобразить. Т.е. делать htmlspecialchars при выводе в html.
    Ответ написан
    Комментировать
  • Почему триггер mysql не создается?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Потому что здесь вы, наоборот, не изменили delimiter команд, что требуется сделать.
    Такой вот дурацкий синтаксис mysql, парсеру надо специально объяснять, где заканчивается триггер (или хранимая процедура).
    Ответ написан
    Комментировать
  • Как победить NULL при составлении запроса в БД?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Соответственно придумайте, как корректно представить NULL в values именно NULL'ом. От такого использования функции join очевидно придётся отказаться.

    А лучше не извращайтесь, и используйте pdo prepared statements, который null передавать умеет штатно.
    Ответ написан
    Комментировать
  • MYSQL не выполняет команды, а просто переводит строчки \C - не помoгает?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Судя по поведению, ранее (либо где-то в конфигах) вы заменили delimiter команд.
    use databasename не требует указания delimiter, потому в первый раз сработал.

    Сброс буфера ввода - \c (кроме как внутри кавычек - сначала закрыть кавычки). Либо ctrl+C, но зависит от того как клиент mysql собран.
    Замена разделителя команд - \d новый_разделитель либо delimiter новый_разделитель
    mysql> \d $$
    mysql> use test2
    ERROR 1049 (42000): Unknown database 'test2'
    mysql> show tables;
        -> wtf?
        -> \c
    mysql> \d ;
    mysql> show tables;
    +----------------------------------+
    | Tables_in_test                   |
    +----------------------------------+


    Для выхода из большинства интерактивный текстовых приложений чаще используется ctrl+D, отправляющий EOF.
    Ответ написан
    Комментировать
  • Как ограничить Rows_examined в MYSQL с помощью LIMIT?

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

    А не читать всё, когда есть limit - умеет даже mysql.
    Ответ написан
    Комментировать
  • Почему разные сервисы показывают разное местоположение по IP?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Связано с тем, что в принципе ip адресация не имеет ничего общего с местоположением по глобусу.
    geoip выкручиваются полагая, что блоки ip адресов обычно никуда внезапно не переезжают и создают таблицу соответствия, какие ip где наверное располагаются физически. Иногда угадывают, иногда нет. Соответственно вы видите банально разные базы geoip (или даже разные версии одной и той же базы)
    Ответ написан
    3 комментария
  • Как избавиться от блокировок при обслуживание партиций внешней таблицы в БД PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    vacuum full и reindex требуют тяжёлую блокировку и держать блокировку будут долго. Поэтому обычно их избегают.
    drop разумеется тоже требует эксклюзивную блокировку, но на короткое время. Важно понимать скользкую ситуацию - если вы пытаетесь взять эксклюзивную блокировку, но не можете её получить из-за других выполняемых транзакций - вы будете ждать окончания этих мешающих транзакций, но уже будете блокировать работу последующих транзакций.

    Если вы считаете, что много места пропало впустую - то это можно посчитать (поставив contrib расширение pgstattuple) вот этими нашими запросами: для таблиц и для индексов
    Если да, проблема с местом в этом - то вам помогут pgcompacttable или pg_repack

    Если данные по большей части архивные - имеет смысл заменить btree индексы на brin. Они медленнее, но очень сильно компактнее по диску.

    А отцеплять партиции - посмотреть в pg_stat_activity что вообще происходит, нет ли аномально длинных транзакций или idle in transaction (т.е. затупов на приложении). Затем с statement_timeout и lock_timeout в 1 секунду (или меньше даже) пробовать отцепить пока не получится.
    Ответ написан
    4 комментария