MySQL5.5多實例編譯安裝——多配置文件

来源:http://www.cnblogs.com/xuan-wei/archive/2017/05/14/6854346.html
-Advertisement-
Play Games

MySQL多實例簡單的說就是在一臺伺服器上安裝一套MySQL程式,通過不同的埠對外提供訪問,多實例不僅節省物理主機成本,還有效提升了單台物理主機的CPU、磁碟I/O使用效率,而且還可以在多實例之間做部署資料庫HA方案,根據不同的配置文件和啟動文件配置多實例,這種方法邏輯和配置簡單,但是不方便管理。 ...


一、什麼是MySQL多實例?
MySQL多實例簡單的說就是在一臺伺服器上安裝一套MySQL程式,通過不同的埠對外提供訪問,多實例不僅節省物理主機成本,還有效提升了單台物理主機的CPU、磁碟I/O使用效率,而且還可以在多實例之間做部署資料庫HA方案。
二、如何配置MySQL多實例?
配置mysql多實例有兩種方式
1、根據官方提供的是通過mysqld_multi使用單獨的配置文件來實現多實例,這種方式定製每個實例的配置不太方面,優點是管理起來很方便,集中管理。
2、使用多個配置文件和啟動文件,配置文件之間的區別:server-id、socket文件的位置、配置路徑和數據存放位置不同。初始化的時候只用不同的配置文件進行初始化資料庫,啟動時使用不同的啟動文件來啟動,這種方法邏輯和配置簡單,但是不方便管理。
下麵我們以第二種多實例的方法進行配置
三、多實例配置
MySQL安裝的是mysql5.5.52版本,安裝方法請看MySQL5.5.52編譯安裝
1、停止單實例mysql資料庫

[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL. SUCCESS!

2、禁止開機自啟動

[root@db01 ~]# chkconfig mysqld off
[root@db01 ~]# chkconfig --list mysqld
mysqld          0:關閉  1:關閉  2:關閉  3:關閉  4:關閉  5:關閉6:關閉

3、創建多實例根目錄/data/目錄

[root@db01 ~]# mkdir -p /data/{3306,3307}/data

需要特別說明一下,在多實例啟動文件中,啟動MySQL不同勢力服務所需要執行的命令實質是有區別的,例如,啟動3306實例命令如下

mysql_safe --defaults-file=/data/3306/mysql &>/dev/null

啟動3307實例的命令如下:

mysql_safe --defaults-file=/data/3307/mysql &>/dev/null

下麵看看多實例啟動文件中,停止MySQL不同實例服務的實質命令
停止3306實例的命令如下:

mysqladmin -uroot -p123456 -S /data/3306/mysql.sock shutdown

停止3307實例的命令如下:

mysqladmin -uroot -p123456 -S /data/3307/mysql.sock shutdown

4、創建MySQL多實例的配置文件和啟動文件
1)3306mysql實例配置文件

[root@db01 ~]# vim /data/3306/my.cnf
[client]
port            = 3306
socket          = /data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user    = mysql
port    = 3306
socket  = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
open_files_limit    = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_cache = 614
external-locking = FALSE
max_allowed_packet =8M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
#default_table_type = InnoDB
thread_stack = 192K
#transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
long_query_time = 1
#log_long_format
#log-error = /data/3306/error.log
#log-slow-queries = /data/3306/slow.log
pid-file = /data/3306/mysql.pid
log-bin = /data/3306/mysql-bin
relay-log = /data/3306/relay-bin
relay-log-info-file = /data/3306/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
#myisam_sort_buffer_size = 1M
#myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql
server-id = 1
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysqld_safe]
log-error=/data/3306/mysql_3306.err
pid-file=/data/3306/mysqld.pid

2)3307mysql實例配置文件

