當(dāng)開發(fā)與生產(chǎn)環(huán)境在同一臺(tái)機(jī)器上,或需要在一臺(tái)機(jī)器上部署多套測試環(huán)境時(shí),往往需要同時(shí)起多個(gè)mysqld進(jìn)程,最近幫測試搭環(huán)境的時(shí)候就碰到了這樣的問題.
還是從安裝mysql開始,下載tarball安裝.
安裝mysql,代碼如下:
- groupadd mysql
- useradd -g mysql mysql
- cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.5.27/ -DMYSQL_DATADIR=/data/mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock -DWITH_DEBUG=0
- make && make install
然后配置my.cnf,從support-files里面拷貝一個(gè)my-medium.cnf到/etc/my.cnf,里面mysqld配置段的內(nèi)容基本是這個(gè)樣子,my.cnf配置,代碼如下:
- [mysqld]
- port = 3306
- socket = /var/run/mysql/mysql.sock
- 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
默認(rèn)mysqld只啟動(dòng)一個(gè)實(shí)例,既然我們的目的是啟動(dòng)多個(gè)mysqld實(shí)例,需要使用mysqld_multi,它是一個(gè)perl腳本,在使用之前,需要給my.cnf加一些料.
my.cnf配置[增加mysqld_mutli],代碼如下:
- # mysqld_multi會(huì)讀取這個(gè)配置短的內(nèi)容
- [mysqld_multi]
- mysqld = /usr/local/mysql/bin/mysqld
- mysqladmin = /usr/local/mysql/bin/mysqladmin
- # 第一個(gè)mysqld實(shí)例
- [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
- # 第二個(gè)mysqld實(shí)例
- [mysqld2]
- port = 3307
- socket = /var/run/mysql/mysql2.sock
- datadir = /data/mysql2
- general-log-file = /var/log/mysql/error.log
- skip-external-locking --Vevb.com
- 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
然后依配置創(chuàng)建mysql運(yùn)行時(shí)文件夾并用mysql_install_db腳本初始化系統(tǒng)庫,代碼如下:
- mkdir -p /data/mysql1 /data/mysql2 /var/log/mysql /var/run/mysql
- chgrp mysql /data/mysql* /var/log/mysql /var/run/mysql
- chown mysql /data/mysql* /var/log/mysql /var/run/mysql
- mysql_install_db --datadir=/data/mysql1 --user=mysql
- mysql_install_db --datadir=/data/mysql2 --user=mysql
- mysqld_multi start 1-2
最后一條命令其實(shí)已經(jīng)將我們配置好的mysqld1和mysqld2啟動(dòng)了,這時(shí)候在進(jìn)程表中應(yīng)該能看到兩個(gè)mysqld進(jìn)程,試著用-P參數(shù)指定端口能分別訪問在/data/mysql1和/data/mysql2下面的兩個(gè)庫,兩者互不影響,正好能滿足測試的要求,當(dāng)然需要配置更多的實(shí)例也是可以的額外收獲.
這次配置過程中還遇到一些額外的問題,記下來備忘.
假如使用的是ubuntu(我目前的版本還是11.10),默認(rèn)會(huì)安裝apparmor,這個(gè)軟件是一個(gè)詭異的存在,它就像一個(gè)暗戀者,一直默默限制軟件的訪問權(quán)限,然后又不被系統(tǒng)待見,以至于我根本不知道它的存在,其實(shí)它是一個(gè)白名單,在/etc/apparmor.d/中指定了/usr/sbin/mysqld對各文件的訪問權(quán)限,當(dāng)我想將mysql的數(shù)據(jù)文件夾遷移到別的位置時(shí),一直報(bào)這個(gè)錯(cuò)誤:
Can't create test file /data/mysql1/littleboy.lower-test
而令人費(fèi)解的就是mysql對這些文件夾是有讀寫權(quán)限的,其實(shí)只需要編輯/etc/apparmor.d/usr.sbin.mysqld文件,依樣畫葫蘆地為文件夾加上rw權(quán)限就可以了.
給mysql設(shè)置遠(yuǎn)程訪問權(quán)限,只需要下面這條sql,代碼如下:
INSERT mysql.user ( `Host`, `User`, `Password` ) VALUES ( '%', 'root', PASSWORD('123456') );
其中最關(guān)鍵的就是那個(gè)'%',表示通過任意host均可以訪問到本機(jī)的mysql.
給mysql設(shè)置密碼,代碼如下:
mysqladmin -u root -h 127.0.0.1 password 123456
上面那種是在不登錄mysql的情況下修改密碼,還有兩種可以通過改表的方式,見MySQL設(shè)置密碼的三種方法.
修改過密碼以后,mysqld_multi可能就不能通過默認(rèn)配置來結(jié)束mysqld進(jìn)程了,這時(shí)候需要在配置里加上用戶名和密碼,代碼如下:
- [mysqld_multi]
- mysqld = /usr/local/mysql/bin/mysqld
- mysqladmin = /usr/local/mysql/bin/mysqladmin
- user = root
- password = 123456
當(dāng)然這樣可能會(huì)有一些安全隱患,因?yàn)閙y.cnf是可見的,假如是多人使用,可以將password這行去掉,每次操作mysqld_multi的時(shí)候,在后面加上--password=123456參數(shù)就行了.
新聞熱點(diǎn)
疑難解答
圖片精選