MySQL體系結構及多實例

MySQL客戶端和服務器端模型

  • MySQL是一個典型C/S,服務器端與客戶端兩部分組成
  • 服務器端程序  mysqld
  • mysql自帶的客戶端(mysql mysqladmin  mysqldump等),API接口(php-mysql)

鏈接方式

經過網絡鏈接串,TCP/IP:(用戶名;密碼;IP;port)
mysql -uroot -p123 -h 10.0.0.52 -P 3306 經過套接字文件,SOCKET:(用戶名;密碼;Socket路徑)
mysql -uroot -p123 -S /application/mysql/tmp/mysql.sock

MySQL服務器構成(實例的構成)

實例 

MySQL在啓動過程php

  • 啓動後臺守護進程(mysqld),並生成工做線程(xxxx)
  • 預分配內存結構供MySQL處理數據使用
  • 線程是幹活的,進程是分配線程的
  • MySQL啓動過程當中,啓動了一個守護進程(mysqld),並生成了許多線程

實例是什麼:mysql

MySQL的後臺進程+線程+預分配的內存結構redis

 mysqld服務的構成

分爲三層:算法

  1. 鏈接層
  2. SQL層
  3. 存儲引擎層

鏈接層

  • 通訊協議(tcp/ip  socket)
  • 鏈接線程
  • 用戶驗證(合法性,讓不讓鏈接)

SQL層

sql層的處理流程圖解:sql

SQL:結構化的查詢語言(數據庫內部的邏輯語言)又分爲:數據庫

  • DDL:數據庫定義語言
  • DCL:數據庫控制語言
  • DML:數據庫操做語言
  • DQL:數據查詢語言

 SQL層的功能

一、判斷緩存

      語法、語句、語義服務器

      語句類型:DQL select網絡

二、咱們數據庫不能真正理解SQL語句多線程

      必須明確的知道,數據在哪一個磁盤的,哪一個文件的哪一個,哪一個頁上。

三、數據庫對象受權狀況進行檢查。

四、解析(解析器)

      將sql語句解析成N種執行計劃

      mysql無法直接執行sql語句,必須解析成執行計劃,運行執行計劃,最終生成如何區磁盤找數據的方式

五、優化(優化器)

      根據不一樣執行計劃,知道哪一個代價是最低的

      MySQL5.6之後學習了oracle的基於代價算法,從N種執行計劃中,選擇代價最小的交給「執行器」

六、「執行器」

      運行執行計劃

      生成如何去磁盤找數據的方式

七、將取數據獲取的方式,交由下層(存儲引擎層)進行處理

八、最終,將取出的數據抽象成管理員或用戶能看懂的方式(表),展示用戶面前。

九、查詢緩存:緩存以前查詢的數據。

      假如咱們查詢的表是一個常常有變更的表,查詢緩存不要設置太大。

 存儲引擎層

存儲引擎是充當不一樣表類型的處理程序的服務器組件。

功能:

存數據、取數據
數據的不一樣存儲方式
不一樣的管理方式:
       事務(增、刪、改)
       備份恢復    
       高級功能(高可用的架構、讀寫分離架構)

依賴於存儲引擎的功能

  • 存儲介質
  • 事務功能
  • 鎖定
  • 備份和恢復
  • 優化
  • 特殊功能:
  • 全文搜索
    引用完整性
    空間數據處理

數據庫的邏輯結構(數據內部結構)

爲了用戶可以讀懂數據出現的,更好的理解數據。

管理數據的一種方式:

對象包括庫和表,庫中包括多張表,表中包括行記錄和列結構

 MySQL如何使用磁盤

 庫是用目錄表示的,表是庫目錄下的文件表示的

 

  •  .MYD類型文件:存儲行數據信息
  •  .frm類型文件:存儲列定義信息
  •  .MYI類型文件:存儲索引

mysql的存儲方式

程序文件隨數據目錄一塊兒存儲在服務器安裝目錄下。執行各類客戶機程序、管理程序和實用程序時,將建立程序可執行文件和日誌文件。首要使用磁盤空間的是數據目錄。

  • 服務器日誌文件和狀態文件:包含有關服務器處理的語句的信息。日誌可用於進行故障排除、監視、複製和恢復。
  • InnoDB 日誌文件:(適用於全部數據庫)駐留在數據目錄級別。
  • InnoDB 系統表空間:包含數據字典、撤消日誌和緩衝區。

