12.10.2011

Сборка MySQL под Debian

Сначала поставим пакет поддержки AIO (асинхронный ввод-вывод к диску), чтобы движки стораджей, которые это умеют (например InnoDB), скомпилировались с этой поддержкой:
apt-get install libaio1 libaio-dev
Ну и еще поставим специфические для сборки пакеты:
apt-get install debhelper devscripts cmake libedit-dev libreadline-dev

Переходим в директорию, где будем работать:
cd /usr/src

На страничке Download MySQL Community Server переключаем выпадающее меню из "Linux-Generic" в "Source Code". Важно знать, что версии выше 5.1 не соберутся по этому мануалу, потому что у них используется configure.cmake вместо configure. Качайте 5.1.
Загружаем нужную версию, помеченную как Generic Linux (Architecture Independent), Compressed TAR Archive.

Кладем этот пакет в /usr/src


Далее нужно выбрать опции конфигурирования. Их описание имеется тут.

Опубликую сначала стандартные опции конфигурирования MySQL на Debian (добытые утилитой mysqlbug):
./configure  '--build=x86_64-linux-gnu' '--host=x86_64-linux-gnu' '--prefix=/usr' '--exec-prefix=/usr' '--libexecdir=/usr/sbin' '--datadir=/usr/share' '--localstatedir=/var/lib/mysql' '--includedir=/usr/include' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-server-suffix=-24+lenny5' '--with-comment=(Debian)' '--with-system-type=debian-linux-gnu' '--enable-shared' '--enable-static' '--enable-thread-safe-client' '--enable-local-infile' '--with-big-tables' '--with-unix-socket-path=/var/run/mysqld/mysqld.sock' '--with-mysqld-user=mysql' '--with-libwrap' '--without-openssl' '--with-yassl' '--without-docs' '--with-bench' '--without-readline' '--with-extra-charsets=all' '--with-innodb' '--with-archive-storage-engine' '--with-csv-storage-engine' '--with-federated-storage-engine' '--with-blackhole-storage-engine' '--with-sphinx-storage-engine' '--without-embedded-server' '--with-ndbcluster' '--with-ndb-ccflags=-fPIC' '--with-ndb-shm' '--without-ndb-sci' '--without-ndb-test' '--with-embedded-server' '--with-embedded-privilege-control' '--without-ndb-docs' 'CC=gcc' 'CFLAGS=-DBIG_JOINS=1 -O2 -fPIC' 'CPPFLAGS=' 'CXXFLAGS=-DBIG_JOINS=1 -felide-constructors -fno-rtti -O2' 'CXX=g++' 'FFLAGS=-g -O2' 'LDFLAGS=' 'build_alias=x86_64-linux-gnu' 'host_alias=x86_64-linux-gnu' 'CFLAGS= -DDBUG_OFF -DBIG_JOINS=1 -O2 -fPIC  ' 'CXXFLAGS= -DDBUG_OFF -DBIG_JOINS=1 -felide-constructors -fno-rtti -O2   -fno-implicit-templates -fno-exceptions -fno-rtti'

 А мы добавим еще несколько настроек (Вам оно может и не надо, я в качестве примера просто показываю):
'--enable-profiling' '--with-debug' '--with-vio' '--with-charset=utf8'

И наоборот удалим '--with-yassl' и '--without-openssl', потому что они переведены в depricated.




Распаковываем:
tar xzf mysql-5.1.59.tar.gz

Переименовываем так, чтобы указать нашу версию. Это надо, чтобы сразу можно было отличить свой пакет от стандартного:
mv mysql-5.1.59 mysql-5.1.59-nsq1

Переходим в директорию:
cd mysql-5.1.59-nsq1

Деперь "дебианизируем" пакет:
dh_make --single -f ../mysql-5.1.59.tar.gz


В результате в этой директории появилась поддиректория debian, а уровнем выше, где мы оставили тарбол, появилась копия тарбола с надписью orig.

Поправим пару параметров перед сборкой. Например Description (один пробел слева как на образце обязателен): 
vi debian/control

