Задать вопрос
  • Смена движка InnoDB → MyISAM на таблице с триггерами?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Делаете бекап, конвертируете, проверяете.
    Так-то триггеры живут уровнем выше storage engine и задеть не должны.

    PS: и стоит ещё раз внимательно подумать, точно ли хорошая идея менять транзакционный innodb на какую-то кучу бинарного мусора. Если вы понимаете, что транзакционность - это не только про слова begin/commit.
    Ответ написан
    Комментировать
  • Почему пользователю БД не назначаются права?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    postgres=# CREATE DATABASE joba_finder;
    CREATE DATABASE
    postgres=# CREATE USER jf_user WITH PASSWORD 'qwerty';
    CREATE ROLE
    postgres=# \l joba_finder 
                                   Список баз данных
         Имя     | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   | Права доступа 
    -------------+----------+-----------+-------------+-------------+---------------
     joba_finder | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 
    (1 строка)
    
    postgres=# GRANT ALL PRIVILEGES ON DATABASE joba_finder to jf_user;
    GRANT
    postgres=# \l joba_finder 
                                       Список баз данных
         Имя     | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа     
    -------------+----------+-----------+-------------+-------------+-----------------------
     joba_finder | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =Tc/postgres         +
                 |          |           |             |             | postgres=CTc/postgres+
                 |          |           |             |             | jf_user=CTc/postgres
    (1 строка)
    
    postgres=# select version();
                                                    version                                                 
    --------------------------------------------------------------------------------------------------------
     PostgreSQL 11.2 (Debian 11.2-2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-2) 8.3.0, 64-bit
    (1 строка)

    Just works. Настройками это не регулируется, так что проверяйте что вы делаете не так. Может быть не коммитите транзакцию с grant? Не знаю.

    Не заметил:

    joba_finder-# \l

    Внимание на -# так где должен быть =# - метка указывает, что вы начали писать запрос, но не завершили его. psql команды вроде \l при этом всё ещё обрабатываются.
    postgres=# select
    postgres-# \l joba_finder 
                                       Список баз данных
         Имя     | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа     
    -------------+----------+-----------+-------------+-------------+-----------------------
     joba_finder | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =Tc/postgres         +
                 |          |           |             |             | postgres=CTc/postgres+
                 |          |           |             |             | jf_user=CTc/postgres
    (1 строка)
    
    postgres-# 1;
     ?column? 
    ----------
            1
    (1 строка)

    Как пример psql команды в середине написания select 1;
    Ответ написан
    3 комментария
  • Какие ключевые отличия PCRE2 от PCRE?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://wiki.php.net/rfc/pcre2-migration
    The userland code is unaffected


    Ключевые отличия - изменения C API. Потому смена major версии библиотеки.
    Ответ написан
    Комментировать
  • Не могу вписать условие в базу данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    alter column "id" что? По синтаксису дальше идёт описание действия, а не непонятно откуда взявшееся слово INTEGER

    Если это самодеятельность вашего gui - то это приложение не умеет работать с postgresql, только и всего. Возьмите что-нибудь адекватное. psql например.

    Ну и default должен быть не в кавычках, а именно вызовом функции, set default nextval(...
    Ответ написан
    Комментировать
  • Как отправить post CURL php?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Не занимайтесь странными извращениями с некорректным формированием multipart/form-data, а дайте curl самому сформировать корректное сообщение.

    curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'file' => new \CurlFile($file)
    ]);


    Остальные параметры конструктора curlfile если нужны для апи.
    Ответ написан
    Комментировать
  • Почему может возникать ошибка curl_setopt(): supplied resource is not a valid cURL handle resource?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Сложно сказать с не воспроизводимым примером кода. Впрочем легко заметить, что сейчас ваш метод _query строго одноразовый. На повторный запуск этого метода (в контексте одного объекта) вы получите такую ошибку. Потому что curl_close закрывает ресурс, но переменная остаётся типа ресурс и потому не отвечает условию !$this->_ch
    Ответ написан
  • Как работает содержимое zip://'. $file_name. '#xl/sharedStrings.xml' в file_get_contents?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Штука называется Protocols and Wrappers, могут быть даже самописные.
    Ровно та же самая вещь, почему file_get_contents умеет делать http запросы.
    Ответ написан
  • Как применить ON CONFLICT для отслеживания изменений при INSERT?

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

    Возможно. Если вы этим знанием свой предметной области поделитесь с СУБД и создадите уникальное ограничение. А скорей всего это вовсе натуральный первичный ключ.

    on conflict работает как ни удивительно при конфликте уникальности. Поэтому пока у вас никто не гарантирует уникальность данных - on conflict ничего не сделает.
    Ответ написан
    Комментировать
  • Можно ли как-то оптимизировать этот SQL запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Попробуйте так:
    SELECT Prop.*, coalesce("counters".countAllUnits, 0) AS "countAllUnits", coalesce("counters".countVacantUnits, 0) AS "countVacantUnits"
                        FROM "Property" AS Prop
                        INNER JOIN LATERAL
                        (
                         SELECT COUNT(*) AS countAllUnits,
    count(*) filter(where "Unit".status = 'Vacant') as countVacantUnits
                         FROM "Unit"
                         WHERE Prop."id" = "Unit"."propertyId"
                        ) AS "counters" ON true
                        WHERE  Prop."userId" IN (
                              SELECT id FROM "User" WHERE  "companyId" = 200001
                        )
                        ORDER BY Prop."userId" ASC LIMIT 10 OFFSET 0

    Ожидание: раннее отсечение limit 10 и nested loop именно от них.
    Ответ написан
    3 комментария
  • Как создать триггер для ограничения операторов CREATE в ночное время?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы с какой-то очень не той стороны хотите подойти к задаче. Вопрос на который надо искать ответ - зачем вы это хотите?

    В нормальном виде у вас вообще нет такой задачи уже на уровне прав - DDL запрещены вовсе для пользователя приложения. А для людей - решается не техническими средствами, а организационно. То есть к проду в любое время суток нет доступа на изменение схемы людьми (а вообще-то и на чтение людьми тоже, для людей доступ к не боевой реплике), которые не отвечают за последствия своих действий. А специалистам, у которых доступ должен быть - чинить препятствия странно, хоть днём, хоть тем более ночью (когда критичные вещи и могут выкатываться).

    Впрочем, event triggers могут быть ddl_command_start для ряда create команд.
    Ответ написан
    1 комментарий
  • Что будет с первичным ключом если создать таблицу без указания PRIMARY KEY?

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

    С точки зрения реляционной теории и нормальных форм в частности.

    С точки зрения SQL - не обязателен. Таблица может не объявлять первичный либо даже какой-то уникальный ключ. Дальше - детали реализации.

    В PostgreSQL никакой даже суррогатный первичный ключ в этом случае создаваться не будет. Адресация строк в PostgreSQL выполняется по TID (tuple ID) - физическому адресу строки в датафайле (и потому TID уникален в таблице), в том числе при поиске по первичному ключу. Но TID - не индекс, никак не связан с хранимыми данными и не накладывает каких-либо ограничений на данные.
    Ответ написан
    3 комментария
  • Как импортировать базу данных Postresql в пустую базу данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Peer authentication failed for user "MyUser"

    То есть первым подходящим правилом pg_hba.conf была peer проверка, требующая чтобы имя пользователя ОС совпадало с запрошенным именем пользователя базы. Что судя по ошибке не выполнено.

    Что делать? Править hba или скорей всего у вас и так настроен вход по паролю при подключении по tcp/ip. То есть psql -h 127.0.0.1 ... вероятнее всего пароль спросит.
    Ответ написан
    Комментировать
  • Как перенести одну базу данных postgres в другой кластер?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    pg_dump + pg_restore - это как раз самый быстрый, если под "быстрый" подразумевать общие затраты времени на задачу и минимальные проблемы, а не минимальное окно потерянной записи.

    В остальных случаях для переноса базы вам нужна какая-то логическая репликация. Триггерная или что-то на основе logical decoding (например логическая репликация в pg10+). Грабли с любыми изменениями схемы данных в комплекте

    Граничный случай: если одну или несколько баз необходимо выселить в новый кластер. Тогда делаете потоковую реплику, когда догонит рестартуете в мастер и удаляете с неё ненужные базы.
    Ответ написан
    Комментировать
  • Что использовать, size_t или int в цикле for?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Выбирайте тот тип данных, который вам действительно нужен.
    Если у вас в цикле пара миллионов итераций максимум - то зачем вам 64-битное целое?
    Если же вам действительно мало 32-битного числа - то вы не можете использовать ни int ни size_t для этих целей, вы должны использовать именно 64-битное целое независимое от платформы.
    А если у вас пара десятков итераций в прыжке - то вам и int слишком большой, возьмите что-нибудь поменьше.

    Разным задачам нужны разные типы данных.
    Ответ написан
    8 комментариев
  • Бывают ли у таблиц свойства?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Динамические (вычисляемые) колонки в mysql есть начиная с 5.7 ветки: https://dev.mysql.com/doc/refman/5.7/en/create-tab...

    Бывают virtual - вычисляются при обращении, бывают stored - вычисляются перед записью и хранятся на диске.
    Ответ написан
    Комментировать
  • Как правильно искать поля типа NULL через LIKE?

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

    С вариантами типа функция(поле) like 'pattern' - аккуратнее. Для большинства субд это обозначает сознательный отказ от использования индексов по этому полю. Для like '%pattern%' впрочем это и так справедливо для любых btree, не префиксовый поиск вести по btree штука закономерно не эффективная.

    PS: и ой большое опасение у меня по этому фрагменту что у вас sql инъекции открыты во всю свою ширину.
    Ответ написан
    5 комментариев
  • Как перенести данные из одной БД в другую БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    возможно банальный
    insert into db2.table (...) select .... from db1.table

    Непонятно, нужны ли какие-то преобразования, а для простого копирования нужны только права на обе базы и простые запросы.
    Ответ написан
  • Debian 9 как обновить?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    apt-get upgrade - это относительно вежливое обновление, в частности (man apt-get)
    New versions of
    currently installed packages that cannot be upgraded without
    changing the install status of another package will be left at
    their current version.


    Более агрессивный вариант - это apt-get dist-upgrade
    Ответ написан
    Комментировать
  • Как безопасно применить Vacuum на террабайтую БД Postgress?

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

    vacuum full - история очень сильно отдельная, т.к. это ни разу не vacuum.
    Места под vacuum full надо под копию таблицы с индексами и на запись этой копии в WAL. То есть теоретически до двукратного объёма.
    Поскольку для рабочей базы возможность уйти на сколько-то часов штука неинтересная - vacuum full по большим таблицам не делают.
    Есть pg_repack делающий с помощью триггера и чёрной магии копию таблицы (место всё так же нужно свободное), после накатывает изменения в основной таблице и заменяет основную на свежую копию. В целом - то что делает vacuum full, но без тяжёлой блокировки таблицы.
    Есть pgcompacttable, идущий другим путём. postgresql пытается новые строки размещать в начале таблицы, поэтому фиктивные обновления строк в конце таблицы скорей всего переместятся в начало, а пустые страницы в конце может срезать обычный vacuum. Плюс перестроить индексы (правда не все). Обновление inplace, запас места под копию не требуется. Полную блокировку таблицы конечно тоже не берём.
    Ответ написан
    Комментировать
  • Как сохранить ассоциативный массив в redis?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ассоциативный массив это hash, соответственно группа команд для этого типа данных: https://redis.io/commands/hgetall

    (глядя на теги) Для например phpredis реализованы
    Ответ написан