每一個數據庫在數據目錄下均具備單一目錄(不管在數據庫中建立何種類型的表)。數據庫目錄存儲如下內容:

  • 數據文件:特定於存儲引擎的數據文件。這些文件也可能包含元數據或索引信息,具體取決於所使用的存儲引擎。
  • 格式文件 (.frm):包含每一個表和/或視圖結構的說明,位於相應的數據庫目錄中。
  • 觸發器:與某個表關聯並在該表發生特定事件時激活的命名數據庫對象。

數據目錄的位置取決於配置、操做系統、安裝包和分發。典型位置是 /var/lib/mysql。

MySQL 在磁盤上存儲系統數據庫 (mysql)。mysql 包含諸如用戶、特權、插件、幫助列表、事件、時區實現和存儲例程之類的信息。

小結

MySQL的鏈接方式

1. 經過網絡鏈接串,TCP/IP:(用戶名;密碼;IP;port)
mysql -uroot -p123 -h 10.0.0.52 -P 3306
3. 經過套接字文件,SOCKET:(用戶名;密碼;Socket路徑) mysql -uroot -p123 -S /application/mysql/tmp/mysql.sock

優化相關的理念(mysqld)

SQL解析(解析器):解析成 ,執行計劃  mysql可以理解的,執行SQL的一種方式

將sql語句解析成N種執行計劃
mysql無法直接執行sql語句,必須解析成執行計劃,運行執行計劃,最終生成如何

優化(優化器):直接影響選擇哪一個執行計劃

基本規則:根據不一樣執行計劃,知道哪一個代價是最低的
MySQL5.6之後學習了oracle的基於代價算法,從N種執行計劃中,選擇代價最小的交給「執行器」

查詢緩存:緩存以前所查詢的數據

做爲了解,生產中,通常會用相似於redis或memcache來代替

邏輯結構---物理結構對應關係

庫   ----->data   就是一個目錄,爲了存放多張表

表   ----->data   在相應的庫中,用多個文件來表示

myisam表:3個文件(.myd數據文件 .myi索引文件 .frm表(列)結構定義文件)

innodb:2個或者1個

如何使用磁盤的

  • 多個庫多個目錄,目錄下存放了多個表的存儲文件
  • 初始化生成的存儲文件:auto.cnf、ibdataN、ib_logfileN、db02.err等

 MySQL管理

 鏈接管理:mysql

鏈接mysql可使用的參數:

[root@db02 ~]# mysql --help
-u <user_name> 或 --host=<user_name>       # 登錄mysql的用戶 -p<password>                                # 登錄mysql的密碼
-h <host_name> 或 --host=<host_name>        # 遠程鏈接,後面跟鏈接mysql服務器的IP
--protocol=<protocol_name> 
-P <port_number> 或 --port=<port_number>    # 指定端口號
-S <socket_name> 或 --socket=<socket_name>  # 指定sock文件路徑

兩種鏈接方式

mysql -uroot -p123  -S /application/mysql/tmp/mysql.sock
mysql -uroot -p123 -h 10.0.0.52 -P 3306

參數文件配置/etc/my.cnf

功能:

1.影響到服務器進程的啓動

2.影響到客戶端程序

如何配置my.cnf

使用不一樣標籤明確指定影響哪部分功能

服務器端:

[server]包括:
[mysqld]   ---- > 通常設置此項
[mysqld_safe]

客戶端:

 [client] ---- > 爲了方便設置此項
 [mysql]
 [mysqldump]
 [mysqladmin]

配置文件讀取順序

/etc/my.cnf ---- > /etc/mysql/my.cnf --- > $MYSQL_HOME/my.cnf ---- > defaults-extra-file --- > ~/.my.cnf

若是在啓動mysql時利用--defaults-file指定了參數配置文件,那麼直接讀取指定的文件

/application/mysql/bin/mysqld_safe --defaults-file=/tmp/aa.txt

MySQL數據庫的關閉

