1、什麼是MySQL多實例?html
簡單的說,就是在一臺機器上開啓多個不一樣的服務端口(如:3306,3307),運行多個MySQL服務進程,這些服務進程經過不一樣的socket監聽不一樣的服務端口來提供各自的服務。mysql
共用一套MySQL安裝程序sql
使用不一樣(也能夠相同)的my.cnf配置文件、啓動程序、數據文件數據庫
做個比喻,MySQL多實例至關於房子的多個臥室同樣,每一個勢力能夠看作一個臥室,整個服務器就是一套房子。邏輯上是獨立的,可是互相會有影響。vim
2、多實例的做用與問題安全
一、有效利用服務器資源bash
當單個服務器資源有剩餘時,能夠充分利用剩餘的資源提供更多的服務。服務器
二、節約服務器資源併發
當公司資金緊張,可是數據庫又須要各自盡可能獨立提供服務,並且,須要主從同步等技術時,多實例就再好不過了。app
三、資源互相搶佔問題
當某個服務實例併發很高或者有慢查詢時,整個實例會消耗整個更多的內存、CPU、磁盤IO資源,致使服務器上的其餘的實例提供服務的質量降低。這就至關於你們住在一個房子的不一樣臥室同樣,早晨起來上班,都要刷牙、洗臉等,這樣衛生間就會被長期佔用,其它人就要等待同樣的道理。
3、MySQL多實例生產應用場景
一、資金緊張型公司的選擇
二、併發訪問不是特別大的業務
三、門戶網站應用MySQL多實例場景
主要是倆點:節約資金,充分利用資源
4、MySQL多實例常見配置方案
一、多配置文件部署方案:配置多個配置文件及多個啓動程序
提示:配置文件,啓動程序,數據文件分別是獨立的
二、單一配置文件部署方案
mysqld_multi (官方推薦) 耦合性過高
5、安裝多實例MySQL數據庫
一、MySQL安裝詳細請看https://www.cnblogs.com/cnxy168/p/11540198.html
二、建立MySQL多實例的數據文件目錄
rm -f /etc/init.d/mysqld
[root@localhost ~]# mkdir -p /data/{3306,3307}/data
[root@localhost ~]# tree /data
/data #總的多實例根目錄
├── 3306 #3306實例的目錄
│ └── data #3306手裏的數據文件目錄
└── 3307 #3307實例的目錄
└── data #3307實例的數據文件目錄
4 directories, 0 files
生產硬件配置:MEM 32g 雙cpu 8核 磁盤6*600g sas 15k。能跑2-3個實例
三、建立MySQL多實例的數據配置文件
rm -f /etc/init.d/mysqld mkdir -p /data/{3306,3307}/data [root@localhost ~]# tree /data /data ├── 3306 │ └── data └── 3307 └── data 4 directories, 0 files [root@localhost ~]# cd /home/oldboy/tools/ root@localhost tools]# unzip data.zip [root@localhost tools]# cp data/3306/my.cnf /data/3306 [root@localhost tools]# cp data/3307/my.cnf /data/3307 [root@localhost tools]# tree /data /data ├── 3306 │ ├── data │ └── my.cnf └── 3307 ├── data └── my.cnf 4 directories, 2 files [root@localhost tools]# cp data/3306/mysql /data/3306 [root@localhost tools]# cp data/3307/mysql /data/3307
[root@localhost tools]# tree /data
/data
├── 3306
│ ├── data
│ ├── my.cnf
│ └── mysql
└── 3307
├── data
├── my.cnf
└── mysql
4 directories, 4 files
cp data.zip / unzip -o data.zip #可代替上面操做
四、配置MySQL多實例的文件權限
受權mysql用戶和組管理整個多實例目錄/data
[root@localhost tools]# chown -R mysql.mysql /data [root@localhost tools]# find /data/ -type f -name "mysql" /data/3306/mysql /data/3307/mysql [root@localhost tools]# find /data/ -type f -name "mysql"|xargs ls -l -rw-r--r--. 1 mysql mysql 1307 9月 18 14:12 /data/3306/mysql -rw-r--r--. 1 mysql mysql 1307 9月 18 14:12 /data/3307/mysql [root@localhost tools]# find /data/ -type f -name "mysql"|xargs chmod +x [root@localhost tools]# find /data/ -type f -name "mysql"|xargs ls -l -rwxr-xr-x. 1 mysql mysql 1307 9月 18 14:12 /data/3306/mysql -rwxr-xr-x. 1 mysql mysql 1307 9月 18 14:12 /data/3307/mysql
五、配置MySQL命令全局使用路徑
1)配置全局路徑意義
若是不配置MySQL命令的全局路徑,就沒法直接敲mysql等命令,也就是隻能/usr/local/mysql/bin/mysql這樣敲命令
2)[root@localhost tools]# tail -1 /etc/profile
export PATH=/application/mysql/bin:$PATH
六、初始化MySQL多實例的數據庫文件
1)初始化命令爲
mysql5.5.32初始化命令:
[root@localhost tools]# cd /application/mysql/scripts/ [root@localhost scripts]# ./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3306/data --user=mysql [root@localhost scripts]# ./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3307/data --user=mysql
2)爲何要初始化數據庫?
a.初始化的主要目的就是建立基礎的數據庫文件,例如:生成mysql庫表等。
b.初始化後查看對應實例數據目錄,能夠看到以下文件。
[root@localhost scripts]# tree /data /data ├── 3306 │ ├── data │ │ ├── mysql │ │ │ ├── columns_priv.frm │ │ │ ├── columns_priv.MYD │ │ │ ├── columns_priv.MYI │ │ │ ├── db.frm │ │ │ ├── db.MYD │ │ │ ├── db.MYI │ │ │ ├── event.frm │ │ │ ├── event.MYD │ │ │ ├── event.MYI │ │ │ ├── func.frm │ │ │ ├── func.MYD 省略。。。
七、啓動MySQL多實例數據庫
[root@localhost scripts]# /data/3306/mysql start Starting MySQL... [root@localhost scripts]# /data/3307/mysql start Starting MySQL... [root@localhost scripts]# netstat -lntup|grep 330[6-7] tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 22823/mysqld tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 24832/mysqld
八、MySQL故障排錯多實例數據庫
[root@localhost 3306]# grep log-error my.cnf|tail -1 log-error=/data/3306/mysql_oldboy3306.err [root@localhost 3306]# cat mysql_oldboy3306.err 190918 14:45:32 mysqld_safe Starting mysqld daemon with databases from /data/3306/data 190918 14:45:32 [Note] Plugin 'FEDERATED' is disabled. 190918 14:45:32 InnoDB: The InnoDB memory heap is disabled 190918 14:45:32 InnoDB: Mutexes and rw_locks use GCC atomic builtins 190918 14:45:32 InnoDB: Compressed tables use zlib 1.2.3 190918 14:45:32 InnoDB: Initializing buffer pool, size = 32.0M 190918 14:45:32 InnoDB: Completed initialization of buffer pool
九、MySQL多實例數據庫管理方法
## 在MySQL裏面 命令前面加 system 能夠切換 數據庫
6、MySQL安全配置
[root@localhost 3306]# mysqladmin -u root -S /data/3306/mysql.sock password 'oldboy123' [root@localhost 3306]# mysqladmin -u root -S /data/3307/mysql.sock password 'oldboy123' [root@localhost 3306]# vim mysql [root@localhost 3306]# cd .. [root@localhost data]# vim 3307/my my.cnf mysqld.pid mysql.sock mysql mysql_oldboy3307.err [root@localhost data]# vim 3307/my my.cnf mysqld.pid mysql.sock mysql mysql_oldboy3307.err [root@localhost data]# vim 3307/mysql.sock [root@localhost data]# ls 3306 3307 [root@localhost data]# cd 3307 [root@localhost 3307]# vim mysql [root@localhost 3307]# find /data -type f -name "mysql" | -exec chmod 700 {} \; -bash: -exec: command not found [root@localhost 3307]# find /data -type f -name "mysql" -exec chmod 700 {} \; [root@localhost 3307]# find /data -type f -name "mysql" -exec chown root.root {} \; [root@localhost 3307]# find /data -type f -name "mysql" -exec ls -l {} \; -rwx------. 1 root root 1310 9月 18 17:48 /data/3306/mysql -rwx------. 1 root root 1310 9月 18 17:48 /data/3307/mysql [root@localhost 3307]# ss -lntup|grep 330 tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",26485,12)) tcp LISTEN 0 128 *:3307 *:* users:(("mysqld",27202,11)) [root@localhost 3307]# pkill mysqld [root@localhost 3307]# ss -lntup|grep 330 [root@localhost 3307]# /data/3306/mysql start Starting MySQL... [root@localhost 3307]# /data/3307/mysql start Starting MySQL... [root@localhost 3307]# ss -lntup|grep 330 tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",28117,12)) tcp LISTEN 0 128 *:3307 *:* users:(("mysqld",28834,11))
#在mysql腳本里面 修改數據庫密碼 把腳本修改成root權限
數據庫有密碼登陸數據庫
mysql -u用戶 -p密碼 -S /data/3306/mysql.sock
7、如何再添加一個MySQL實例
:g/A/s//B/g #把符合A的內容所有替換爲B :%s/A/B/g #把符合A的內容所有替換爲B :n1,n2s/A/B/gc #n1,n2爲數字,在第n1和n2間尋找A,用B替換
增長一個MySQL實例的命令過程以下:
[root@localhost ~]# mkdir /data/3308/data -p [root@localhost ~]# cp /data/3306/my.cnf /data/3308 [root@localhost ~]# cp /data/3306/mysql /data/3308 [root@localhost ~]# chown -R mysql.mysql /data/3308 [root@localhost ~]# vim /data/3308/mysql [root@localhost ~]# vim /data/3308/my.cnf 這兩項用上面的替換命令把3306替換成3308 [root@localhost scripts]# ./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3308/data --user=mysql Installing MySQL system tables... OK Filling help tables... OK [root@localhost scripts]# /data/3308/mysql start Starting MySQL... [root@localhost scripts]# ss -lntup | grep 330 tcp LISTEN 0 128 *:3308 *:* users:(("mysqld",410,12)) [root@localhost scripts]# mysql -uroot -S /data/3308/mysql.sock [root@localhost scripts]# mysqladmin -u root -S /data/3308/mysql.sock password 'oldboy123' [root@localhost scripts]# mysql -uroot -poldboy123 -S /data/3308/mysql.sock
八 、小結
遠程鏈接:mysql -u用戶 -p密碼 -h 地址 -P 端口