博客 / 詳情

返回

MySQL多實例配置

概述

MySQL 多實例是指在同一台物理服務器(或虛擬機)上,通過不同的配置文件、端口、數據目錄等隔離參數,運行多個獨立的 MySQL 服務進程。每個實例擁有自己的數據庫、用户、權限、日誌和內存資源(可通過配置限制),邏輯上等同於多台獨立的 MySQL 服務器。

通過大白話講就是:

  • 一般在一個系統環境中,可以運行多個相同的服務程序信息,並且產生不同的進程和網絡端口信息,就可以稱為多實例概念;
  • 在數據庫服務運行過程中,也可以啓動多個數據庫服務程序,產生多個數據庫服務進程和不同的服務端口,形成多實例;
  • 多個數據庫服務實例信息中存儲的數據庫信息是相互隔離和獨立的,並且利用數據庫服務多實例可以實現測試與分佈式架構需求。

企業數據庫服務端實例應用架構設計圖:
image

MySQL多實例的核心作用

資源利用率最大化(核心價值)

  • 單台服務器硬件資源(CPU、內存、磁盤)未飽和時,多實例可充分利用空閒資源,避免硬件浪費。

例:一台 32 核 64G 內存的服務器,僅運行 1 個 MySQL 實例(佔用 16G 內存),剩餘內存可部署 2-3 個實例,服務不同業務。

隔離性與風險控制

  • 業務隔離:不同業務(如電商訂單、用户會員、數據分析)部署在獨立實例,避免某業務的慢查詢、高併發影響其他業務。
  • 權限隔離:每個實例有獨立的 root 用户和業務賬號,防止跨業務數據泄露或誤操作。
  • 故障隔離:一個實例崩潰(如內存溢出、表損壞),其他實例不受影響,降低整體服務中斷風險。

成本優化

  • 減少服務器數量,降低硬件採購、機房託管、電力散熱等成本,尤其適合中小團隊或測試環境。
  • 避免 “為單一低負載業務單獨部署服務器” 的資源浪費。

靈活適配不同需求

  • 可針對不同實例配置差異化參數:
  • 核心業務實例:分配更多內存(innodb_buffer_pool_size)、更高 IO 優先級,優化併發性能。
  • 測試 / 報表實例:分配較少資源,允許較低的查詢性能,不影響核心業務。
  • 支持不同 MySQL 版本(如 5.7 和 8.0)共存,滿足老系統兼容和新功能測試需求。

MySQL多實例配置實操

部署規劃:

實例服務端口 實例存儲路徑 實例配置文件 套接字文件
端口信息:3307 /data/3307/data /data/3307/data/my.cnf /tmp/mysql3307.sock
端口信息:3308 /data/3308/data /data/3308/data/my.cnf /tmp/mysql3308.sock
端口信息:3309 /data/3309/data /data/3309/data/my.cnf /tmp/mysql3309.sock

下載前置依賴

# 下載libtinfo5、libnuma1依賴
root@master:~# apt update -y && apt install -y libtinfo5 libnuma1

下載mysql服務

方式一:進入官網下載,並上傳到宿主機中,適合離線環境

官網下載地址: https://downloads.mysql.com/archives/community/
image

方式二:直接在宿主機中使用wget進行下載,適合宿主機聯網環境

root@master:/data00/software/mysql_8.0.26# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz

解壓mysql服務並配置

# 服務解壓至家目錄
root@master:/data00/software/mysql_8.0.26# tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
 
# 創建軟鏈接
root@master:/data00/software/mysql_8.0.26# ln -s /data00/software/mysql_8.0.26/mysql-8.0.26-linux-glibc2.12-x86_64 /root/mysql

# 配置環境變量
root@master:~# echo 'export PATH=/root/mysql/bin:$PATH' >> /etc/profile
root@master:~# source /etc/profile

# 檢查環境變量
root@master:~# mysql -V
mysql  Ver 8.0.26 for Linux on x86_64 (MySQL Community Server - GPL)

創建mysql虛擬用户及存儲目錄

創建虛擬用户

# 創建用户
root@master:~# useradd -s /sbin/nologin -M mysql
# 檢查用户
root@master:~# id mysql
uid=2001(mysql) gid=2002(mysql) groups=2002(mysql)

創建存儲目錄

root@master:~# mkdir -p /data00/data/mysql330{7..9}
root@master:~# ll /data00/data/
total 16
drwxr-xr-x 6 mysql mysql 4096 Nov 28 14:27 mysql
drwxr-xr-x 2 root  root  4096 Nov 28 15:03 mysql3307
drwxr-xr-x 2 root  root  4096 Nov 28 15:03 mysql3308
drwxr-xr-x 2 root  root  4096 Nov 28 15:03 mysql3309

進行多實例數據目錄初始化步驟

# 如果存在my.cnf,挪走
root@master:~# ll /etc/my.cnf 
-rw-r--r-- 1 root root 394 Nov 28 14:25 /etc/my.cnf
root@master:~# mv /etc/my.cnf /tmp

