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