Задать вопрос
  • Как вывести значения со всеми id из таблицы PostgeSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы удалили предыдущий вопрос и у меня нет желания набирать ответ повторно. Поэтому буду краток.
    На одну ошибку указал Rsa97 , вторая ошибка:
    SELECT id FROM Users;
    SELECT id FROM "Users";

    Это обращения к разным таблицам.

    Разберитесь, где вы потеряли сами сообщения об ошибках pg.
    Ответ написан
  • Позволяет ли PostgreSQL использовать ddl и dml в одной транзакции?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Да, позволяет.
    В некоторых случаях пробивает изоляцию транзакций, например, truncate виден из конкурентных транзакций сразу, но при rollback его эффект откатится штатно.
    Ответ написан
    Комментировать
  • Почему выскакивает ошибка Function name must be a string ???

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    $_SERVER('REMOTE_ADDR')

    Вы пытаетесь вызвать функцию. А $_SERVER - это не функция и не что-то приводимое к callable
    Ответ написан
    Комментировать
  • В чем проблема в этом триггере?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы в after insert триггере на табличке со странным названием lechenie выполняете безусловный insert в эту же самую таблицу. Вопрос к вам: почему вы в результате ожидаете что-то кроме бесконечной рекурсии?
    Ответ написан
    6 комментариев
  • Как создать глобальный класс внутри namespace?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Следовать PSR и вынести объявление класса в отдельный файл по ожидаемому пути PSR-4 (или PSR-0).
    Ответ написан
    Комментировать
  • Как переписать данную строку при портировании с MySQL на PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В postgresql все текстовые типы следуют кодировке базы. case insensitive utf8 в pg не предусмотрено.
    Поэтому если у вас база в utf8 - то "STEM" varchar(50) not null
    Если база не в utf8 - не надо так делать.
    Ответ написан
    Комментировать
  • Как смонтировать .raw диск от виртуалки?

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

    mount -o loop,offset=$((512*start_сектор_нужного_раздела)) file mountpoint
    или losetup с параметром модуля ядра loop.max_part в какое-нибудь адекватное значение - тогда будут loop устройства с разделами как обычное блочное устройство.

    Задача максимум: и прочитать файлы и засунуть виртуалку в Proxmox, в качестве хранилища использующий LVM на CephFS.

    Сделать LV по меньшей мере такого же размера, скопировать весь файл поблочно через dd
    Ответ написан
    1 комментарий
  • Возможно ли подменить значение $_SERVER['REMOTE_ADDR'] на локальном php-сервере?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Повесить дополнительный IP на интерфейс, перевесить веб-сервер туда и обратиться к этому адресу.
    Или банально воткнуть $_SERVER['REMOTE_ADDR'] = 'any another ip'; где-нибудь до проверки. $_SERVER не защищён от записи. Только не забыть удалить перед коммитом.
    Ответ написан
    Комментировать
  • Mdadm удалит данные при создании raid 1 если на одном из разделов информация?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Да, будут потеряны.

    Во время переезда на массив часто массив инициализируют деградировавщим:
    mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/hdc1
    Затем копируют на него данные и потом добавляют недостающий диск.
    Ответ написан
  • Преобразование данных из бд в json в python?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select json_agg(tablename) from tablename;
    Всё. Получите json массив.
    Ответ написан
    1 комментарий
  • Тонкости работы БД MySQL при одновременной записи и считывании данных из одной таблицы?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Недостаточно данных. Разные storage engine будут вести себя разным образом. Для транзакционных storage будут иметь значение уровень изоляции транзакции и собственно как именно реализована транзакционная обработка в обоих приложениях.

    innodb, read commited, транзакционная работа писателя: читатель увидит версию данных как будто писатель ничего ещё не делал.
    innodb, read commited, нетранзакционная работа писателя/autocommit - читатель увидит какой-то промежуточный результат, что-то обновлено, что-то ещё нет.
    myisam - подождёт завершение пишущего запроса (только мешающего запроса! Следующий пишущий запрос постоит подождёт завершение читающего запроса), прочитает текущее состояние
    Ответ написан
    6 комментариев
  • Как устроены базы данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    4+32*2+32*2 = 132

    Мне даже интересно, с чего вы придумали умножить именно на 2. Я честно не знаю распространённых кодировок фиксированной двухбайтной ширины. Обычно речь или про ворох однобайтовых или кодировки переменной длины.

    Поиск по смещению в датафайле - да, применяется. Но не имеет в общем случае ровно ничего общего со структурой таблицы уровня SQL.

    Например, краткий взгляд на internals postgresql: momjian.us/main/writings/pgsql/internalpics.pdf
    Ответ написан
  • Почему возникает ошибка, когда передаешь кортеж из 1 элемента в sql запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Потому что синтаксически там запятой быть не может.
    Если запятую ставите вы - сделайте так, чтобы её там не было.
    Если запятую ставит ваше ORM или прочий библиотечный код - значит или вы неверное используете библиотеку или это баг этой библиотеки.
    Ответ написан
    Комментировать
  • Как создать программный RAID-1 массив на Ubuntu из размечённого/используемого и неразмеченного жёсткого диска?

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

    Суть для вашего случая: разметить sdb, инициализировать как degraded массив:
    mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1
    mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb5
    Перенести всё полезное с sda на sdb, поправить загрузчик, перезагрузиться с рейда, добавить разделы sda в соответствующие массивы.
    Инициализировать массив напрямую на устройство, а не разделы, возможно, но с этого устройства нельзя будет загружаться.

    Разные фокусы с переносом всего полезного. Системный раздел может быть проще через dd скопировать (но раздел на sdb должен быть чуть больше, там ещё mdadm суперблок в 2048 секторов)
    /home - начальную копию в 2-3 прохода rsync'ом, затем перемонтировать в ro и ещё один rsync.
    Ответ написан
    Комментировать
  • Как установить MySQL 5.0.15?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Взять исходники из музея и попробовать собрать. Не уверен что получится без проблем на современных версиях библиотек, но попробуйте.
    Ответ написан
    Комментировать
  • Как отслеживать изменения в СУБД при конкурентной записи?

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

    Или напишите или возьмите какой-нибудь готовый logical decoding. Сможете читать вообще поток репликации

    В общем случае в общем-то нужна всё равно очередь. Из транзакции в таблички очереди пишете метки какие данные изменились, читатель читает эту метки и получает все изменения независимо от времени коммита.
    Ответ написан
    Комментировать
  • Как сделать ограничение доступа к базе данных в Mysql?

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

    Вы таки удивитесь.
    Дефолтно база доступна всем пользователям. И даже есть права на создание объектов. Удалить таблицу сможет суперпользователь или владелец этой таблицы. А вот создать - кто угодно.

    Поэтому в postgresql после создания базы необходимо отзывать дефолтные права:
    create database newdb;
    \c newdb
    GRANT CONNECT ON DATABASE newdb TO newdb_user ;
    REVOKE ALL ON DATABASE newdb FROM public;
    REVOKE ALL ON SCHEMA public FROM public;
    GRANT USAGE ON SCHEMA public TO newdb_user;

    Если при create database указать owner - то выдавать ему права на схему public будет избыточно, но делать revoke таки необходимо.

    Сходная ситуация с mysql.
    Ответ написан
  • Как работает вирус monero распространяемый через postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Всё очевидно:
    суперпользователь базы - лицо доверенное и база доверяет этому пользователю. И суперпользователь множеством хитрых и не очень способов способен сделать с сервером на котором запущена база всё на что хватит прав у пользователя, от которого запущен postgres.
    Например, запустить любую произвольную команду даже простой и очевидной командой copy, не говоря уже о каких-то извращениях.

    Конкретная атака по-видимому уже разобрана и описана вот тут: https://habrahabr.ru/post/351452/

    Никогда не используйте trust, уж тем более в мир. В нормальном состоянии база вообще не должна быть открыта в мир.
    Ответ написан
    3 комментария
  • Почему var_export "обрамляет" null-байт пустыми строками?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы предполагаете слишком умную логику для глупой функции.
    https://github.com/php/php-src/blob/PHP-7.2/ext/st...
    var_export пытается вывести строку в одинарных кавычках, чтобы в ней не осуществлялись подстановки спецсимволов и другого счастья. Но null-байт поэтому же в одинарных кавычках вывести нельзя. Поэтому все \0 заменяются на ' . \"\\0\" . '
    В предельном случае получаются как раз одинарные кавычки по краям результирующей строки и ' . \"\\0\" . ' в качестве основных данных. А проверять предварительно, что у нас всего-то и есть \0 в строке -- слишком частный случай.
    Ответ написан
    1 комментарий
  • Как выбрать следующие 100 строк из большой таблицы?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    2. Нужно ли включать order by в таких огромных таблицах?

    Не зависит от размера базы.
    Или у вас есть order by и поведение ожидаемое или у вас нет order by и СУБД имеет полное право на каждый запрос выдавать любые подходящие под фильтр данные в любом порядке.
    Запрос выдающий неправильные данные обычно никому не нужен, даже если он и быстрый.

    offset для пагинации вообще вещь неуклюжая. https://use-the-index-luke.com/no-offset
    Быстрая пагинация - это передача уникального идентификатора, последнего на просматриваемой странице. Т.е. запрос на выборку следующих 100 записей начиная после такого-то id.
    Бонусом консистентное поведение, если, например, что-то из строк предыдущей страницы удалили. Оффсет тупо потеряет строку из выборки и пользователь может не найти то что искал.

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

    Вы изобрели то что делает джойн. База в общем случае его сделает лучше.
    Будет ли огромная временная таблица - смотрите план.
    Ответ написан
    Комментировать