上篇文章介紹了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單機多實例來部署,若是上述介紹有什麼疑問或者問題,能夠在下方留言指出,歡迎轉發評論!
後續文章將更新在我的小站上,歡迎查看。