本課程,適合具備一定Linux運(yùn)維或者開發(fā)基礎(chǔ)的朋友警没,課程定級(jí)中匈辱、高級(jí)DBA。
只要掌握80%杀迹,輕松助力薪資15k-25K亡脸。
課程內(nèi)容均來自與MySQL官網(wǎng)+MySQL源碼。
配套精品視頻(2021 5月全新錄制树酪,版權(quán)所有:郭加磊 oldguo浅碾。),獲取方法私聊续语。
1. MySQL C/S結(jié)構(gòu)
Clinet : mysql mysqldump ,sqlyog,API
Server : mysqld守護(hù)進(jìn)程
2. 實(shí)例(instance)
實(shí)例: mysqld + 線程(Master thread , IO ,SQL ,purge...) + 預(yù)分配內(nèi)存(數(shù)據(jù)\日志\線程)
公司: boss + 員工(總經(jīng)理+普通員工) + 辦公室
3. MySQL服務(wù)的構(gòu)成
3.1 Server層
a. 連接層
b. SQL 層
3.2 engine 存儲(chǔ)引擎層
4. 對(duì)象存儲(chǔ)結(jié)構(gòu)和邏輯結(jié)構(gòu)的對(duì)比
邏輯結(jié)構(gòu):
庫 : 庫名,庫屬性(字符集,校對(duì)規(guī)則)
表 : 列+行+表屬性+表名
存儲(chǔ)結(jié)構(gòu):
庫---> 目錄
表---> xx.ibd ---> 區(qū)(extents)---->頁(pages)
5. 用戶管理
5.1 作用
登陸數(shù)據(jù)庫
管理數(shù)據(jù)庫對(duì)象
5.2 長成啥樣?
名字@'白名單'
白名單? ----> 在白名單中的IP才能連MySQL
oldguo@'localhost' --> 本地用戶
oldguo@'10.0.0.2' --> 單一IP
oldguo@'10.0.0.%' --> 范圍IP
oldguo@'10.0.0.5%' --> 范圍IP
oldguo@'10.0.0.0/255.255.254.0' --> 范圍IP
oldguo@'%' --> 范圍IP
安全規(guī)范:
a. 白名單盡量小,最好細(xì)化到單一IP, %要不得.
b. 用戶名有特點(diǎn).
c. 無用的用戶要?jiǎng)h除或者鎖定.
d. 密碼超過三種復(fù)雜度,12位以上.
5.3 查\增\刪\改
5.3.1 查詢
mysql> desc mysql.user;
mysql> select user,host ,authentication_string ,plugin from mysql.user;
mysql> select user as "用戶",host as "白名單" ,authentication_string as "密碼",plugin as "插件" from mysql.user;
mysql> select user as "用戶",host as "白名單" ,plugin as "插件" from mysql.user;
5.3.2 創(chuàng)建用戶
mysql> create user oldboy@'10.0.0.%' identified by '123';
mysql> create user oldguo@'10.0.0.%' identified with mysql_native_password by '123';
命令不會(huì),看幫助.
mysql> help create user;
5.5.3 彩蛋:
- 8.0 之后必須先建用戶后授權(quán),grant不再支持建用戶功能和密碼修改功能;
- 密碼插件,8.0之前使用mysql_native_password,8.0 之后使用caching_sha2_password
- 導(dǎo)致的問題: 使用老的客戶端程序,連接不了8.0版本
解決方法:
a. 建用戶時(shí),指定mysql_native_password插件進(jìn)行密碼加密.
b. 修改用戶時(shí),可以修改插件
c. 配置文件中指定默認(rèn)加密插件為mysql_native_password
5.3.4 修改用戶
mysql> alter user oldboy@'10.0.0.%' identified with mysql_native_password by '123';
mysql> select user as "用戶",host as "白名單" ,plugin as "插件" from mysql.user;
mysql> alter user oldboy@'10.0.0.%' ACCOUNT LOCK;
mysql> alter user oldboy@'10.0.0.%' ACCOUNT UNLOCK;
5.3.5 刪除用戶
mysql> drop user oldboy@'10.0.0.%';
6. 權(quán)限管理
6.1 作用
約束用戶能夠?qū)?shù)據(jù)庫對(duì)象(庫,表)干啥(SQL).
6.2 權(quán)限列表
mysql> SHOW PRIVILEGES;
ALL ? 除了Grant option所有權(quán)限.
2.3 授權(quán)
grant 權(quán)限 on 權(quán)限范圍 to 用戶;
權(quán)限范圍?
*.* 全局范圍,包含了所有庫表 chmod 777 -R /
wordpress.* 單庫范圍 chmod 777 -R /wordpress
wordpress.t1 單表
mysql> create user root@'10.0.0.%' identified with mysql_native_password by '123';
mysql> grant all on *.* to root@'10.0.0.%';
mysql> create user wp_user@'10.0.0.%' identified with mysql_native_password by '123';
mysql> grant select,update,delete,insert on wordpress.* to wp_user@'10.0.0.%';
6.4 查詢用戶權(quán)限
6.4.1 專用命令
mysql> show grants for wp_user@'10.0.0.%';
6.4.2. 授權(quán)表查詢
use mysql ;
user : user host auth plugin 全局授權(quán)(*.*)的權(quán)限
db : user host 單庫范圍授權(quán)(wordpress.* )的用戶權(quán)限
table_priv : user host 單表范圍授權(quán)(wordpress.t1)的用戶權(quán)限
6.5 回收權(quán)限
mysql> revoke delete ON `wordpress`.* from `wp_user`@`10.0.0.%`;
mysql> show grants for wp_user@'10.0.0.%';
6.6 角色 role MySQL 8.0 中的role支持
需求
oldguo.* rw(insert,update,delete,select) --->oldguo_rw
oldguo.* r (select) --->oldguo_r
mysql> create role oldguo_rw,oldboy_r;
mysql> grant select on oldguo.* to oldboy_r;
mysql> grant select,update,insert,delete on oldguo.* to oldguo_rw;
mysql> create user user1@'%' identified by '123';
mysql> create user user2@'%' identified by '123';
mysql> grant oldguo_r to user1@'%';
mysql> grant oldguo_rw to user2@'%';
6.7 彩蛋 本地管理員root@'localhost',密碼忘記(誤刪除\誤修改)
a. 重啟數(shù)據(jù)庫到無驗(yàn)證模式
[root@db01 ~]# /etc/init.d/mysqld stop
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
b. 登錄改密碼
[root@db01 ~]# mysql
mysql> flush privileges;
mysql> alter user root@'localhost' identified by '123';
c. 正常啟動(dòng)數(shù)據(jù)庫
[root@db01 ~]# /etc/init.d/mysqld restart
6.8 彩蛋: 如何暴力破解弱口令
7. 連接管理
7.1 自帶客戶端程序
7.1.1 mysql
(1) 本地 socket文件連接
條件: localhost用戶需要提前創(chuàng)建.
[root@db01 ~]# mysql -uroot -p123 -S /tmp/mysql.sock
(2) 網(wǎng)絡(luò)連接串(TCP/IP)
條件: 遠(yuǎn)程連接用戶必須出現(xiàn)在白名單.
[root@db01 ~]# mysql -uoldguo -p123 -h10.0.0.51 -P3306
7.2 開發(fā)工具
sqlyog
navicat
workbench
7.3 程序(驅(qū)動(dòng))連接
php
python
go
java
等垂谢。
8. 配置文件
8.1 方式
a. 源碼包,編譯時(shí)配置一些參數(shù)(CMAKE)
b. 配置文件
c. 命令行指定
8.2 配置文件應(yīng)用
8.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
注意:
a. 多個(gè)文件會(huì)依次從左到右讀取,如果有重復(fù),最后讀取的生效.
b. 啟動(dòng)時(shí),強(qiáng)制指定讀取哪個(gè)配置文件(--defaults-file=/opt/aa.txt),mysqld mysqld_safe 程序能夠調(diào)用
8.2.2 基本結(jié)構(gòu)
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
port=3306
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
[標(biāo)簽] :
[服務(wù)端]: [mysqld] [mysqld_safe] [server]
影響: 數(shù)據(jù)庫啟動(dòng),初始化.
[客戶端]: [mysql] [mysqldump] [client]
影響: 只影響到本機(jī)客戶端程序運(yùn)行.
9. 啟動(dòng)關(guān)閉
9.1 啟動(dòng)方式
mysqld &
mysqld_safe &
mysql.server start
service start systemd start
9.2 關(guān)閉方式
mysql.server stop
sys-v systemd stop
mysqladmin -uroot -p123 shutdown
shutdown
10. 多實(shí)例
10.1 同版本
10.1.1 多套目錄
mkdir -p /data/330{7..9}/data
chown -R mysql. /data
10.1.2 配置文件
cat >/data/3307/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3307/data
port=3307
socket=/tmp/mysql3307.sock
EOF
cat >/data/3308/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
socket=/tmp/mysql3308.sock
EOF
cat >/data/3309/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3309/data
port=3309
socket=/tmp/mysql3309.sock
EOF
10.1.3 初始化數(shù)據(jù)
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data
10.1.4 啟動(dòng)數(shù)據(jù)庫
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
cat >/etc/systemd/system/mysqld3307.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3308.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3309.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF
systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309
10.2 多版本多實(shí)例
10.2.1 5.6和5.7 解壓和軟連接
[root@db01 opt]# ln -s /opt/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql57
[root@db01 opt]# ln -s /opt/mysql-5.6.46-linux-glibc2.12-x86_64 /usr/local/mysql56
10.2.2 目錄及授權(quán)
mkdir -p /data/331{6..7}/data
chown -R mysql. /data
10.2.3 配置文件
cat >/data/3316/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql56
datadir=/data/3316/data
port=3316
socket=/tmp/mysql3316.sock
EOF
cat >/data/3317/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3317/data
port=3317
socket=/tmp/mysql3317.sock
EOF
10.2.4 初始化數(shù)據(jù)
/usr/local/mysql57/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/3317/data
/usr/local/mysql56/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3316/data
10.2.5 啟動(dòng)
[root@db01 opt]# /usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/3316/my.cnf &
[root@db01 opt]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3317/my.cnf &
10.2.6 連接
[root@db01 opt]# mysql -S /tmp/mysql3307.sock
[root@db01 opt]# mysql -S /tmp/mysql3316.sock
[root@db01 opt]# mysql -S /tmp/mysql3317.sock
11. 升級(jí)
11.1 升級(jí)方式
a. inplace (就地升級(jí))
適合于有主從環(huán)境.
b. merging (邏輯備份遷移升級(jí))
11.2 升級(jí)注意事項(xiàng)(INPLACE)
來自于MySQL官網(wǎng)
Upgrade is only supported between General Availability (GA) releases.
Upgrade from MySQL 5.6 to 5.7 is supported. Upgrading to the latest release is recommended before upgrading to the next version. For example, upgrade to the latest MySQL 5.6 release before upgrading to MySQL 5.7.
Upgrade that skips versions is not supported. For example, upgrading directly from MySQL 5.5 to 5.7 is not supported.
Upgrade within a release series is supported. For example, upgrading from MySQL 5.7.x to 5.7.y is supported. Skipping a release is also supported. For example, upgrading from MySQL 5.7.x to 5.7.z is supported.
翻譯:
a. 支持GA版本之間升級(jí)
b. 5.6--> 5.7 ,先將5.6升級(jí)至最新版,再升級(jí)到5.7
c. 5.5 ---> 5.7 ,先將5.5 升級(jí)至最新疮茄,再5.5---> 5.6最新滥朱,再5.6--->5.7 最新
d. 回退方案要提前考慮好,最好升級(jí)前要備份(特別是往8.0版本升級(jí))力试。
e. 降低停機(jī)時(shí)間(停業(yè)務(wù)的時(shí)間)
11.3 INPLACE 升級(jí)過程原理
1.備份原數(shù)據(jù)庫數(shù)據(jù)
2. 安裝新版本軟件
3. 關(guān)閉原數(shù)據(jù)庫(掛維護(hù)頁
4. 使用新版本軟件 “掛” 舊版本數(shù)據(jù)啟動(dòng)(--skip-grant-tables ,--skip-networking)
5. 升級(jí) : 只是升級(jí)系統(tǒng)表徙邻。升級(jí)時(shí)間和數(shù)據(jù)量無關(guān)的。
6. 正常重啟數(shù)據(jù)庫畸裳。
7. 驗(yàn)證各項(xiàng)功能是否正常缰犁。
8. 業(yè)務(wù)恢復(fù)。
11.4 5.6.48 ----> 5.7.30 Inplace 升級(jí)演練
11.4.1 安裝 新版本軟件 5.7.30
ok躯畴。
11.4.2 停原庫 ,做冷備.
a. 快速關(guān)庫功能關(guān)閉(優(yōu)雅關(guān)閉)
連接到數(shù)據(jù)庫中(5.6.48)民鼓,執(zhí)行以下語句:
[root@db01 ~]# mysql -S /tmp/mysql3316.sock -e "set global innodb_fast_shutdown=0 ;"
[root@db01 ~]# mysql -S /tmp/mysql3316.sock -e "select @@innodb_fast_shutdown ;"
[root@db01 ~]# /usr/local/mysql56/bin/mysqladmin -S /tmp/mysql3316.sock shutdown
b. 冷備:
[root@db01 ~]# cp -r /data/3316/data/ /tmp/bak
c. 使用高版本軟件(5.7.30)掛低版本(5.6.48)數(shù)據(jù)啟動(dòng)
[root@db01 data]# vim /data/3316/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3316/data
socket=/tmp/mysql3316.sock
port=3316
innodb_fast_shutdown=0
[root@db01 data]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3316/my.cnf --skip-grant-tables --skip-networking &
d. 升級(jí) (升級(jí)到8.0可以省略)
[root@db01 data]# /usr/local/mysql57/bin/mysql_upgrade -S /tmp/mysql3316.sock --force
e. 重啟數(shù)據(jù)庫到正常狀態(tài)
[root@db01 data]# /usr/local/mysql57/bin/mysqladmin -S /tmp/mysql3316.sock shutdown
[root@db01 data]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3316/my.cnf &
11.5 Mysql 5.7.30 Inplace升級(jí)到MySQL 8.0.20
11.5.1 升級(jí)之前的預(yù)檢查
a. 安裝mysqlsh
[root@db01 opt]# tar xf mysql-shell-8.0.20-linux-glibc2.12-x86-64bit.tar.gz
[root@db01 opt]# ln -s /opt/mysql-shell-8.0.20-linux-glibc2.12-x86-64bit /usr/local/mysqlsh
[root@db01 opt]# cd /usr/local/mysqlsh/
[root@db01 bin]# vim /etc/profile
export PATH=/usr/local/mysqlsh/bin:$PATH
[root@db01 bin]# source /etc/profile
[root@db01 bin]# mysqlsh --version
mysqlsh Ver 8.0.20 for Linux on x86_64 - for MySQL 8.0.20 (MySQL Community Server (GPL))
b. 在5730數(shù)據(jù)庫中創(chuàng)建鏈接用戶
[root@db01 bin]# mysql -S /tmp/mysql3317.sock
mysql> create user root@'10.0.0.%' identified with mysql_native_password by '123';
mysql> grant all on *.* to root@'10.0.0.%';
c. 升級(jí)前檢測
[root@db01 ~]# mysqlsh root:123@10.0.0.51:3317 -e "util.checkForServerUpgrade()" >>/tmp/up.log
11.5.2 正式升級(jí)
a. 安裝 新版本軟件 8.0.20
ok。
b. 停原庫
# 1. 快速關(guān)庫功能關(guān)閉(優(yōu)雅關(guān)閉)
連接到數(shù)據(jù)庫中(5.7.30)蓬抄,執(zhí)行以下語句丰嘉。
mysql> set global innodb_fast_shutdown=0 ;
mysql> select @@innodb_fast_shutdown;
mysql> shutdown ;
c. 使用高版本軟件(8.0.20)掛低版本(5.7.30)數(shù)據(jù)啟動(dòng)
[root@db01 data]# vim /data/3317/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3317/data
socket=/tmp/mysql3317.sock
port=3317
[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3317/my.cnf --skip-grant-tables --skip-networking &
d. 重啟數(shù)據(jù)庫到正常狀態(tài)
[root@db01 data]# mysqladmin -S /tmp/mysql3317.sock shutdown
[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3317/my.cnf &