Задать вопрос
  • Как смонтировать .raw диск от виртуалки?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего 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 для вашего PostgreSQL?
    2. Нужно ли включать order by в таких огромных таблицах?

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

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

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

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

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

    Во-первых неясно пароль какого пользователя запрашивается?

    Того, к которому вы сказали подключиться psql. Поскольку вы не указали соответствующий ключ -U и, скорей всего, не определили переменную окружения - то psql пытается использовать имя пользователя аналогичное имени пользователю открытой консоли.

    Ошибка прямым текстом говорил, что была использована парольная аутентификация, в результате пользователя с таким паролем в базе не оказалось. Разберитесь как авторизоваться в базе в вашей системе, к дампам отношения не имеет никакого.
    Ответ написан
    4 комментария
  • Сколько жетских дисков потребуется?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Хранилище чего именно? Я без проблем могу себе представить нагруженную СУБД на 10Тб (и немного за 20Тб сырой ёмкости накопителей), которая не взлетит на HDD вообще как раз из-за требований к времени доступа и все эти 20Тб набраны серверными SSD.
    И могу себе ещё более легко представить хранилище на 10тб под бекапы, где производительность должна быть просто достаточной за разумное время положить новый бекап или прочитать нужный при аварии, для чего достаточно raid5 или 6, а может дешевле окажется и вовсе пара 10тб дисков, надо с прайсом уже смотреть.

    Сначала задачи, ограничения применения, пределы дальнейшего расширения, бюджет на всю хранилку - и только потом сколько надо будет заказать дисков.
    Для хранения 10тб информации необходим хотя бы один накопитель (задача может сказать, что диск резервировать не нужно, такое тоже бывает). Всё остальное выбирается под конкретику.
    Ответ написан
    4 комментария
  • PHP PDO Как добиться синхронной работы COMMIT?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Для приложения commit синхронен. Если вы вышли из commit() - значит транзакция уже зафиксирована.

    Проверяйте код приложения #2. Может быть вы уже в транзакции и потому не видите изменения. Может быть вы подключаетесь к асинхронной реплике
    Ответ написан
    5 комментариев
  • Как сделать синоним для таблиц в другой БД?

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

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

    Неверно полностью.

    Кратко алгоритм:
    - коммутатор получает пакет на порту
    - заносит mac отправителя в таблицу адресов, ассоциируя таким образом mac и физический порт, к которому подключено устройство
    - проверяет, есть ли mac получателя пакета в таблице
    - если есть - отправляет пакет только в этот порт
    - если нет - отправляет на все порты кроме того, откуда пакет пришёл

    Из таблицы вычищаются адреса, от которых не было пакетов в течении определённого времени (в настройках коммутатора если такие такая, типично 5 минут)
    Ответ написан
    5 комментариев
  • Какую утилиту лучше использовать для реорганизации таблиц PostgreSQL (например: pg_repack vs pgcompactor vs подстройка автовакума)?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    pg_repack - это community extension, форк более раннего pg_reorg. И не отрицая вклад участников pgpro в разработку postgresql в целом - я не вижу их среди контрибьютеров pg_repack.

    Мы активно используем обе. Основные моменты касательно pg_repack vs pgcompacttable в общем-то именно я и изложил в README компактора. Если говорить на русском:
    - pg_repack делает копию таблицы, т.е. требуется двукратный запас диска. Компактор работает в рамках одной таблицы и требует место только под копию наиболее толстого индекса и то, толстые индексы обрабатываются самыми последними. Т.е. расчёт на работу когда места уже мало.
    - компактор намеренно выполняется медленно чтобы не задевать работающий проект
    - компактор не может обрабатывать toast таблицы. Репак - может.
    - pg_repack характеризуется очень заметными пиками io и wal. Вся таблица едет одной транзакцией и это никак не регулируется. Поэтому может аффектить прод на неважных дисках и в том числе оторвать реплики при недостатке сетевой полосы.
    - pg_repack умеет перемещать между tablespace и может делать команду cluster

    (или лучше подстроить автовакум)?

    Конечно необходимо настроить автовакуум и не мешать ему работать - т.е. исключить долгие транзакции. Но всё равно бывают хитрые моменты, когда репак или компактор бывают нужны.
    Ответ написан
    2 комментария