體系結構及基礎管理

1. 體系結構

1.1 C/S(客戶端/服務端)模型介紹

TCP/IP方式(遠程、本地):

mysql -uroot -poldboy123 -h 10.0.0.51 -P3306

Socket方式(僅本地):

mysql -uroot -poldboy123 -S /tmp/mysql.sock

1.2 實例介紹
實例=mysqld後臺守護進程+Master Thread +幹活的Thread+預分配的內存

公司=老闆+經理+員工+辦公室

1.3 mysqld程序運行原理
1.3.1 mysqld程序結構

mysql出現故障或性能問題80%以上是人爲的。

                                                                    ---oldguo

1.3.2 一條SQL語句的執行過程

1.3.2.1 連接層

(1)提供連接協議:TCP/IP 、SOCKET

(2)提供驗證:用戶、密碼,IP,SOCKET

(3)提供專用連接線程:接收用戶SQL,返回結果

通過以下語句可以查看到連接線程基本情況

mysql> show processlist;

1.3.2.2 SQL層 (重點)

(1)接收上層傳送的SQL語句

(2)語法驗證模塊:驗證語句語法

(3)語義檢查:判斷SQL語句的類型

DDL :數據定義語言

DCL :數據控制語言

DML :數據操作語言

DQL:數據查詢語言

(4)權限檢查:用戶對庫表有沒有權限

(5)解析器:進行SQL的預處理,產生執行計劃

(6)優化器:根據解析器得出的多種執行計劃,進行判斷,選擇最優的執行計劃

    代價模型:資源(CPU IO MEM)的耗損評估性能好壞

(7)執行器:根據最優執行計劃,執行SQL語句,產生執行結果

執行結果:在磁盤的xxxx位置上

(8)提供查詢緩存(默認是沒開啓的),會使用redis tair替代查詢緩存功能

(9)提供日誌記錄(日誌管理章節):binlog,默認是沒開啓的。

1.3.2.3 存儲引擎層(類似於Linux中的文件系統)

負責根據SQL層執行的結果,從磁盤上拿數據。將16進制的磁盤數據,交由SQL架構化成表,由連接層的專用線程返回給用戶。

1.4 邏輯結構
1.4.1 庫:庫名,庫權限,庫數據類型等

1.4.2 表(二維表)

列:字段

行:記錄

MySQL爲了將來數據的準確、規範、有意義,對於傳統認知的二維表添加了更多的功能

表屬性:權限,存儲引擎,字符集

列屬性:數據類型、約束、其他屬性(默認值,自增長,註釋)

1.5 物理存儲結構引入
1.5.1 庫的物理存儲結構
用文件系統的目錄來存儲

1.5.2 表的物理存儲結構
MyISAM(一種引擎)的表:

user.frm:列的相關信息

user.MYD:數據行

user.MYI:索引信息

==========================

InnoDB(默認的存儲引擎)的表:

time_zone.frm:存儲列相關信息

time_zone.ibd:數據行+索引

1.5.3 表的段、區、頁(16k)(瞭解)
頁:最小的存儲單元

區:1個或多個連續的頁

段:一個表就是一個段,包含一個或多個區

==================================================

2. 基礎管理

2.1 用戶、權限管理

2.1.1 用戶

作用:

登錄,管理數據庫對象

定義:

用戶@‘白名單’

白名單?

允許哪些IP能夠登錄數據庫

支持的方式?

oldboy@’%’ :所有地址

oldboy@‘10.0.0.%’ :10.0.0.0/24 網段的地址

oldboy@‘localhost’ :本地主機

oldboy@‘10.0.0.5%’ :10.0.0.50~10.0.0.59

oldboy@‘10.0.0.0/255.255.254.0’ :子網掩碼不是24位的

管理操作:

增:

mysql> create user oldboy@‘10.0.0.%’ identified by ‘123’;

查:

mysql> select user ,host ,authentication_string from mysql.user

改:

mysql> alter user oldboy@‘10.0.0.%’ identified by ‘456’;

刪:

mysql> drop user oldboy@‘10.0.0.%’;

2.1.2 權限

介紹

SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

ALL : 以上所有權限,一般是普通管理員擁有的

with grant option:超級管理員才具備的,給別的用戶授權的功能

應用用戶:SELECT,INSERT, UPDATE, DELETE

權限管理操作:

grant 權限 on 對象 to 用戶 identified by ‘密碼’;

需求例子:windows機器的navicat登錄到linux中的MySQL,管理員用戶。

grant all on 對象 to 用戶 identified by ‘密碼’;

對象:

. —>chmod 755 -R / ----》針對管理員

oldboy.* chmod 755 -R /oldboy ----->應用用戶

oldboy.t1 chmod 755 -R /oldboy/t1

mysql> grant all on . to root@‘10.0.0.%’ identified by ‘123’;

