Mysqld_multi在一臺服務器上運行多個mysql實例及操作

一、Mysqld_multi在一臺物理服務器上運行多個mysql實例

 

Mysql具有一次安裝可以運行多個實例的功能,這個功能是通過mysqld_multi實現的。當一臺機器上需要運行多個MySQL服務器時,mysqld_multi是管理多個mysqld的服務進程,這些服務進程程序用不同的unix socket或是監聽於不同的端口,通過簡單的命令,它可以啓動,關閉和報告所管理的服務器的狀態 。(可以用此在一臺機器上做主從複製)。

1.準備

用mysql源程序安裝,假設在安裝時用的configura選擇項如下:

/configure --prefix=/usr/bin/mysql   --datadir=/search/mysql1/data1 --sysconfdir=/etc

 

備註:--prefix將MYSQL安裝到/usr/bin/mysql ,

--datadir將數據庫生成/search/mysql1/data1,

--sysconfdir是指定mysql使用到的my.cnf配置文件的搜索路徑爲/etc

2.配置

安裝完成後,就是設置配置文件,是mysql能夠運行多個實例。

一下是我們機器上的配置文件my.cnf的配置

 

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root

[mysqld1]
datadir=/search/mysql1/data1
socket=/var/lib/mysql/mysql.sock1

user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
port=3306
skip-name-resolve
server_id=21
log-bin=mysql-bin

max_connections=1000
key_buffer_size=2147836348
query_cache_size=134217728
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
#log=/search/mysql1/data1/mysql1.log
pid-file=/search/mysql1/data1/mysql.pid1
log-error=/search/mysql1/data1/log.1

log-slave-updates
slave-skip-errors=ALL


[mysqld2]
datadir=/search/mysql2/data2
socket=/var/lib/mysql/mysql.sock2

user=mysql
old_passwords=1
skip-name-resolve
server_id=2
log-bin=mysql-bin

max_connections=1000
key_buffer_size=2147836348
#query_cache_size=134217728
query_cache_type=0
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
port=3307
#log=/search/mysql2/data2/mysql2.log
pid-file=/search/mysql2/data2/mysql.pid2
log-error=/search/mysql2/data2/log.2

 

[mysqld3]
datadir=/search/mysql3/data3
socket=/var/lib/mysql/mysql.sock3

user=mysql
old_passwords=1
port=3308
skip-name-resolve
server_id=3
log-bin=mysql-bin

max_connections=1000
key_buffer_size=2147836348
#query_cache_size=134217728
query_cache_type=0
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
#log=/search/mysql3/data3/mysql3.log
pid-file=/search/mysql3/data3/mysql.pid3
log-error=/search/mysql3/data3/log.3

 

[mysqld4]
datadir=/search/mysql3/data4
socket=/var/lib/mysql/mysql.sock4
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
port=3309
skip-name-resolve
server_id=13
log-bin=mysql-bin

max_connections=1000
key_buffer_size=2147836348
#query_cache_size=134217728
query_cache_type=0
delay_key_write=ALL
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
#log=/search/mysql3/data4/mysql4.log
pid-file=/search/mysql3/data4/mysql.pid4
log-error=/search/mysql3/data4/log.4

 

根據以上的配置信息,可知我們配置了mysqld1,mysqld2,mysqld3,mysqld4四個mysql實例,每個實例都指定了不同的連接端口(是3306——3309)和數據存儲路徑(datadir所指定的就是它們各自數據的存儲路徑)等等一些其他的信息。

 

最重要的配置文件my.cnf弄好了之後,現在爲配置中不同mysql 服務建立各自文件夾和初始數據庫等。

[mysqld1]是一個默認的,在我們安裝mysql時已經有了,所以不用管它。接下來只要配置[mysqld2]、[mysqld3]、[mysqld3]既可以。

下面就已配置[mysqld2]爲例:

只要根據配置就的路徑爲它建立一個目錄就可以。將該目錄改爲mysql管理權,命令如下

  mkdir /search/mysql2/data2   #建立[mysqld2]實例的數據存儲目錄

 

建數據庫,我們可以把默認的mysql數據庫複製過來,以利用其它的mysql帳號,其它數據庫根據應用再建立。

cp -R /search/mysql1/data1/mysql  /usr/local/mysql/data2  #默認的mysql數據庫複製過來

 

chown -R mysql:mysql /usr/local/mysql/data2  #該目錄改爲mysql管理權

 

[mysqld3],[mysqld4]的操作相同,在此省略。

至此我們的配置就結束了,接下來就是要啓動我們的mysql服務了。
 

 

3.啓動mysql服務

 

使用如下參數來啓動mysqld_multi: (注:該命令在mysql的bin目錄中,根據上面所提到./configure --prefix=/usr/bin/mysql ,所以該文件應該在 /usr/bin/mysql/bin,這得根據你安裝時所指定的路徑 ) 。

 

mysqld_multi [options] [GNR[,GNR]...]

 

start,stop和report是指你想到執行的操作。你可以在單獨的服務或是多服務上指定一個操作,區別於選項後面的GNR列表。如果沒有指定GNR列表,那麼mysqld_multi將在所有的服務中根據選項文件進行操作。

每一個GNR的值是組的序列號或是一個組的序列號範圍。此項的值必須是組名字最後的數字,比如說如果組名爲mysqld17,那麼此項的值則爲 17。如果指定一個範圍,使用"-"(破折號)來連接二個數字。如GNR的值爲10-13,則指組mysqld10到組mysqld13。多個組或是組範圍可以在命令行中指定,使用","(逗號)隔開。不能有空白的字符(如空格或tab),在空白字符後面的參數將會被忽略。 (注:GNR值就是我們定義my.cnf中mysqld#中的值,我這裏只有1-4)。

 

 mysqld_multi --config-file=/etc/my.cnf start 1   #只啓動第一個mysql服務,相關文件由my.cnf中mysql1設定

 mysqld_multi --config-file=/etc/my.cnf stop 1   #停止第一個mysql服務,相關文件由my.cnf中mysql1設定

 mysqld_multi   --config-file=/etc/my.cnf start 1-4    #啓動 第1至4mysql服務,其實就是我這裏的全部。

 注意:5.6 版本已下的用" --defaults-extra-file=/etc/my.cnf "

注意:直接用 service mysqld start 命令去啓動會報錯。【個人覺得這個命令是用來啓動只安裝了單個實例的服務器的】

 

4、客戶端訪問

任何(遠程)客戶端訪問都需要指定訪問端口。方纔能進入指定數據庫服務。否則將使用到Mysql默認的端口(3306)所服務的MYSQL。

 

4.1 如果是在本地機器上連接mysql服務器

 mysql -S /var/lib/mysql/mysql.sock1   #連接的是[mysql1]實例上

 如果使用 mysql -p3306 命令去連接[mysql1]實例,則會報錯“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) ”【個人覺得出現這個錯誤是,默認會去找mysql.sock這個文件,而因爲此物理機器上運行的是多個實例,所以這個文件不存在】

 

4.2如果是在遠程機器上去連接此mysql服務器(當然此遠程機器需要有連接的權限)

mysql -umysql -p -h10.10.2.23   #這裏假設用戶名是mysql,服務器iP是10.10.2.23,則連接的是[mysql1]實例,因爲沒有指定端口。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章