Задать вопрос
  • Ошибка при вызове метода getImportedKeys?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Проверяйте версии используемого ПО. Ваша библиотека предоставляющая вызов getImportedKeys очевидно не умеет используемую у вас версию PostgreSQL.
    Последний релиз postgresql где было поле tgconstrname системного каталога - далёкий 8.4
    Ответ написан
  • Почему не работает mysqli_stmt_send_long_data?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    https://bugs.mysql.com/bug.php?id=83958
    Not a bug, так и задумано.

    Что делать? Вообще не пытаться пихать бинарники картинок в базу, что им там делать.
    Ответ написан
  • Как получить содержимое любой другой строки из таблицы (fetch_row)?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Может быть документацию почитать? С чего вы решили, что fetch_row когда-либо вернёт двумерный массив, да и вообще будет возвращать больше одной строки результата за раз? Прямым текстом сказано:
    Fetches one row of data from the result set and returns it as an enumerated array

    И дальше в примерах показано как остальные строки прочитать.
    Ответ написан
    Комментировать
  • Почему for загоняет все значения ассоциативного массива в один ключ?

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

    Если вы думаете, что '$l' - это обращение к переменной - то вы заблуждаетесь.
    Ответ написан
    1 комментарий
  • Как освободить место после удаления базы postgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    pg_upgrade --link ?
    Бесполезный datadir от 9.5 удалили? pg_upgrade создал скрипт delete_old_cluster после обновления для этого.
    Ответ написан
    Комментировать
  • Какова правильная практика использования уникального идентификатора(Postgres SERIAL)?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как Вы поняли в поле "а" вписывается ответ "no" или "yes" .

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

    В моем бизнесе вопросы собраны в Репорт (Репорты разные. В зависимости от Репорта имеют от 10 до 70 вопросов). Таким образом ответы заходящие в таблицу user нужно разделять по Репортам.

    Хотелось бы знать, как из первого вытекает второе.

    Если у вас есть некие "репорты", состоящие из некоторого числа вопросов, а на вопросы отвечают пользователи то совершенно очевидно у вас есть:
    таблица пользователей
    таблица репортов
    таблица вопросов с полем-ссылкой на репорт
    таблица ответов из 3 полей: id пользователя, id вопроса, значение ответа. Primary key на первые два поля.
    Ответ написан
    Комментировать
  • Nl2br заменяя \n приписывает после замены через себя еще \n?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    nl2br вставляет тег br перед символом переноса строки.
    https://github.com/php/php-src/blob/PHP-7.2/ext/st...
    in brief this inserts
    or
    before matched regexp \n\r?|\r\n?


    То есть строго отвечая на заданный вопрос - нет, не дописывает. Но функция не заменяет имеющиеся в тексте символы перевода строки, а вставляет тег перед ними - потому символ перевода строки в тексте после тега будет.
    Ответ написан
    Комментировать
  • Что происходит с памятью после удалении записи с типом varchar в postgresql?

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

    Ммм. Сомневаюсь что действительно что-то ясно.

    Для начала:
    на диске данные существуют ровно в том же виде, что и затем обрабатываются в памяти. Как побочного следствие именно этого, кстати, базы postgresql физически не переносимы на другие процессорные архитектуры, только dump/restore или ещё какую логическую репликацию. А ещё есть забавный фокус выравнивания структур данных в памяти. Из-за чего при разном порядке столбцов в таблице идентичный объём записанных данных может различаться по требуемому месту на дисках.

    postgresql - mvcc база. При удалении строки запись не удаляется. Вообще. Только проставляется xmax и страничка отмечается грязной. Операции обновления строки не существует вовсе. Update - это всегда delete + insert. Обновлённая запись при этом попадает в отличающееся место таблицы, так, что в таблице одновременно существую и старая и новая версии строки. И их может быть много.
    (enterprisedb грозятся доделать zheap в pg13, так что может будет веселее, но в версиях до 11 гарантированно как я описал, в 12 - только если вы смелый человек и будете собирать экспериментальные расширения)
    Итак, далее приходит autovacuum или vacuum, строки которые уже никому не могут быть видны вычищаются и считаются пустым пространством, в том числе по free space map.

    Пишущие операции пытаются найти место под запись:
    - в той же самой странице данных
    - в какой-то странице начиная от начала таблицы
    - в худшем случае создают новую страницу

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

    занимаемой процессом памяти на жестком диске

    Что это такое?
    Если интересен формат датафайлов - то вам дорога в исходники базы. Для ОС выделяются блоки на диске по 8кб и в них хранится какая-то бинарная штука.

    Касательно private памяти backend'а - в postgresql есть менеджер памяти, называемый memory context. backend память запрашивает у ОС блоками, что-то делает что ему надо используя эту память под всякую мелочь или не очень мелочь, затем memory context обнуляется или удаляется и память возвращается ОС. Большинство контекстов существуют не долго, на транзакцию или на запрос, например.
    Отладчик широко распространён - gdb. Без dbg сборки, впрочем, там явно будет ничего не понятно.
    Ответ написан
    Комментировать
  • Как заменить разные слова на ссылки с помощью preg_replace?

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

    1) Вы сначала делаете match (не знаю зачем, ну да ладно, не о том вопрос).
    2) Затем обходите результаты.
    3) Затем игнорируете то что вы нашли и по всё той же регулярке что в пункте 1 заменяете всё в строке на певрое совпадение.

    Результат совершенно логичен. Исправьте логику, чтобы заменять в теле цикла только одно соответствующее совпадение.

    Через preg_replace это делать банально проще и удобнее, чем match + цикл по нему. А есть ещё preg_replace_callback если просто replace не хватает.
    Ответ написан
    1 комментарий
  • Существует ли какая нибудь возможность узнать пароль пользователя в Postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Пароли скорей всего сохранены как md5. Метод scram-sha-256 появился только в 10 и включая 12 релиз ещё не используется по-умолчанию (проблем с базой нет, сообщество даёт время на реализацию этого протокола в клиентских библиотеках, чтобы не как с mysql 8.0 получилось).

    Хэши паролей md5 можно найти в pg_authid таблице системного каталога, считаются как
    select rolpassword = ('md5' || md5('some password' || rolname)) from pg_authid where rolname = 'username';

    То есть восстановить исходный пароль невозможно. Можно попробовать подобрать коллизию для хэша.
    Ответ написан
    Комментировать
  • Можно ли гарантированно записать информацию в две базы данных?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    отключение света или kill процесса,

    Отдельно обращаю пристальное внимание на настройки редиса. Он не запишет данные с настройкой fsync по-умолчанию. Дефолтный fsync для AOF режима лога записи у него - раз в секунду. То есть все данные до секунды работы длительности вы можете потерять при крахе ОС.

    Redis не поддерживает протокол двухфазного коммита. И вы не можете сделать durable fsync в два места атомарно.
    Поэтому просто это никак не сделать.
    Что сделать можно - переделать логику, чтобы одна из баз могла при аварии привести данные в консистентный вид используя данные ведущей базы.
    Ответ написан
    Комментировать
  • Как создать индекс в postgresql для view?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Никак.
    view не хранит никаких данных, а раз нет данных - то не по чему строить индекс.
    Пример принципиальной проблемы индекса на view: если сделать view вида select foo, avg(bar) from tablename group by foo; - как пересчитывать данные при изменении строк в tablename?

    Индекс может быть создан на материализованном представлении (materialized view) - потому что такое представление данные хранит непосредственно. Но обновлять эти данные требуется вручную запросом REFRESH MATERIALIZED VIEW, который выполнит запрос, запишет его результат в новый heap, затем заменит старый heap новым (если не указан concurrently) либо обновит несовпадающие строки (для concurrently)
    Ответ написан
    4 комментария
  • Как лучше написать SELECT для переводов товара?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select ...
    from product as p
    join lateral (
    select title, description from product_translate as pt
    where pt.product_id = p.id order by language_id = ? limit 1
    ) on true
    where ....


    Как обычно мог напутать направление сортировки - допишите desc если перевод есть, но выбирается не он.

    Идея выбирать любой другой язык в случае отсутствия нужного - странная. Но запрос я написал именно такой.
    Если переводов нет вообще - сейчас такой товар не будет выводиться. Если нужен с NULL вместо текста - заменить джойн на left join.
    Ответ написан
    Комментировать
  • Почему datediff так работает или как сделать if > 7 дней?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Мне это в последующем надо применить в условии
    if ($interval > 7){...

    $datetime1 = date_create('2019-05-16');
    if ($datetime1 < new datetime('-7 day'))

    ?
    Для datetime сделаны операторы сравнения родные.
    Ответ написан
    Комментировать
  • Как быстрее записать в базу PosgresQl?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Быстрее всего - COPY запросом.
    При том, сразу из csv файла, локального к СУБД.

    Через приложение - сильно лучше тоже COPY. В PDO интерфейс для COPY, впрочем, ужасен.
    Хуже - относительно большими insert
    ещё хуже - кучей запросов в транзакции
    кучей запросов вне общей общей транзакции - очевидно будет очень медленно.
    Ответ написан
    Комментировать
  • Как решить ошибку SQLSTATE[57014]: Query canceled: 7 ERROR: canceling statement due to statement timeout"?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ищите где выставлен statement_timeout. Такая ошибка именно по срабатывании этой настройки. И включать её надо намеренно. Так что ищите где ставится, от конфига СУБД, настроек базы и пользователя до руками сделанного set в приложении.
    Ответ написан
    Комментировать
  • Почему так мало соединений с базой данных на 1ГБ оперативной памяти?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Вот честно могу ответить - ни малейших представлений как можно абстрактно сказать, сколько памяти займёт client backend процесс базы.
    Это будет меняться от:
    - очевидно версии базы, плюс от компилятора и настроек сборки
    - session_preload_libraries, work_mem (к слову о work_mem - вы знаете, что один запрос может использовать несколько work_mem?), temp_buffers. Да ещё maintenance_work_mem для некоторых операций
    - величины системного каталога - как pinned таблиц, так и затем кэшированных при обращениях
    - выполняемых ранее запросов. Тот же кэш хранимых процедур у каждого backend свой

    Один backend вполне и десятки гб памяти может использовать и такие настройки может иметь смысл делать для, например, построения индекса.

    Помимо собственной private памяти на каждое активное соединение всё множество max_connections резервирует себе некоторое место в сегменте разделяемой памяти, независимо от того, сколько соединений вы затем используете.

    Чтобы админить калькуляторы и чайники обычно DBA не нанимают. Тем более если на том же самом калькуляторе помимо базы ещё и приложение отъедает непредсказуемо сколько памяти. Чего там от этого 1гб останется? Видимо даже shared_buffers с 128мб поднимать некуда, а то может и уменьшать придётся. Так что по опыту сложно что-то сказать о такой конфигурации.

    Скорей всего не трогайте max_connections. Оставьте дефолтные 100.

    Правильно ли я понимаю, что пул соединений не помогает в плане экономии оперативной памяти

    Смотря какой пул и как работает приложение.
    pgbouncer в pool_mode = transaction вполне может свести пару сотен подключений к баунсеру на десяток коннектов в базе. Ну а 10 процессов базы будут использовать наверняка поменьше памяти чем 200.
    Для pool_mode = session - да, только сгладить стоимость fork годится.
    Ответ написан
    1 комментарий
  • Как получить даты, которые соответствуют названиям дней недели в Postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select day /*, ... */ 
    from tablename 
    join lateral generate_series(start_date, end_date, interval '1day') as day on true 
    where to_char(day, 'Day') = week_day


    если в лоб и у вашего week_day (который с весьма не ясной причиной хранится в varchar) написание совпадает с to_char.
    Ответ написан
    1 комментарий
  • Что это значит: $obj->{$b='dd'}?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Это странный способ написать:
    $b = 'dd';
    $obj->dd;
    Ответ написан
    7 комментариев