當一台機器上需要運行多個MySQL伺服器時,mysqld_multi是一個非常棒的工具,通過簡單的命令,它可以啟動,關閉和報告所管理的伺服器的狀態。
下面的設定檔非常簡潔,僅僅是為了測試用,所以實驗前將原來的"my.cnf"做個備份吧,這樣會讓人安心點。這個設定檔如下:
[client]
# port = 3306
# socket = /var/run/mysqld/mysqld.sock
user = root
password = dandan
[mysqld_multi]
#mysqld = /usr/bin/mysqld_safe
#mysqladmin = /usr/bin/mysqladmin
#user = root
#password = dandan
[mysqld1]
port = 3306
socket = /var/run/mysqld/mysql.sock1
pid-file = /var/run/mysqld/db-app1.pid
#log = /usr/bin/mysql/data1/db-app.log
datadir = /var/lib/mysql/
user = mysql
[mysqld2]
port = 3307
socket = /var/run/mysqld/mysql.sock2
pid-file = /var/run/mysqld/db-app2.pid
datadir = /var/lib/mysql/mysql2
#log = /usr/bin/mysql/data2/db-app.log
user = mysql
[mysqlGNR],每個伺服器的GNR都不一樣,它可以為一個大於或等於0的數,每個伺服器都監聽不同的連接埠,有各自的Unix Domain socket。這裡需要注意的是資料檔案目錄,www.adbrite.cc每個伺服器要有自己的資料目錄,在Ubuntu下安裝MySQL,預設資料目錄在"/var/lib/mysql"路徑下,此路徑下有一個mysql資料庫,它儲存了資料庫的配置資料,每個伺服器都需要這個資料庫,因此在此目錄下建立一個mysql2目錄,然後"cp -R mysql mysql2"。
先看看var/run/mysqld/目錄
root@ecy-geek:/var/run/mysqld# ls /var/run/mysqld/
開啟兩個伺服器
root@ecy-geek:/var/run/mysqld# mysqld_multi start 1,2
再看看var/run/mysqld/目錄
root@ecy-geek:/var/run/mysqld# ls /var/run/mysqld/
db-app1.pid db-app2.pid mysql.sock1 mysql.sock2
報表服務器的狀態,可見兩個伺服器都已經運行起來了
root@ecy-geek:/var/run/mysqld# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
關閉一號伺服器
root@ecy-geek:/var/run/mysqld# mysqld_multi stop 1;
root@ecy-geek:/var/run/mysqld# ls /var/run/mysqld/
db-app2.pid mysql.sock2
再次報告狀態,可見一號伺服器已經關閉
root@ecy-geek:/var/run/mysqld# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is running
用戶端串連試試
root@ecy-geek:/var/run/mysqld# mysql -S/var/run/mysqld/mysql.sock2
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.31-1ubuntu2 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
root@ecy-geek:/var/run/mysqld# mysql -P3307
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
可見使用Unix Domain串連伺服器是正常的,使用通訊端卻串連不上,似乎mysql用戶端能明白自己同伺服器在一台主機上,因此它固執地使用Unix Domain串連伺服器而不管使用者的指示。上面的只是一個簡單的示範而已,一般[mysqld_multi]組合裡有一些mysqld_multi一些選項,推薦使用mysqld_safe來啟動伺服器,我被裡面的選項弄暈了,所以就沒有往設定檔中添加[mysqld_multi]這個組,等以後再深入探究下吧。
使用"service mysql start"開啟mysql伺服器,預設也是使用了mysqld_safe指令碼啟動。在Linux中許多程式都是使用shell指令碼來啟動的,bash會開啟一個新的進程運行指令碼,這個指令碼要啟動並執行程式會成為該進程的子進程,只要子進程不退出,父進程也會一直運行。如果使用"kill -9"殺死父進程,子進程將成為孤兒進程被init進程收養。Linux qq的啟動指令碼非常之簡單,如下:
root@ecy-geek:/home/ecy/C# which qq
/usr/bin/qq
root@ecy-geek:/home/ecy/C# file /usr/bin/qq
/usr/bin/qq: POSIX shell script text executable
root@ecy-geek:/home/ecy/C# cat /usr/bin/qq
#!/bin/sh
cd /usr/share/tencent/qq/
./qq
root@ecy-geek:/home/ecy/C# ps -ef | grep qq
root 2658 1278 0 12:13 pts/1 00:00:00 grep qq
ecy 6187 1 0 11:41 ? 00:00:00 /bin/sh /usr/bin/qq
ecy 6188 6187 0 11:41 ? 00:00:04 ./qq
可以看見運行/usr/bin/qq這個指令碼的進程的父進程是init進程,從圖形介面啟動的qq是這樣的,而從shell中直接輸入/usr/bin/qq啟動qq,指令碼進程的父進程就是運行該qq的bash進程了。
root@ecy-geek:/home/ecy/C# ps -ef | grep mysql
root 1974 1278 0 12:09 pts/1 00:00:00 grep mysql
root@ecy-geek:/home/ecy/C# service mysql start
* Starting MySQL database server mysqld [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.
root@ecy-geek:/home/ecy/C# ps -ef | grep mysql
root 2027 1 0 12:09 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql 2075 2027 1 12:09 pts/1 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/ecy-geek.err --pid-file=/var/lib/mysql/ecy-geek.pid
root 2198 1278 0 12:10 pts/1 00:00:00 grep mysql
mysqld_safe指令碼就非常複雜了,這一陣子也在複習shell,什麼時候有空分析下mysqld_safe指令碼吧 ^_^