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在啟動過程

  • 啟動后台守護進程(mysqld),並生成工作線程(xxxx)
  • 預分配內存結構供MySQL處理數據使用
  • 線程是干活的,進程是分配線程的
  • MySQL啟動過程中,啟動了一個守護進程(mysqld),並生成了許多線程

實例是什么:

MySQL的后台進程+線程+預分配的內存結構

 mysqld服務的構成

分為三層:

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

連接層

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

SQL層

sql層的處理流程圖解:

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

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

 SQL層的功能

1、判斷

      語法、語句、語義

      語句類型:DQL select

2、我們數據庫不能真正理解SQL語句

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

3、數據庫對象授權情況進行檢查。

4、解析(解析器)

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

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

5、優化(優化器)

      根據不同執行計划,知道哪個代價是最低的

      MySQL5.6以后學習了oracle的基於代價算法,從N種執行計划中,選擇代價最小的交給“執行器”

6、“執行器”

      運行執行計划

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

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

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

9、查詢緩存:緩存之前查詢的數據。

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

 存儲引擎層

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

功能:

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

依賴於存儲引擎的功能

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

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

為了用戶能夠讀懂數據出現的,更好的理解數據。

管理數據的一種方式:

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

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM