MySQL數據庫運維之多單機多實例搭建

上篇文章介紹了MySQL中索引應用,從本篇文章日後,將介紹MySQL運行維護相關內容,首先介紹一下MySQL單服務器多實例的搭建過程!

1、單機多實例的優缺點mysql

一、優勢
(1)單機多實例的部署方式能夠充分利用服務器資源
(2)若是後期業務量會擴展,使用多實例將數據分開存儲,有利於後期的數據遷移
二、缺點
(1)因爲多實例部署在一臺機器上,會形成必定程度上的服務器資源爭用(包括:CPU,內存,IO,網絡等)
(2)單機上的多實例容災能力較差,好比:單臺服務器磁盤若是損壞,全部實例的數據可能會丟失linux

2、單機多實例的搭建過程sql

一、軟件和環境準備
(1)通用二進制格式下載地址:https://dev.mysql.com/get/Dow...
(2)主機IP:192.168.0.10shell

二、將下載的軟件上傳到遠程服務器上,而後解壓,重命名。如下介紹過程當中使用的是5.6.39版本,和5.6.40版本沒有太大區別數據庫

[root@WB-BLOG local]# tar xf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz 
[root@WB-BLOG local]# mv mysql-5.6.39-linux-glibc2.12-x86_64 mysql-5.6.39

三、建立mysql用戶和多實例的目錄vim

[root@WB-BLOG local]# useradd mysql -s /sbin/nologin -M
[root@WB-BLOG local]# mkdir -pv /mysql_data/{3306,3307}/data
[root@WB-BLOG local]# tree /mysql_data/
    /mysql_data/
    ├── 3306
    │   └── data
    └── 3307
        └── data

四、配置3306端口對應的實例bash

[root@WB-BLOG local]# cd mysql-5.6.39
[root@WB-BLOG mysql-5.6.39]# cp support-files/my-default.cnf /mysql_data/3306/my.cnf
[root@WB-BLOG mysql-5.6.39]# cd /mysql_data/3306/
[root@WB-BLOG 3306]# vim my.cnf

編輯端口爲3306的實例的配置文件,寫入以下內容:服務器

[mysql]
socket = /mysql_data/3306/data/mysql.sock
[mysqld]
event_scheduler = ON
character-set-server = UTF8
innodb_buffer_pool_size = 128M
basedir = /usr/local/mysql-5.6.39
datadir = /mysql_data/3306/data
port = 3306
server_id = 3
socket = /mysql_data/3306/data/mysql.sock
innodb_file_per_table = 1
skip-name-resolve
innodb_flush_log_at_trx_commit = 2
log_bin = /mysql_data/3306/data/mysql-bin
log_bin_index = /mysql_data/3306/data/mysql-bin-index
binlog_format = mixed
log_error = /mysql_data/3306/data/mysql-error
pid_file = /mysql_data/3306/data/mysql.pid
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M 
max_connections = 1000
max_allowed_packet = 16M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

五、配置3307端口對應的實例網絡

將/mysql_data/3306目錄下的my.cnf複製一份到/mysql_data/3307目錄下,並修配置文件中的端口,server-id和數據目錄的路徑,以下:異步

[root@WB-BLOG 3306]# cd ../3307/
[root@WB-BLOG 3307]# cp ../3306/my.cnf .
[root@WB-BLOG 3307]# vim my.cnf

在端口爲3307的實例對應的配置文件中寫入以下內容:

[mysql]
socket = /mysql_data/3307/data/mysql.sock
[mysqld]
event_scheduler = ON
character-set-server = UTF8
innodb_buffer_pool_size = 128M
basedir = /usr/local/mysql-5.6.39
datadir = /mysql_data/3307/data
port = 3307
server_id = 4
socket = /mysql_data/3307/data/mysql.sock
innodb_file_per_table = 1
skip-name-resolve
innodb_flush_log_at_trx_commit = 2
log_bin = /mysql_data/3307/data/mysql-bin
log_bin_index = /mysql_data/3307/data/mysql-bin-index
binlog_format = mixed
log_error = /mysql_data/3307/data/mysql-error
pid_file = /mysql_data/3307/data/mysql.pid
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M 
max_connections = 1000
max_allowed_packet = 16M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

