Задать вопрос
  • Скрипт на bash для мониторинга таблицы из Postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Не имеет отношения к postgresql. Чисто bash

    DB_NAME = foo - это команда
    DB_NAME=foo - это переменная
    Ответ написан
    Комментировать
  • Как решить проблему PDOStatement::execute(): SQLSTATE[HY093]?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если внимательно посмотреть на то что действительно написано, то это будет
    $products_data = [];
    if ($query) {
        $sql = "SELECT * FROM `products`";
        $products_data = $db->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
    }


    Но, к счастью, вы вместо логичного поведения кода, соответствующего тому что действительно написано в исходнике, получаете ошибку от pdo, который не может понять, почему вы передали параметры в запрос, в котором не было мест для параметров.

    Потому что where строковой_литерал это или заведомо невыполнимый запрос, 0 строк (если строковой литерал пустая строка) или истина для всех строк таблицы. Почему это строковой литерал? Ну, потому что таков синтаксис SQL, строка в одинарных кавычках - литерал.

    А вот что вы подразумевали дальше, мне догадаться сложнее. Если в $query записано то что в вопросе, то что тогда такое должно быть :product_Id1?
    Ответ написан
  • Как усановить php-curl?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Don't ask for end-of-life PHP versions or Ubuntu release, they won't be provided.

    собственно
    18.04 EOL уже с год как
    Ответ написан
    Комментировать
  • Как установить plrust под windows для создания функций в pgAdmin?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ни документация ни гитхаб не упоминает поддержку экзотических платформ вроде windows. Только обычный linux.

    Попробуйте творчески адаптировать процедуру установки plrust из исходников под вашу платформу (возможно что не получится). Ну или просто поставить обычный linux, например в виртуалке.
    Ответ написан
    Комментировать
  • Как распарсить вывод ifconfig/ip, чтобы показывало имя интерфейса, отвечающее за беспроводную сеть?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Это должны быть те /sys/class/net/*, у которых существует /sys/class/net/$iface/wireless
    Ответ написан
    Комментировать
  • Есть ли разница в дисках для NAS?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    HDD - это расходники. Нет смысла обсуждать "меньше" или "больше" проживут. Сдохнут гарантированно. Если повезёт, то ещё в гарантийный период - бесплатно поменяете.

    Для SOHO разница между линейками по большей части неважна. Вот что стоит уточнить - SMR или CMR диск и готовы ли с этим мириться. Достаточную ли вам предлагают скидку за террабайт, чтобы вляпываться в SMR. В одной и той же линейке дисков могут быть одновременно и SMR и CMR диски, уточнять нужно модели.
    Далее, скорость вращения диска. 7200 чуть быстрее, 5400 медленнее но их попроще охлаждать в среднем. Различие скорости для личной медиатеки скорей всего неважно, но на достаточно хорошем интернет-канале торренты могут заметно озадачить массив количеством IO.

    Зеркало будет надежно или лучше пожертвовать местом и сделать raid5 или 6?

    Звучит как полное непонимание вопроса. Каким местом жертвовать, если именно зеркало даст меньше всего форматируемую ёмкость массивов? Местом придётся жертвовать, если делать как раз зеркало.
    На примере шести 10ТБ дисков для удобства счёта, из 60ТБ RAW ёмкость массива:

    raid0 или JBOD - дадут вам все 60ТБ, выпадение любого диска фатально.
    raid1 - зеркало - даст вам как максимум 3 массива по 10ТБ, до 30ТБ форматируемой ёмкости. В каждом массиве соответственно можно потерять по соседнему диску. То есть хранилка выпадение одного любого диска переживёт, выпадение второго диска - смотря какому из дисков не повезёт. Можно потерять один из массивов полностью. (raid1 на всех 6 дисках вряд ли входит в вопрос, 10ТБ итоговой ёмкости, но чтобы их потерять из-за отказа диска нужно чтобы отказали все 6 дисков)
    raid5 - даст вам 50ТБ форматируемой ёмкости. Переживёт выпадение одного любого диска, выпадение второго диска - фатально для всего массива.
    raid6 - ближайший родственник raid5 - даст вам 40ТБ ёмкости. Но зато гарантированно переживёт выпадение любых двух дисков. Только отказ третьего будет фатален для массива.
    raid10 - даст вам 30ТБ ёмкости как raid1, гарантированно выдержит выпадение одного диска, в идеале может работать на только половине дисков массива но критично зависит от структуры raid10, какие именно номера дисков могут быть потеряны без краха всего массива. Отказ второго диска может оказаться фатален. Используется не когда нужна ёмкость или возможность пережить несколько выпавших дисков, а когда нужна производительность, особенно на запись. То есть вряд ли ваш случай.

    Что ещё надо упомянуть - вот диск из массива умер, сколько времени вам нужно это заметить, купить новый на замену, заменить? Плюс на таких объёмах займёт ещё сутки-двое-трое на восстановление массива. Вот тут причина, почему существует RAID6, хотя он по ёмкости хуже RAID5 и не лучше по производительности - пока у вас массив деградировал до 5/6 дисков, он переживёт выпадение ещё одного из дисков пока вы ставите замену и массив восстанавливается.
    Ответ написан
    Комментировать
  • Почему большой iowait в cloud vm c postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    У яндекса весьма медлительные сетевые диски, совершенно верно. Именно по latency, что куда более критично для СУБД чем обещанная полоса пропускания или IOPS (которые у большинства хранилок предполагают совершенно абсурдную для СУБД глубину очереди команд).
    Ответ написан
    2 комментария
  • Нужно ли стремиться обнулять переменные и по возможности не создавать их копий в проектах php?

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

    Неа. См. zval

    Начав работать с языком Go начал придавать значение экономии памяти - не создавать лишних переменных.

    Разве компилятор go недостаточно умён для элементарных оптимизаций кода?
    Вы проверяли байткод, ваша оптимизация действительно имеет место или это самообман?
    Ответ написан
    5 комментариев
  • Какой кабель DP - DVI нужен для 120/144Гц?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Since DisplayPort dual-mode operates by using the pins of the DisplayPort connector to send DVI/HDMI signals, the 20-pin DisplayPort connector can only produce a single-link DVI signal (which uses 19 pins). A dual-link DVI signal uses 25 pins, and is therefore impossible to transmit natively from a DisplayPort connector through a passive adapter. Dual-link DVI signals can only be produced by converting from native DisplayPort output signals with an active conversion device.

    https://en.wikipedia.org/wiki/DisplayPort

    О, мне гугл дал ссылочку именно про ваш монитор: https://forums.tomshardware.com/threads/how-to-con...
    В общем, или жить дальше на 60гц или дорогой активный преобразователь сигнала или замена монитора
    Ответ написан
  • Кластер postgres не инициализирует настройки?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Some of the PostgreSQL parameters must hold the same values on the primary and the replicas. For those, values set either in the local patroni configuration files or via the environment variables take no effect. To alter or set their values one must change the shared configuration in the DCS. Below is the actual list of such parameters together with the default values:
    max_connections: 100
    max_locks_per_transaction: 64
    max_worker_processes: 8
    max_prepared_transactions: 0
    wal_level: hot_standby
    track_commit_timestamp: off

    https://patroni.readthedocs.io/en/latest/patroni_c...
    всё выглядит штатно, как задумано разработчиками patroni
    Ответ написан
    3 комментария
  • Как забрать с раздела 500ГБ и передать их другому разделу?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    resize2fs /dev/centos/home с указанием размера файловой системы с каким-то запасом, до 400ГБ например обрезать. Критично следующим шагом не обрезать часть файловой системы.
    lvresize /dev/centos/home до желаемого размера
    lvresize /dev/centos/root до желаемого размера
    resize2fs /dev/centos/home
    resize2fs /dev/centos/root
    Ответ написан
    4 комментария
  • Почему не удалось перенести базу zabbix?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    1. запустили намеренно pg_dump с отказом -O - то есть --no-owner
    2. развернули дамп от супера
    3. все объекты теперь ожидаемо принадлежат суперу, owner'а же не переносили
    4. удивляемся, что постороннему пользователю нет прав чтения

    Что же тут могло пойти не так?

    Самое простое для баз с одним пользователем - импортируйте дамп базы от имени этого самого пользователя. Если в базе есть какие-то extension - то сперва их создать от суперпользователя.
    Ответ написан
    3 комментария
  • Как pgbouncer обрабатывает idle сесии?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Зависит от pool_mode.

    В режиме session баунсер прозрачен для приложения: не налагает каких-то явных ограничений на использование, но один клиент к баунсеру = один коннект к базе. Соединение с базой сможет быть передано другому клиенту только после того как предыдущий клиент отключится. Поэтому этот режим используется очень редко.

    В режиме transaction пула коннект к базе выдаётся клиенту только на время транзакции. Самый распространённый режим работы, любим именно за то, что сколько бы тысяч коннектов не открыло приложение к баунсеру, на базе открыто небольшое число действительно потребовавшихся соединений.
    Но этот режим пула налагает ограничения на работу приложения. Вы не сможете нормально использовать ничего, что меняет состояние коннекта, потому что следующий ваш запрос с высокой вероятностью попадёт в другой коннект. То есть курсоры, временные таблицы, set (кроме set local), prepared statements (где parse, bind и execute могут разойтись по 3 разным коннектам)

    С prepared statements в transaction pool mode с недавних пор может помочь настройка max_prepared_statements, но только если prepare и deallocate выполняются именно командами протокола, но не SQL запросами. Тут многие широкоиспользуемые библиотеки оказались в пролёте.
    Ответ написан
    1 комментарий
  • Можно ли всем строковым полям задавать тип TEXT и повлияет ли это сильно на производительность?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    text и varchar - это одно и то же на уровне реализации postgresql.

    varchar с каким-то разумным ограничением (не бессмысленный взятый с потолка 255 везде, а разумный для этого конкретного поля) тем не менее смысл имеет: куда проще найти ошибку в месте записи данных, чем потом искать, откуда в поле обычно содержащем до 30 символов взялось 10 мегабайт текста (история из практики, да)

    Про char ограничусь цитатой письма Tom Lane
    Type character(N) is a hangover from the days of punched cards. Don't use it.

    Просто забудьте про такой тип данных. Он не только бесполезен, но и вреден.
    Ответ написан
    5 комментариев
  • Как настроить слоты репликации в patroni для сохранения неограниченного кол-ва WAL при отключении реплики?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если wal_status становится lost - значит max_slot_wal_keep_size был изменён с дефолтного значения -1 и установлен в какое-то другое значение.
    Потому что именно для этого добавляли настройку max_slot_wal_keep_size, чтобы отставший слот репликации не ронял базу.
    Ответ написан
  • Какой из WD HDD выбрать в рабочую станцию?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Любой. Это расходник.

    Критерии:
    - цена за террабайт
    - длительность гарантии (учесть, что это не гарантия того что диск столько проработает, а вероятность получить исправную замену в течении указанного срока, переплачивать х2 только за гарантию нет смысла, надёжнее будет взять два HDD)
    - CMR если нет чёткого понимания что для задачи сгодится SMR и только если SMR очень ощутимо выгоднее
    Ответ написан
    Комментировать
  • По какому принципу работает набор индексов в одной таблице?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Нет, ни одно из утверждений не является верным.

    btree индекс - это структура, располагающаяся отдельно, сбоку, от таблицы. Порядок данных в таблице никак не меняется от создания индекса.
    Индекс btree(a,b,c) и три индекса btree(a), btree(b), btree(c) - разные вещи.
    Ответ написан
    6 комментариев
  • Можно ли на горячую обесточивать HDD SATA и SAS?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Стандарт SATA изначально требует поддержку hot swap. Но конечно могут быть нюансы для конкретных реализаций диска, контроллера или ОС.

    В linux имеет смысл скомандовать echo 1 > /sys/block/(device)/device/delete перед отключением питания. Ядро сбросит буфера и скомандует остановку шпинделя диску.
    Ответ написан
    Комментировать
  • Какой максимальный размер temp_buffers для PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Максимум INT_MAX / 2 числа блоков, что при обычном размере блока в 8кб будет равняться лимиту до 8TiB.
    melkij=> set temp_buffers to '8192GB';
    ERROR:  1073741824 8kB is outside the valid range for parameter "temp_buffers" (100 .. 1073741823)
    melkij=> set temp_buffers to '8191GB';
    SET


    Действует независимо для каждого процесса базы. При max_connection = 100 каждый из этих 100 процессов имеет возможность выделить по столько памяти для хранения блоков временных таблиц этой сессии.
    Ответ написан
    Комментировать
  • Как решить ошибку пула соединений к PostgreSql?

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

    remaining connection slots are reserved for non-replication superuser connections

    означает, что у базы заняты все возможные max_connections - superuser_reserved_connections, поэтому не может принимать больше коннектов, пока не отключится кто-то из подключившихся ранее (либо не будет обнаружен обрыв tcp сессии и поэтому коннект будет освобождён).
    Ответ написан