[root@db01 ~]# cp /data/3306/my.cnf /data/3307/my.cnf
[root@db01 ~]# sed -i 's#3306#3307#g' /data/3307/my.cnf
[root@db01 ~]# sed -n /server-id/p /data/3307/my.cnf
server-id = 1
[root@db01 ~]# sed -i 's#server-id = 1#server-id = 2#g' /data/3307/my.cnf                       
[root@db01 ~]# cat /data/3307/my.cnf
[client]
port            = 3307
socket          = /data/3307/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user    = mysql
port    = 3307
socket  = /data/3307/mysql.sock
basedir = /application/mysql
datadir = /data/3307/data
open_files_limit    = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_cache = 614
external-locking = FALSE
max_allowed_packet =8M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
#default_table_type = InnoDB
thread_stack = 192K
#transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
long_query_time = 1
#log_long_format
#log-error = /data/3307/error.log
#log-slow-queries = /data/3307/slow.log
pid-file = /data/3307/mysql.pid
log-bin = /data/3307/mysql-bin
relay-log = /data/3307/relay-bin
relay-log-info-file = /data/3307/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
#myisam_sort_buffer_size = 1M
#myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql
server-id = 2
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysqld_safe]
log-error=/data/3307/mysql_3307.err
pid-file=/data/3307/mysqld.pid

5、MySQL多實例啟動文件的創建和配置文件創建幾乎一樣,也可以通過vim命令來添加如下:
1)3306mysql實例啟動文件

[root@db01 ~]# vim /data/3306/mysql
#!/bin/bash
################################################
# Filename:mysql
# Description:Start MySQL multi instance script
# Version:1.0
# Date:2016/12/10
# Author:xuanwiei
# Email:[email protected]
################################################
#init
port=3306
mysql_user="root"
mysql_pwd="123456"  #這裡將來是要修改為和資料庫密碼一致
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
    else
      printf "MySQL is running...\n"
      exit
    fi
}
#stop function
function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
       ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
   fi
}
#restart function
function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}
case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

2)3307mysql實例啟動文件

[root@db01 ~]# cp /data/3306/mysql /data/3307/mysql
[root@db01 ~]# sed -i 's#3306#3307#g' /data/3307/mysql
[root@db01 ~]# cat /data/3307/mysql
#!/bin/bash
################################################
# Filename:    mysql
# Description: Start MySQL multi instance script
# Version:     1.0
# Date:        2016/12/10
# Author:      xuanwiei
# Email:       [email protected]
################################################
#init
port=3307
mysql_user="root"
mysql_pwd="123456"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
    else
      printf "MySQL is running...\n"
      exit
    fi
}
#stop function
function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
       ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
   fi
}
#restart function
function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}
case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

6、配置MySQL多實例的文件許可權
(1)通過下麵的命令授權mysql用戶和用戶組管理整個多實例的根目錄/data

[root@db01 ~]# chown -R mysql.mysql /data

(2)通過下麵的mysql多實例所有啟動文件的mysql可執行,設置700許可權最佳,註意不要用755許可權,因為文件里有資料庫管理員密碼,會被讀取到。

[root@db01 scripts]# find /data/ -type f -name "mysql"
/data/3306/mysql
/data/3307/mysql
[root@db01 scripts]# find /data/ -type f -name "mysql"|xargs chmod 700
[root@db01 scripts]# find /data/ -type f -name "mysql"|xargs ls -l
-rwx------ 1 root root 1359 12月 10 16:20 /data/3306/mysql
-rwx------ 1 root root 1359 12月 10 16:22 /data/3307/mysql

7、初始化MySQL多實例的資料庫文件
(1)初始化MySQL資料庫

cd /application/mysql/scripts/ <==註意和MySQL5.1的路徑不同,MySQL5.1不在MySQL bin路徑下了
3306實例
/application/mysql/scripts/mysql_install_db \
--basedir=/application/mysql \
--datadir=/data/3306/data \
--user=mysql
3307實例
/application/mysql/scripts/mysql_install_db \
--basedir=/application/mysql \
--datadir=/data/3307/data \
--user=mysql