需求:創建一個應用用戶app用戶,能從windows上登錄mysql,並能操作app庫。

mysql> grant select ,update,insert,delete on app.* to app@‘10.0.0.%’ identified by ‘123’;

開發人員用戶授權流程:

1.權限

2.對誰操作

3.你從哪來

4.密碼要求

提示:8.0在grant命令添加新特性

建用戶和授權分開了

grant 不再支持自動創建用戶了,不支持改密碼

授權之前,必須要提前創建用戶。

查看授權:

mysql> show grants for app@‘10.0.0.%’;

回收權限:

revoke delete on app.* from app@‘10.0.0.%’;

2.2 連接管理

2.2.1 自帶客戶端命令

mysql 常用參數:

-u 用戶

-p 密碼

-h IP

-P 端口

-S socket文件

-e 免交互執行命令

< 導入SQL腳本

登錄方法一——遠程登錄:

[root@db01 ~]# mysql -uroot -p -h 10.0.0.51 -P3306

Enter password:

登錄方法一——遠程登錄:

mysql> select @@socket;

±----------------+

| @@socket |

±----------------+

| /tmp/mysql.sock |

[root@db01 ~]# mysql -uroot -p -S /tmp/mysql.sock

Enter password:

[root@db01 ~]# mysql -uroot -p -e “select user,host from mysql.user;”

Enter password:

±--------------±----------+

| user | host |

±--------------±----------+

| abc | 10.0.0.% |

| app | 10.0.0.% |

| root | 10.0.0.% |

| mysql.session | localhost |

| mysql.sys | localhost |

| root | localhost |

±--------------±----------+

[root@db01 ~]#

[root@db01 ~]# mysql -uroot -p <world.sql

Enter password:

[root@db01 ~]#

2.3 多種啓動方式介紹

提示:

以上多種方式,都可以單獨啓動MySQL服務

mysqld_safe和mysqld一般是在臨時維護時使用。

另外,從Centos 7系統開始,支持systemd直接調用mysqld的方式進行啓動數據庫

2.4 初始化配置
2.4.1 初始化配置的方法
預編譯

配置文件

命令行

2.4.2 初始配置文件

初始化配置文件的默認讀取路徑

[root@db01 ~]# mysqld --help --verbose |grep my.cnf

/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

初始化配置文件讀取順序

/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

默認情況下,MySQL啓動時,會依次讀取以上配置文件,如果有重複選項,會以最後一個文件設置的爲準。

但是,如果啓動時加入了–defaults-file=xxxx時,以上的所有文件都不會讀取

配置文件的書寫方式

[標籤]

配置項=xxxx

標籤類型:服務端、客戶端

服務器端標籤:

[mysqld]

[mysqld_safe]

[server]

客戶端標籤:

[mysql]

[mysqldump]

[client]

配置文件的示例展示:

[root@db01 ~]# cat /etc/my.cnf

[mysqld]

user=mysql

basedir=/data/mysql

datadir=/data/mysql/data

socket=/tmp/mysql.sock

server_id=6

port=3306

log_error=/data/mysql/mysql.log

[mysql]

socket=/tmp/mysql.sock

prompt=Master [\d]>

2.5 多實例的應用

2.5.1 準備多個目錄

mkdir -p /data/330{7,8,9}/data

2.5.2 準備配置文件

vim /data/3307/my.cnf

[mysqld]

basedir=/data/mysql

datadir=/data/3307/data

socket=/data/3307/mysql.sock

log_error=/data/3307/mysql.log

port=3307

server_id=7


vim /data/3308/my.cnf

[mysqld]

basedir=/data/mysql

datadir=/data/3308/data

socket=/data/3308/mysql.sock

log_error=/data/3308/mysql.log

port=3308

server_id=8


vim /data/3309/my.cnf

[mysqld]

basedir=/data/mysql

datadir=/data/3309/data

socket=/data/3309/mysql.sock

log_error=/data/3309/mysql.log

port=3309

server_id=9


2.5.3 初始化三套數據

mv /etc/my.cnf /etc/my.cnf.bak

mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/data/mysql

mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/data/mysql

mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/data/mysql

2.5.4 systemd管理多實例

cd /etc/systemd/system

cp mysqld.service mysqld3307.service

cp mysqld.service mysqld3308.service

cp mysqld.service mysqld3309.service

vim mysqld3307.service

ExecStart=/data/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf

vim mysqld3308.service

ExecStart=/data/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf

vim mysqld3309.service

ExecStart=/data/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf

2.5.5 授權
chown -R mysql.mysql /data/*

2.5.6 啓動

systemctl start mysqld3307.service

systemctl start mysqld3308.service

systemctl start mysqld3309.service

2.5.7 驗證多實例

netstat -lnp|grep 330

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’”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章