Source: mysql
Section: unknown
Priority: extra
Maintainer: Michael Abramovich
Build-Depends: debhelper (>= 7.0.50~), autotools-dev
Standards-Version: 3.8.4
Homepage: http://dev.mysql.com/
#Vcs-Git: git://git.debian.org/collab-maint/mysql.git
#Vcs-Browser: http://git.debian.org/?p=collab-maint/mysql.git;a=summary

Package: mysql-server-5.1
Architecture: amd64
Depends: mysql-client-5.1 (>= 5.1.49-3), libdbi-perl, perl (>= 5.6), libc6 (>= 2.7), libgcc1 (>= 1:4.1.1), libmysqlclient16 (>= 5.1.21-1), libstdc++6 (>= 4.1.1), zlib1g (>= 1:1.1.4), debconf (>= 0.5) | debconf-2.0, psmisc, passwd, lsb-base (>= 3.0-10), mysql-server-core-5.1 (= 5.1.49-3)
Pre-Depends: mysql-common (>= 5.1.49-3), adduser (>= 3.40), debconf
Description: MySQL database server binaries and system database setup
 MySQL is a fast, stable and true multi-user, multi-threaded SQL database
 server. SQL (Structured Query Language) is the most popular database query
 language in the world. The main goals of MySQL are speed, robustness and
 ease of use.
 .
 This package contains all the infrastructure needed to setup system
 databases.

Далее делаем вещь, специфическую для нашей сборки - запрещаем стандартную автоконфигурацию и вписываем свою: стандартную для Debian с вкраплениями своих настроек, указанных выше.
(ВНИМАНИЕ: перед строкой ./configure --pref..., которая во второй строке, не должно быть ни одного пробела и только один [Tab]. Иначе сборщик не заметит эту строку и конфигурация не пройдет. Первый признак ошибки - слишком быстро пробежавший билд, а в пакете не будет ничего кроме директории /usr):


vi debian/rules
override_dh_auto_configure:
               
./configure  '--build=x86_64-linux-gnu' '--host=x86_64-linux-gnu' '--prefix=/usr' '--exec-prefix=/usr' '--libexecdir=/usr/sbin' '--datadir=/usr/share' '--localstatedir=/var/lib/mysql' '--includedir=/usr/include' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-server-suffix=-24+lenny5' '--with-comment=(Debian)' '--with-system-type=debian-linux-gnu' '--enable-shared' '--enable-static' '--enable-thread-safe-client' '--enable-local-infile' '--with-big-tables' '--enable-profiling' '--with-debug' '--with-vio' '--with-charset=utf8' '--with-unix-socket-path=/var/run/mysqld/mysqld.sock' '--with-mysqld-user=mysql' '--with-libwrap' '--without-openssl' '--with-yassl' '--without-docs' '--with-bench' '--without-readline' '--with-extra-charsets=all' '--with-innodb' '--with-archive-storage-engine' '--with-csv-storage-engine' '--with-federated-storage-engine' '--with-blackhole-storage-engine' '--with-sphinx-storage-engine' '--without-embedded-server' '--with-ndbcluster' '--with-ndb-ccflags=-fPIC' '--with-ndb-shm' '--without-ndb-sci' '--without-ndb-test' '--with-embedded-server' '--with-embedded-privilege-control' '--without-ndb-docs' 'CC=gcc' 'CFLAGS=-DBIG_JOINS=1 -O2 -fPIC' 'CPPFLAGS=' 'CXXFLAGS=-DBIG_JOINS=1 -felide-constructors -fno-rtti -O2' 'CXX=g++' 'FFLAGS=-g -O2' 'LDFLAGS=' 'build_alias=x86_64-linux-gnu' 'host_alias=x86_64-linux-gnu' 'CFLAGS= -DDBUG_OFF -DBIG_JOINS=1 -O2 -fPIC  ' 'CXXFLAGS= -DDBUG_OFF -DBIG_JOINS=1 -felide-constructors -fno-rtti -O2   -fno-implicit-templates -fno-exceptions -fno-rtti'

