[an error occurred while processing this directive]
mysqld_multiでハマっています。トホホ・・・

第250日目:mysqld_multiでハマっています。トホホ・・・

(2011/03/03 15:00)
どうも、▲('A`)/です。
おはようございます。
えーと、前回の日記で仮想環境を構築しようとしましたが、
ちょっと別件で作業が入った為、一時棚上げします。すみません。
えーと、どういう作業が入ったかといいますと、MySQLのレプリケーション
環境を作って欲しいとroot兄(・∀・)からリクエストがありまして・・・
でもね、社内で使えるIPは1つしかないのですよ。
じゃあ、どうしたらいいかな、と色々当たってみると、何やら
mysqld_multiというものがあるそうで・・・
こいつを使うと複数のMySQLサーバを制御できるんだとか。
じゃあ、こいつを使って試しにw44(dokuo号)上で複数の
データベースサーバを動かしてみよう、となりました。

で、いつもの様にportsからMySQLをインストールしたのですが、
どこを探してもmysqld_multiが見つかりません。

おかしいなあ、と思って、ソースからインストールしてみると、
/usr/local/bin の中にちゃんと作られます。

なんじゃ、こりゃ?

mysqld_multi とは /etc/my.cnfで書かれた定義を読み込んで、
mysqld_safe(MySQLの本体であるmysqldを監視するラッパー)を
複数起動させる、Perlスクリプトです。
(実際どの様な中身なのかはコチラからご覧いただけます。)
mysqld_multiとmysql_safe、mysqldの起動関係はこんな感じになります。

mysqld_multi ---> mysqld_safe(1) ---> mysqld(1)
         |
         --> mysqld_safe(2) ---> mysqld(2)
         |
         |
         --> mysqld_safe(n) ---> mysqld(n)

えーと、結果を先取りして言いますと、いつもの力技で稼働させる
事はできましたが、まだ色々調べながらこの日記を書いているので、
細かい処はちょっと自信は無いです、ハイ。

で、どうやって動かしたかを以下で書きます。
インストールしたMySQLは5.0.92(8.2-RELEASEのportsに収録されているもの)を
使用しました。
で、まずは、MySQLは2つ動かす様にしてみます。2つ目のMySQLのデータベースの
ディレクトリは /var/db2/mysql とします。(元々のMySQLのディレクトリは
/var/db/mysql に作られます。)

1) portsからインストールする。
 今回はsjisを扱える様にする為に、以下の様に実行しました。

cd /usr/ports/databases/mysql50-server
make WITH_CHARSET=sjis WITH_XCHARSET=complex install

2) 起動時にMySQLが動く様に /etc/rc.conf に以下のパラメータを追記します。

mysql_enable="YES"

3) 2つ目のMySQLのデータベースのディレクトリを作ります。
  ちなみにMySQLのユーザ&グループの登録は 1)で既に実行されています。

mkdir -p /var/db2/mysql
chown mysql:mysql /var/db2/mysql

4) 各MySQLのディレクトリに対して、権限データベース(スキーマ)を作ります。
  まあ、初期化みたいなものです。

/usr/local/bin/mysql_install_db --basedir=/usr/local --datadir=/var/db/mysql --user=mysql
/usr/local/bin/mysql_install_db --basedir=/usr/local --datadir=/var/db2/mysql --user=mysql

  このコマンドを実行する事で、各ディレクトリの下に次のディレクトリ群が作成されます。
  mysql
  test

5) もし、MySQLが稼働しているなら、一旦停止します。

/usr/local/etc/rc.d/mysql-server stop

 通常portsからインストールすると、起動スクリプトは /usr/local/etc/rc.d に
 設置されます。で、停止されたかどうか確認を忘れずに
 (確認方法は、psコマンドでもいいですし、mysqlにログインできなければOKです。)

6) 先程取り上げたmysqld_multiを /usr/local/bin に設置します。
  (こいつはソースからインストールした時にコピッて退避しておいたものです。)
  ちなみにportsからインストールすると、mysql_safeとかはこのディレクトリに
  格納されます。パーミッションは555で、所有者は他のものと同じ様に合わせて
  下さい。

7) 次に起動スクリプトを設置します。
  こちらのスクリプト(修正版 mysql-server)を /usr/local/etc/rc.d に設置して
  パーミッションは555、所有者は元のmysql-serverと同じにして下さい。

  起動用のスクリプトは実はportsからインストールした時も、/usr/local/share/mysql に
  何故か格納されているのです・・・(だったら、本体も入れてよ〜!)
  オリジナルのスクリプトの名称は mysqld_multi.server という名称です。
  参考までにオリジナルのmysqld_multi.serverも置いておきます。

  でも、オリジナルのスクリプトだと何故かうまく起動できなかったのです。
  で、以下の様な修正を加えて使えるようになりました。
  (修正ポイント)
 
  ・上記の記述を、以下の様に修正する
  basedir=/usr/local/mysql
  bindir=/usr/local/mysql/bin
  basedir=/usr/local
  bindir=/usr/local/bin
  ・以下の行を先程の basedi= の行の上に追記する
  PATH=/usr/local/bin

