一、簡介
1、概述
MySQL多實例就是在一臺機器上開啓多個不同的服務端口(如:3306,3307),運行多個MySQL服務進程,通過不同的socket監聽不同的服務端口來提供各自的服務
2.1、優點
1)有效利用服務器資源
當單個服務器資源過剩時,可以充分利用剩餘的資源來提供更多的服務;
2)節約服務器資源
當公司資金緊張,但數據庫又需要數據庫之間各自提供服務時,並且還想使用主從同步等技術,此時多實例就再好不過了;
3)方便後期架構擴展
當公司的某個項目才啓動時,啓動初期並不一定有很大的用戶量,因此可以先用一組物理數據庫服務器,在上面部署多個實例,方便後續架構擴展、遷移;
2.2、缺點
資源互相搶佔問題
當某個服務實例併發很高或者有慢查詢時,整個實例會消耗更多的內存、CPU和IO資源,這將導致服務器上的其它實例提供服務的質量下降。這就比如說合租房的各個租客,每當早晨上班時,都會洗漱,此時衛生間的佔用率就大,各個租客總會發生等待。
3、部署mysql多實例的兩種方式
1、基於多配置文件
通過使用多個配置文件來啓動不同的進程,以此來實現多實例。
優點:邏輯簡單,配置簡單
缺點:管理起來不方便
2、基於mysqld_multi
通過官方自帶的 mysqld_multi 工具,使用單獨配置文件來實現多實例
優點: 便於集中管理管理
缺點: 不方便針對每個實例配置進行定製
4、同一開發環境下安裝兩個數據庫,必須處理以下問題
(1) 配置文件安裝路徑不能相同
(2)數據庫目錄不能相同
(3)啓動腳本不能同名
(4)端口不能相同
(5)socket文件的生成路徑不能相同
二、服務搭建
1、部署環境
CentOS Linux release 7.5.1804 (Core)
2、下載免編譯的二進制包
mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz
3、解壓和遷移(/usr/local)
[root@SQL local]# tar -zxvf mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz
[root@SQL local]# mv mysql-5.6.41-linux-glibc2.12-x86_64 mysql
4、暫時關閉iptables和seLinux
5、創建mysql用戶
# groupadd mysql
# useradd -r -g mysql -s /bin/false mysql
6、創建相關目錄
[root@SQL ~]# mkdir -p /data/mysql/{mysql3307,mysql3308,mysql3309}
[root@SQL ~]# mkdir -p /data/mysql/mysql3307/{data,log,tmp}
[root@SQL ~]# mkdir -p /data/mysql/mysql3308/{data,log,tmp}
[root@SQL ~]# mkdir -p /data/mysql/mysql3309/{data,log,tmp}
7、更改目錄權限
[root@SQL ~]# chown -R mysql:mysql /data/mysql/
[root@SQL ~]# chown -R mysql:mysql /usr/local/mysql/
8、添加環境變量
# echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
# source /etc/profile
9、修改my.cnf
# cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
[root@SQL ~]# vim /etc/my.cnf
[client]
port = 3307
socket = /tmp/mysql.sock
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin= /usr/local/mysql/bin/mysqladmin
log = /data/mysql/mysqld_multi.log
[mysqld]
user = mysql
basedir = /usr/local/mysql
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld3307]
port = 3307
mysqld = mysqld
mysqladmin = mysqladmin
datadir = /data/mysql/mysql3307/data
language = /usr/local/mysql/share/english/
server-id = 3307
socket = /tmp/mysql3307.sock
pid-file = /data/mysql/mysql3307/mysql3307.pid
log-output = file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql3307/log/slow.log
log-bin = /data/mysql/mysql3307/log/mysql-bin
binlog_format = row
binlog_rows-query-log_events = 1
expire_logs_days = 30
log-error = /data/mysql/mysql3307/log/error.log
explicit_defaults_for_timestamp=true
character_set_server = utf8
[mysqld3308]
port = 3308
mysqld = mysqld
mysqladmin = mysqladmin
datadir = /data/mysql/mysql3308/data
language = /usr/local/mysql/share/english/
server-id = 3308
socket = /tmp/mysql3308.sock
pid-file = /data/mysql/mysql3308/mysql3308.pid
log-output = file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql3308/log/slow.log
log-bin = /data/mysql/mysql3308/log/mysql-bin
binlog_format = row
binlog_rows-query-log_events = 1
expire_logs_days = 30
log-error = /data/mysql/mysql3308/log/error.log
explicit_defaults_for_timestamp=true
character_set_server = utf8
[mysqld3309]
port = 3309
mysqld = mysqld
mysqladmin = mysqladmin
datadir = /data/mysql/mysql3309/data
language = /usr/local/mysql/share/english/
server-id = 3309
socket = /tmp/mysql3309.sock
pid-file = /data/mysql/mysql3309/mysql3309.pid
log-output = file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql3309/log/slow.log
log-bin = /data/mysql/mysql3309/log/mysql-bin
binlog_format = row
binlog_rows-query-log_events = 1
expire_logs_days = 30
log-error = /data/mysql/mysql3309/log/error.log
explicit_defaults_for_timestamp=true
character_set_server = utf8
10、初始化數據庫(5.6)
[root@SQL ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/mysql3307/data --basedir=/usr/local/mysql/ --socket=/tmp/mysql3307.sock
[root@SQL ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/mysql3308/data --basedir=/usr/local/mysql/ --socket=/tmp/mysql3308.sock
[root@SQL ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/mysql3309/data --basedir=/usr/local/mysql/ --socket=/tmp/mysql3309.sock
備註:(5.7)
# cd /usr/local/mysql/
[root@SQL mysql]# ./bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql/mysql3307/data --basedir=/usr/local/mysql/ --socket=/tmp/mysql3307.sock
[root@SQL mysql]# ./bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql/mysql3308/data --basedir=/usr/local/mysql/ --socket=/tmp/mysql3308.sock
[root@SQL mysql]# ./bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql/mysql3309/data --basedir=/usr/local/mysql/ --socket=/tmp/mysql3309.sock
檢查數據庫是否初始化成功狀態
出現兩個”OK”
11、查看數據庫是否初始化成功
查看3307數據庫
[root@SQL ~]# ll /data/mysql/mysql3307/data/
12、設置啓動文件
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
13、mysqld_multi進行多實例管理
啓動全部實例
# /usr/local/mysql/bin/mysqld_multi report
查看全部實例狀態
[root@SQL ~]# /usr/local/mysql/bin/mysqld_multi report
1、運行失敗,如下圖:
#數據庫日誌報如下錯誤
#mysqld_multi錯誤日誌如下
解決方式:
# vim /etc/my.cnf
[mysql330*]
language = /usr/local/mysql/share/english/
啓動單個實例:/usr/local/mysql/bin/mysqld_multi start 3306
停止單個實例:
/usr/local/mysql/bin/mysqladmin -S /mysql/mysql3306/mysql3306.sock -u root -p shutdown
或者
/usr/local/mysql/bin/mysqld_multi stop 3306
查看單個實例狀態:/usr/local/mysql/bin/mysqld_multi report 3306
14、查看啓動進程
15、修改密碼
# mysql -S /tmp/mysql3307.sock
mysql> set password for root@'localhost'=password('123456');
mysql> flush privileges;
其他實例同理
16、新建用戶並授權
# mysql -S /tmp/mysql3307.sock -p
mysql> use mysql
mysql> grant select,delete,update,insert on *.* to jiangjj@'%' identified by '123456';
mysql> flush privileges;
注意:
mysqld_multi關閉不了MySQL處理Tips
vim /usr/local/mysql/bin/mysqld_multi
修改mysqld_mutli 把
my $com= join ' ', 'my_print_defaults ', @defaults_options, $group;
替換爲:
my $com= join ' ', 'my_print_defaults -s', @defaults_options, $group;
補充:mysql5.7配置類似,只是在配置數據庫賬號密碼用法不同