shimxmemo

メモをのこすよ!

CentOS 5.8にソースからTokuDB入りMySQLをインストールするよ

何度も諦めそうになりましたよマジで。

 

参照したのは

Bizlog: TokuDB 7.0.1のCommunity EditionをUbuntuでビルド

の後半部分。

ただ、古いバージョンなので今は無いファイルが多かった。

あとは

源码编译安装tokudb的过程 - NoSQL数据库

中国語で死にかけた。

希望大家在安装时别再遇到类似的问题。 

(意訳:インストールで同じような問題が発生した場合、これで解決する事を願うよ!)

に全俺が泣いた!

また、TokuDBの起動確認とかは

CentOS 5.8にコンパイル済みのTokuDB入りMySQLをインストールするよ - shimxmemo

を参照の事。

なぜならこの記事書いてて力尽き(ry

インストール環境

# cat /etc/redhat-release
CentOS release 5.8 (Final)
 
# uname -a
Linux hostname 2.6.18-308.13.1.el5 #1 SMP Tue Aug 21 17:10:18 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

準備

Documentation, Collateral and White Papers | Tokutek

TokuDB for MySQL 5.5 Users Guide(pdf)

によると必要要件は

Operating Systems: These instructions were tested using CentOS 5.8. They are expected to work with other Linux distributions.

Compiler: These instructions were tested using gcc 4.1.2 and gcc-c++ 4.1.2.

Packages: You will need the following packages installed at the noted revision or later:

•autoconf 2.61

•automake 1.10

•bison 2.3

•ccache 2.4

•cmake 2.6

•libtool 1.5

•ncurses-devel 5.6

readline 5.2

•zlib-devel 1.2

Processor Architecture: TokuDB requires a 64-bit operating system.

とのこと。

あと、mysqlユーザーとか作っておいてね。

参照

CentOS 5.8にcmakeインストール - shimxmemo

valgrindインストール

作業中全然うまくいかなく、色々な事を試したので、もしかしたらいらないかも。

# cd /usr/local/src/
# wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2
# tar jxvf valgrind-3.9.0.tar.bz2
# cd valgrind-3.9.0
# ./configure
# make
# sudo make install

インストール手順

ft-engineのダウンロード

# cd /usr/local/src/
# git clone git://github.com/Tokutek/tokudb-engine.git tokudb-engine
# cd tokudb-engine

ちなみに

# scripts/make.mysql.bash usage

で使い方を確認

 

さて、このままだとmake途中でこけるので、ここでインストールスクリプトの修正

第一回スクリプト修正

バックアップ

# cp ./scripts/make.mysql.bash ./scripts/make.mysql.bash.bak
# cp ./scripts/common.sh ./scripts/common.sh.bak
make.mysql.bashの修正
# vi ./scripts/make.mysql.bash

ディレクトリの存在確認ができていない部分を修正

> if [ ! -d $mysql_distro ] ; then
< if [ ! -d $mysql_distro-$mysql_version ] ; then
      github_download Tokutek/$mysql_repo $(git_tree $git_tag $mysql_tree) $mysql_distro-$mysql_version
  fi

ソースを一旦ダウンロードする為にexitを入れる

  if  $mysql_repo =~ mariadb  ||  $mysql_distro =~ ^mariadb  ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) extra/jemalloc
  elif [ ! -d storage/tokudb/ft-index/third_party/jemalloc ] ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) storage/tokudb/ft-index/third_party/jemalloc
  fi
< # tmp exit!
< exit;
./scripts/common.shの修正

また、このままだと二回実行するとmkdirでこけるので、存在判定を入れ、ディレクトリが存在しない場合のみmkdirするようにする

vi ./scripts/common.sh
>    mkdir $dest
<    if [ ! -d $dest ] ; then
<        mkdir $dest
<    fi

いよいよインストール作業開始

ソースのダウンロード

パスを通す(今回は/usr/local/gcc-4.7.2/bin/gcc-4.7.2/usr/local/gcc-4.7.2/bin/g++-4.7.2を利用)

# export LD_LIBRARY_PATH=/usr/local/gcc-4.7.2/lib:$LD_LIBRARY_PATH

ソースダウンロード(使うgccの場所を指定する事)

# ./scripts/make.mysql.bash \
--mysqlbuild=mysql-5.5.36-tokudb-7.1.5-linux-x86_64 \
--cc=/usr/local/gcc-4.7.2/bin/gcc-4.7.2 \
--cxx=/usr/local/gcc-4.7.2/bin/g++-4.7.2

