Вопрос по sql, character-encoding, mysql – Какой лучший способ изменить набор символов для больших таблиц данных?

5

В моей производственной базе данных таблицы, связанные с оповещениями, создаются по умолчанию с CharSet "latin", из-за этого мы получаем ошибку при попытке вставить японские символы в таблицу. Нам нужно изменить кодировку таблицы и столбцов по умолчанию на UTF8. Поскольку в этих таблицах содержится огромное количество данных, команда Alter может занять очень много времени (это заняло 5 часов в моей локальной БД с тем же объемом данных) и заблокировать таблицу, что приведет к потере данных. Можем ли мы спланировать механизм изменения Charset на UTF8 без потери данных.

Какой лучший способ изменить кодировку для огромных таблиц данных?

Я думаю, что вставка символов UTF8 в таблицу latin1 вызовет любую ошибку. ajreal

Ваш Ответ

3   ответа
5

пт-онлайн-схема смены
Он делает именно это - «изменяет структуру таблицы без блокировки чтения или записи» - с некоторыми ограничениями (только таблицы InnoDB и т. Д.) И сопряженными с этим рисками.

1

или в другом экземпляре, когда вы настраиваете команду остановки подчиненного вопроса репликации и изменяете таблицу. Если у вас более одной таблицы, между каждым диалогом вы можете подумать о том, чтобы снова запустить slave, чтобы синхронизировать две базы данных. (Если вы этого не сделаете, синхронизация может занять больше времени). После завершения преобразования реплицированная копия может заменить старую производственную базу данных, а вы удалите старую. Это способ, которым я обнаружил, чтобы минимизировать время простоя.

5

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html:

В большинстве случаев ALTER TABLE создает временную копию исходной таблицы. MySQL ожидает другие операции, которые изменяют таблицу, затем продолжается. Он включает изменение в копию, удаляет исходную таблицу и переименовывает новую. Во время выполнения ALTER TABLE исходная таблица доступна для чтения другими сеансами. Обновления и записи в таблицу, которые начинаются после начала операции ALTER TABLE, останавливаются до тех пор, пока новая таблица не будет готова, а затем автоматически перенаправляются в новую таблицу без каких-либо неудачных обновлений.

Так что да - сложно минимизировать время простоя при этом. Это зависит от профиля использования вашей таблицы, есть ли еще чтение / запись?

Один из подходов, который я могу придумать, - это использовать своего рода репликацию. Поэтому создайте новую таблицу предупреждений, которая использует UTF-8, и найдите способ реплицировать исходную таблицу в новую, не влияя на доступность / пропускную способность. Когда репликация завершится (или достаточно близко), переключите таблицу, переименовав ее?

Конечно, это легче сказать, чем сделать - нужно больше учиться, если это вообще возможно.

Похожие вопросы