注意:上述的內容對比以後能夠發現,只有端口和server-id不一樣,因此可使用sed命令完成替換,以下:

[root@WB-BLOG 3307]# sed -i "s#3306#3307#g" my.cnf
[root@WB-BLOG 3307]# sed -i "s#server-id=3#server-id=4#g" my.cnf

六、查看目錄結構是否正常,以下所示表示的結果表示正常。而後將/mysql_data/3306和/mysql_data/3307目錄受權給mysql用戶

[root@WB-BLOG 3307]# tree /mysql_data/
    /mysql_data/
    ├── 3306
    │   ├── data
    │   └── my.cnf
    └── 3307
        ├── data
        └── my.cnf
[root@WB-BLOG 3307]# chown -R mysql:mysql /mysql_data/{3306,3307}
[root@WB-BLOG 3307]# ls -l /mysql_data/ 
    total 8
    drwxr-xr-x. 3 mysql mysql 4096 May 22 04:45 3306
    drwxr-xr-x. 3 mysql mysql 4096 May 22 04:51 3307

七、初始化3306實例和3307實例的數據目錄

[root@WB-BLOG 3307]# cd /usr/local/mysql-5.6.39
[root@WB-BLOG mysql-5.6.39]# ./scripts/mysql_install_db --basedir=/usr/local/mysql-5.6.39 --datadir=/mysql_data/3306/data/ --user=mysql
[root@WB-BLOG mysql-5.6.39]# ./scripts/mysql_install_db --basedir=/usr/local/mysql-5.6.39 --datadir=/mysql_data/3307/data/ --user=mysql
#從初始化的控制檯日誌判斷是否初始化成功,看到兩個單行的OK表示成功,以下
2018-05-22 04:58:48 0 [Note] /usr/local/mysql-5.6.39/bin/mysqld (mysqld 5.6.39-log) starting as process 3642 ...
OK
...
2018-05-22 04:58:54 0 [Note] /usr/local/mysql-5.6.39/bin/mysqld (mysqld 5.6.39-log) starting as process 3664 ...
OK

#查看3306和3307實例的數據目錄是否正常,是否有初始化以後的系統表
[root@WB-BLOG mysql-5.6.39]# ls /mysql_data/3306/data/
    ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test
[root@WB-BLOG mysql-5.6.39]# ls /mysql_data/3307/data/
    ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test

八、使用mysqld_safe命令測試實例是否能夠正常啓動

[root@WB-BLOG mysql-5.6.39]# cd bin/
[root@WB-BLOG bin]# ./mysqld_safe --defaults-file=/mysql_data/3306/my.cnf --datadir=/mysql_data/3306/data/ &
#查看進程是否正常啓動
[root@WB-BLOG bin]# netstat -tunlp | grep mysql
  tcp   0   0 :::3306      :::*      LISTEN      4050/mysqld

如上結果表示3306實例啓動正常,能夠用此方法測試3307是否能夠正常啓動。

九、手動編寫針對每一個實例的啓動腳本

(1)修改3306和3307實例的密碼,修改方式爲使用跳過受權表的方式啓動,而後登錄修改,能夠參考第一篇博文,MySQL的多種安裝方式中有介紹,使用的命令以下,再也不詳述

[root@WB-BLOG 3306]# /usr/local/mysql-5.6.39/bin/mysqld_safe --defaults-file=/mysql_data/3306/my.cnf --datadir=/mysql_data/3306/data/ --skip-grant-tables &
[root@WB-BLOG ~]# mysql -uroot -p -P3306 -S /mysql_data/3306/data/mysql.sock 
mysql> update user set password = password('root');
mysql> flush privileges;

