Mysql принудительно закрывает соединение во время больших операций схемы
Я участвую в проекте, который требует обновления схем базы данных 14k в Mysql с 46+ новыми таблицами. Сценарий создания этих дополнительных таблиц занимает в среднем 42 секунды для каждой схемы. При запуске в однопоточном режиме проблем не возникает, но чтобы не тратить неделю + на завершение обновления, у нас есть инструмент, который поддерживает многопоточность применения сценария обновления. Это делается в C# с помощью Microsoft Parallel.ForEach с ограничением на число потоков. В настоящее время, если я протолкну его через 4 потока, база данных начнет периодически отвечать фатальными ошибками, которые при копании показывают, что во время ожидания ответа хост принудительно закрыл соединение. Тайм-аут соединения установлен на 120000 с тайм-аутом команды по умолчанию, также установленным на 120000. (Я попытался изменить его на int.MaxValue без заметной разницы) Для базы данных установлено значение "wait_timeout", равное 28800, и "interactive_timeout", равное 28800, как Что ж.
Соответствующая часть исключения:
MySql.Data.MySqlClient.MySqlException (0x80004005): во время выполнения команды произошла неустранимая ошибка. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): При попытке прочитать набор результатов произошла неустранимая ошибка. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Сбой чтения из потока. ---> System.IO.IOException: невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.
И код, используемый для запуска сценария, выглядит следующим образом:
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
using (MySqlTransaction trans = conn.BeginTransaction())
{
using (MySqlCommand command = conn.CreateCommand())
{
command.CommandText = initialCommandText + query;
command.ExecuteNonQuery();
}
trans.Commit();
}
}
Где начальный текст команды - это просто строка "using some_schema_name;\r\n"
Если у кого-нибудь есть какие-либо идеи или потенциальные настройки, которыми я могу манипулировать для увеличения пропускной способности, это будет очень цениться!