1. 程式人生 > >mysql -> 啟動&多例項_03

mysql -> 啟動&多例項_03

常用的連線方式:

套接字:  mysql -uroot -p123  -S /application/mysql/tmp/mysql.sock
Tcp/Ip: mysql -uroot -p123 -h 10.0.0.52 -P 3306

資料庫的啟動流程

mysqld 檔案屬性
[[email protected] ~]# cd /application/mysql/bin/
[[email protected] bin]# file mysqld
mysqld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

mysql.server檔案屬性
[
[email protected]
bin]# file ../support-files/mysql.server ../support-files/mysql.server: POSIX shell script text executable mysqld_safe檔案屬性 [[email protected] data]# file /application/mysql/bin/mysqld_safe /application/mysql/bin/mysqld_safe: POSIX shell script text executable

注:可以看出mysql.server檔案與mysqld_safe檔案都是指令碼檔案,最後都呼叫mysqld二進位制檔案進行啟動。

my.cnf 配置檔案說明

功能 

    1、影響到伺服器程序的啟動

    2、影響到客戶端程式

配置my.cnf

                  使用不同的"標籤"去明確指定影響哪部分功能

                  伺服器端

my.cnf檔案配置例項

[[email protected] data]# cat /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
port=3307
[mysql]
socket=/tmp/mysql.sock
user=root
password=123

檢查程序資訊,可以看到與my.cnf配置的相同

[[email protected] data]# ps -ef |grep [my]sql 
root       3411   1918  0 15:52 pts/1    00:00:00 /bin/sh /application/mysql/bin/mysqld_safe
mysql      3548   3411  0 15:52 pts/1    00:00:00 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/var/log/mysql.log --pid-file=/application/mysql/data/db02.pid --socket=/tmp/mysql.sock --port=3307

配置檔案的讀取過程

/etc/my.cnf --> /etc/mysql/my.cnf --> $MYSQL_HOME/my.cnf --> defaults-extra-file=/tmp/clsn.txt --> ~/.my.cnf

注:

假設4個配置檔案都存在,同時使用--defaults-extra-file指定了引數檔案,如果這時有一個 "引數變數"在5個配置檔案中都出現了,那麼後面的配置檔案中的引數變數值會覆蓋前面配置檔案中的引數變數值,就是說會使用 ~/.my.cnf 中設定的值

如果使用./bin/mysqld_safe 守護程序啟動mysql資料庫時,使用了 --defaults-file=<配置檔案的絕對路徑>引數,這時只會使用這個引數指定的配置檔案。

mysql多例項配置

  

  簡單地說,MySQL多例項就是在一臺伺服器上同時開啟多個不同的服務埠(如:3306/3307)同時執行多個MySQL服務程序,這些服務程序通過不同的socket監聽不同的服務埠來提供服務。

  這些MySQL多例項共用一套MySQL安裝程式,使用不同的my.cnf(也可以相同)配置檔案、啟動程式(也可以相同)和資料檔案。在提供服務時,多例項MySQL在邏輯上看來是各自獨立的,他們根據配置檔案對應設定值,獲得伺服器響應數量的資源。

 

多例項的作用與問題 

1、有效利用伺服器資源,充分利用剩餘的資源提供更多的服務

2、節約伺服器資源,需要主從同步等技術時,多例項就再好不過了

3、資源互搶問題,當某個服務例項併發很高或者慢查詢時,

整個例項會消耗更多的記憶體、CPU、磁碟IO資源

 

多例項生產場景應用 

1、資金緊張性公司的選擇 
  資金緊張,公司業務訪問量又不大,但又希望不同的業務的資料庫服務各自盡量獨立 
2、併發訪問不是特別大的業務 
  當公司業務訪問量不太大的時候,伺服器的資源基本都是浪費的,這就適合多例項的使用 
3、入口網站應用MySQL多例項場景 
  配置硬體好的伺服器,可以節省IDC機櫃空間,跑多例項也不會減少硬體資源不慢的浪費 
  一般是從庫多例項,例如:某部門使用IBM伺服器為48核CPU,記憶體96GB、一臺伺服器跑3~4個例項:此外,sina網也是用的多例項,記憶體48GB左右。企業環境中一般將多例項應用在測試環境。

配置方案  

1、多個配置檔案,多個啟動程式(比較好,推薦)

2、單一配置檔案,多個啟動程式(官方推薦,耦合性太高,不好)

單機執行1~4個數據庫例項

 

多例項配置過程

(1)準備多個目錄

[[email protected] ~]# mkdir -p /data/330{7,8,9}/data
[[email protected] 3308]# tree /data/
[[email protected] data]# tree 
.
├── 3307
│   └── data
├── 3308
│   └── data
├── 3309
│   └── data

(2)準備配置檔案(配置檔案與初始化先後順序不影響,但注意初始化路徑)

[[email protected] ~]# cat /data/3307/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
user=mysql
port=3307
server_id=7

