Как узнать версию MySQL по FRM-файлу

Недавно я помогал клиенту разобраться почему минорное обновление MySQL требовало пересоздания некоторых таблиц. Утилита mysql_upgrade должна запускаться для любого обновления вне зависимости от разницы в версиях, но при минорном обновлении она обычно не требует пересоздания таблиц.

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

Знаете ли вы, что в случаях подобных этому, есть быстрый, простой и безопасный способ проверить версию MySQL прописанную в таблице? Вы можете сделать это, распарсив FRM файл, в соответствии с описанием формата изложенным здесь.

В спецификации указано, что номер версии занимает 4 байта и начинается с офсета 0x33. Так как он записан в формате little endian, вы можете получить номер версии, прочитав первые 2 байта.

Это значит, что нам нужно воспользоваться hexdump, прочитать 2 байта, начиная с офсета 0x33 и преобразовать их в десятичный формат, чтобы получить версию MySQL:

Первый пример соответствует таблице созданной в MySQL версии 5.5.32, а второй – версии 5.1.73.

Значит ли это, что таблица 51_test была изначально создана в MySQL 5.1.73? Не обязательно, т.к. MySQL обновляет штамп версии в FRM-файле, каждый раз когда таблица перестраивается или изменяется ALTER’ом.

В документации указано, что детали хранения штампа версии могут быть изменены при переходе к новому текстовому формату хранения, но мне удалось получить версию вышеописанным способом для таблиц созданных в MySQL 5.7.7.

Источник: http://web-hl.ru/index.php/2015/08/30/how-to-get-mysql-version-from-frm-file/

Be the first to comment

Leave a Reply

Your email address will not be published.


*