Ситуация

У вас есть база данных, которая не толерантна к большому объёму INSERT-ов и UPDATE-ов. Но у вас также есть большой дамп с кучей таких операций.

Как безопасно импортировать дамп в базу и не убить её?

Решение

Если вы делаете вставку через терминал, например, направляя поток сразу в mysql, то можно просто ограничить скорость записи с помощью утилиты pv:

# скорость ограничена 100 тысячами строк в секунду
pv -L 100k -l dump.sql | mysql -u root -p

# скорость ограничена 100 строками в секунду
pv -L 100 -l dump.sql | mysql -u root -p
  • -l – строчный режим, ведь pv может ограничивать скорость и просто в байтах
  • -L 100 – необходимое ограничение

Описание

Вообще, утилита pv (pipevieiwer) известна как способ отображения прогресса и скорости UNIX-пайплайна. Если вы делаете вот так:

my_program < some_input.bin
# или вот так
cat some_input.bin > my_program

То прогресс виден не будет. Это ок, когда речь идёт о небольших файлах. Но для больших можно сделать так:

pv some_input.bin | my_program

И тогда вы увидите что-то подобное:

➜  pv some_input.bin | my_program
154KiB 0:00:09 [1000 B/s] [=====>           ]  12% ETA 12:03:16:07

Установка

Утилита есть в стандартном наборе репозиториев большинства дистров, поэтому ограничусь командами для копипаста.

MacOS

brew install pv

Ubuntu/Debian

sudo apt-get install pv

CentOS/Fedora

sudo yum install pv