Sunday, February 17, 2013

Debian に MySQL 5.6 系をソースからインストールします

最近 MySQL が 5.6 系も 「一般提供開始」 (出典) となったそうですので, 久しぶりに少し触ってみようかと思い, インストールをおこなってみました.

ビルド済みのバイナリをインストールするということは以前にもやったことがありまして, Debian に MySQL をインストールしてみます という記事 (Apr 15, 2012) に簡単に書いたことがありました. 今回はソースからビルドしてインストールするということをやってみました.

ビルドの準備

まず MySQL :: Download MySQL Community Server というページからソースコードのアーカイブをダウンロードします. わたしが選択したのは mysql-5.6.10.tar.gz です.

MySQL 5.5 系からは, configure スクリプトが付属されなくなりました. 代わりに CMake を使うことが必要となっています. Debian の cmake パッケージをインストールしてもよいのですが, まだ今回のため以外に CMake を使う機会が訪れるような気がしないので, とりあえず CMake のサイトからバイナリをダウンロードして簡易的に使用することにしました.

なお, 必要なツール等につきましては, MySQL :: MySQL 5.6 Reference Manual :: 2.9 Installing MySQL from Source というページに記載されています. それによりますと, CMake のほかに, Make, C++ コンパイラー, Perl などが必要だとのことです. C++ コンパイラーがまだなかったので, Debian の g++ パッケージをインストールしておきました.

CMake を使ってビルドの準備をおこなう手順は, configure スクリプトを使っておこなうのと比べても, さほど勝手が違うわけではないようです. わたしとしては, 少なくともインストール先だけはデフォルトとは違うディレクトリにしたかったので, 次のように実行してみました.

$ cd ~/mysql-5.6.10
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql-5.6.10

すると, 次のようなエラーメッセージが出て止まってしまいました.

/* 前略 */

-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:83 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
  cmake/readline.cmake:126 (FIND_CURSES)
  cmake/readline.cmake:193 (MYSQL_USE_BUNDLED_LIBEDIT)
  CMakeLists.txt:325 (MYSQL_CHECK_READLINE)


-- Configuring incomplete, errors occurred!

ああ. そうでした. そうでした.

Debian の libncurses5-dev パッケージをインストールして, もう一度やってみます.

$ sudo apt-get install libncurses5-dev
$ rm CMakeCache.txt
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql-5.6.10

特に問題がなければ, およそ 1 分で終了します.

/* 前略 */

-- Configuring done
-- Generating done
-- Build files have been written to: /home/tt4cs/mysql-5.6.10

ビルドからインストールまで

ビルドとインストールでは特に悩むことはありませんでした.

$ make
$ sudo make install

ただ, けっこう時間がかかります. わたしのマシンのスペックは Intel Core2 Duo CPU P8600 2.40GHz でして, Windows 7 (x86) 上の VMware Player で Debian GNU/Linux 6.0 (x86) を稼動させています. この環境で, ビルドには約 27 分かかりました. インストールは約 2 分でした. この間, コンソール上に出力されたログは 11,000 行を超えていました. そこそこ大きなサイズだと思います.

初期設定

MySQL のデーモンを root ユーザーで実行するのはよくないことでしょうから, MySQL 用のユーザーとグループを作成しておくことにしました.

$ sudo groupadd -g 503 mysqld
$ sudo useradd -M -u 503 -g mysqld -s /bin/false mysqld

続いて, 初期データベース作成のスクリプトを実行します.

$ cd /opt/mysql-5.6.10
$ sudo scripts/mysql_install_db --user=mysqld

ここで気づいたポイントは 3 点ありました. 1 点目は, MySQL のインストール先に移動することでした. そうしないと, mysql_install_db スクリプトが, 関連する別のスクリプトファイル等を見つけられずに失敗してしまうようでした. 2 点目は, MySQL デーモンの実行ユーザーを, コマンドラインオプションで指定しておくことです. そうすれば, このスクリプトが /opt/mysql-5.6.10/data 以下のディレクトリとファイルのオーナーを適宜変更しておいてくれるようでした.

3 点目は, おそらく環境依存の話なのだと思いますが, Perl についてです. わたしの環境にはすでに Perl スクリプトを実行する準備ができているものと思っていました. が, このスクリプトを実行しようとした際, 次のようなエラーが発生したのでした.

