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、入口網站應用MySQL多例項場景 配置硬體好的伺服器,可以節省IDC機櫃空間,跑多例項也不會減少硬體資源不慢的浪費 一般是從庫多例項,例如:某部門使用IBM伺服器為48核CPU,記憶體96GB、一臺伺服器跑3~4個例項:此外,sina網也是用的多例項,記憶體48GB左右。企業環境中一般將多例項應用在測試環境。
配置方案
單機執行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 esacView 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 esacView Code