常規關閉:

mysqladmin shutdown
servive mysqld stop

還有使用kill殺進程的方式關閉,可是儘可能不要使用kill方式關閉

可經過以下地址查看生產高併發環境野蠻粗魯殺死數據庫致使故障企業案例:

http://oldboy.blog.51cto.com/2561410/1431161

http://oldboy.blog.51cto.com/2561410/1431172

 

MySQL多實例

編輯要指定的my.cnf和啓動腳本

my.cnf文件

實例1:3306

[root@db02 3306]# cat /data/3306/my.cnf 
[client]
port            = 3306
socket          = /data/3306/mysql.sock

[mysqld]
user    = mysql
port    = 3306
socket  = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
log-bin = /data/3306/mysql-bin
server-id = 6

[mysqld_safe]
log-error=/data/3306/my_3306.err
pid-file=/data/3306/mysqld.pid

 實例2:3307

[root@db02 3306]# cat /data/3307/my.cnf 
[client]
port            = 3307
socket          = /data/3307/mysql.sock

[mysqld]
user    = mysql
port    = 3307
socket  = /data/3307/mysql.sock
basedir = /application/mysql
datadir = /data/3307/data
log-bin = /data/3307/mysql-bin
server-id = 7

[mysqld_safe]
log-error=/data/3307/myy_3307.err
pid-file=/data/3307/mysqld.pid

啓動腳本

3306啓動腳本:

[root@db02 3306]# cat /data/3306/mysql
#!/bin/sh
#init
port=3306
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/3306/3306.pid
start(){
    if [ ! -e "$mysql_sock" ];then
         printf "Starting MySQL...\n"
        /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
        sleep 3
    else
        printf "MySQL is running...\n"
        exit 1
    fi
}
stop(){
    if [ ! -e "$mysql_sock" ];then
        printf "MySQL is stopped...\n"
        exit 1
    else
        printf "Stoping MySQL...\n"
        mysqld_pid=`cat "$mysqld_pid_file_path"`
         if (kill -0 $mysqld_pid 2>/dev/null)
           then
             kill $mysqld_pid
             sleep 2
         fi
    fi
}

restart(){
    printf "Restarting MySQL...\n"
    stop
    sleep 2
    start
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
View Code

3307啓動腳本:

[root@db02 3306]# cat /data/3307/mysql 
#!/bin/sh
#init
port=3307
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/3307/3307.pid
start(){
    if [ ! -e "$mysql_sock" ];then
         printf "Starting MySQL...\n"
        /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
        sleep 3
    else
        printf "MySQL is running...\n"
        exit 1
    fi
}
stop(){
    if [ ! -e "$mysql_sock" ];then
        printf "MySQL is stopped...\n"
        exit 1
    else
        printf "Stoping MySQL...\n"
        mysqld_pid=`cat "$mysqld_pid_file_path"`
         if (kill -0 $mysqld_pid 2>/dev/null)
           then
             kill $mysqld_pid
             sleep 2
         fi
    fi
}

restart(){
    printf "Restarting MySQL...\n"
    stop
    sleep 2
    start
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
3307

建立數據目錄受權

mkdir /data/{3306,3307}/data -p
chown -R mysql.mysql /data/

初始化數據

cd /application/mysql/scripts  
./mysql_install_db  --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
./mysql_install_db  --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql

受權執行權限並啓動數據庫

5.6.36特殊性:須要建立錯誤日誌文件

touch /data/3306/my_3306.err
touch /data/3307/my_3307.err

給啓動腳本執行權限,啓動後檢查

chmod 700 /data/3306/mysql
chmod 700 /data/3307/mysql
[root@db02 3306]# /data/3306/mysql start
Starting MySQL...
[root@db02 3306]# /data/3307/mysql start
Starting MySQL...
[root@db02 3306]# netstat -lntup|grep 330
tcp        0      0 :::3306                     :::*                        LISTEN      3180/mysqld         
tcp        0      0 :::3307                     :::*                        LISTEN      3388/mysqld  

多實例登錄

mysql -S /data/3306/mysql.sock
mysql -S /data/3307/mysql.sock
相關文章
相關標籤/搜索