• Как очистить таблицу?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если truncate выполняется дольше секунды - значит truncate не выполняется вовсе, а ждёт блокировку.

    Посмотрите в pg_stat_activity where state != 'idle' на предмет долгих транзакций.
    Или сразу запросом по pg_locks, например, вот таким: https://github.com/dataegret/pg-utils/blob/master/...

    Нормальный мониторинг - вопрос отдельный, сложный и печальный.
    Ответ написан
  • Как разделить два диска в RAID1 на два независимых?

    Melkij
    @Melkij
    PostgreSQL DBA
    linux raid (mdadm) использует начальную часть раздела под хранение метаданных данных массива. Поэтому файловая система непосредственно начинается немного позже. Обычно через 2048 секторов, можно посмотреть в mdadm -E /dev/том_массива, графа Data Offset.

    Соответственно если вы больше не хотите использовать linux raid - то вам необходимо монтировать файловую систему со смещением (-o offset=...) либо передвинуть границу раздела в разметке диска (удалить раздел и создать такой же, но стартовый сектор указать на нужное число секторов позже).
    Ответ написан
    Комментировать
  • Как подписать модули ядра при сборке гостовским алгоритмом?

    Melkij
    @Melkij
    PostgreSQL DBA
    https://www.kernel.org/doc/html/v5.0/admin-guide/m...
    The facility currently only supports the RSA public key encryption standard (though it is pluggable and permits others to be used). The possible hash algorithms that can be used are SHA-1, SHA-224, SHA-256, SHA-384, and SHA-512 (the algorithm is selected by data in the signature).


    Напишите патч и уговорите сообщество его принять либо накладывайте самостоятельно на свою сборку.
    Ответ написан
    Комментировать
  • Как создать таблицу из другой с использованием другого sequence для id столбца?

    Melkij
    @Melkij
    PostgreSQL DBA
    melkij=> create table identity_test (i int primary key generated by default as identity, val int);
    CREATE TABLE
    melkij=> insert into identity_test (val) values (1);
    INSERT 0 1
    melkij=> table identity_test;
     i | val 
    ---+-----
     1 |   1
    (1 строка)
    
    melkij=> create table identity_test_like (like identity_test INCLUDING COMMENTS INCLUDING CONSTRAINTS INCLUDING DEFAULTS INCLUDING INDEXES);
    CREATE TABLE
    melkij=> \d identity_test_like
                        Таблица "public.identity_test_like"
     Столбец |   Тип   | Правило сортировки | Допустимость NULL | По умолчанию 
    ---------+---------+--------------------+-------------------+--------------
     i       | integer |                    | not null          | 
     val     | integer |                    |                   | 
    Индексы:
        "identity_test_like_pkey" PRIMARY KEY, btree (i)
    
    melkij=> \d identity_test
                                    Таблица "public.identity_test"
     Столбец |   Тип   | Правило сортировки | Допустимость NULL |           По умолчанию           
    ---------+---------+--------------------+-------------------+----------------------------------
     i       | integer |                    | not null          | generated by default as identity
     val     | integer |                    |                   | 
    Индексы:
        "identity_test_pkey" PRIMARY KEY, btree (i)


    include identity нет - identity не скопирован. Всё выглядит корректно.

    Если же вы не про identity, а про синтаксический сахар serial - то его nextval был скопирован потому вы сами это попросили через INCLUDING DEFAULTS.
    Типа данных serial нет. Это синтаксический сахар вокруг поля int, создания sequence и указания nextval в default.
    Ответ написан
    Комментировать
  • Почему пухнет WAL каталог?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если реплика приостанавливает репликацию (видно по waiting в списке процессов для startup процесса) - значит ей мешают запущенные на ней транзакции. Проверьте свой max_standby_streaming_delay.

    В целом почему база может не удалять WAL сверх необходимых:
    - создан слот репликации но его не читают
    - archive_command выполняется с ошибкой
    Ответ написан
  • Ошибка при вызове метода getImportedKeys?

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

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

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

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

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    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
    PostgreSQL DBA
    мне сно , при апдейте кортежа в 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
    PostgreSQL DBA
    Смотрите в код и думайте, что ваш код выполняет на самом деле. Смотрите отладчиком содержимое переменных либо банально распечатайте их.

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Пароли скорей всего сохранены как 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
    PostgreSQL DBA
    отключение света или kill процесса,

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Никак.
    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
    PostgreSQL DBA
    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
    PostgreSQL DBA
    Мне это в последующем надо применить в условии
    if ($interval > 7){...

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

    ?
    Для datetime сделаны операторы сравнения родные.
    Ответ написан
    Комментировать