(2)編寫3306實例的啓動腳本,以下:

[root@WB-BLOG bin]# cd /mysql_data/3306/
[root@WB-BLOG 3306]# vim mysqld

寫入以下內容:

#!/bin/bash
#
MYSQL_BASE_PATH=/usr/local/mysql-5.6.39
MYSQL_PORT=3306
MYSQL_3306_BASEDIR=/mysql_data/3306
MYSQL_SOCK=${MYSQL_3306_BASEDIR}/data/mysql.sock
MYSQL_CONF=${MYSQL_3306_BASEDIR}/my.cnf
MYSQL_DATADIR=${MYSQL_3306_BASEDIR}/data
MYSQL_USER=root
MYSQL_PASS=root

#When No Input
function Usage(){
   echo "Please Usage ./mysqld {start|stop|restart|status}"
   exit 2
}
#Start MySQL
function start_mysql() {
   if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
      echo "MySQL is already running..."
   else
      ${MYSQL_BASE_PATH}/bin/mysqld_safe --defaults-file=${MYSQL_CONF} --datadir=${MYSQL_DATADIR} > /dev/null 2>&1 &
      sleep 2
      if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
          echo "MySQL start success!"
      else
          echo "MySQL start failure.View logs and try again."
      fi
   fi
}
#Stop MySQL
function stop_mysql(){
   if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
       ${MYSQL_BASE_PATH}/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PASS} -P${MYSQL_PORT} -S ${MYSQL_SOCK} shutdown > /dev/null 2>&1 &
       sleep 2
       if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
          echo "MySQL stop failure..."
       else
          echo "MySQL stop success!"
       fi
   else
       echo "MySQL is not running..."
   fi  
}
#Restart MySQL
function restart_mysql(){
   stop_mysql
   sleep 2
   start_mysql
}
#MySQL status
function mysql_status(){
   if [ `ps -ef| grep mysql | grep ${MYSQL_PORT}|grep -v grep | wc -l` -gt 1 ]; then
       echo "MySQL is running..."
   else
       echo "MySQL is stopped."
   fi
}
case $1 in
start)
start_mysql
;;
stop)
stop_mysql
;;
restart)
restart_mysql
;;
status)
mysql_status
;;
*)
Usage
;;
esac

授予mysqld腳本可執行權限,而後啓動:

[root@WB-BLOG 3306]# chmod +x mysqld 
[root@WB-BLOG 3306]# ./mysqld start
#查看運行狀態
[root@WB-BLOG 3306]# ./mysqld status
    MySQL is running...

(3)將3306實例中的mysqld腳本拷貝一份到/mysqld_data/3307目錄下,而後修改端口及實例的目錄,最終內容以下:

#!/bin/bash
#
MYSQL_BASE_PATH=/usr/local/mysql-5.6.39
MYSQL_PORT=3307
MYSQL_3307_BASEDIR=/mysql_data/3307
MYSQL_SOCK=${MYSQL_3307_BASEDIR}/data/mysql.sock
MYSQL_CONF=${MYSQL_3307_BASEDIR}/my.cnf
MYSQL_DATADIR=${MYSQL_3307_BASEDIR}/data
MYSQL_USER=root
MYSQL_PASS=root

