當開發與生產環境在同一台機器上,或需要在一台機器上部署多套測試環境時,往往需要同時起多個mysqld進程,最近幫測試搭環境的時候就碰到了這樣的問題。
還是從安裝mysql開始,下載tarball安裝,
安裝mysql
代碼如下 復制代碼 groupadd mysql然後配置my.cnf,從support-files裡面拷貝一個my-medium.cnf到/etc/my.cnf,裡面mysqld配置段的內容基本是這個樣子
my.cnf配置
代碼如下 復制代碼 [mysqld]默認mysqld只啟動一個實例,既然我們的目的是啟動多個mysqld實例,需要使用mysqld_multi。它是一個perl腳本,在使用之前,需要給my.cnf加一些料。
my.cnf配置[增加mysqld_mutli]
代碼如下 復制代碼# mysqld_multi會讀取這個配置短的內容
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
# 第一個mysqld實例
[mysqld1]
port = 3306
socket = /var/run/mysql/mysql1.sock
datadir = /data/mysql1
general-log-file = /var/log/mysql/error.log
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
user = mysql
# 第二個mysqld實例
[mysqld2]
port = 3307
socket = /var/run/mysql/mysql2.sock
datadir = /data/mysql2
general-log-file = /var/log/mysql/error.log
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
user = mysql
然後依配置創建mysql運行時文件夾並用mysql_install_db腳本初始化系統庫
代碼如下 復制代碼 mkdir -p /data/mysql1 /data/mysql2 /var/log/mysql /var/run/mysql
最後一條命令其實已經將我們配置好的mysqld1和mysqld2啟動了,這時候在進程表中應該能看到兩個mysqld進程,試著用-P參數指定端口能分別訪問在/data/mysql1和/data/mysql2下面的兩個庫,兩者互不影響,正好能滿足測試的要求。當然需要配置更多的實例也是可以的。
額外收獲
這次配置過程中還遇到一些額外的問題,記下來備忘。
假如使用的是ubuntu(我目前的版本還是11.10),默認會安裝apparmor,這個軟件是一個詭異的存在,它就像一個暗戀者,一直默默限制軟件的訪問權限,然後又不被系統待見,以至於我根本不知道它的存在。其實它是一個白名單,在/etc/apparmor.d/中指定了/usr/sbin/mysqld對各文件的訪問權限,當我想將mysql的數據文件夾遷移到別的位置時,一直報這個錯誤
Can't create test file /data/mysql1/littleboy.lower-test
而令人費解的就是mysql對這些文件夾是有讀寫權限的,其實只需要編輯/etc/apparmor.d/usr.sbin.mysqld文件,依樣畫葫蘆地為文件夾加上rw權限就可以了
給mysql設置遠程訪問權限,只需要下面這條sql
1
其中最關鍵的就是那個'%',表示通過任意host均可以訪問到本機的mysql
給mysql設置密碼。
代碼如下 復制代碼 mysqladmin -u root -h 127.0.0.1 password 123456上面那種是在不登錄mysql的情況下修改密碼,還有兩種可以通過改表的方式。見MySQL設置密碼的三種方法
修改過密碼以後,mysqld_multi可能就不能通過默認配置來結束mysqld進程了,這時候需要在配置裡加上用戶名和密碼
代碼如下 復制代碼[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = root
password = 123456
當然這樣可能會有一些安全隱患,因為my.cnf是可見的。假如是多人使用,可以將password這行去掉,每次操作mysqld_multi的時候,在後面加上--password=123456參數就行了