本文以MySQL5.7爲例,介紹在同一臺機器下如何安裝多個MySQL實例。
環境:RHEL 6.5 + MySQL 5.7mysql
先來看下MySQL5.7單實例的安裝方法(這裏引用官方文檔的安裝步驟):linux
shell> groupadd mysql shell> useradd -r -g mysql -s /bin/false mysql shell> cd /usr/local shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> mkdir mysql-files shell> chown mysql:mysql mysql-files shell> chmod 750 mysql-files shell> bin/mysqld --initialize --user=mysql shell> bin/mysql_ssl_rsa_setup shell> bin/mysqld_safe --user=mysql & # Next command is optional shell> cp support-files/mysql.server /etc/init.d/mysql.server --修改/etc/profile 增長 export PATH=/usr/local/mysql/bin:$PATH --須要修改密碼才能夠正常操做數據庫: mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. mysql> alter user 'root'@'localhost' identified by '123'; Query OK, 0 rows affected (0.00 sec)
能夠看到單實例MySQL的安裝很是簡單,只需建立了必要的用戶組和用戶,解壓二進制軟件包,初始化而後調整下權限基本就OK了。sql
下面來看下多實例MySQL配置,若是須要安裝多實例在同一臺機器上,主要4個地方的配置須要區分:端口(Port)、數據目錄(datadir)、socket文件、server-id標識。(注:對其餘配置能夠根據實際需求去自定義各個實例的一些參數)
MySQL的配置文件my.cnf支持標籤重定義,好比我這裏安裝4個實例,分別定義爲[mysqld1]、[mysqld2]、[mysqld3]、[mysqld4]。shell
舉例來講,我在本來的標準my.cnf配置文件中增長以下配置內容:數據庫
...這裏省略本來的my.cnf配置內容... [mysqld_multi] mysqld=/usr/local/mysql/bin/mysqld_safe mysqladmin=/usr/local/mysql/bin/mysqladmin Log=/usr/local/mysql/multi.log [mysqld1] server-id=101 datadir=/data/mysqldata/3307 socket=/tmp/mysql.sock3307 port=3307 [mysqld2] server-id=102 datadir=/data/mysqldata/3308 socket=/tmp/mysql.sock3308 port=3308 [mysqld3] server-id=103 datadir=/data/mysqldata/3309 socket=/tmp/mysql.sock3309 port=3309 [mysqld4] server-id=104 datadir=/data/mysqldata/3310 socket=/tmp/mysql.sock3310 port=3310
多實例MySQL初始化:即分別初始化不一樣實例,也就是指定不一樣的datadir
bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3307
bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3308
bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3309
bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3310安全
--建立多實例各自的datadir [root@jystdrac2 mysqldata]# pwd /data/mysqldata [root@jystdrac2 mysqldata]# mkdir 3307 3308 3309 3310 --具體參照安裝單實例的步驟 [root@jystdrac2 local]# tar zxvf /public/ISO/mysql/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz [root@jystdrac2 local]# ln -s mysql-5.7.28-linux-glibc2.12-x86_64 mysql --多實例MySQL初始化 [root@jystdrac2 mysql]# pwd /usr/local/mysql [root@jystdrac2 mysql]# bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3307 [root@jystdrac2 mysql]# bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3308 [root@jystdrac2 mysql]# bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3309 [root@jystdrac2 mysql]# bin/mysqld --initialize --user=mysql --datadir=/data/mysqldata/3310
記錄好每一個MySQL實例默認生成的密碼:socket
yD*jUO%pj4ta aHiLky?Ge28k psPWYuk/)8=j <8Pk#rxteaqx
修改密碼,我這裏測試環境爲了方便統一設置密碼爲123,若是是生產環境切記要設計符合客戶要求的密碼安全策略:ide
[root@jystdrac2 3307]# mysql -uroot -S/tmp/mysql.sock3307 -p yD*jUO%pj4ta mysql> set password='123'; mysql -uroot -S/tmp/mysql.sock3308 -p mysql -uroot -S/tmp/mysql.sock3309 -p mysql -uroot -S/tmp/mysql.sock3310 -p
多實例MySQL開機啓動項設置:測試
[root@jystdrac2 mysql]# chkconfig --list|grep mysql [root@jystdrac2 mysql]# cp support-files/mysqld_multi.server /etc/init.d/mysqld_multi [root@jystdrac2 mysql]# chkconfig --add mysqld_multi [root@jystdrac2 mysql]# chkconfig --list|grep mysql mysqld_multi 0:off 1:off 2:on 3:on 4:on 5:on 6:off
多實例MySQL經常使用管理命令:this
--顯示多實例mysqld的運行狀態 mysqld_multi report --啓動[mysqld1] mysqld_multi start 1 --啓動[mysqld2] mysqld_multi start 2 --啓動全部多實例mysqld進程 mysqld_multi start --經過socket鏈接到指定的MySQL實例 mysql -uroot -S/tmp/mysql.sock3307 -p mysql -uroot -S/tmp/mysql.sock3308 -p mysql -uroot -S/tmp/mysql.sock3309 -p mysql -uroot -S/tmp/mysql.sock3310 -p --確認鏈接實例的端口信息 show variables like '%port%';
最後確認下4個MySQL實例的啓動、關閉均正常:
[root@jystdrac2 mysql]# mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running MySQL server from group: mysqld4 is running [root@jystdrac2 mysql]# ps -ef|grep mysql root 10923 1 0 23:48 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --server-id=101 --datadir=/data/mysqldata/3307 --socket=/tmp/mysql.sock3307 --port=3307 root 10930 1 0 23:48 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --server-id=102 --datadir=/data/mysqldata/3308 --socket=/tmp/mysql.sock3308 --port=3308 root 10947 1 0 23:48 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --server-id=103 --datadir=/data/mysqldata/3309 --socket=/tmp/mysql.sock3309 --port=3309 root 10963 1 0 23:48 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --server-id=104 --datadir=/data/mysqldata/3310 --socket=/tmp/mysql.sock3310 --port=3310 mysql 11438 10923 0 23:48 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysqldata/3307 --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --server-id=101 --log-error=jystdrac2.err --pid-file=jystdrac2.pid --socket=/tmp/mysql.sock3307 --port=3307 mysql 11461 10947 0 23:48 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysqldata/3309 --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --server-id=103 --log-error=jystdrac2.err --pid-file=jystdrac2.pid --socket=/tmp/mysql.sock3309 --port=3309 mysql 11463 10930 0 23:48 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysqldata/3308 --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --server-id=102 --log-error=jystdrac2.err --pid-file=jystdrac2.pid --socket=/tmp/mysql.sock3308 --port=3308 mysql 11472 10963 0 23:48 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysqldata/3310 --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --server-id=104 --log-error=jystdrac2.err --pid-file=jystdrac2.pid --socket=/tmp/mysql.sock3310 --port=3310 root 12228 7701 0 23:51 pts/0 00:00:00 grep mysql [root@jystdrac2 mysql]# mysqld_multi stop [root@jystdrac2 mysql]# mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is not running MySQL server from group: mysqld3 is not running MySQL server from group: mysqld4 is not running [root@jystdrac2 mysql]# ps -ef|grep mysql root 12400 7701 0 23:52 pts/0 00:00:00 grep mysql [root@jystdrac2 mysql]# mysqld_multi start [root@jystdrac2 mysql]# mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running MySQL server from group: mysqld4 is running [root@jystdrac2 mysql]#