Задать вопрос
  • Удаление БД как папок из mariadb?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. На проблемном сервере:
      • Создать папки баз.
      • Запустить сервер в режиме восстановления (InnoDB Recovery Modes).
      • Дропнуть базы.

    2. Если не удаётся запуститься даже в режиме восстановления:
      • Восстановить БД из бэкапа на другом инстансе сервера
      • Скопировать каталоги баз на проблемный сервер
      • См. п. 1.

    Ответ написан
    Комментировать
  • Почему LIKE разделяет _E на _ и Е - mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если ничего не помогает, попробуйте почитать документацию.

    LIKE operator

    With LIKE you can use the following two wildcard characters in the pattern:

    • % matches any number of characters, even zero characters.
    • _ matches exactly one character.
    Ответ написан
    1 комментарий
  • Как сделать правильный комплексный индекс?

    @Akina
    Сетевой и системный админ, SQL-программист.
    n_flag может быть 0..5
    num_status 0..20
    ...
    запись, где n_flag=0 и num_status>=10.

    Указанным условиям при равномерном распределении значений соответствует ~9% записей, т.е. 18 млн. Причём отбор по n_flag более селективен.
    Чисто теоретически оптимальным без использования фич Постгресса будет индекс (n_flag, update_date, num_status).

    DEMO fiddle. Правда, 200 млн. записей я генерить как-то не решился... но для 1 млн. записей запрос показывает 40-50 мс - по-моему, вменяемо.

    PS. Индекс называется на "комплексный", а композитный. Кроме того, этот индекс - покрывающий, т.е. для обработки запроса серверу не требуется обращаться к таблице.
    Ответ написан
  • Сбор сведений в общую Excel-таблицу от нескольких работников без гугл-форм?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Начните с формализации данных. Хотя бы введите единообразие наименований (наименование должно выбираться из списка, а не вводиться в свободной форме, либо должна заполняться форма со всеми возможными наименованиями) и формата представления данных. Это задача 1.
    Задача 2 - решить, в каком виде будет заполняться ежедневная форма. Веб-форма тут в общем вполне подойдёт. На гугле свет клином не сошёлся - есть те же яндекс-документы, например...
    Задача 3 - передача готовой формы. Тут я бы рекомендовал выгрузку в локальный CSV и отправку по электронной почте. Это контролируемый и протоколируемый канал, бесполезно говорить, что письмо было отправлено вовремя, если его нет в отправленных или если дата отправки - безнадёжно просроченная.
    Задача 4 - загрузка полученных данных в единое хранилище. Тут уже можно думать о приличной СУБД. Ну а её штатных клиентских средств для загрузки - за глаза.
    Задача 5 - аналитика. Имея данные в БД, получать аналитику в любых формах и разрезах - не проблема.
    Ну и задача 6 - формирование красивых выходных документов с результатами анализа. Тоже не сказать что проблема.
    Ответ написан
    2 комментария
  • Как составить аналогичный запрос, если поле text, а не json?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Можно ли написать такой же запрос, если поле raw не jsonb, а text?

    Ну офигеть проблема - заменить tp."raw"->>'errorCode' на tp."raw"::JSONB->>'errorCode'

    Кстати, это применимо к полю обоих типов. Просто для JSON - избыточно.
    Ответ написан
    1 комментарий
  • Это нормальные результаты трассировки?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Трассировка - это ICMP. Обработка ICMP, или во всяком случае обработка ping и отправка pong - это задача с низшим приоритетом для любого узла за редчайшим исключением. Потому даже 100% потерь ни о чём не говорят. TCP или UDP пинг был бы более информативен, но с ними есть определённые сложности - при отсутствии специального ПО на целевом узле результаты будут весьма приблизительными.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Диапазон от 194.58.80.0/24 до 194.58.95.0/24 - лучше. Он извне (на внешнем интерфейсе) накрывается одним маршрутом.

    194.58.80.0 .. 194.58.95.0 = 194.58.80.0/20
    194.58.72.0 .. 194.58.87.0 = 194.58.72.0/21 + 194.58.80.0/21

    Впрочем, лучше - провайдеру. Потребителю - глубоко пофиг.

    PS. Конечно, пофиг вообще всем. Но это единственная разница, которую мне удалось отыскать.
    Ответ написан
    2 комментария
  • Как посчитать общую длительность времени между строками определенной выборки в MySQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS ( SELECT *, 
                         LAG(`datetime`) OVER (PARTITION BY login ORDER BY `datetime`) lag_datetime, 
                         LAG(event) OVER (PARTITION BY login ORDER BY `datetime`) lag_event 
                  FROM history )
    SELECT login, SUM(TIMESTAMPDIFF(MINUTE, lag_datetime, `datetime`)) duration
    FROM cte
    WHERE (event, lag_event) = (2,1)
    GROUP BY login;

    https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=398... (исходные данные подправлены).
    Ответ написан
    1 комментарий
  • Бывает ли дружба между двумя сетями на 1 ПК?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В корпоративной сети есть, видимо, несколько подсетей, кроме той, в которой находится адрес интерфейса из этой сети. Для того, чтобы имелся доступ к узлам этих подсетей, должны существовать соответствующие маршруты через правильный адрес шлюза.

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

    Соответственно для нормальной работы нужно (при условии, что обе карты адресуются по DHCP):

    1. Настроить метрики интерфейсов, поставить интерфейсу в корпоративной сети более высокую метрику (бОльшее значение метрики соответствует более низкому приоритету интерфейса, и соответственно его маршрутов).

    2. Выяснить адреса узлов в корп. сети, к которым тебе нужен доступ. Если доступ осуществляется по IP - то всё просто, адреса уже есть. Если же по именам, то следует отключить второй интерфейс, а потом получить соответствия имён адресам (да хоть тупым пингом) и внести эти соответствия в файл HOSTS. Ну и молиться, что эти нужные адреса - не динамические. Получив адреса (а ещё лучше - узнав у админа их подсети), прописать статические маршруты в эти подсети либо к этим адресам через анонсируемый в корпоративной сети шлюз. После чего - на карте в корп. сеть установить статические адреса DNS-серверов, и удалить из списка все серверы.

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

    Впрочем, это всё будет работать только в случае, если в корп. сети не производятся какие-то перестройки (изменения адресации). Если что-то изменится, скорее всего придётся корректировать и свои локальные настройки.
    Ответ написан
    1 комментарий
  • Как использовать maxmind GeoLite2 на mysql 5.5, где нет inet6_aton?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В результате надо получить таблицу, в которой будут только IPv4 адреса

    Не вижу проблемы. Импорт не использует inet6_aton. Соответственно после импорта можно просто удалить записи с IPv6-адресами. А затем ещё и изменить тип поля на VARBINARY(4).
    Ответ написан
  • Как создать свою двойную шапку заголовков в запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT {выходные поля запроса}
    FROM ( SELECT 3 AS rownumber, {выходные поля запроса}
           FROM {остальное тело запроса} )
         UNION ALL
         ( SELECT 1, {надписи шапки}
           FROM DUAL )
         UNION ALL
         ( SELECT 2, {кастомные названия}
           FROM DUAL )
    ) AS total
    ORDER BY rownumber, {остальные поля сортировки};
    Ответ написан
  • Как группировать данные, если у них есть уникальные id?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Вы пытаетесь сделать откровенную глупость, выводя значение id в итоговом наборе.

    Вот есть некая группа, в ней все off_id одинаковы, но id различны. После группировки все эти записи будут сгруппированы в одну. А теперь, внимание, вопрос: ну и какое одно значение id из всех возможных сервер должен вернуть? не знаете? так ведь и сервер не знает... вот он и генерирует ошибку.

    Уберите id из выходного набора. Либо явно и чётко скажите серверу, какое именно значение из всех возможных в группе он должен вернуть. Наименьшее? требуйте MIN(id). Наибольшее? MAX(id). Хоть какое, любое? ANY_VALUE(id).
    Ответ написан
    Комментировать
  • Как организовать сеть (теория)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    • 0. Всегда (на все три вопроса). 800 устройств в одном домене коллизий, это [censored] и полный ступор.
    • 1. Да. Но нет. Все в одной подсети - бред и никакого смысла.
    • 2. Немаршрутизируемые в Интернет адреса (bogon networks). Я бы делал подсети в 172.16. Но это дело вкуса.
    • 3. Ни разницы, ни усложнения нет и в помине. Стандартности тут тоже никакой.
    • 4. Каждую подсеть в свой VLAN. Ибо нефиг.
    • 5. Серверы в отдельных подсетях. Причём не одной. Что делать серверу видеонаблюдения в подсети бухгалтерии?
    • 6. Стройте схему на основании потоков трафика, а не по некоему мистическому наитию.
    • 7. Не у телефонии, а у некоторых коммутаторов есть специальная работа с VoiceVLAN. да, только экономия портов. Если не работал - то и не связывайся. Потом поэкспериментируешь.
    • 8. По требованиям безопасности сеть видеонаблюдения вообще должна быть по возможности физически отделена от пользовательской. Отдельные коммутаторы и кабельные линии. да и трафика они генерят - могут забивать каналы, оно надо? То же и с линиями охранно-пожарной сигнализации - но тут строго, никаких "по возможности".
    • 9. Сервер печати. И да - он и принтеры в отдельном VLAN.

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

    Ставь сразу нормальный маршрутизатор.
    Потому что коммутатор, хоть и L3, тебе ничего не даст во вменяемой форме - ни статистики, ни управления, ни наблюдения.
    Ответ написан
    13 комментариев
  • Как добавить свойство в каждый элемент массива в postgresql /jsonb при помощи sql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT 'Bob' AS name, 25 AS age UNION ALL
        SELECT 'Mark'       , 30        UNION ALL
        SELECT 'Joe'        , 35
    )
    SELECT test.id,
           jsonb_build_object('items', jsonb_agg(jae.value_1 || jsonb_build_object('age', cte.age)))
    FROM test
    CROSS JOIN jsonb_array_elements(test.value->'items') AS jae (value_1)
    LEFT JOIN cte ON cte.name = jae.value_1->>'name'
    GROUP BY test.id

    DEMO
    Ответ написан
    2 комментария
  • Что провайдер сделает за ддос на меня?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ничего он не сделает. Твоей вины в том, что некие третьи лица атакуют твой адрес - нет. Ни прямой, ни косвенной.

    и кто-нибудь решит задудосить

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

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Процитирую INTUIT.RU: Основы сетей передачи данных.

    Постоянная и динамическая коммутация

    Как сети с коммутацией пакетов, так и сети с коммутацией каналов можно разделить на два класса:

    • сети с динамической коммутацией ;
    • сети с постоянной коммутацией.


    В сетях с динамической коммутацией:

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

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

    Сеть, работающая в режиме постоянной коммутации:

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS ( SELECT name, last_name, cnt FROM table
                  UNION ALL
                  SELECT name, last_name, cnt - 1 FROM cte WHERE cnt > 1 )
    SELECT name, last_name FROM cte;
    Ответ написан
    Комментировать
  • Нужно добавить текст к уже имеющемуся в ячейках Excel. Какую формулу использовать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Никакую.
    Формула не может изменить другую ячейку. Формула не может именно изменить себя - только посчитать новое значение.
    Это делается либо формулой в отдельном столбце с последующей заменой исходного столбца на рассчитанные значения, либо процедурой на VBA.
    Ответ написан
    1 комментарий
  • Как выполнить SELECT с таким условием?

    @Akina
    Сетевой и системный админ, SQL-программист.
    aopil,
    а для более старых версий невозможно выполнить то, что я хочу?


    SELECT *
    FROM services
    JOIN (
        SELECT *,
               @row_number := CASE WHEN service_id = @service_id
                                   THEN @row_number + 1
                                   ELSE 1
                                   END rownumber,
               @service_id := service_id
        FROM orders
        CROSS JOIN (SELECT @service_id := 0, @row_number := 0) init_vars
        ORDER BY service_id, id DESC
        ) enumerated_orders USING (service_id)
    WHERE enumerated_orders.rownumber <= services.service_limit

    https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=1f2a95...
    Ответ написан
    1 комментарий
  • Как изменять значение в бд по времени?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Информация о том, что пользователь оплатил подписку заносится в бд (есть отдельная строка, в которой изначальное значение равно нулю, а при оплате меняется на 1).

    В комплекте с информацией о факте оплаты должна существовать и информация о дате-времени открытия доступа по подписке. Кстати, в этом случае сама информация о факте оплаты не нужна, достаточно просто самого факта наличия момента оплаты либо срока действия оплаченного доступа.

    значение сменилось на 1, а потом через месяц само сменилось на 0.

    Для этого у MySQL есть свой встроенный планировщик. Запускаем, создаём процедуру, которая выполняется, например, ежеминутно, и обнуляет поле доступа для всех записей, у которых разница между текущим штампом времени и штампом времени открытия доступа превышает срок доступа (хардкод, либо взятый из служебной таблицы или даже из обрабатываемой записи).

    MySQL 8.0 Reference Manual / Stored Objects / Usin...
    Ответ написан
    Комментировать