Как запустить несколько версий mysql сервера на одной машине.

Для экспериментов я стараюсь использовать последние версии ПО. Это позволят познакомиться с новыми возможностями продуктов и оценить нововведения до применения в production - где важен не только функционал но и стабильность. Так в качестве базы данных на экспериментальных проектах оказалась база данных mysql-server-5.7.

Одним из таких проектов является Партнерский магазин книг. Вариант обновление данных - загрузка товара из sql дампа. Проблема заключается в том, что дамп генерируется на базе mysql 4.1 который не совместим с mysql 5.7

Конвертация дампа требует использование mysql-server версии 5.5 как промежуточного звена для восстановления и снятия дампа в корректном формате. Встает вопрос, как запустить несколько mysql серверов разных версий на одном сервере?
Ответ: Docker

Docker, инструмент позволяющий упаковывать приложения с зависимости в отдельный отдельных блок, легко перемещаемый между разработчиками или production среду.

Далее мы опишем шаги на примере Облачного хостинга и сервера на базе Ubuntu 14.04.

Добавляем ключ репозитория Docker в систему Шаг: 1

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
Шаг: 2 - добавляем репозиторий из под root
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list
apt-get update

Шаг: 3 устанавливаем правильную версию ядра и сам докер
apt-get install linux-image-generic-lts-trusty
apt-get install docker-engine
Для работы скрипта нам потребуется mysql-client
apt-get install mysql-client
После чего нужно перезагрузить машину и подключаем swap файл
dd if=/dev/zero of=/swapfile bs=256M count=8
chown root:root /swapfile
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile

Теперь для экспорта нам достаточно запустить небольшой bash скрипт

#!/bin/bash
curl http://my-shop.ru/_files/prices/partner.sql.gz -L > my_shop_ru.sql.gz
DOCKER_ID=$(docker run  -i -t -d -p 3307:3306  -v $(pwd)/mysqld.cnf:/mysql/etc/mysqld.cnf   --name mysql55  micktwomey/mysql5.5)
sleep 5
echo "CREATE DATABASE my_shop CHARACTER SET utf8;" | mysql -udocker -pdocker -h127.0.0.1 -P3307
zcat "my_shop_ru.sql.gz" | sed 's/TYPE=MyISAM//g'  | iconv -f cp1251 -t utf8 | mysql -udocker -pdocker -h127.0.0.1 -P3307 my_shop
mysqldump  -udocker -pdocker -h127.0.0.1 -P3307 my_shop | gzip > /mnt/tmpfs/my_shop.sql.gz
docker stop mysql55
docker rm mysql55

За основу мы используем наработки с github и немного модифицируем конфигурационный файл mysqld, для увеличения скорости работы.

Требует внимания строка запуска
DOCKER_ID=$(docker run -i -t -d -p 3307:3306 -v $(pwd)/mysqld.cnf:/mysql/etc/mysqld.cnf --name mysql55 micktwomey/mysql5.5)
Мы заменяем стандартный конфиг на свой.

[mysqld]
bind-address = 0.0.0.0
binlog_format = mixed
character-set-server = utf8
collation-server = utf8_general_ci
datadir = /mysql/data
engine = INNODB
expire_logs_days = 1
innodb_additional_mem_pool_size = 20M
innodb_buffer_pool_size = 512M
innodb_data_file_path = ibdata1:10M:autoextend
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 50
innodb_log_buffer_size = 16M
innodb_log_file_size = 128M
key_buffer_size = 256M
log-bin = mysql-bin
long_query_time = 2
max_allowed_packet = 67108864
max_connections = 50
max_heap_table_size = 32M
myisam_sort_buffer_size = 64M
query_cache_size= 16M
read_buffer_size = 16M
read_rnd_buffer_size = 4M
server-id = 1
skip-external-locking
slow_query_log = 1
sort_buffer_size = 1M
table_open_cache = 500
thread_cache_size = 8
thread_concurrency = 4
tmp_table_size = 32M
socket = /mysql/mysql.sock

Первый запуск скрипта будет немного дольше остальных тк будет скачен docker-image. Последующие запуски не потребуют скачивания образов docker контейнера и будут работать быстрей.

Вам может понравиться