CLI AI

Выгрузить одну таблицу MySQL и восстановить только её

2026-08-16

mysqldump -u root -p --single-transaction shop orders --result-file=orders.sql выгружает одну таблицу из базы, а mysql shop < orders.sql возвращает её на место, не трогая остальные. Короткий ответ скрывает две вещи: дамп начинается с DROP TABLE IF EXISTS, и через --where можно выгрузить только нужные строки.

1. Выгрузить одну таблицу

clai
$ clai сделай дамп таблицы orders из базы shop→ mysqldump -h my8 -uroot -p --single-transaction shop orders --result-file=orders.sql

Сначала идёт имя базы, потом таблицы через пробел. --single-transaction снимает дамп InnoDB без блокировки — на живой базе этот флаг не опция, а необходимость. --result-file вместо > сохраняет переносы строк и не даёт тексту ошибок попасть внутрь дампа.

2. Что лежит в таком дампе

clai
$ clai покажи значимые строки дампа→ grep -E 'DROP TABLE|CREATE TABLE|INSERT INTO' orders.sqlDROP TABLE IF EXISTS `orders`;CREATE TABLE `orders` (INSERT INTO `orders` VALUES (1,'acme',120.50,'2026-08-01'),(2,'globex'

Вот о чём обычно не пишут. Самая первая инструкция — DROP TABLE IF EXISTS. Восстановление такого файла не сливает данные с текущими, а заменяет таблицу её состоянием на момент дампа.

3. Только структура, без строк

clai
$ clai выгрузи только структуру таблицы orders→ mysqldump -h my8 -uroot -p --no-data shop orders --result-file=schema.sql

--no-data оставляет CREATE TABLE и убирает все INSERT — проверено, в файле ни одной вставки. Удобно сравнивать схему на проде и на стенде обычным diff.

4. Выгрузить только нужные строки

clai
$ clai выгрузи только заказы за август→ mysqldump -h my8 -uroot -p --single-transaction --where="created >= '2026-08-01'" shop orders --result-file=august.sqlINSERT INTO `orders` VALUES (1,'acme',120.50,'2026-08-01'),(3,'initech',45.20,'2026-08-10');

В дамп попали две строки из трёх — июльский заказ отфильтрован. Выше показана строка INSERT из получившегося файла. Так делают точечные выгрузки: по дате, по клиенту, по диапазону id.

5. Восстановить одну таблицу в живую базу

clai
$ clai восстанови таблицу orders из дампа→ mysql -h my8 -uroot -p shop < orders.sql

Проверено на живой базе: до восстановления в orders было 2 строки, после — 3, а соседняя таблица customers осталась ровно такой, какой была. Так и откатывают одну таблицу, не задевая остальные.

6. Тот же дамп в другую базу

clai
$ clai залей дамп таблицы в базу shop_copy→ mysql -h my8 -uroot -p shop_copy < orders.sql

В дампе одной таблицы нет ни CREATE DATABASE, ни USE, поэтому приёмник выбирается аргументом mysql. Проверено: в shop_copy появилась таблица orders со всеми тремя строками.

Gotchas

  • Дамп одной таблицы начинается с DROP TABLE. Всё, что записали в неё после снятия дампа, при восстановлении исчезнет. Если нужно именно дописать, снимайте дамп с --no-create-info.
  • --no-create-info упирается в первичный ключ. Проверено: заливка такого файла поверх существующих строк даёт ERROR 1062 (23000) at line 24: Duplicate entry '1' for key 'orders.PRIMARY'. Дописывание работает только для новых строк — либо чистите таблицу заранее, либо добавляйте --insert-ignore или --replace.
  • Без --single-transaction дамп блокирует таблицу. На MyISAM этого не избежать, на InnoDB это авария, устроенная своими руками посреди рабочего дня.

Related questions

Как выгрузить несколько таблиц? Перечислить: mysqldump shop orders customers. Обратный флаг — --ignore-table=shop.logs, он исключает.

Как сжать дамп на лету? mysqldump … | gzip > dump.sql.gz, восстановление — zcat dump.sql.gz | mysql shop. С --result-file так не выйдет: он сам пишет файл.

Чем mysqldump хуже mysqlpump и mydumper? Оба конкурента выгружают параллельно и выигрывают на больших базах, зато mysqldump есть везде, а его формат читается глазами.

See also

CliAI пишет строку дампа с нужными флагами и показывает её до того, как она коснётся базы. Поставить одной строкой.