第二回スクリプト修正

ダウンロードが正常に完了したら、仕込んでいたexitを消す。

# vi ./scripts/make.mysql.bash
  if  $mysql_repo =~ mariadb  ||  $mysql_distro =~ ^mariadb  ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) extra/jemalloc
  elif [ ! -d storage/tokudb/ft-index/third_party/jemalloc ] ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) storage/tokudb/ft-index/third_party/jemalloc
  fi
> # tmp exit!
> exit;

この状態でmakeしてもダメ。今の環境だと、

[ 12%] Completed 'build_jemalloc'
[ 12%] Built target build_jemalloc
make: *** [all] エラー 2

というエラーでこける。

原因としては

  • cmakeコマンドのオプションが足りていない
  • cmakeのテスト内容で使えない引数(-fuse-linker-plugin)がある

という事なので、それぞれ対応していくことに。

cmakeコマンドのオプションが足りていない

function generate_cmake_cmd ()のcmakeコマンド部分を修正する必要がある。

最低限

  • -D WITH_DEBUG=1
  • -D MYSQL_MAINTAINER_MODE:BOOL=OFF

の二つのオプションを追加しないとエラーが出てmakeできない。

また、MySQLインストール時のオプションもここで追加する必要あり。

# vi ./scripts/make.mysql.bash
function generate_cmake_cmd ()
      echo -n CC=$cc CXX=$cxx cmake \
          -D BUILD_CONFIG=mysql_release \
          -D CMAKE_BUILD_TYPE=$cmake_build_type \
          -D CMAKE_TOKUDB_REVISION=$ft_revision \
          -D BUILD_TESTING=OFF \
          -D USE_GTAGS=OFF \
          -D USE_CTAGS=OFF \
          -D USE_ETAGS=OFF \
          -D USE_CSCOPE=OFF

<     # extend for make
<     echo -n " " \
<         -D WITH_DEBUG=1 \
<         -D MYSQL_MAINTAINER_MODE:BOOL=OFF
<
<     # extend mysql(今回最低限必須なオプション)
<     echo -n " " \
<         -D WITH_PLUGINS=all \
<         -D WITH_PARTITION_STORAGE_ENGINE:BOOL=ON
<
<     # extend mysql charaset(移行前のDBがsjisだったので)
<     echo -n " " \
<         -D DEFAULT_CHARSET=sjis \
<         -D DEFAULT_COLLATION=sjis_japanese_ci \
<         -D WITH_EXTRA_CHARSETS=ALL
<
<     # extend mysql dir(インストールするディレクトリやデータディレクトリを変えたい時のみ必要)
<     echo -n " " \
<         -D SYSCONFDIR:PATH=/usr/local/mysqls/mysql_tokudb \
<         -D CMAKE_INSTALL_PREFIX:PATH=/usr/local/mysqls/mysql_tokudb \
<         -D MYSQL_DATADIR:PATH=/usr/local/mysqls/mysql_tokudb/var \
<         -D MYSQL_UNIX_ADDR=/tmp/mysql_tokudb.sock \
<         -D MYSQL_TCP_PORT=30002
cmakeのテスト内容で使えない引数(-fuse-linker-plugin)がある

また、途中のft-indexのコンパイルの際、「-fuse-linker-pluginが無い」と怒られてインストールできないので

# vi /usr/local/src/tokudb-engine/mysql-5.5.36/storage/tokudb/ft-index/cmake_modules/TokuSetupCompiler.cmake
>   set(CMAKE_C_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_C_FLAGS_RELEASE} -UNDEBUG")
>   set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_CXX_FLAGS_RELEASE} -UNDEBUG")
>   set(CMAKE_EXE_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_EXE_LINKER_FLAGS}")
>   set(CMAKE_SHARED_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_SHARED_LINKER_FLAGS}")
< #  set(CMAKE_C_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_C_FLAGS_RELEASE} -UNDEBUG")
< #  set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_CXX_FLAGS_RELEASE} -UNDEBUG")
< #  set(CMAKE_EXE_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_EXE_LINKER_FLAGS}")
< #  set(CMAKE_SHARED_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_SHARED_LINKER_FLAGS}")
<   set(CMAKE_C_FLAGS_RELEASE "-g -O3 -flto ${CMAKE_C_FLAGS_RELEASE} -UNDEBUG")
<   set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -flto ${CMAKE_CXX_FLAGS_RELEASE} -UNDEBUG")
<   set(CMAKE_EXE_LINKER_FLAGS "-g ${CMAKE_EXE_LINKER_FLAGS}")
<   set(CMAKE_SHARED_LINKER_FLAGS "-g ${CMAKE_SHARED_LINKER_FLAGS}")
# vi /usr/local/src/tokudb-engine/mysql-5.5.36/storage/tokudb/CMakeLists.txt
> SET_PROPERTY(TARGET tokudb APPEND PROPERTY LINK_FLAGS_RELEASE "-flto -fuse-linker-plugin")
< #SET_PROPERTY(TARGET tokudb APPEND PROPERTY LINK_FLAGS_RELEASE "-flto -fuse-linker-plugin")
< SET_PROPERTY(TARGET tokudb APPEND PROPERTY LINK_FLAGS_RELEASE "-flto")

