CentOS 5.8にソースからTokuDB入りMySQLをインストールするよ
何度も諦めそうになりましたよマジで。
参照したのは
Bizlog: TokuDB 7.0.1のCommunity EditionをUbuntuでビルド
の後半部分。
ただ、古いバージョンなので今は無いファイルが多かった。
あとは
中国語で死にかけた。
希望大家在安装时别再遇到类似的问题。
(意訳:インストールで同じような問題が発生した場合、これで解決する事を願うよ!)
に全俺が泣いた!
また、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週間かかりましたぜ…。
同じような事にはまった人の助けになれば。