Установим файлы приложения в сам пакет, а то он пустой получится:
dh_install

Так как у нас ванильный пакет, а не дебиановский, то у нас изначально нету никакого init-скрипта. Создадим его, перетерев старый (пробел только перед шибэнгом не забудьте стереть):

tee > debian/init.d.ex
#!/bin/bash

#if [ ! -d /backup/mysql_main ]; then
#  mkdir /backup/mysql_main
#  chown -R mysql:mysql /backup/mysql_main
#  chmod 700 /backup/mysql_main
#fi

#ret=`mount | grep mysql_db`
#if [ "$ret" = "" ];then
#  mount -t tmpfs /dev/shm -o size=4096m,noatime,nodiratime,relatime,nosuid,nodev,noexec /mysql_db
#fi

if [ ! -d /var/run/mysql ]; then
  mkdir /var/run/mysql
  chown -R mysql:mysql /var/run/mysql
fi

if [ ! -d /var/log/mysql ]; then
  mkdir /var/log/mysql
  chown -R mysql:mysql /var/log/mysql
fi

if [ ! -d /var/lib/mysql ]; then
  mkdir /var/lib/mysql
  chown -R mysql:mysql /var/lib/mysql
fi

if [ ! -d /var/run/mysqld ]; then
  mkdir -p /var/run/mysqld
  chown -R mysql:mysql /var/run/mysqld
fi

if [ ! -d /var/run/mysqld ]; then
  mkdir -p /var/run/mysqld
  chown -R mysql:mysql /var/run/mysqld
fi

case $1 in
  start)
#    echo "Performing database copying to the memory. Please wait..."
#    rm -rf /mysql_db/*
#    cp -r /var/lib/mysql/* /mysql_db
#    chown -R mysql:mysql /mysql_db
    su - mysql -c "/usr/bin/mysql.server start"
    #if [ ! -f /var/www/var/run/mysqld/mysqld.sock ]; then
    #  ln -s /var/www/var/run/mysqld/mysqld.sock /var/run/mysqld/mysqld.sock > /dev/null 2>&1
    #fi
    root_passwd=`cat /usr/local/ispmgr/etc/ispmgr.conf | grep -A 4 'Type mysql'|grep Pas|awk '{print $2}'`
    mysql -uroot -p$root_passwd -e "set global max_connections = 8192;"
    uid=`cat /etc/passwd|grep mysql | sed 's/:/ /g' | awk '{print $3}'`
    if [ ! -d /root/cgroups/${uid} ]; then
      mkdir /root/cgroups/${uid}
    fi
    ps aux|grep mysql |grep -v standby |grep -v grep | awk '{print $2}' > /tmp/tasks
    for i in `cat /tmp/tasks`; do
      echo ${i} > /root/cgroups/${uid}/tasks
    done
    rm -f /tmp/tasks
    echo 256 > /root/cgroups/${uid}/cpu.shares
    exit 0;
  ;;
  stop)
    su - mysql -c "/usr/bin/mysql.server stop"
    #if [ ! -f /var/www/var/run/mysqld/mysqld.sock ]; then
    #  ln -s /var/www/var/run/mysqld/mysqld.sock /var/run/mysqld/mysqld.sock > /dev/null 2>&1
    #fi
#    echo "Database stopped. Now copying to the disk. Please wait..."
#    rm -rf /var/lib/mysql/*
#    cp -r /mysql_db/* /var/lib/mysql
#    chown -R mysql:mysql /var/lib/mysql
    exit 0;
  ;;
  restart)
    /etc/init.d/mysql stop
    /etc/init.d/mysql start
  ;;
  *)
    echo "Usage: mysql start|stop|restart"
  ;;
esac

И установим новый init-скрипт:

dh_installinit

Собираем. Это надолго:

debuild -uc -us

Отходим назад и смотрим:

ls ../*deb
Можно теперь поставить:
dpkg -i ../mysql_5.1.59-nsq1-1_amd64.deb







Комментариев нет:

Отправить комментарий