Преобразование базы данных среднего размера из одной кодировки в другую с минимальным временем простоя
Наша компания (малый бизнес) недавно начала новый бизнес в регионе Азиатско-Тихоокеанского региона, который требует от нас поддержки 4-битных символов в нашей базе данных MySQL 5.7.
Это требование означает, что нам нужно преобразовать нашу базу данных из одной кодировки в другую.
Таблицы базы данных имеют размер от нескольких строк до ~100 ГБ. Некоторые имеют много внешних ключей, индексов. Есть одна или две хранимые процедуры, но их можно пересчитать по пальцам.
Для этого мы можем запланировать время простоя.
Мы работаем в AWS RDS, и чтобы добиться наилучшего времени преобразования, мы решили сделать снимок и перейти к экземпляру с наибольшей емкостью и максимально подготовленным вводом-выводом, который мы могли бы использовать. Это было похоже на r5.24xlarge или что-то в этом роде с 50000 IOPS.
К сожалению, когда мы тестируем это, преобразование каждой таблицы с помощью ALTER TABLE SET CHARSET занимает более 8-12 часов...
Хотя мы можем запланировать время простоя, мы не можем простаивать в течение этого времени. 4 часа, вероятно, выходят за рамки того, что бизнес считает приемлемым.
Мы начали удалять старые данные из нескольких таблиц, но этого недостаточно.
Основным узким местом здесь является то, что пиковая пропускная способность диска RDS достигает 350 МБ/с независимо от того, сколько преобразований таблиц мы выполняем одновременно, размера БД, выделения памяти или подготовленного количества операций ввода-вывода в секунду. Действительно, IOPS никогда не достигает 50 КБ, а процессор/память минимальны. Очередь на диске достигает около 10, что, как я полагаю, связано с ограничением пропускной способности.
Мы также попробовали Aurora, которая в нашем случае оказалась медленнее.
Есть ли у кого-нибудь идеи, как мы можем еще больше увеличить пропускную способность или сократить время, необходимое для этого преобразования?