А вот как!
Приведённый ниже python-код разбивает дамп базы mysql на несколько дампов таблиц. Нужно это бывает как правило для его параллельного потабличного импорта, так как импорт в варианте с дампом всех таблиц в одном файле выполняется на одном ядре, то есть, в один поток. Исправим-же это досадное недоразумение.
#!/usr/bin/env python
""" mysql dump splitter by table """
import sys
from subprocess import Popen, PIPE
begin_table_tag = (b'-- Table structure for table `',
b'-- Temporary table structure f')
with sys.stdin.buffer as IN:
OUT = None
FILE = None
HEAD = b''
for i in IN:
if i[0:30] in begin_table_tag:
TABLE = i.decode().split('`', 2)[1]
if OUT:
OUT.communicate()
FILE.close()
FILE = open(f"{TABLE}.sql.bz2", 'wb')
OUT = Popen(['lbzip2','-c'], stdin=PIPE, stdout=FILE)
OUT.stdin.write(HEAD)
if OUT:
OUT.stdin.write(i)
else:
HEAD += i
OUT.communicate()
FILE.close()
Для корректной работы потребуется утилиты lbzip2, и pv (опционально).
Пример использования:
mkdir z && cd z && pv ../mydump.sql.bz2 | lbzip2 -cd | ../mysqldump-splitter.py
где,
mydump.sql.bz2 — файл дампа mysql, созданный командой mysqldump --add-drop-table --force --complete-insert --single-transaction dbname
mysqldump-splitter.py
— приведенный выше код python
z — папка, в которую будут сохранены дампы таблиц.
Но как же импортировать созданные таким образом дампы таблиц в наш mysql-сервер?
Очень просто, импортировать все наши файлы в 16 потоков можно вот так:
for n in *.bz2; do echo "bzcat $n | mysql && rm -v $n"; done | xargs -P16 -I{} bash -c "{}"