Can't locate File/Basename.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at scripts/mysql_install_db line 38.
BEGIN failed--compilation aborted at scripts/mysql_install_db line 38.

どうも Basename.pm というファイルが見つけられなかったと言っているようです.

適当に perl --version とか perl -V とか実行してみても, 何が欠けているのかいまいちよくわかりません. よくわからないまま, だめもとで, すでにインストールされているはずの Debian の perl パッケージをあらためてインストールする, ということをしてみました.

結果的に, これで解消されました. もう少し事前に調べてもよかったのですが, 解消してしまったので何とも言えません. すでにインストールされているように見えたパッケージが実はインストールされていなかった, みたいな印象だけ残って, よくわかりません. また別の仮想マシンに Debian をインストールする機会があれば, よく調べてみたいと思います.

設定ファイルの編集

ここまでで, もういつでも起動することはできるのですが, その前にもう少し設定作業を続けます.

さまざまな設定作業は, 基本的に my.cnf というファイルを編集することで, おこなうことができます. 先ほどの mysql_install_db スクリプトが, あらかじめ /opt/mysql-5.6.10my.cnf を作成しておいてくれたので, これを編集します.

ちなみに, my.cnf は, いろいろな場所に置くことができます. どの場所にある my.cnf がどの順序で読み込まれるかなどは, MySQL :: MySQL 5.6 Reference Manual :: 4.2.3.3 Using Option Files というページに記述されています.

とりあえず, この設定ファイルの [mysqld] セクション以下に, 次のような設定内容だけ追記しておきました.

user=mysqld
character-set-server=utf8mb4
skip-character-set-client-handshake

MySQL デーモンを起動するスクリプトを --user オプションをつけずに実行した場合, デフォルトでは mysql というユーザーが MySQL デーモンの実行ユーザーとみなされることになっているようです. 起動スクリプトを直接編集するのは失礼でしょうから, 設定ファイルのほうで明示しておきます. こうすれば, 起動スクリプトに --user オプションをつけ忘れても安心でしょう. (あるいは今回は最初から mysqld ユーザーではなく mysql ユーザーを作成しておけば, この部分は省略ができたとも言えますが...)

文字のエンコードに関しては, MySQL の utf8 では 3 バイトで表現することのできる文字 (基本多言語面?) までしか扱えないそうですので, 念のため utf8mb4 にしておきました.

あと, むかしはデフォルトのストレージエンジンが MyISAM なので, InnoDB をデフォルトにしたい場合はそれも指定する必要があったかと思うのですが, 5.5 系以降は InnoDB がデフォルトとなったようです.

起動

MySQL デーモンを起動するスクリプトを実行してみます.

$ sudo /opt/mysql-5.6.10/bin/mysqld_safe &

待ち受けポートはデフォルトでは 3306/tcp です. このポートで待ち受けを始めたら起動は成功したと考えてよいかと思います. また, ソケットファイルのパスはデフォルトでは /tmp/mysql.sock です. 変更の必要があるのかどうかよくわからないので, これはとりあえずそのままにしておきます.

初回起動の段階では, セキュリティ的にいろいろまずい (管理者ユーザーのパスワードが設定されていない等) ので, 起動したら, まずそれを是正します. そのためのスクリプトがすでに用意されています.

$ cd /opt/mysql-5.6.10
$ sudo bin/mysql_secure_installation

このスクリプトも, 前述の mysql_install_db と同様に, MySQL のインストール先に移動してからでないと実行ができないようです. まあ, それはともかく, ここでは管理者ユーザー (MySQL 内での root ユーザー) のパスワードを設定したり, リモートから管理者ユーザーとしてログインすることを禁止したり, 匿名ユーザーを削除したり, テスト用のデータベースを削除したり, といったことをインタラクティブに実行することができます.

停止

MySQL デーモンを停止するには, 以下を実行します.

$ sudo /opt/mysql-5.6.10/bin/mysqladmin shutdown -u root -p

管理者ユーザー (MySQL 内での root ユーザー) のパスワードを入力するよう促されますので, それを入力すれば, 停止することができます.

まとめ

ざっくりと以上のとおりでしょうか. 見落としなどがあれば, またこのブログに書くか書かないかしたいと思います.

No comments:

Post a Comment