MySQL выполняет временную INSERT "без последствий" с репликацией, избегая блокировок

Итак, мы пытаемся запустить отчет на экране, который не изменит сохраненные данные. Однако это сложно, поэтому необходимо пройти через пару (ВРЕМЕННЫХ *) таблиц.

Он извлекает данные из живых таблиц, которые реплицируются.

Немного неприятно, когда дело доходит до "подходящих" записей от

temp_PreCalc

и заполнить их из оперативных данных, чтобы создать следующий (ВРЕМЕННЫЙ *) вывод таблицы

в результате эффективно:

INSERT INTO temp_PostCalc (...) SELECT... FROM temp_PreCalc ПРИСОЕДИНЯЙТЕСЬ к live_Tab1 ON ... ПРИСОЕДИНЯЙТЕСЬ к live_Tab2 ON ... ПРИСОЕДИНЯЙТЕСЬ к live_Tab3 ON ...

Отчет не является "окончательным" ответом. Ожидается, что это просто "снимок" отчета, который будет устаревшим, как только он появится на экране.

Там нет порядка или воспроизводимости проблемы.

Так что в идеале я бы переключил свой УРОВЕНЬ ИЗОЛЯЦИИ TRANSACTION на READ COMMITTED... Однако я не могу, потому что live_Tab1,2,3 реплицируются с типом BIN_LOG STATEMENT...

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

Я хотел бы видеть это преимущество в производительности во время ответа!

За исключением того, что данные записываются в (ВРЕМЕННЫЕ *) таблицы и затем выбрасываются.

Там нет места назначения live_ table - только источники...

    • эти таблицы на самом деле не ВРЕМЕННЫЕ ТАБЛИЦЫ, а динамически создаются и выбрасываются таблицы InnoDB, так как расчет отчета требует самостоятельного объединения и удаления... но они являются временными

Теперь я, кажется, хожу по кругу в поисках ответа.


У меня нет привилегии SUPER и я не хочу ее... Так что не могу SET BIN_LOG=0 для этого сеанса соединения (Почему это требование?)

Так...

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

Позволит ли MySQL мне

ЧИТАЙТЕ УРОВЕНЬ УРОВНЯ ИЗОЛЯЦИИ СЕССИИ СДЕЛКИ;

INSERT INTO temp_PostCalc (...) SELECT... FROM temp_PreCalc ПРИСОЕДИНЯЙТЕСЬ к live_Tab1 ON ... ПРИСОЕДИНЯЙТЕСЬ к live_Tab2 ON ... ПРИСОЕДИНЯЙТЕСЬ к live_Tab3 ON ...;

Или я все еще получу

"Оператор Cannot Execute: невозможно записать в двоичный журнал, поскольку BINLOG_FORMAT = STATEMENT и хотя бы в одной таблице используется механизм хранения, ограниченный ведением журнала на основе строк..."

Даже если это не технически верно? Я ожидаю, что это произойдет, так как я предполагаю, что репликация будет запущена просто потому, что она видит оператор "INSERT", и выполнит простую проверку любой участвующей таблицы на предмет ее пригодности для репликации, даже если ни одно из назначений на самом деле не является репликацией. право....

или это меня приятно удивит?

Я действительно не могу столкнуться с использованием неприятного решения, такого как

ВЫБЕРИТЕ НА ВЫХОД ДАННЫХ НАГРУЗКИ

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

или потоковую передачу через клиент PHP, просто чтобы отделить INSERT от SELECT, чтобы MySQL не расстраивался по поводу того, какие таблицы подходят для репликации....

1 ответ

Итак, похоже, что единственный способ выглядит так:

Мы создаем вторую схему "ScratchTemp"... Устанавливаем страшную репликацию --replicate-ignore-db=ScratchTemp

Мой "локальный" код запроса открывает новое соединение MySQL и выполняет USE ScratchTemp; Поскольку я выбрал базу данных по умолчанию "игнорировать"d one - ни один из моих запросов не будет реплицирован.

Поэтому я должен быть очень осторожным, чтобы не выполнять ЛЮБЫЕ реальные запросы здесь

Обращайтесь к моим скретч-таблицам и фактическим таблицам данных, поставив перед ними все префиксы в моих запросах с полным именем схемы...

например, INSERT INTO LiveSchema.temp_PostCalc (...) SELECT ... FROM LiveSchema.temp_PreCalc ПРИСОЕДИНЯЙТЕСЬ к LiveSchema.live_Tab1 и т. д., как указано выше.

А затем закройте это соединение, как только смогу, так как откровенно опасно открывать неповторяющееся соединение....

Вздох...?

Другие вопросы по тегам