7) /etc にMySQLの定義ファイル(my.cnf)を設置する。

  [mysql]
  default-character-set=sjis
  [mysqld]
  character-set-server=sjis
  [mysqld_multi]
  mysqld = /usr/local/bin/mysqld_safe
  mysqladmin = /usr/local/bin/mysqladmin
  [mysqld1]
  server-id = 1
  port = 3306
  datadir = /var/db/mysql
  socket = /tmp/mysql.sock
  pid-file = /var/db/mysql/w44.maido3.cc.pid
  [mysqld2]
  server-id = 2
  port = 3307
  datadir = /var/db2/mysql
  socket = /tmp/mysql2.sock
  pid-file = /var/db2/mysql/w44.maido3.cc.pid

  まず、通常のMySQLでは[mysql]と[mysqld]の記述があるか、そもそもmy.cnfが無い
  (デフォルト設定)状態ですが、今回は[mysqld_multi]と[mysqld1]、[mysqld2]が
  追加となります。
  [mysqld_multi]の記述はおまじないだと思って下さい。
  [mysqldx]は各MySQLサーバの設定となります。
  ただし、文字コードの設定は共通項目なので、[mysqld]と[mysql]に記述します。
  (この事から判ると思いますが、異なる文字コードを取り扱うことができないのです。
  あと、どれだけ複数立ち上げられるかは、ちょっと確認できていません。

  [mysqldx(xは数字)]の処の記述について説明します。
  まず、[mysqldx(xは数字)]の処の記述について説明します。
  server-idは各MySQLサーバの識別に必要なので、重複しない様に番号を1から順につけて
  下さい。そして、port も重複しない様に割り振って下さい。
  (ちなみにMySQLのデフォルトで使用するポートは 3306 です。)
  で、socketはソケットファイル(通信制御の為のファイル)の場所を、
  pid-fileはプロセス管理の為のファイルの置き場所を、
  datadirはデータベースそのものが格納されている場所を示しています。
  必ず記述して下さい。
  ([mysqld1]の中の記述は通常のMySQLの基本設定となります。)

で、ここまでできたら、サーバを再起動すれば立ち上がりますし、
再起動したくない場合には以下のコマンドで起動できます。

/usr/local/etc/rc.d/mysql-server start

そうすると、こんか感じで動きます。
mysqld_safeが2つ、mysqldが2つ動いていますね。
プロセス2332が1番目のMySQLサーバ、それを監視するデーモン(ラッパ)が
プロセス2272になります。
同様にプロセス2333が2番目のMySQLサーバ、それを監視するデーモン(ラッパ)が
プロセス2278になります。

2272 0 I 0:00.00 /bin/sh /usr/local/bin/mysqld_safe --server-id=1 --port=3306 --datadir=/var/db/mysql --socket=/tmp/mysql.sock --pid-file=/var/db/m

2278 0 I 0:00.00 /bin/sh /usr/local/bin/mysqld_safe --server-id=2 --port=3307 --datadir=/var/db2/mysql --socket=/tmp/mysql2.sock --pid-file=/var/db

2332 0 I 0:00.03 /usr/local/libexec/mysqld --basedir=/usr/local --datadir=/var/db/mysql --user=mysql --pid-file=/var/db/mysql/w44.maido3.cc.pid --p

2333 0 I 0:00.04 /usr/local/libexec/mysqld --basedir=/usr/local --datadir=/var/db2/mysql --user=mysql --pid-file=/var/db2/mysql/w44.maido3.cc.pid -

では、それぞれのMySQLにどうやってログインすれば良いかといいますと、
サーバにログインしているのを前提でお話すると、こうなります。

mysql -u [ユーザ名] -p -P [ポート番号] -h 127.0.0.1

ここで、ポート番号を指定する場合には大文字のPを指定します。
(小文字のpはパスワード入力のパラメータです。)
それと、小文字の h はホストを示します。
この場合にはローカルホスト(127.0.0.1)からのログインをMySQL側に知らせている事になります。

さて、本当に各サーバにログインできたか、statusコマンドで確認してみて下さい。
(実行例を以下に記載します。)

# mysql -P 3306 -h 127.0.0.1
mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.92, for portbld-freebsd8.2 (amd64) using  5.2

Connection id:          4
Current database:       
Current user:           root@localhost
SSL:                    Not in use
Current pager:          more
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.92 FreeBSD port: mysql-server-5.0.92
Protocol version:       10
Connection:             127.0.0.1 via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 5 min 11 sec

Threads: 1  Questions: 15  Slow queries: 0  Opens: 12  Flush tables: 1  
Open tables: 6  Queries per second avg: 0.048
--------------

mysql> exit
# 

# mysql -P 3307 -h 127.0.0.1

mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.92, for portbld-freebsd8.2 (amd64) using  5.2

Connection id:          1
Current database:       
Current user:           root@localhost
SSL:                    Not in use
Current pager:          more
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.92 FreeBSD port: mysql-server-5.0.92
Protocol version:       10
Connection:             127.0.0.1 via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3307
Uptime:                 4 min 9 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 12  Flush tables: 1  
Open tables: 6  Queries per second avg: 0.016
--------------

mysql> exit
# 

で、日記で掲載したmysqld_multiは5.0系、5.1系で動きます。
(いちおう 5.0.92と5.1.55で稼働しました。)
でもねえ、何故か5.5.9ではうまく行かなかったのですよ。不思議だなあ?・・・
5.5.9ではインストール時に /usr/local/bin に mysqld_multi が入っていたのですよ。
で、「ラッキー!」と思って、 /etc/my.cnf と 起動用スクリプトを設定して起動させて
見たのですが、何故か、以下の様にデーモン(ラッパ)だけ認識されて、本体のmysqldが
ちゃんと表示されないのです。

2350 0 S 0:00.01 /bin/sh /usr/local/bin/mysqld_safe --server-id=1 --port
2355 0 S 0:00.01 /bin/sh /usr/local/bin/mysqld_safe --server-id=2 --port
2628 0 S 0:00.04 [mysqld]
2629 0 S 0:00.08 [mysqld]

今日はroot兄(・∀・)なので、もう少し粘ってみます。
それでは、また!▲('A`)/


249日目に戻る。   251日目に続く。

目次に戻る
1日目 2日目 3日目 4日目 5日目 6日目 7日目
8日目 9日目 10日目 11日目 12日目 13日目 14日目
15日目 16日目 17日目 18日目 19日目 20日目 21日目
22日目 23日目 24日目 25日目 26日目 27日目 28日目
29日目 30日目 31日目 32日目 33日目 34日目 35日目
36日目 37日目 38日目 39日目 40日目 41日目 42日目
43日目 44日目 45日目 46日目 47日目 48日目 49日目
50日目 51日目 52日目 53日目 54日目 55日目 56日目
57日目 58日目 59日目 60日目 61日目 62日目 63日目
64日目 65日目 66日目 67日目 68日目 69日目 70日目
71日目 72日目 73日目 74日目 75日目 76日目 77日目
78日目 79日目 80日目 81日目 82日目 83日目 84日目
85日目 86日目 87日目 88日目 89日目 90日目 91日目
92日目 93日目 94日目 95日目 96日目 97日目 98日目
99日目 100日目 101日目 102日目 103日目 104日目 105日目
106日目 107日目 108日目 109日目 110日目 111日目 112日目
113日目 114日目 115日目 116日目 117日目 118日目 119日目
120日目 121日目 122日目 123日目 124日目 125日目 126日目
127日目 128日目 129日目 130日目 131日目 132日目 133日目
134日目 135日目 136日目 137日目 138日目 139日目 140日目
141日目 142日目 143日目 144日目 145日目 146日目 147日目
148日目 149日目 150日目 151日目 152日目 153日目 154日目
155日目 156日目 157日目 158日目 159日目 160日目 161日目
162日目 163日目 164日目 165日目 166日目 167日目 168日目
169日目 170日目 171日目 172日目 173日目 174日目 175日目
176日目 177日目 178日目 179日目 180日目 181日目 182日目
183日目 184日目 185日目 186日目 187日目 188日目 189日目
190日目 191日目 192日目 193日目 194日目 195日目 196日目
197日目 198日目 199日目 200日目 201日目 202日目 203日目
204日目 205日目 206日目 207日目 208日目 209日目 210日目
211日目 212日目 213日目 214日目 215日目 216日目 217日目
218日目 219日目 220日目 221日目 222日目 223日目 224日目
225日目 226日目 227日目 228日目 229日目 230日目 231日目
232日目 233日目 234日目 235日目 236日目 237日目 238日目
239日目 240日目 241日目 242日目 243日目 244日目 245日目
246日目 247日目 248日目 249日目 250日目 251日目 252日目
253日目 254日目 255日目 256日目 257日目 258日目 259日目
260日目 261日目 262日目 263日目 264日目 265日目 266日目
267日目 268日目 269日目 270日目 271日目 272日目 273日目
274日目 275日目 276日目 277日目 278日目 279日目 280日目
281日目 282日目 283日目 284日目 285日目 286日目 287日目
288日目 289日目 290日目 291日目 292日目 293日目 294日目
295日目 296日目 297日目 298日目 299日目 300日目 301日目
302日目 303日目 304日目 305日目 306日目 307日目 308日目
309日目 310日目 311日目 312日目 313日目 314日目 315日目
316日目 317日目 318日目 319日目 320日目 321日目 322日目
323日目 324日目 325日目 326日目 327日目 328日目 329日目
330日目 331日目 332日目 333日目 334日目 335日目 336日目
337日目 338日目 339日目 340日目 341日目 342日目 343日目
344日目 345日目 346日目 347日目 348日目 349日目 350日目
351日目 352日目 353日目 354日目 355日目 356日目 357日目
358日目 359日目 360日目 361日目 362日目 363日目 364日目

いま一番お得なページ! 解析
[an error occurred while processing this directive]