Возникла необходимость обновить MySQL 5.0 до MySQL 5.1 в Gentoo с минимальным перерывом в работе,
описываю свой опыт. Вполне допускаю, что будет для гуру банальностью, тем не
менее, как "напоминалка"
будет полезна. Хотя бы мне самому :)
Основой послужили статья Peter Davies'a и руководство MySQL Upgrading MySQL.
1. Работа с пакетами
Поскольку Gentoo считает, что версии 5.1 недостойны называться стабильными (хотя она уже довольно
давно является "релизной", в отличии от 5.4. см. планы развития веток MySQL),
то они занесены в список исключений, т.н. "masked", так что при попытке
установить их без вынесения
из этого списка приведут к ошибке.
Чтобы обойти это, нужно зарегистрировать эту версию MySQL в "список исключений
из списка исключений" :)
echo "=dev-db/mysql-community-5.1.21_beta" >> /etc/portage/package.unmask
Если просто комментировать соответствующие строки в файле
/usr/portage/profiles/package.mask, как это
предлагает Питер, то при каждом обновлении пакета этот файл будет обновляться, с соответственным
удалением комментариев. Не совершайте такой ошибки, какую сделал я :)
Gentoo у меня собран 64-битной версией, поэтому не обойтись без явного задания
разрешения сборки MySQL
под amd64. Для этого вносим соответствующую запись в очередной файл исключений:
echo "dev-db/mysql-community ~amd64" >> /etc/portage/package.keywords
и на всякий случай:
echo "virtual/mysql ~amd64" >> /etc/portage/package.keywords
Если просто выставить в командной строке ACCEPT_KEYWORDS="~amd64", то Gentoo не поймет, что такое
ключевое слово было выставлено при установке, и как итог, любое (авто-)обновление пакета
остановится с ошибкой "masked by: ~amd64".
Думаете, что этого уже достаточно для установки? Ошибаетесь :)
Помните, что у нас ещё стоит версия 5.0? Так вот чтобы установить 5.1, нам надо
сначала удалить 5.0.
Явно не быстрое дело, а время простоя, напомню, критично. Поэтому вместо
остановки работающего 5.0,
его удаления и компиляции 5.1, лучше сделать хитрее и воспользоваться
возможностью создания бинарных пакетов.
Создам сначала бинарный пакет установленного mysql-5.0, чтобы в случае неудачи с 5.1 можно было
быстро откатится на предыдущую версию:
quickpkg dev-db/mysql или emerge --verbose --buildpkg dev-db/mysql
Затем подготовим нашу новую версию, создав бинарный пакет для последующей установки:
emerge --verbose --ask --buildpkgonly =dev-db/mysql-community-5.1.21_beta
Использование distcc и ccache обычно позволяет существенно уменьшить время компиляции. У меня при
использовании ccache и distcc на два сервера время сборки пакета mysql-5.0 уменьшилось на 35%.
2. Создание архивной копии
Почему идёт вторым шагом? Потому что операции, приведённые выше, по идее не
должны вызывать никаких
изменений в работающем MySQL, но занимают определённое количество времени, а терять изменения,
внесённые в БД за это время, не хочется.
Делаете любым удобным для себя способом, хотя бы как это описывает Питер, через mysqldump,
архивирование директории с БД после её остановки или репликацию на другой сервер.
Поскольку для меня было важным минимальный перерыв, а настраивать репликацию я не хотел,
я воспользовался первым способом:
mysqldump -A --opt --allow-keywords --flush-logs --hex-blob --master-data --max_allowed_packet=16M \
--quote-names --default-character-set=CP1251 --single-transaction --result-file=BACKUP_MYSQL_5.0.SQL
Единственное, что я хотел бы порекомендовать, это использовать помимо указанных Питером ключей,
ключ --single-transaction, который существенно ускоряет восстановление из бэкапа,
и ключ --default-character-set со значением "cp1251" для тех, у кого таблицы в
cp1251, а не в UTF8,
который выставляется при дампах по умолчанию. У меня бекап, созданный без этих
ключей весил 4.6 Гб, с ключами - 4.1 Гб
3. Обновление MySQL и таблиц
Итак, пакеты и архивные копии готовы, предупреждаем тех.поддержку о возможных
перебоях и приступаем:
Останавливаем работающий MySQL:
/etc/init.d/mysql stop
Удаляем MySQL 5.0:
emerge --unmerge --verbose dev-db/mysql
Устанавливаем бинарный пакет MySQL 5.1:
emerge --usepkgonly --verbose =dev-db/mysql-community-
5.1.21_beta.tbz2
Запускаем установленный MySQL 5.1:
/etc/init.d/mysql start
Обновляем таблицы:
mysql_upgrade --user=root --password=PASSWORD --default-character-set=cp1251 --verbose
При удачном раскладе (объединяйте команды в конвейер с помощью "&&"!) это займёт меньше минуты.
Учтите, что опции сервера, указанные в /etc/mysql/my.cnf, для 5.1 могут отличатся от 5.0!
Поэтому если сервер не стартует, смотрите tail /var/log/mysql/mysqld.err и исправляйте переменные.
Мне, скажем, пришлось терять время, пока я убирал "skip-bdb" и "skip-federated". К сожалению, я не
знаю другого способа проверить на совместимость файлы от 5.0 и 5.1, кроме как
скурпулезного сравнения документации.
|