Я делаю некоторые подготовительные работы для миграции большого сайта.
Размер базы данных составляет около 10 ГБ, а в нескольких таблицах содержится более 15 миллионов записей. К сожалению, это происходит только в виде большого файла mysqldump в формате SQL из-за отношений с клиентами за пределами моей компетенции, но вы знаете, как это происходит. Моя цель - минимизировать время простоя и, следовательно, импортировать данные как можно быстрее.
Я попытался использовать стандартный интерфейс MySQL CLI следующим образом:
$mysql database_name < superhuge_sql_file -u username -p
Это, однако, очень медленно.
Чтобы попытаться ускорить процесс, я использовал awk, чтобы разбить файл на куски для каждой таблицы со связанными данными, и создал небольшой сценарий оболочки, чтобы попытаться импортировать таблицы параллельно, вот так;
#!/bin/sh
awk '/DROP TABLE/{f=0 ;n++; print >(file="out_" n); close("out_" n-1)} f{ print > file}; /DROP TABLE/{f=1}' superhuge.sql
for (( i = 1; i <= 95; i++ ))
do
mysql -u admin --password=thepassword database_name < /path/to/out_$i &
done
Стоит отметить, что это скрипт «один раз и уничтожь» (пароли в скриптах и т. Д.).
Теперь, это работает, но все еще занимает более 3 часов, чтобы завершить работу на четырехъядерном сервере, не делая ничего другого в настоящее время. Таблицы выполняют импорт параллельно, но не все сразу, и попытка получить информацию о сервере MySQL через интерфейс командной строки очень медленная во время процесса. Я не уверен, почему, но попытка получить доступ к таблицам, используя ту же учетную запись пользователя mysql, зависает, пока это происходит. max_user_connections не ограничено.
Я установил максимальное число соединений в my.cnf на 500, но в противном случае не настроил MySQL на этом сервере.
У меня была хорошая охота, но мне было интересно, есть ли какие-либо параметры конфигурации MySQL, которые помогут ускорить этот процесс, или какие-либо другие методы, которые я пропустил, будут быстрее.