# 初始化3307實例
root@master:~# mysqld --initialize-insecure --user=mysql  --datadir=/data00/data/mysql3307  --basedir=/root/mysql
2025-11-28T07:06:59.371413Z 0 [System] [MY-013169] [Server] /data00/software/mysql_8.0.26/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.26) initializing of server in progress as process 712455
2025-11-28T07:06:59.378238Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-11-28T07:06:59.908463Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-11-28T07:07:00.800804Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2025-11-28T07:07:00.801007Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2025-11-28T07:07:00.831043Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

# 初始化3308實例
root@master:~# mysqld --initialize-insecure --user=mysql  --datadir=/data00/data/mysql3308  --basedir=/root/mysql
2025-11-28T07:07:51.734893Z 0 [System] [MY-013169] [Server] /data00/software/mysql_8.0.26/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.26) initializing of server in progress as process 712572
2025-11-28T07:07:51.742666Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-11-28T07:07:52.250511Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-11-28T07:07:53.016441Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2025-11-28T07:07:53.016686Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2025-11-28T07:07:53.060209Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

# 初始化3309實例
root@master:~# mysqld --initialize-insecure --user=mysql  --datadir=/data00/data/mysql3309  --basedir=/root/mysql
2025-11-28T07:08:28.983028Z 0 [System] [MY-013169] [Server] /data00/software/mysql_8.0.26/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.26) initializing of server in progress as process 712843
2025-11-28T07:08:28.989875Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-11-28T07:08:29.529660Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-11-28T07:08:30.454927Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2025-11-28T07:08:30.455127Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2025-11-28T07:08:30.593524Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

編寫實例配置文件

# 3307實例
root@master:~# cat >/data00/data/mysql3307/my.cnf <<EOF
[mysqld]
server_id=3307
port=3307
user=mysql
basedir=/root/mysql
datadir=/data00/data/mysql3307
socket=/tmp/mysql3307.sock
EOF

# 3308實例
root@master:~# cat >/data00/data/mysql3308/my.cnf <<EOF
[mysqld]
server_id=3308
port=3308
user=mysql
basedir=/root/mysql
datadir=/data00/data/mysql3308
socket=/tmp/mysql3308.sock
EOF

# 3309實例
root@master:~# cat >/data00/data/mysql3309/my.cnf <<EOF
[mysqld]
server_id=3309
port=3309
user=mysql
basedir=/root/mysql
datadir=/data00/data/mysql3309
socket=/tmp/mysql3309.sock
EOF

編寫systemd配置文件

# 3307 systemd
root@master:~# cat >/usr/lib/systemd/system/mysqld3307.service<<EOF
[Unit]
Description=MySQL Server
Documentation=mysqld.service
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/root/mysql/bin/mysqld --defaults-file=/data00/data/mysql3307/my.cnf
LimitNOFILE = 5000
EOF

# 3308 systemd
root@master:~# cat >/usr/lib/systemd/system/mysqld3308.service<<EOF
[Unit]
Description=MySQL Server
Documentation=mysqld.service
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/root/mysql/bin/mysqld --defaults-file=/data00/data/mysql3308/my.cnf
LimitNOFILE = 5000
EOF

# 3309 systemd
root@master:~# cat >/usr/lib/systemd/system/mysqld3309.service<<EOF
[Unit]
Description=MySQL Server
Documentation=mysqld.service
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/root/mysql/bin/mysqld --defaults-file=/data00/data/mysql3309/my.cnf
LimitNOFILE = 5000
EOF

啓動mysql

# 加載systemd文件
root@master:~# systemctl daemon-reload

# 啓動服務
root@master:~# systemctl start mysqld3307
root@master:~# systemctl start mysqld3308
root@master:~# systemctl start mysqld3309

登錄實例並初始化(修改密碼、授權)

  • 初始化3307
root@master:~# mysql -uroot -S /tmp/mysql3307.sock

# 修改root用户密碼為root
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.01 sec)

# 創建一個可遠程連接的root用户(可選)
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.01 sec)
# 授權(可選)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)
# 刷新權限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

# 退出mysql,重新使用用户名、密碼連接
root@master:~# mysql -uroot -proot -P3307
mysql: [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 13
Server version: 8.0.26 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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>
  • 初始化3308
# 使用sock連接mysql
root@master:~# mysql -uroot -S /tmp/mysql3308.sock

# 修改root用户密碼為root
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.01 sec)

# 創建一個可遠程連接的root用户(可選)
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.01 sec)
# 授權(可選)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)
# 刷新權限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

# 退出mysql,重新使用用户名、密碼連接
root@master:~# mysql -uroot -proot -P3308
mysql: [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 13
Server version: 8.0.26 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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>
  • 初始化3309
root@master:~# mysql -uroot -S /tmp/mysql3309.sock

# 修改root用户密碼為root
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.01 sec)

# 創建一個可遠程連接的root用户(可選)
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.01 sec)
# 授權(可選)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)
# 刷新權限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

# 退出mysql,重新使用用户名、密碼連接
root@master:~# mysql -uroot -proot -P3309
mysql: [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 13
Server version: 8.0.26 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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>
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.