• Как перенести большую базу на другой сервер без простоев?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Рабочий ли вариант если просто через rsync передать всю папку /var/lib/mysql?

    Просто перенос файлов рабочей БД окончится тем, что файлы есть, а базы нет, потому что неоткуда взяться метаданным в системной базе данных. Вернее, всё ещё забавнее - базы вроде бы и нет (USE приводит к ошибке "БД не существует"), но её нельзя создать, потому что она есть. И то же самое с таблицами (SELECT/DROP/прочее нельзя, потому что таблицы нет, CREATE нельзя, потому что она есть).

    Метод сработает, если переносить все БД сразу, включая служебные. Но требуется точное соответствие исходной и конечной конфигураций - начиная с версии и сборки MySQL и кончая именами каталогов и именами/паролями учётных записей в операционной системе. Плюс перегенерация и переподключение сертификатов.

    Еще вариант с репликацией, но насколько я понял всё равно базу нужно блокировать на момент дампа, а это тоже какое-то время

    Решений без блокирования практически не существует. Нет, можно наколхозить реальное решение, которое обойдётся вообще без остановки, я даже представляю как именно (FEDERATED ENGINE + triggers), но подробно рассказывать не буду - для её реализации нужны достаточная квалификация и опыт, на одних советах шанс на удачу невелик, скорее всё поломается.

    Есть вполне себе документированные способы: Copying MySQL Databases to Another Machine. Особенно последний из описанных. Он предполагает минимальное время простоя при использовании штатных средств.
    Ответ написан
    Комментировать
  • Можно ли по мак адресу присвоить Vlan ID Cisco?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Существуют port-based VLAN и MAC-based VLAN.
    Первый - это когда определённый VLAN назначается порту коммутатора статически.
    Второй - это когда VLAN назначается порту в зависимости от MAC-адреса подключенного к порту оборудования.
    Оба варианта работают, само собой, только с нетегованными пакетами, то есть на чисто клиентских либо гибридных портах, но не на транковых.

    Вроде бы второй вариант - именно то, что нужно. Но есть подвох. Всё зависит от того, как именно реализован протокол на конкретном устройстве. Потому как возможны два варианта.

    Первый - это когда пакет от хоста направляется в VLAN в зависимости от MAC узла-источника. В этом случае получится именно то, что нужно.

    Второй вариант (достаточно старый, по-моему, сейчас нигде не реализуется) - это когда порт коммутатора включается в VLAN, определяемый (первым) найденным на данном порте MAC клиента, и в дальнейшем не изменяется. Конечно, этот вариант не подходит. А потому на имеющемся оборудовании просто надо либо проверить на практике, либо почитать в мануале (впрочем, обычно этот момент не описывается), какой из вариантов реализован.

    Есть ещё третий вариант, хотя на самом деле первый. Это Voice VLAN. Эта возможность имеется не на всяком оборудовании, но если имеется, то она однозначно работает по первому варианту. То есть можно тот VLAN, в котором камеры, объявить Voice VLAN, и получить решение задачи.

    -------------------------------------

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    На версии 8+ как-то так:
    WITH cte AS (
        SELECT `events`.`id`,
               `events`.`date_public`,
    	   `event_categories`.`id` as `cat_id`,
    	   `event_categories`.`title` as `cat_title`
    	   ROW_NUMBER() OVER (PARTITION BY `event_categories`.`id` ORDER BY `events`.`date_public` ASC) rn
        FROM `events`
        INNER JOIN `event_category_joins` ON `events`.`id` = `event_category_joins`.`event_id` 
        INNER JOIN `event_categories` ON `event_categories`.`id` = `event_category_joins`.`event_category_id` 
        WHERE `events`.`date_public` >= '2024-04-05 19:00:00'
    --    WHERE `events`.`date_public` >= CURRENT_DATE
        )
    SELECT id, date_public, cat_id, cat_title
    FROM cte
    WHERE rn = 1;
    Ответ написан
    1 комментарий
  • Как кучу файлов с дампами таблиц соединить в один?

    @Akina
    Сетевой и системный админ, SQL-программист.
    type X:\sql_files_folder\*.sql | Z:\mysql_bin_folder\mysql -D database_name -u account_name -p

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

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


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

    Классический подход - таблица текстовых литералов

    CREATE TABLE translation (
        token_id INT,      -- идентификатор строки
        language_id INT,   -- идентификатор языка
        PRIMARY KEY (token_id, language_id),
        value VARCHAR(100) NULL DEFAULT NULL
        );


    Соответственно зная номер строки, который нужен, и язык, получаем значение
    SELECT value
    FROM translation
    JOIN language USING (language_id)
    WHERE token_id = @token_id
      AND language_name = @language_name;

    Впрочем, обычное состояние - это когда не все строки переведены. Тогда используется
    SELECT COALESCE((
        SELECT value
        FROM translation
        JOIN language USING (language_id)
        WHERE token_id = @token_id
          AND language_name = @language_name;
        ), (
        SELECT value
        FROM translation
        JOIN language USING (language_id)
        WHERE token_id = @token_id
          AND language_name = @default_language_name;
        )) value;

    То есть для литералов. имеющих перевод, возвращаются именно они, а для ещё не имеющих - значение на языке по умолчанию.

    ============

    С другой стороны, вывод сообщений на экран - это интерактивное взаимодействие, где начхать на производительность. А коли так, то сообщения можно хранить в одном поле в виде JSON объекта, типа
    {
        "ru":"Выход",
        "en":"Quit"
    }

    Но и для такой схемы получение литерала для дефолтного языка при отсутствии перевода - актуально.
    Ответ написан
    Комментировать
  • Как включить/отключить интернет от компьютера удаленно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Подключаешься удалённо к роутеру и disable/enable порта, которому подключен компьютер.
    Если роутер не умеет избирательно отключать порты - то через файрвол включаешь/выключаешь правило, разрешающее доступ из LAN, либо по МАС.
    Ответ написан
    Комментировать
  • Как заблокировать лишний шлюз?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Нужно изменить режим работы Роутера-2. Он должен работать в режиме не роутера, а точки доступа, т.е. просто служить конвертором интерфейса. Ну и, само собой, DHCP на нём отключить.
    Тогда камера будет цепляться за него и через него слать запрос адреса на Роутер-1. Ну вернее слать запрос в проводной интерфейс, а там Роутер-1 единственный DHCP.
    У ТПЛинка на сайте даже видео есть "Как превратить роутер в точку доступа?".
    Ответ написан
    1 комментарий
  • Что такое кластерный индекс в mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Кластерный индекс... это на самом деле понятие крайне виртуальное.

    Что такое обычный некластерный индекс? берём выражение индекса, считаем его значение для каждой записи, сортируем и пишем на диск. Получаем отдельную структуру, в которой выражение индекса сортировано. Когда потребуется искать заданное значение этого выражения, мы вместо просмотра от записи к записи сразу половинным делением быстренько найдём нужное значение, возьмём из него уникальный идентификатор записи, и обратимся за записью. Если в таблице 1000 записей, то для поиска заданного значения без индекса нам в среднем пришлось бы просмотреть 500 записей, а с индексом - всего 10.

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

    В MySQL (точнее, в используемом по умолчанию движке InnoDB) первичный индекс, во-первых, существует ВСЕГДА, во-вторых, определяется так (в статье, на которую дали ссылку, имеются неточности в пункте 2):
    1. Если первичный ключ задан явно, то его выражение является также и выражением кластерного индекса. Или иначе - первичный ключ и есть кластерный индекс.
    2. Если первичный ключ явно не задан, но в таблице имеется индекс, отвечающий всем следующим требованиям:
      • является уникальным
      • не является функциональным, в т.ч. не использует в выражении вычисляемые поля
      • не использует в выражении поля, которые определены как допускающие значение NULL

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


    Выглядит так, как будто это просто физическая сортировка данных по индексируемому полю.

    Фактически - именно так.

    Создаётся ли отдельная таблица или просто упорядочивается хранение существующих данных?

    Не создаётся. Но при изменении первичного индекса таблица полностью пересоздаётся с новым физическим порядком записей.

    Если данные упорядочиваются этим индексом, допустим по ID, то почему при select без сортировки данные могут возвращаться в произвольном порядке, а не отсортированные по ID по-умолчанию?

    Если не задан явно ORDER BY, сервер имеет право вернуть записи в любом порядке, как ему удобнее. В большинстве случаев, но не всегда, он будет возвращать записи в порядке чтения с диска...

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

    ===

    PS. Кстати, правило выбора индекса, который будет использоваться в качестве кластерного, имеет неприятный побочный эффект. Если у некоторых полей, входящих в какие-то индексы, изменяется свойство NULLability, то это может привести к изменению того, какой из имеющихся индексов станет использоваться в качестве первичного по пункту 2. В результате мы получим невозможность использования INSTANT / INPLACE методов, и будет использован длинный COPY. Впрочем, ситуация такая крайне редка.
    Ответ написан
    2 комментария
  • Как разделить сеть на несколько подсетей, чтобы в каждой был определенный вид устройства и настроить для каждой сети получение адреса по dhcp?

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

    Вот вообще не вижу проблемы. Резервирование IP-адреса на DHCP-сервере по МАС-адресу - это единственное, что нужно для решения задачи.

    PS. Правда, три DHCP-скопа, торчащие в одном L2-сегменте - это из разряда "странное"...
    Ответ написан
    Комментировать
  • Как оптимизировать запрос через Sqlalchemy?

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

    SELECT coalesce(A.id, :coalesce_1) AS card_id, 
           coalesce(A.serial_number, :coalesce_2) AS card_number, 
           coalesce(B.name, :coalesce_3) AS prj_name, 
           coalesce(C.name, :coalesce_4) AS client_name, 
           coalesce(A.user_name, :coalesce_5) AS card_owner_name, 
           coalesce(A.user_phone_number, :coalesce_6) AS card_owner_phone_number, 
           coalesce(A.balance_current, :coalesce_7) AS current_balance, 
           coalesce(A.balance_bonus, :coalesce_8) AS bonus_balance, 
           coalesce(A.active, :coalesce_9) AS card_status, 
           coalesce(D.name, :coalesce_10) AS tariff_plan_name, 
           NULL AS anon_1 
    FROM cashless_card 
    JOIN company ON cashless_card.company_id = company.id 
    JOIN voc ON cashless_card.voc_id = voc.id 
    LEFT OUTER JOIN tariff_plan ON cashless_card.tariff_plan = tariff_plan.id 
    WHERE cashless_card.company_id IN (__[POSTCOMPILE_company_id_1])

    Почти очевидно, что в таблицах company, voc и tariff_plan поле по имени id - это первичный ключ... но хотелось бы подтверждения.

    Впрочем, видно, что для оптимизации запроса в таблице cashless_card крайне желательно наличие индекса (company_id). Следует также проверить эффективность индекса (company_id, voc_id, tariff_plan), и аналогичного с переставленными местами последними 2 полями (первым ставить то, которое более селективно).

    Кроме того, эффективность запроса сильно зависит от количества идентификаторов в списке, который передаётся в условие WHERE cashless_card.company_id IN (__[POSTCOMPILE_company_id_1]). Если их более десятка, есть смысл преобразовать этот список в набор данных (синтетическая UNION-таблица) и использовать как ещё один источник данных запроса.

    Ну и надо понимать, что наличие LIMIT/OFFSET только замедляет выполнение запроса. Причём чем больше OFFSET, тем сильнее это замедление.
    Ответ написан
    6 комментариев
  • Как настроить удалённую печать на МФУ Pantum M6550NW без присоединения принтера к сети?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если комп с Windows рядом - киньте патч-корд напрямую.
    Если не очень далеко - подключитесь по WiFi.
    Ответ написан
    Комментировать
  • Есть ли ошибки в данной топологии сети?

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

    PS. Как по мне, вся схема - одна большая ошибка.
    PPS. И что вообще делают роутеры и брэндмауэр в L2-схеме?
    Ответ написан
    Комментировать
  • Как найти начальную точку для определения маршрутов в двумерном массиве?

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

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

    Применительно к показанному массиву - только значение USA соответствует описанному условию.

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

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

    Задача не решается вычисляемым полем - в его выражении не допускается недетерминированных конструкций.

    Для решения задачи потребуется:
    1) trigger, который обработает начальные условия
    2) event procedure, которая обработает изменение значения по наступлении заданного момента времени

    Однако условия на формирование значения поля:

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

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

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

    Возможное решение - UNION ALL двух запросов. Первый - получающий список полей таблицы из INFORMATION_SCHEMA.COLUMNS в виде CSV, второй - собственно показанный запрос. Поскольку UNION ALL не перемешивает выходные записи, получится вроде бы то, что нужно.

    Однако есть грабли. Невидимые вычисляемые столбцы. Они будут присутствовать в списке полей, но не в наборе данных.

    См. fiddle
    Ответ написан
    Комментировать
  • Что нужно знать и куда смотреть чтобы заменить домашний оптический роутер на другой?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Читайте договор.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    UPDATE TableA 
    SET tableB_Id = TableB.Id
    FROM TableB
    WHERE TableA.Name = TableB.Name;


    fiddle
    Ответ написан
    Комментировать
  • Зависит ли скорость записи в БД от количества в ней записей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. Меняется/Зависит ли как-то скорость записи в таблицу БД от количества записей в таблице?

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

    2. Меняется/Зависит ли как-то скорость записи в таблицу БД от количества таблиц в БД?

    В MySQL - нет.

    3. Меняется/Зависит ли как-то скорость записи в таблицу БД от количества записей в соседних таблицах БД?

    В MySQL - нет. За исключением случая, когда пополняемая таблица имеет внешний ключ на другую таблицу. Но и в этом случае есть факторы, которые влияют на скорость записи гораздо сильнее.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT address, 
           office, 
           t1.fio, 
           t2.counter, 
           CASE t2.counter
               WHEN 'counter1' THEN t1.counter1
               WHEN 'counter2' THEN t1.counter2
               WHEN 'counter3' THEN t1.counter3
               END value,
           t2.num,
           t1.date       
    FROM table1 t1
    JOIN table2 t2 USING (address, office)
    Ответ написан
    2 комментария
  • Как узнать с каких интерфейсов в cisco куда идут кабеля?

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

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

    Берём ноут либо планшет с сетевухой (USB). Втыкаемся в розетку или коммутатор. Смотрим в ARP в интерфейсе сиськи, на каком порте находится МАС сетевухи.

    А ещё есть генераторы, которые "свистят" в кабель. И к ним щуп, который определяет наличие этого "свиста" в кабеле либо розетке. Но это либо вдвоём, либо много бегать.
    Ответ написан
    2 комментария