У меня есть таблица TB_EVENT_LOG, которая находится в процессе производства, мне нужно перенести данные prod в фиктивную таблицу на том же сервере и усечь производственную таблицу. В то же время я хочу заблокировать производственную таблицу. Я новичок в db, может ли кто-нибудь предложить эффективный способ сделать то же самое.
CREATE event transfer_data
ON SCHEDULE EVERY 12 hour
STARTS CURRENT TIME_STAMP
DO
BEGIN
LOCK TABLE TB_EVENT_LOG WRITE;
INSERT INTO TB_EVENT_LOG_dummy SELECT * FROM TB_EVENT_LOG ;
UNLOCK TABLES;
TRUNCATE TABLE TB_EVENT_LOG;
END |
DELIMITER ;
Чтобы исключить только скопированные записи из производственной таблицы, вместо блокировки таблиц можно использовать транзакции.
Например
START TRANSACTION;
INSERT INTO TB_EVENT_LOG_dummy SELECT * FROM TB_EVENT_LOG ;
TRUNCATE TABLE TB_EVENT_LOG;
COMMIT;
START TRANSACTION READ ONLY
должно работать так же, как оператор LOCK TABLE
. «Режим доступа к транзакции может быть указан с помощью SET TRANSACTION. .... Если режим доступа к транзакции установлен на READ ONLY, изменения в таблицах запрещены. Это может позволить механизмам хранения повысить производительность, которые возможны, когда запись не разрешена. . "source dev.mysql.com/doc/refman/8.0/en/set-transaction.html @Manikanta
mysql -u user -p password < script.sql
placeLOCK TABLE TB_EVENT_LOG WRITE; INSERT INTO TB_EVENT_LOG_dummy SELECT * FROM TB_EVENT_LOG ; UNLOCK TABLES; TRUNCATE TABLE TB_EVENT_LOG;
в файле .sql