Для экспериментов я стараюсь использовать последние версии ПО. Это позволят познакомиться с новыми возможностями продуктов и оценить нововведения до применения в 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
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
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 контейнера и будут работать быстрей.