2 заметки с тегом

SQL

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

Удаление данных из огромных таблиц

Самый простой и быстрый вариант, полная очистка таблицы:

-- удаляет все записи из таблицы
TRUNCATE TABLE huge_table;

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

DELETE FROM huge_table WHERE date <  NOW() - INTERVAL 1 MONTH;

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

Предлагаю следующий алгоритм:

-- создаем пустую таблицу по образу нужной
CREATE TABLE new_table LIKE huge_table;
-- перемещаем в нее нужные данные ( в нашем случае за последний месяц)
INSERT new_table SELECT * FROM huge_table WHERE date >  NOW() - INTERVAL 1 MONTH;
-- и атомарно меняем таблицы местами
RENAME TABLE huge_table AS huge_table_to_delete, new_table AS huge_table;
-- после этого выполняем удаление без условий (работа уже идет с новой таблицей)
DELETE TABLE huge_table_to_delete;

Готово!

13 апреля   SQL

Бэкап и восстановление MySQL в Docker

# Backup
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql

--lock-tables=false # не блокирует таблицы во время дампа
--single-transaction # оборачивает в единую транзакцию вместо блокировки (только для InnoDB)
--skip-add-locks # ускоряет время восстановления за счет пропуска блокировок

# Restore
cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE
5 апреля   Docker   SQL