1. MySQL體系結(jié)構(gòu)與管理
1.1 MySQL C/S結(jié)構(gòu)介紹 ***
兩種連接方式:
TCP/IP:mysql -uroot -poldboy123 -h 10.0.0.51 -P3306
Socket:mysql -uroot -poldboy123 -S /tmp/mysql.sock
1.2 MySQL實(shí)例的構(gòu)成 ***
公司: 老板? +? 經(jīng)理? + 員工 + 辦公區(qū)
實(shí)例: mysqld +? master thread? + 干活的Thread? + 預(yù)分配的內(nèi)存
1.3 MySQL中mysqld服務(wù)器進(jìn)程結(jié)構(gòu)
1.3.1 SQL語(yǔ)句引入
結(jié)構(gòu)化的查詢語(yǔ)言
DQL
DDL
DML
DCL
mysql> select user,host from mysql.user;
1.3.2 連接層
(1) 提供連接協(xié)議
Socket?
TCPIP
(2) 驗(yàn)證用戶名(root@localhost)密碼合法性肥卡,進(jìn)行匹配專門的授權(quán)表。
(3) 派生一個(gè)專用連接線程(接收SQL,返回結(jié)果)
? mysql> show processlist;
思考:
忘記密碼的參數(shù)在哪做的手腳冷溃?
--skip-grant-tables?
--skip-networking ?
1.3.3 SQL層(優(yōu)化方面至關(guān)重要的)
(1)驗(yàn)證SQL語(yǔ)法和SQL_MODE
(2)驗(yàn)證語(yǔ)義
(3)驗(yàn)證權(quán)限
(4)解析器進(jìn)行語(yǔ)句解析桐款,生成執(zhí)行計(jì)劃(解析樹(shù))
(5)優(yōu)化器(各種算法虹茶,基于執(zhí)行代價(jià))桥爽,根據(jù)算法舌胶,找到代價(jià)最低的執(zhí)行計(jì)劃升敲。
代價(jià):CPU? IO? MEM
(6)執(zhí)行器按照優(yōu)化器選擇執(zhí)行計(jì)劃答倡,執(zhí)行SQL語(yǔ)句,得出獲取數(shù)據(jù)的方法驴党。
(7)提供query cache(默認(rèn)不開(kāi))瘪撇,一般不開(kāi),會(huì)用redis
(8)記錄操作日志(binlog)港庄,默認(rèn)沒(méi)開(kāi)
未完待續(xù)
1.3.4 存儲(chǔ)引擎層
真正和磁盤打交道的一個(gè)層次
根據(jù)SQL層提供的取數(shù)據(jù)的方法倔既,拿到數(shù)據(jù),返回給SQL鹏氧,結(jié)構(gòu)化成表渤涌,再又連接層線程返回給用戶。
1.4 邏輯結(jié)構(gòu)
庫(kù)? ---> 表 ----》數(shù)據(jù)行(記錄)把还,字段(列)实蓬,屬性(列屬性,列約束吊履,列的數(shù)據(jù)類型等安皱,表屬性,權(quán)限)
表=====>數(shù)據(jù)行+列+元數(shù)據(jù)
1.5 物理結(jié)構(gòu)(引入)
1.5.1 宏觀
庫(kù)艇炎,存儲(chǔ)在操作系統(tǒng)的目錄中
表:
user表: MyISAM
user.frm? ? -----> 列的定義信息
user.MYD -----> 數(shù)據(jù)行
user.MYI? ? -----> 索引信息
time_zone表:InnoDB
time_zone.frm? ---->列的定義信息
time_zone.ibd? ---->數(shù)據(jù)行和索引
面試題:
說(shuō)明MyISAM和InnoDB在存儲(chǔ)方式上的異同酌伊?
1.5.2 微觀
段,區(qū)缀踪,頁(yè)
一個(gè)表就是一個(gè)段腺晾,mysql分配空間時(shí)至少分配一個(gè)區(qū)
每個(gè)區(qū)默認(rèn)是1M(64 個(gè) pages),MySQL最小的IO單元是PAGE(16K)
文件句柄辜贵,恢復(fù)rm的數(shù)據(jù)悯蝉。
2. 基礎(chǔ)管理
2.1 用戶管理
2.1.1 作用
登錄
管理數(shù)據(jù)庫(kù)對(duì)象
2.1.2 用戶的定義
用戶名@'白名單'
白名單?
oldguo@'10.0.0.51'
oldguo@'10.0.0.%'
oldguo@'10.0.0.5%'
oldguo@'10.0.0.0/255.255.254.0'
oldguo@'%'
oldguo@'oldguo.com'
oldguo@'localhost'
oldguo@'db01'
常用的:
oldguo@'10.0.0.%'
oldguo@'10.0.0.5%'
oldguo@'10.0.0.0/255.255.254.0'
oldguo@'localhost'
2.1.3 用戶管理
創(chuàng)建用戶
mysql> create user oldguo@'10.0.0.%' identified by '123';
查詢用戶
mysql> select user,host ,authentication_string from mysql.user;
小練習(xí):
1. 創(chuàng)建一個(gè)oldboy用戶托慨,密碼oldboy123 能夠通過(guò)172.16.1網(wǎng)段登錄數(shù)據(jù)庫(kù)鼻由,并且查看用戶
刪除用戶
mysql> drop user oldguo@'10.0.0.%';
修改用戶
mysql> alter user root@'localhost' identified by '123';
2.2 權(quán)限管理
2.2.1 權(quán)限作用
控制用戶登錄之后能對(duì)MySQL對(duì)象做哪些命令。
2.2.2 權(quán)限的定義
MySQL的權(quán)限定義就是SQL語(yǔ)句。
ALL:
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 : 以上所有權(quán)限蕉世,一般是普通管理員擁有的
with grant option:超級(jí)管理員才具備的蔼紧,給別的用戶授權(quán)的功能
8.0 版本新特性(了解)
加入了role的概念。
2.2.3 授權(quán)管理
(1)語(yǔ)法:
grant ALL? ? on? ? wordpress.* to? ? wordpress@'10.0.0.%'? identified by '123';
grant 權(quán)限? on? 范圍? to? 用戶? ? identified by '密碼' ?
grant select,update,insert,delete? ? on? 范圍? to? 用戶? ? identified by '密碼'
范圍:
*.*
wordpress.*
wordpress.t1
(2)例子:
1. 從windows中的navicat軟件使用root管理mysql數(shù)據(jù)庫(kù)
grant all on *.* to root@'10.0.0.%' identified by '123';
2. 創(chuàng)建 zhihu業(yè)務(wù)用戶能夠?qū)hihu業(yè)務(wù)庫(kù)進(jìn)行業(yè)務(wù)操作
grant select,update,delete ,insert on zhihu.* to zhihu@'10.0.0.%' identified by '123';
(3)思考一個(gè)問(wèn)題(課后自己進(jìn)行驗(yàn)證):
1. grant select,update on *.* to oldboy@'10.0.0.%';
2. grant delete on wordpress.* to oldboy@'10.0.0.%';
3. grant insert on wordpress.t1 to oldboy@'10.0.0.%';
問(wèn)狠轻,oldboy@'10.0.0.%' 能對(duì)t1表具備什么權(quán)限奸例?
MySQL中的權(quán)限是可以繼承,多次授權(quán)是疊加的向楼。
所以查吊,想要取消某個(gè)權(quán)限,必須通過(guò)回收的方式實(shí)現(xiàn)湖蜕,而不能多次重復(fù)授權(quán)逻卖。
(4)查看用戶權(quán)限
mysql> show grants for root@'localhost';
(5)回收權(quán)限
mysql> revoke delete on zhihu.* from 'zhihu'@'10.0.0.%';
面試題:
1.開(kāi)發(fā)人員找DBA開(kāi)用戶,需要DBA和開(kāi)發(fā)人員溝通什么昭抒?
(1)你要做哪些權(quán)限的操作
(2)你要從什么地址來(lái)登數(shù)據(jù)庫(kù)
(3)要對(duì)什么對(duì)象進(jìn)行管理操作评也?
2.開(kāi)發(fā)人員找DBA要管理員root用戶的密碼,作為DBA你怎么處理灭返?(金融公司)
情況一:
(1)不給
(2)在金融公司嚴(yán)令禁止盗迟,舉報(bào)!N鹾罚缕!
情況二(小公司)
root用戶是亂用,學(xué)會(huì)保護(hù)自己婆芦。
可以提意見(jiàn)怕磨,生成流程。
3. MySQL 連接管理
3.1 自帶的客戶端工具
mysql 參數(shù)
-u
-p
-S
-h
-P
[root@db01 ~]# mysql -uroot -p -S /tmp/mysql.sock
[root@db01 ~]# mysql -uoldguo -p -h10.0.0.51 -P3306
問(wèn)題:
怎么證明你的數(shù)據(jù)庫(kù)是可用的消约?
1. 證明進(jìn)程和端口存在
ps -ef |grep mysqld
netstat -lnp|grep mysqld
2. 驗(yàn)證用戶遠(yuǎn)程連接性
[root@db01 ~]# mysql -uoldguo -p -h10.0.0.51
-e
<
[root@db01 ~]# mysql -uoldguo -p123? -h10.0.0.51 -e "show databases;"
[root@db01 ~]# mysql -uroot -p <world.sql
3.2 遠(yuǎn)程的客戶端工具
navicat? sqlyog
略肠鲫。
4. MySQL 啟動(dòng)方式介紹
輔助腳本方式(普通的啟動(dòng)關(guān)閉):
sys-v? : /etc/init.d/mysqld?
/etc/init.d/mysqld? start
----> /application/mysql/bin/mysqld_safe
----> /application/mysql/bin/mysqld
systemd : /etc/systemd/system/mysqld.service
systemctl start mysqld?
---->/application/mysql/bin/mysqld
維護(hù)性的啟動(dòng)方式:
/application/mysql/bin/mysqld_safe? --skip-grant-tables --skip-networking &
/application/mysql/bin/mysqld &
5. MySQL 初始化配置
5.1 預(yù)編譯時(shí)進(jìn)行設(shè)置(略)
只能在編譯安裝中實(shí)現(xiàn)
硬編碼配置到程序中
5.2 初始化配置文件(my.cnf)
5.2.1 初始化配置文件默認(rèn)讀取位置
[root@db01 ~]# mysqld --help --verbose |grep "my.cnf"
/etc/my.cnf --》 /etc/mysql/my.cnf --》 /usr/local/mysql/etc/my.cnf? --》 ~/.my.cnf
--defaults-file=/opt/my.cnf
mysqld_safe
mysqld?
5.3 命令行模式
[root@db01 ~]# mysqld_safe --defaults-file=/opt/my.cnf --socket=/tmp/asdad &
5.4 初始化配置文件應(yīng)用
5.4.1 作用
數(shù)據(jù)庫(kù)的啟動(dòng):mysqld? mysqld_safe? ?
客戶端的連接:mysql? mysqldump? mysqladmin
5.4.2 書(shū)寫(xiě)格式
[程序名]
配置項(xiàng)=xxx
配置項(xiàng)=xxx
配置項(xiàng)=xxx
配置項(xiàng)=xxx
服務(wù)端
[server]
[mysqld]
[mysqld_safe]
客戶端
[client]
[mysql]
[mysqldump]
5.4.3 mysql初始化配置常用參數(shù)(通用模板)
[mysqld]
user=mysql
basedir=/application/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=6
port=3306
log_error=/data/mysql/data/mysql.log
log_bin=/data/mysql/data/mysql-bin? ?
[mysql]
socket=/tmp/mysql.sock
5.5 MySQL 多實(shí)例
5.5.1 創(chuàng)建目錄
mkdir -p /data/330{7,8,9}/data
5.5.2 準(zhǔn)備配置文件
cat > /data/3307/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/data/3307/mysql-bin
EOF
cat > /data/3308/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
port=3308
server_id=8
log_bin=/data/3308/mysql-bin
EOF
cat > /data/3309/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
port=3309
server_id=9
log_bin=/data/3309/mysql-bin
EOF
5.5.3 初始化三套數(shù)據(jù)
mv /etc/my.cnf /etc/my.cnf.bak
mysqld --initialize-insecure? --user=mysql --datadir=/data/3307/data --basedir=/application/mysql
mysqld --initialize-insecure? --user=mysql --datadir=/data/3308/data --basedir=/application/mysql
mysqld --initialize-insecure? --user=mysql --datadir=/data/3309/data --basedir=/application/mysql
5.5.4 systemd管理多實(shí)例
cd /etc/systemd/system
cp mysqld.service mysqld3307.service
cp mysqld.service mysqld3308.service
cp mysqld.service mysqld3309.service
vim mysqld3307.service
ExecStart=/application/mysql/bin/mysqld? --defaults-file=/data/3307/my.cnf
vim mysqld3308.service
ExecStart=/application/mysql/bin/mysqld? --defaults-file=/data/3308/my.cnf
vim mysqld3309.service
ExecStart=/application/mysql/bin/mysqld? --defaults-file=/data/3309/my.cnf
5.5.5 授權(quán)
chown -R mysql.mysql /data/*
5.5.6 啟動(dòng)
systemctl start mysqld3307.service
systemctl start mysqld3308.service
systemctl start mysqld3309.service
5.5.7 驗(yàn)證多實(shí)例
netstat -lnp|grep 330
mysql -S /data/3307/mysql.sock -e "select @@server_id"
mysql -S /data/3308/mysql.sock -e "select @@server_id"
mysql -S /data/3309/mysql.sock -e "select @@server_id"