資料庫類型 一、版本介紹和選擇 PerconaDB 主流版本 企業版本 在Linux中啟動資料庫 二、MYSQL的體繫結構 MYSQL C/S結構 實例: 1、mysqld 的三層結構 2、MySQL的邏輯結構 三、MySQL安裝 1、 https://www.mysql.com/ MySQL官網 ...
資料庫類型
mysql
一、版本介紹和選擇
oracle MySQL 8.**0**
MariaDB
PerconaDB
主流版本
mysql 5.6 5.6.36 5.38 5.6.40
mysql 5.7 5.7.18 5.7.20 5.7.22
企業版本
6-12月之間的GA
在Linux中啟動資料庫
/etc/init.d/mysqld start
二、MYSQL的體繫結構
MYSQL C/S結構
2種連接方法:TCP/IP(遠程,本地);SOCKET(本地)
mysql -uroot -poldboy123 -h 10.0.0.128 -p3306
mysql -uroot -poldboy123 -s /tmp/mysql.sock
實例:
mysqld(最重要)--->master thread--->N Thread --->記憶體結構(員工)
1、mysqld 的三層結構
1、連接層
-提供鏈接協議(TCP/IP,Socket)
-提供用戶驗證
-提供專用連接線程
2、SQL層
- 接受上層命令
- 提供語法檢測
- 語義(SQL類型),許可權
- 專用解析器解析SQL,解析成執行計劃
- 優化器:幫我們選擇一個代價最低的執行計劃(cpu,IO,MEM)
-執行器:按照優化器的選擇,執行SQL語句,得出獲取數據的方法
-查詢緩存:預設關閉, 一般會使用redis產品替代
-記錄產品日誌:查詢日誌,二進位日誌
3、存儲引擎層
- 按照SQL層結論,找到想應數據,結構化成表的形式
2、MySQL的邏輯結構
庫(schema):存儲表的地方
表(table):二維表
元數據:
-表名
-表的屬性(表的大小,許可權,存儲引擎,字元集等)
-列:列名,列屬性(數據 類型,約束,其他定義)
======================================
-記錄:數據行
======================================
三、MySQL安裝
1、https://www.mysql.com/ MySQL官網
2、點擊DOWNLOADS
3、點擊Archives
4、點擊MYSQL Community Server
5、
四、sql語句(SQL92)
SQL種類
DDL數據定義語言;
DCL數據控制語言;
DML數據操作語言;
DQL數據查詢語言
SQL語句的操作對象
庫
表
不同分類語句的作用
DDL:
-庫:
CREATE DATABASE(創建)
DROP DATABASE(刪除)
ALTER DATABASE(修改)
SQL語句建庫規範第一條:
1、關鍵字大寫(非必須),字面量(用戶定義的,必須)
2、庫名,只能小寫,不能有數字開頭,不能是預留的關鍵字
3、庫名必須和業務名字有關,例如his_user;
4、必須加字元集
-表
CREATE TABLE(創建)
DROP TABLE(刪除)
ALTER TABLE (修改)
==================================
CREATE TABLE t1 (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '用戶ID',
sname VARCHAR(20) NOT NULL COMMENT '用戶姓名',
gender ENUM('f','m','u') NOT NULL DEFAULT 'u' COMMENT '用戶性別',
telnum CHAR(11) NOT NULL UNIQUE COMMENT '手機號',
tmdate DATETIME NOT NULL DEFAULT NOW() COMMENT '錄入時間'
)ENGINE INNODB CHARSET utf8mb4;
=================================
SQL語句建庫規範第二條:
1、關鍵字大寫(非必須),字面量(用戶定義的,必須)
2、表名,只能小寫,不能有數字開頭,不能是預留的關鍵字
3、庫名必須和業務名字有關,例如his_user;
4、必須加存儲引擎和字元集
5、使用的數據類型
6、必須要有主鍵
7、儘量加非空選項
8、欄位唯一性
9、必須加註釋
10、避免使用外鍵,
11、建立合理的索引
DCL:
grant
revoke
lock
DML:
insert
update
delete
-SQL語句按批量插入數據
-update必須加where條件
-delete儘量替換為update
-如果有清空全表需求,不要用delete,推薦使用truncate
DQL:
selete
show
SQL語句規範第四條:
1. select語句避免使用 select * from t1;----> select id,name from t1;
2. select語句儘量加等值的where條件,例如:select * from t1 where id=20;
3、select語句 對於範圍查詢,例如:select * from t1 where id>200; 儘量添加limit或者 id>200 and id<300 union all id>300 and id<400
4、select的where條件,不要使用<>like '%name' not in not exist
5、不要出現3表以上的表連接,避免子查詢
6、where條件中不要出現函數操作
SQL語句規範第五條
1、少於10位的數字int,大於10位數的char,例如手機號
2、char和varchar選擇時,字元長度一定不變的可以使用char,可變的儘量使用varchar,在可變長度的存儲時,將來使用不同的數據類型,對於索引樹的高度有影響的
3、選擇合適的數據類型
4、合適的長度
===============
五、MySQL 5.7 初始化配置
5.1 初始化數據:
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/opt/mysql/data --basedir=/opt/mysql
5.2 配置文件
vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/mydata
socket=/tmp/mysql.sock
log_error=/var/log/mysql.log
user=mysql
port=6606
[mysql]
socket=/tmp/mysql.sock
作用:
1.影響服務端的啟動
標簽: [mysqld][mysqld_safe] [server] ...
[mysqld]
basedir=/opt/mysql
datadir=/opt/mysql/data
user=mysql
socket=/tmp/mysql.sock
port=3306
server_id=6
2.影響客戶端連接
標簽: [client][mysql] [mysqldump] ....
[mysql]
socket=/tmp/mysql.sock
5.3 創建相關目錄
mkdir -p /data/330{7..9}/data
5.4創建配置文件
cat>> /data/3307/my.cnf<<EOF
[mysqld]
basedir=/opt/mysql
datadir=/data/3307/data
user=mysql
socket=/data/3307/mysql.sock
port=3307
server_id=3307
EOF
cp /data/3307/my.cnf /data/3308
cp /data/3307/my.cnf /data/3309
sed -i 's#3307#3308#g' /data/3308/my.cnf
sed -i 's#3307#3309#g' /data/3309/my.cnf
5.5 初始化數據
mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/opt/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/opt/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/opt/mysql
5.6 啟動多實例
chown -R mysql.mysql /data/*
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
驗證:
[root@standby data]# netstat -lnp|grep 330
5.7、 systemd管理多實例
cat >> /etc/systemd/system/mysqld3307.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=![img](file:///C:\Users\26685\AppData\Local\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)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=/opt/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
cp /etc/systemd/system/mysqld3307.service /etc/systemd/system/mysqld3308.service
cp /etc/systemd/system/mysqld3307.service /etc/systemd/system/mysqld3309.service
sed -i 's#3307#3308#g' /etc/systemd/system/mysqld3308.service
sed -i 's#3307#3309#g' /etc/systemd/system/mysqld3309.service
[root@standby ~]# systemctl start mysqld3307
[root@standby ~]# systemctl start mysqld3308
[root@standby ~]# systemctl start mysqld3309
[root@standby ~]# netstat -lnp|grep 330
[root@standby ~]# systemctl stop mysqld3309
[root@standby ~]# systemctl stop mysqld3308
[root@standby ~]# systemctl stop mysqld3307
[root@standby ~]# systemctl enable mysqld3307
[root@standby ~]# systemctl enable mysqld3308
[root@standby ~]# systemctl enable mysqld3309
六、忘記密碼處理:
mysqladmin -uroot -p password 123
select user,authentication_string,host from mysql.user;
1.停資料庫
/etc/init.d/mysqld stop
2.啟動資料庫為無密碼驗證模式
mysqld_safe --skip-grant-tables --skip-networking &
update mysql.user set authentication_string=PASSWORD('456') where user='root' and host='localhost';
/etc/init.d/mysqld restart
[root@standby ~]# mysql -uroot -p123
[root@standby ~]# mysql -uroot -p456
七、數據類型和字元集
int 最多存10位數字
-2^31` 2^31-1
2^32 10位數
浮點:
字元串類型
char 定長,存儲數據效率較高,對於變化較多的欄位,空間浪費較多
varchar 變長,存儲時判斷長度,存儲會有額外開銷按需分配存儲空間,
enum(枚舉):
時間類型:datetime,timestamp,date,time
八、索引及執行計劃
8.1 索引
- 作用:優化查詢,select查詢有三種情況:緩存查詢(不在MySQL中進行數據查詢),全表掃描,索引掃描
8.2索引種類
Btree(btree b+tree b*tree)
Rtreee
HASH
FullText
Btree分類
聚集索引:基於主鍵,自動生成的,一般是建表時創建主鍵,自動 選擇唯一鍵作為聚集索引。
輔助索引:人為創建的 (普通,覆蓋)
唯一索引:人為創建(普通索引,聚集索引)
聚集索引和輔助索引的區別:
1、葉子結點,按照主鍵列的順序,存儲的整行數據 ,就是真正的數據頁
2、輔助索引:葉子結點,列值排序之後,存儲到葉子結點+主鍵對應的主鍵的值,便於會表查詢
8.4 索引管理命令
8.4.1索引鍵(key),表中的某個列
創建普通輔助索引(MUL)
alter table blog_userinfo add key idx_email(email);
create index idx_phone on blog_userinfo(phone);
查看索引
desc blog_userinfo;
show index from blog_userinfo;
刪除索引
alter table blog_userinfo drop index idx_email;
drop index idx_phone on blog_userinfo;
首碼索引
select count(*),substring(password,1,20) as sbp from blog_userinfo group by sbp;
alter table blog_userinfo add index idx(password(10));
唯一鍵索引 (UNI ,不能有重覆值)
alter table 表名 add unique key uni_email(email);
覆蓋索引(聯合索引)
-作用:不需要會表查詢,不需要聚集索引,所有查詢的數據都從輔助索引中獲取
8.5重要的欄位:
8.5.1 type:查詢類型
作用:
-可以 判斷出,全表掃描還是索引掃描 (all就是全索引掃描,其他的就是索引掃描)
-對於索引掃描 來講,又可以細化分,可以判斷出事哪一種類 的索引掃描
type的具體類型介紹:
All :全表掃描
Index:全索引掃描
-例子:desc select countrycode from city;
range:索引範圍掃描
< ,>,<=,>=,in,or ,between ,and,like 'CH%'
in或者or改寫成union
select *from city where countrycode='CHN'
union all
select *from city where countrycode='USA';
ref:輔助索引的等值查詢
select *from city where countrycode='CHN';
eq_ref:多錶鏈接查詢(join on)
const,system主鍵或唯一鍵等值查詢
九、 後端伺服器
ping埠號(22,80,443,3306,6397,8080,8000)
ssh:
cpu:
mem:
IO:
查看CPU
cat /proc/cpuinfo
查看所有進程
ps aux
yum install -y sysstat
伺服器的啟停:
真實硬體:遠程管理卡,fence設備等
虛擬化產品:kvm,openstack, docker, k8s,vmware esxi
自動裝系統:
真實硬體:kickstart + cobbler
虛擬化產品:克隆,啟動新容器
自動化配置:
ansible ,saltstack (批量化配置)
生命周期管理:
啟停服務,監控:zabbix(硬體)系統
Devops:代碼上線發佈
現在用git和jenkins發佈
堡壘機(jumpserver)
VPN
資料庫審核:
危險性操作
SQL性能審計 (全表掃描,抓取執行事件過長的語)
性能參數審核,根據性能指標,提出性能優化建議
資料庫對象監控,提出整改建議
explain
存儲引擎
作用:和磁碟的數據打交道
簡介:MySQL基於存儲引擎管理,表空間數據文件
存儲引擎種類
Innodb存儲引擎
ibd:存儲表的數據行和索引
frm:表基本結構信息
Myisam存儲引擎
frm:表基本結構信息,myi:存索引,myd:存數據行
事務
保證交易的完整性
ACID特性
Atomic(原子性)
所有語句作為一個單元全部成功執行或全部取消。不允許出現中間過程.
Consistent(一致性)
如果資料庫在事務開始時處於一致狀態,則在執行該事務期間將保留一致狀態。
Isolated(隔離性)
事務之間不相互影響。
兩個方面: 修改同一行 , 一致性讀
Durable(持久性)
事務成功完成後,所做的所有更改都會準確地記錄在資料庫中。所做的更改不會丟失。
十、日誌
錯誤日誌修改
log_error=/var/log/mysql.log 分析[error]
二進位日誌(binog,邏輯型日誌)
作用:記錄了所有變更類的語句,可以做數據恢復和操作的審計
DDL,DCL:以語句方式(startement)記錄
DML:預設是以行模式記錄(row模式 ,數據行的變化)
配置方法
查看:show variables like 'log_bin';
log_bin=/opt/mysql/data/mysql-bin
binlog_format=row
server_id=6
sync_binlog=1
查看日誌信息
mysql> show binary logs;
mysql> show master status; 查看正在使用的日誌
日誌內容的查看
按事件查看日誌內容
mysql> show binlog events in 'mysql-bin.000012'; #000012事件
直接查看日誌內容
mysqlbinlog --base64-output=decode-rows -vvv /opt/mysql/data/mysql-bin.000012 |more
截取二進位日誌
[root@standby data]# mysqlbinlog --start-position=219 --stop-position=186613 /opt/mysql/data/mysql-bin.000012 >/tmp/binlog.sql
慢日誌(slow-log)
記錄慢語句的日誌文件
vim /etc/my.cnf
配置:
slow_query_log=1
slow_query_log_file=/opt/mysql/data/standby-slow.log
long_query_time=1
log_queries_not_using_indexes=1
十一、備份恢復
備份的種類
邏輯備份:SQL語句備份
物理備份:數據頁備份
邏輯備份工具的介紹
select xxxx from t1 into outfile '/tmp/redis.txt';
mysql -uroot -p123 -e "select concat('hmset city_',id,' id ', id,' name ',name,' countrycode ',countrycode,' district ',district,' population ',population) from world.city limit 10 "|redis-cli
mysqldump(邏輯備份工具)
建個目錄:mkdir /backup 用於放備份文件
-A 全庫備份
mysqldump -uroot -p123 -A >/backup/full.sql
-B 備份一個或多個指定庫
mysqldump -uroot -p123 -B world bbs >/backup/wb.sql
備份單庫中的表
mysqldump -uroot -p123 world city country >/backup/ccc.sql
主從複製:
基於二進位日誌完成的