0.有感而發(fā)
0.1 關于學習的幾個階段
0.2 聽懂
0.3 面試能說明白
0.4 工作崗位上能干明白
0.5 變通和自主學習
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程序結構
1.3.2 一條SQL語句的執(zhí)行過程
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的預處理撮奏,產生執(zhí)行計劃
(6)優(yōu)化器:根據解析器得出的多種執(zhí)行計劃,進行判斷弯菊,選擇最優(yōu)的執(zhí)行計劃 代價模型:資源(CPU IO MEM)的耗損評估性能好壞(7)執(zhí)行器:根據最優(yōu)執(zhí)行計劃,執(zhí)行SQL語句踱阿,產生執(zhí)行結果執(zhí)行結果:在磁盤的xxxx位置上
(8)提供查詢緩存(默認是沒開啟的)管钳,會使用redis tair替代查詢緩存功能
(9)提供日志記錄(日志管理章節(jié)):binlog,默認是沒開啟的软舌。1.3.2.3 存儲引擎層(類似于Linux中的文件系統(tǒng))負責根據SQL層執(zhí)行的結果才漆,從磁盤上拿數據。將16進制的磁盤數據佛点,交由SQL架構化成表醇滥,由連接層的專用線程返回給用戶。
1.4 邏輯結構
1.4.1 庫:
庫名超营,庫權限鸳玩,庫數據類型等
1.4.2 表(二維表)
列:字段
行:記錄
MySQL為了將來數據的準確、規(guī)范演闭、有意義不跟,對于傳統(tǒng)認知的二維表添加了更多的功能
表屬性:權限,存儲引擎米碰,字符集
列屬性:數據類型窝革、約束、其他屬性(默認值吕座,自增長虐译,注釋)
1.5 物理存儲結構引入
1.5.1 庫的物理存儲結構用文件系統(tǒng)的目錄來存儲
1.5.2 表的物理存儲結構
MyISAM(一種引擎)的表
user.frm:列的相關信息
user.MYD:數據行
user.MYI:索引信息
==========================
InnoDB(默認的存儲引擎)的表:
time_zone.frm:存儲列相關信息
time_zone.ibd:數據行+索引
1.5.3 表的段、區(qū)吴趴、頁(16k)(了解)
頁:最小的存儲單元
區(qū):1個或多個連續(xù)的頁
段:一個表就是一個段漆诽,包含一個或多個區(qū)
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';
需求:創(chuàng)建一個應用用戶app用戶回季,能從windows上登錄mysql家制,并能操作app庫。
mysql> grant select ,update,insert,delete on app.* to app@'10.0.0.%' identified by '123';
開發(fā)人員用戶授權流程:
1.權限
2.對誰操作
3.你從哪來
4.密碼要求提示:
"8.0在grant命令添加新特性建用戶和授權分開了grant 不再支持自動創(chuàng)建用戶了泡一,不支持改密碼授權之前颤殴,必須要提前創(chuàng)建用戶"
**查看授權:
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 免交互執(zhí)行命令
< 導入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:
[root@db01 ~]#
[root@db01 ~]# mysql -uroot -p <world.sql
Enter password:
[root@db01 ~]
2.3 多種啟動方式介紹
提示:
以上多種方式鼻忠,都可以單獨啟動MySQL服務
mysqld_safe和mysqld一般是在臨時維護時使用涵但。
另外,從Centos 7系統(tǒng)開始帖蔓,支持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=6port=3306
log_error=/data/mysql/mysql.log
[mysql]
ocket=/tmp/mysql.sockprompt=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.serviceExecStart=/data/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
vim mysqld3309.serviceExecStart=/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'"