[[email protected] ~]# cat /data/3308/my.cnf [mysqld] basedir=/usr/local/mysql datadir=/data/3308 socket=/data/3308/mysql.sock log_error=/data/3308/mysql.log user=mysql port=3308 server_id=8

[[email protected] data]# cat 3309/my.cnf [mysqld] basedir=/usr/local/mysql datadir=/data/3309 socket=/data/3309/mysql.sock log_error=/data/3309/mysql.log user=mysql port=3309 server_id=9

(3)初始化三套資料

mysqld --initialize-insecure  --user=mysql --datadir=/data/3307/data --basedir=/usr/local/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3308/data --basedir=/usr/local/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3309/data --basedir=/usr/local/mysql

(4)systemd管理多例項

cd /etc/systemd/system
cp mysqld.service mysqld3307.service 
cp mysqld.service mysqld3308.service 
cp mysqld.service mysqld3309.service 

[[email protected] system]# vim mysqld3307.service 
......
ExecStart=/usr/local/mysql/bin/mysqld--defaults-file=/data/3307/my.cnf

[[email protected] system]# vim mysqld3308.service 
......
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf

[[email protected] system]# vim mysqld3309.service 
......
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf

(5)授權

chown -R mysql.mysql /data/*

//過載守護程序   systemctl daemon reload
Warning: mysqld3309.service changed on disk. Run 'systemctl daemon-reload' to reload units.

(6)啟動

systemctl start mysqld3307.service 
systemctl start mysqld3308.service 
systemctl start mysqld3309.service 

檢視埠是否啟動mysqld

[[email protected] system]# netstat -lntup | grep 330
tcp6       0      0 :::3306 :::* LISTEN 2536/mysqld tcp6 0 0 :::3307 :::* LISTEN 3168/mysqld tcp6 0 0 :::3308 :::* LISTEN 3203/mysqld tcp6 0 0 :::3309 :::* LISTEN 3238/mysqld 

登入資料庫

[[email protected] system]# mysql -S /data/3307/mysql.sock   //-S, --socket=name   連線伺服器的sockey檔案

檢查建立例項是否存在

mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3308/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3309/mysql.sock -e "show variables like 'server_id'"

//例如:
[[email protected] system]# mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 7     |
+---------------+-------+

3306多例項管理指令碼

 1 [[email protected] /]# cat data/3306/mysql 
 2 #!/bin/sh
 3 #3306 start scripts
 4 #init
 5 port=3306
 6 mysql_user="root"
 7 CmdPath="/application/mysql/bin"
 8 mysql_sock="/data/${port}/mysql.sock"
 9 mysqld_pid_file_path=/data/3306/3306.pid
10 start(){
11     if [ ! -e "$mysql_sock" ];then
12          printf "Starting MySQL...\n"
13         /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
14         sleep 3
15     else
16         printf "MySQL is running...\n"
17         exit 1
18     fi
19 }
20 stop(){
21     if [ ! -e "$mysql_sock" ];then
22         printf "MySQL is stopped...\n"
23         exit 1
24     else
25         printf "Stoping MySQL...\n"
26         mysqld_pid=`cat "$mysqld_pid_file_path"`
27          if (kill -0 $mysqld_pid 2>/dev/null)
28            then
29              kill $mysqld_pid
30              sleep 2
31          fi
32     fi
33 }
34 
35 restart(){
36     printf "Restarting MySQL...\n"
37     stop
38     sleep 2
39     start
40 }
41 
42 case "$1" in
43     start)
44         start
45     ;;
46     stop)
47         stop
48     ;;
49     restart)
50         restart
51     ;;
52     *)
53         printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
54 esac
View Code

3307多例項管理指令碼

1 [[email protected] /]# cat data/3307/mysql 
 2 #!/bin/sh
 3 #3307 start scripts
 4 #init
 5 port=3307
 6 mysql_user="root"
 7 CmdPath="/application/mysql/bin"
 8 mysql_sock="/data/${port}/mysql.sock"
 9 mysqld_pid_file_path=/data/3307/3307.pid
10 start(){
11     if [ ! -e "$mysql_sock" ];then
12          printf "Starting MySQL...\n"
13         /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
14         sleep 3
15     else
16         printf "MySQL is running...\n"
17         exit 1
18     fi
19 }
20 stop(){
21     if [ ! -e "$mysql_sock" ];then
22         printf "MySQL is stopped...\n"
23         exit 1
24     else
25         printf "Stoping MySQL...\n"
26         mysqld_pid=`cat "$mysqld_pid_file_path"`
27          if (kill -0 $mysqld_pid 2>/dev/null)
28            then
29              kill $mysqld_pid
30              sleep 2
31          fi
32     fi
33 }
34 
35 restart(){
36     printf "Restarting MySQL...\n"
37     stop
38     sleep 2
39     start
40 }
41 
42 case "$1" in
43     start)
44         start
45     ;;
46     stop)
47         stop
48     ;;
49     restart)
50         restart
51     ;;
52     *)
53         printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
54 esac
View Code