Linux下使用mysqld_multi管理多個MySQL伺服器

來源:互聯網
上載者:User

當一台機器上需要運行多個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指令碼吧 ^_^

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.