Ответы пользователя по тегу MySQL
  • База данных MySql, как сделать переменную, с индивидуальным значением для всех аккаунтов?

    @rPman
    Если по каким то причинам таблицу для данных создавать не желаете
    то можно использовать вьюху или хранимую процедуру, в которой прописываете буквально все значения от пользователя (или любых других условий)
    SELECT CASE
      WHEN USER() =='one@localhost' THEN 1
    ...
      ELSE 0
    END

    т.е. местом хранения тут будет код хранимой процедуры или вьюхи а для ее обновления потребуется вызов ddl
    Ответ написан
    Комментировать
  • Как можно увеличить скорость записи в бд mysql?

    @rPman
    Что значит стопорится? зачем гадать, расставь по больше вывода в свои логи отладочной информации (когда принял запрос, обработал, отправил транзакцию, когда получил ответ от базы и т.п.) с таймингами и смотри что и где происходит в проблемный момент

    Что за пиз...ц с сериализацией картинок в base64 потом это все в json, а в базе хранить php-щным serialize?

    http post прекрасно справляется с отправкой файлов, там своя сериализация, никто не мешает миксить в запросе get и post данные

    Не храните картинки в базе данных, никак, ни блобом ни сериализацией, кто придумал этот маразм, в каком бредовом туториале это прочитали и каждый второй это реализует?

    Файлы храни в файлах на диске, а в базу записывай путь или имя файла (либо сам файл по идентификатору называй), раз в сто лет на обслуживании базы сравнивай наличие файлов на диске и записей в базе и удаляй висяки (образуются если во время обработки произошла ошибка, например скрипт умер, файл записали а транзакция в базе откатилась)

    p.s. в php во всех репозитариях есть красивый сериализатор igbinary, если что он в каком то смысле даже быстрее старого serialize и точно компактнее, его потихоньку в стандарт пропихивают, например можно использовать его для хранения сессий
    Ответ написан
    1 комментарий
  • Порекомендуйте подходящую базу данных?

    @rPman
    которые при генерации отчета как либо аггрегируются.
    это чуть ли не наисложнейшая задача для баз данных, 80м записей тем более

    Партицируйте прямо по суткам.

    Убирайте транзакции, нафиг вам тут innodb когда хватит myisam, оно на запись быстрее, у вас база write once read ... тоже once.

    У вас там база данных упирается случайно не в работу с диском? в облаке можно взять несколько дисков, они будут независимыми, раскидай по ним таблицы (myisam штатно поддерживает симлинки), что может дать прирост в скорости в разы только за счет этого, даже если они ssd, например отделить хранение индексов от данных или отделить старые данные от сегодняшних.

    На время обработки аналитики можно потюнить файловую систему и отключить flush для файлов таблиц (например ext4 data writeback и можно отключить журнал) - сильно ускоряет именно запись, особенно если много ram, это включает большой риск потери/порчи данных при сбросе ос но с другой стороны вероятность этого очень мала и как я понимаю, данные в базу и так пишутся из какого то другого хранилища, т.е. при проблеме с сервером просто перезапускается обработка за текущие сутки.

    Уберите индексы на запись, все, сначала пусть идет вставка данных без их индексации, затем создаете индекс (это на порядок быстрее) и уже потом строите аналитику.

    Общая аналитика должна не работать с самими данными, а с их посуточной выжимкой (возможно в результате и хранить их не придется) считай это самодельные индексы. Грубо говоря если в запросе на аналитику стоит count,max,min,.. то достаточно сложить посуточные значения и для глобальных считать уже по ним... само собой если запросы с условиями и сложными группировками, то надо думать но все решаемо.. грубый пример нужно считать агрегацию по часам, вот в индексы и пиши суточные значения по часам, а если надо постранично то для каждой страницы для каждых суток считаешь, потом агрегируешь уже по этим результатам.
    Ответ написан
    6 комментариев
  • Как обновить данные в одной таблице, после обновления данных в другой?

    @rPman
    на некоторые связные изменения в sql базах данных есть встроенный функционал, например foreign key index - это та самая связь между двумя таблицами по значению в поле или нескольких

    при создании индекса можно указать, что делать со связанными записями в таблице, например каскадно удалять при удалении записи или прописать null
    смотреть on delete и on update statements

    любые более сложные условия делают с помощью тригеров
    Ответ написан
    4 комментария
  • Почему начала тормозить mariadb?

    @rPman
    по USB 2.0 внешний жесткий диск
    странный сетап
    но
    скорость чтения 304.13 K/s скорость записи не больше 604.13 K/s...
    говорит что usb у тебя работает на 1мбит скорости, что очень похоже на usb1 версию

    чтобы удостовериться, отключи базу данных (убери нагрузку) и проверь диск на линейное чтение любым способом, например прочитав то 2-гигабайтовый файл в null
    dd if=/path/to/file of=/dev/null bs=1024k status=progress


    причина деградации скорости usb2 до 1 версии банальна, на том же контроллере (соседний вывод usb или к примеру тот же usb хаб) висит мышка/клавиатура или любое другое устройство usb1 версии. Такова особенность работы usb хабов, понижают скорость до минимально поддерживаемого (даже если у тебя будет usb3)

    Решение - подключить мышь/клаватуру или диск на другой контроллер (просто экспериментально перебери порты)
    Ответ написан
  • Как собрать сервер на устаревшем ПО?

    @rPman
    Одно слово - вииртуализация.

    Так как при попытке установить старую версию ОС на новое железо можно получить странные проблемы (а можно не получить, не попробуешь не узнаешь) но главное устаревший софт уже давно не поддерживается и никто баги в нем не чинит. Закрыть виртуалку фаерволом (просто когда она за nat уже хорошо) логичнее всего.

    Поэтому ставишь современную ос, а внутри средствами виртуализации или любых инструментов создания песочницы (даже chroot поможет) устанавливаешь устеревшую версию ОС и приложений. В простом варианте может подойти просто миграция (читай копирование) из старого железа внутрь виртуалки как есть, останется настроить сеть и все продолжит работать как работало.

    ОС FreeBSD 7.2
    уходи от этого, на linux, рекомендую для новичков - на ubuntu, сама freebsd может и норм но настраивать что то нестандартное будет новичкам тяжелее на порядок

    С высокой вероятностью Lighttpd и MySQL подойдут новых версий, и большая часть проблем создаст код, написанный под старую версию php, т.е. почему бы не попробовать установить на современную ОС только его (но придется собирать из исходников, я не видел бакпортов php такой старой версии под новые) т.е. вся возня, найти максимально высокую версию ОС для запуска в виртуалке, для которой есть php4

    Для установки старой версии ubuntu можно использовать архив old-releases.ubuntu.com и указав их репы в debootstrap собирать какую угодно старую версию минисборки в каталог, которую уже можно виртуализировать хоть chroot хоть lxc хоть полноценной виртуалкой
    Ответ написан
    2 комментария
  • Почему не срабатывает код php?

    @rPman
    ты 'добросовестно' отключил вывод сообщений об ошибках с помощью @ при вызове unlink и теперь удивляешься что тебе непонятно, почему ничего не работает?

    убери это и смотри по логам, там будет точно указано, какой файл и почему не получилось удалить
    Ответ написан
  • Каким хостом пользоваться для работы с БД?

    @rPman
    Если бакэнд будет запускаться так же на этом хостинге, где развернута база данных, то localhost можно оставить, стандартное обозначение машины для доступа по сети локально

    Нет нужды искать сервер с установленным mysql, так как для его установки требуется ровно одна команда и пара телодвижений по настройке пользователей, бери любой vps с ssh доступом, при необходимости хостинг предоставит администратора за дополнительную палату
    Ответ написан
    Комментировать
  • Как правильнее будет синхронизировать удаленную бд локально?

    @rPman
    правильно - master-slave репликация, все изменения главной базы автоматически, допускается с некоторым лагом, прилетают на подчиненную slave, с этой базой можно работать в readonly режиме как с обычной базой, и ее нагрузка никак не скажется на нагрузку основной.
    Ответ написан
  • Как запустить сервер на своем ПК?

    @rPman
    Настоятельно рекомендую не использовать готовые мега сборки для разработки, а взять чистую linux операционку (пусть и серверных ревизий но не обязательно) и установить ее в виртуальной машине (можно в windows wsl использовать но я так же настоятельно не рекомендую этого, так как проблем это добавит а для начинающего лишние они не нужны), для начинающих пользователей рекомендую VirtualBox

    Этот подход подготовит начинающего разработчика к тому что его ждет на VDS-ках и позволит научиться базовым основам администрирования.

    Современный разработчик просто обязан иметь базовые навыки devops для настройки рабочего окружения
    Ответ написан
    Комментировать
  • Как сформировать запрос к 3-м таблицам сразу?

    @rPman
    select ... from ...
    union
    select ... from ...
    union 
    ...
    выдаст уникальные строки, если использовать union all то нет
    Ответ написан
    Комментировать
  • Как реализовать логику реферальной системы после получения награды в первый раз?

    @rPman
    храни количество использованных рефералов, тех что уже учтены для выдачи награды, тогда условие выборки людей, кому нужно выдать награду будет where ref_cnt-used_ref_cnt>=10
    и выдавать награду либо несколько раз пока не останется рефералов (мало ли кто то разом 1000500 найдет) либо сразу считать нужную награду
    Ответ написан
  • Какую систему использовать для бекапов lunix с s3?

    @rPman
    наведете на решение?

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

    К примеру системный раздел windows можно адекватно бакапить только средствами копирования разделов (так как для их работу необходимо корректно восстанавливать не только acl но и hard- и symbolic- links (подскажите мне если знаете такой что сможет работать с бакапом на уровне файлов, кроме штатного от майкрософта но управляемость бакапами там нулевая, плюс почти никакой дедупликации, ну их нафиг)

    И главное, никакая из известных мне систем резервного копирования не проводит полностью контроль над бакапами в том виде который требует идеология, а именно - возможность восстановить рабочую систему из бакапа. Максимум что могут сделать - проверить контрольную сумму результата (что само собой не спасет от ошибок в конфиг файлах). И это логично, так как собственно сам факт проверки работоспособности автоматизировать универсально невозможно.

    Но вот в частных случаях, когда интегратору/админу известна система от и до, возможно построение своих скриптов автоматизации и формировании отчетов о тестировании среды.

    По делу, одно время я пользовался в windows bat скриптами (готовые были написаны для win7 и уже не работают в win10, но идея там простая, все переписывается легко) когда на целевом диске создавался снапшот, затем с помощью rsync создавалась полная копия указанных каталогов, но с указанием предыдущей версии реплики, для неизменившихся файлов утилита создавала hardlink на прошлую копию, в результате получается идеальная инкрементальная копия, с которой можно работать как с обычными файлами (не требуется извлечение из сжатых архивов и последовательное принятие патчей инкрементации), причем на любую сохраненную дату, при необходимости можно легко удалить старую или даже любую реплику, благодаря корректной обработки hardlink файловой системой.

    Сам диск можно подключать по сети, на выбор либо средствами windows (.vhd файлы) либо iscsi
    Сжатие - поддерживается, но только слабое ntfs.

    Недостаток подхода, в момент создания резервной копии, требуется полный доступ на запись на весь архив, т.е. это жуть какая опасная операция, если что то случится не то, можно потерять все копии. Если закрыть глаза на руткиты, ломающие файловые системы минуя ОС, напрямую записывающие диски (маловероятный сценарий, от которого защищаться нужно еще до размышлений о резервных копиях), то защититься можно выставляя права доступа на старые реплики, на все есть консольные утилиты

    Второй недостаток - год ежедневных копий с даже средним количеством файлов в итоговом разделе создаст миллиарды hardlink (лимит на количество hardlink на один файл - 1024, это примерно три года ежедневных бакапов), ну и к примеру, проверка такого диска с помощью chkdsk может потребовать дни и недели.
    ----------------------------------------

    Другой подход, если требуется создание копий общей шары на сервере (linux само собой), выбираешь cow файловые системы, с поддержкой онлайн снапшотов - btrfs/zfs. Каждый день или даже каждый час создаешь снапшот и хранишь так долго как это необходимо, удаляя не нужные тогда когда пожелаешь (операция моментальная, не зависит от объема данных). Это защитит данные от проблем на клиентской стороне, например ошибочные удаления или вирусы-шифровальщики и т.п.

    Чтобы защитить данные от проблем с серверным железом, то к примеру можно использовать фишку btrfs incremental backup, когда разницу между двумя указанными снапшотами (предыдущим и текущим) отсылают на удаленный сервер, упаковав его в один файл (точнее поток). т.е. эти патчи можно хранить и применять на заранее сохраненное стартовое состояние файловой системы. Само собой удаленный сервер так же должен хранить снапшоты (кстати а патчи можно хранить на третьем сервере).

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

    В обоих случаях советую создание автоматических отчетов по изменениям (не только общие но к примеру по пользователям, сколько изменений какие пользователи сделали, в графиках), т.е. даже информация о размере снапшота более чем полезна, если нормально у вас еженедельно получать дифы размером X гигабайт, а сегодня внезапно получаете 0 или 100X это уже повод забеспокоиться.
    ----------------------------------------

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

    @rPman
    у mysql нет адекватных методов управления приоритетами (есть low-priority yно оно действует на не все engines) поэтому исторически распределение нагрузки делают с помощью репликации.

    Поднимаешь второй сервер (физически файлы базы должны быть размещены на другом диске или даже сервере) и настраиваешь между основным и этим второстепенным master-slave репликацию, требования к этому среверу сильно ниже (зависит от нагрузки само сабой, но в основном там будут только записи) и уже на эту базу натравливаешь mysqldump

    p.s. альтернатива, запилить свой/подправить исходники mysqldump, в своем приложении скорость получения данных можно контролировать принудительными sleep-ами (например запрашиваешь табличку, а в цикле получения данных вставляешь раз на тысячу строк sleep).
    первый же нагугленный код mysqldump на php, вставь слип в этот цикл

    upd. не нужно править код штатной утилиты, более чем достаточно просто использовать штатный механизм потоков linux и замедлить запись итогового дампа с помощью к примеру cstream
    mysqldump ... | cstream -t $((1024*1024)) | zstd --ultra -T0 -o backup.sql.zstd


    p.p.s. тупо, останаливаешь базу, копируешь файлы с таблицами как есть, переносишь на свою машину, поднимаешь там ту же версию mysql, делаешь дамп
    Ответ написан
    1 комментарий
  • Как исправить ошибки php mysql?

    @rPman
    нужно смотреть что там за сообщение об ошибке, вполне возможно /usr/lib/php/20200930/mysqli.so файл нулевой длины и его достаточно будет удалить вручную

    удаляй все что хоть как то конфликтует, включая их зависимости
    apt purge ...

    если что можно удалять вручную с помощью dpkg игнорируя зависимости но в конце концов порядок нужно восстановить чтобы apt autoremove -f отработало и dpkg-reconfigure -a тоже

    p.s. почему у тебя такой странный путь?
    поэтому вместо debian я ставлю ubuntu, список и поддержка backports для кучи полезных приложений там заметно полнее и все за порядок удобнее
    Ответ написан
  • Праивльно ли хранить инфу о просмотрах в базе mysql?

    @rPman
    Совершенно нормально, вместо выполнения запроса на аналитику в момент вывода, делать это тригером во время изменения данных, в соответствующее поле.

    Это оправдано с того момента, как количество запросов на чтение в несколько раз превышает количество на изменения, особенно когда аналитика запрашивает многоданных... т.е. почти всегда.

    Место на диске на порядки дешевле чем процессорное время (и время работы этого диска), которое ты будешь тратить на аналитику.
    Ответ написан
    Комментировать