#When No Input
function Usage(){
   echo "Please Usage ./mysqld {start|stop|restart|status}"
   exit 2
}
#Start MySQL
function start_mysql() {
   if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
      echo "MySQL is already running..."
   else
      ${MYSQL_BASE_PATH}/bin/mysqld_safe --defaults-file=${MYSQL_CONF} --datadir=${MYSQL_DATADIR} > /dev/null 2>&1 &
      sleep 2
      if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
          echo "MySQL start success!"
      else
          echo "MySQL start failure.View logs and try again."
      fi
   fi
}
#Stop MySQL
function stop_mysql(){
   if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
       ${MYSQL_BASE_PATH}/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PASS} -P${MYSQL_PORT} -S ${MYSQL_SOCK} shutdown > /dev/null 2>&1 &
       sleep 2
       if [ `ps -ef | grep mysql | grep ${MYSQL_PORT} | grep -v grep | wc -l` -gt 1 ]; then
          echo "MySQL stop failure..."
       else
          echo "MySQL stop success!"
       fi
   else
       echo "MySQL is not running..."
   fi  
}
#Restart MySQL
function restart_mysql(){
   stop_mysql
   sleep 2
   start_mysql
}
#MySQL status
function mysql_status(){
   if [ `ps -ef| grep mysql | grep ${MYSQL_PORT}|grep -v grep | wc -l` -gt 1 ]; then
       echo "MySQL is running..."
   else
       echo "MySQL is stopped."
   fi
}
case $1 in
start)
start_mysql
;;
stop)
stop_mysql
;;
restart)
restart_mysql
;;
status)
mysql_status
;;
*)
Usage
;;
esac

十、單機多實例的登陸

(1)常規登陸方法

[root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3307 -S /mysql_data/3307/data/mysql.sock
參數解釋:
-S:指定示例對應的Socket文件

注意:單機多實例的登陸須要指定待登陸示例對應的socket文件。

(2)爲了防止每次登錄MySQL時須要帶一對參數,編寫一個方便登錄的腳本mysql_login.sh,將登陸所需參數寫入到腳本中,內容以下:

[root@WB-BLOG mysql_data]# cat mysql_login.sh 
#!/bin/bash
#
SERVER_IP=127.0.0.1
MYSQL_BASE_PATH=/usr/local/mysql-5.6.39
MYSQL_01_PORT=3306
MYSQL_02_PORT=3307

#MYSQL USER AND PASS
MYSQL_01_USER=root
MYSQL_01_PASS=root
MYSQL_02_USER=root
MYSQL_02_PASS=root

MYSQL_01_BASEDIR=/mysql_data/3306
MYSQL_02_BASEDIR=/mysql_data/3307

MYSQL_01_SOCK=${MYSQL_01_BASEDIR}/data/mysql.sock
MYSQL_02_SOCK=${MYSQL_02_BASEDIR}/data/mysql.sock

echo "1> mysql-3306"
echo "2> mysql-3307"

read -p "Please Input the Login Server Number:[1,2]:" INPUT
case $INPUT in
1)
${MYSQL_BASE_PATH}/bin/mysql -u${MYSQL_01_USER} -p${MYSQL_01_PASS} -P${MYSQL_01_PORT} -h${SERVER_IP} -S ${MYSQL_01_SOCK} --prompt='mysql-server-3306> '
;;
2)
${MYSQL_BASE_PATH}/bin/mysql -u${MYSQL_02_USER} -p${MYSQL_02_PASS} -P${MYSQL_02_PORT} -h${SERVER_IP} -S ${MYSQL_02_SOCK} --prompt='m
ysql-server-3307> '
;;
*)
echo "Wrong Input.Please run mysql_login.sh again."
;;
esac

腳本中的登陸命令參數說明:

prompt:指定登陸以後的mysql命令行提示符,若是同時打開多個shell窗口,能夠在每個mysql的命令行窗口指定命令提示符,防止數據庫的誤操做。

腳本的運行效果:

[root@WB-BLOG mysql_data]# ./mysql_login.sh 
1> mysql-3306
2> mysql-3307
Please Input the Login Server Number:[1,2]:1
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.39-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql-server-3306> 
#登陸成功

至此,MySQL的多實例搭建介紹完畢,後面的主從異步複製介紹打算使用MySQL單機多實例來部署,若是上述介紹有什麼疑問或者問題,能夠在下方留言指出,歡迎轉發評論!

後續文章將更新在我的小站上,歡迎查看。

相關文章
相關標籤/搜索