提示:--basedir=/application/mysql為MySQL的安裝路徑,--datadir為不同的實例數據目錄
操作過程:

[root@db01 ~]# cd /application/mysql/scripts/
[root@db01 scripts]# /application/mysql/scripts/mysql_install_db \
> --basedir=/application/mysql \
> --datadir=/data/3306/data \
> --user=mysql
WARNING: The host 'db01' could not be looked up with resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !
Installing MySQL system tables...
161117 14:14:14 [Note] /application/mysql/bin/mysqld (mysqld 5.5.52) starting as process 46676 ...
OK
Filling help tables...
161117 14:14:15 [Note] /application/mysql/bin/mysqld (mysqld 5.5.52) starting as process 46683 ...
OK

如果有兩個ok,就表示初始化成功
其中WARNING: The host 'db01' could not be looked up with resolveip.
原因是因為db01沒有在hosts文件中解析
解決:echo "172.16.1.52     db01" >>/etc/hosts

[root@db01 scripts]# /application/mysql/scripts/mysql_install_db \
> --basedir=/application/mysql \
> --datadir=/data/3307/data \
> --user=mysql
Installing MySQL system tables...
161117 14:18:20 [Note] /application/mysql/bin/mysqld (mysqld 5.5.52) starting as process 46733 ...
OK
Filling help tables...
161117 14:18:21 [Note] /application/mysql/bin/mysqld (mysqld 5.5.52) starting as process 46740 ...
OK

如果有兩個ok,就表示初始化成功
這次沒用出現WARNING: The host 'db01' could not be looked up with resolveip.
(2)初始化資料庫的原理及結果

[root@db01 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
│   │   │   ├── func.MYI
…………………省略部分………………………………

(3)初始化故障
示例1:給出了警告信息“WARNING: The host 'db01' could not be looked up with resolveip.”
這個警告信息可以忽略,如果非要解決則需修改主機名解析 

echo "172.16.1.52     db01" >>/etc/hosts

8、啟動MySQL多實例資料庫
第一個實例3306的啟動命令

/data/3306/mysql start

第二個實例3307的啟動命令

/data/3307/mysql start

現在檢查MySQL多實例資料庫是否成功啟動

netstat -lntup|grep 330

操作過程:

[root@db01 scripts]# /data/3306/mysql    
Usage: /data/3306/mysql {start|stop|restart}
[root@db01 scripts]# /data/3306/mysql start
Starting MySQL...
[root@db01 scripts]# /data/3307/mysql start
Starting MySQL...

查看埠

[root@db01 scripts]# ss -nlutp|grep 330
tcp    LISTEN     0      600                    *:3306                  *:*      users:(("mysqld",48766,12))
tcp    LISTEN     0      600                    *:3307                  *:*      users:(("mysqld",49510,12))


9、配置及管理MySQL多實例資料庫
(1)配置MySQL多實例資料庫開機自啟動
服務的開機自啟動和關鍵,MySQL多實例的啟動也不例外,把MySQL多實例的啟動命令加入/etc/rc.local,實現開機自啟動:

cat >>/etc/rc.local<<EOF
#mysql multi instances
/data/3306/mysql start
/data/3307/mysql start
EOF
tail -3 /etc/rc.local

提示:要確保MySQL腳本有執行許可權
(2)登陸mysql測試
登錄時要指定sock文件
測試命令如下:

mysql -S /data/3306/mysql.sock    <==直接敲進來了,而且身份還是root,但是多了-S /data/3306/mysql.sock,用戶區別登錄不同的實例

操作演示

[root@db01 scripts]# mysql -S /data/3306/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.52-log Source distribution
Copyright (c) 2000, 2016, 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>
[root@db01 3306]# mysql -S /data/3307/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.52-log Source distribution
Copyright (c) 2000, 2016, 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>

到這裡MySQL多實例就配置完成啦O(∩_∩)O~~!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...