に。

パッケージ作成

再度

# ./scripts/make.mysql.bash \
--mysqlbuild=mysql-5.5.36-tokudb-7.1.5-linux-x86_64 \
--cc=/usr/local/gcc-4.7.2/bin/gcc-4.7.2 \
--cxx=/usr/local/gcc-4.7.2/bin/g++-4.7.2

を実行。

CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: MySQL
CPack: - Install project: MySQL
CPack: Create package
CPack: - package: /usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo/mysql-5.5.36-tokudb-7.1.5-linux-x86_64.tar.gz generated.
/usr/local/src/tokudb-engine/mysql-5.5.36

で成功

/usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo以下にパッケージ化されたものができるので、それを解凍して移動

MySQLセットアップ

デフォルトのディレクトリ(/usr/local/mysql)へセットアップ

解凍と移動

# cd /usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo
# tar zxvf mysql-5.5.36-tokudb-7.1.5-linux-x86_64.tar.gz
# mv ./mysql-5.5.36-tokudb-7.1.5-linux-x86_64 /usr/local/mysql

初期設定と起動

# cd /usr/local/mysql
# cp ./support-files/my-innodb-heavy-4G.cnf ./my.cnf
# vi ./my.cnf
server-idなど必要な記述を

# ./scripts/mysql_install_db \
--user=mysql
# chown -R mysql:mysql .

# ./support-files/mysql.server start
Starting MySQL............ SUCCESS!
デフォルトではないディレクトリ(/usr/local/mysqls/mysql_tokudb)へセットアップ

解凍と移動

# cd /usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo
# tar zxvf mysql-5.5.36-tokudb-7.1.5-linux-x86_64.tar.gz
# mv ./mysql-5.5.36-tokudb-7.1.5-linux-x86_64 /usr/local/mysqls/mysql_tokudb

初期設定と起動

# cd /usr/local/mysqls/mysql_tokudb
# cp ./support-files/my-innodb-heavy-4G.cnf ./my.cnf
# vi ./my.cnf
port番号やserver-idなど必要な記述を

# ./scripts/mysql_install_db \
--basedir=/usr/local/mysqls/mysql_tokudb \
--datadir=/usr/local/mysqls/mysql_tokudb/var \
--user=mysql
# chown -R mysql:mysql .

# ./support-files/mysql.server start
Starting MySQL............ SUCCESS!

デフォルトエンジン変更

# vi ./my.cnf
> default-storage-engine = MYISAM
< default-storage-engine = TokuDB

# ./support-files/mysql.server restart
Shutting down MySQL... SUCCESS!
Starting MySQL... SUCCESS!

確認

# ./bin/mysql
mysql> show variables;
version                                           | 5.5.36-tokudb-7.1.5-debug-log
mysql> show plugins;
| TokuDB                        | ACTIVE   | STORAGE ENGINE     | ha_tokudb.so | GPL     |
| TokuDB_trx                    | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_locks                  | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_lock_waits             | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_file_map               | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_fractal_tree_info      | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_fractal_tree_block_map | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |

データ作成テスト

mysql> use test;
mysql> CREATE TABLE user ( id int(11) NOT NULL, name varchar(33) NOT NULL );
mysql> SHOW CREATE TABLE user\G;
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `name` varchar(33) NOT NULL
) ENGINE=TokuDB DEFAULT CHARSET=utf8

mysql> insert into user(id, name) values(1,'user1');
mysql> select * from user;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 |
+----+-------+

という感じ。

途中心折れかけたし、ここまで1週間かかりましたぜ…。

同じような事にはまった人の助けになれば。