Mysql 5.7之后都會有默認的root密碼:通過grep "temporary password" /var/log/mysqld.log來找回
文件存儲的劣勢
??? 數(shù)據(jù)冗余的不一致性性
??? 數(shù)據(jù)訪問困難
??? 數(shù)據(jù)孤立
??? 完整性問題
??? 原子性問題
??? 并發(fā)訪問異常
??? 安全性問題
DML:數(shù)據(jù)操作語言
??? INSERT
??? DELETE
??? SELECT
??? UPDATE
DDL:數(shù)據(jù)定義語言
??? CREATE
??? DROP
??? ALTER
DCL:數(shù)據(jù)控制語言
??? GRANT
??? REVOKE
RDB對象:庫、表同欠、索引样傍、視圖、用戶铺遂、存儲過程衫哥、存儲函數(shù)、時間調度器
約束
??? 域約束:數(shù)據(jù)類型約束
??? 外鍵約束:引用完整性約束
??? 主鍵約束:某字段能唯一標識此字段所屬的實體襟锐,且不為空
??? 唯一性約束:每一行的某字段都不允許出現(xiàn)相同值撤逢,可以為空
??? ??? 一張表中可以有多個
??? 檢查性約束:不能出現(xiàn)違反常理的類型
??? constraint
數(shù)據(jù)查詢和存儲
??? 存儲管理器
??? ??? 權限及完整性管理器
??? ??? 事務管理器
??? ??? 文件管理器
??? ??? 緩沖區(qū)管理器
? ? 查詢管理器
??? ??? dml解釋器
??? ??? ddl解釋器
??? ??? dcl解釋器
??? ??? 查詢執(zhí)行引擎
mysql是單進程多線程的模型
??? 守護線程
??? 應用線程
關系運算
??? 投影:只輸出指定屬性
??? 選擇:只輸出符合條件的行
??? 自然連接:具有相同名字的屬性上所有取值相同的行
??? 笛卡爾積:
??? ??? (a+b)*(c+d)=ac+ad+bc+bd
??? 并:兩個表關系相同的部分。集合運算
sql查詢語句
??? DDL
??? DML
??? 完整性定義語言:ddl的一部分
??? 視圖定義語言
? ? 事務控制語言
??? 嵌入式sql和動態(tài)sql:把sql嵌入到程序語言中叫嵌入式sql;程序設計語言使用函數(shù)或者方法和rdbms服務器建立連接并進行交互叫動態(tài)sql
??? 授權:DCL
使用程序設計語言和rdbms交互:
??? 嵌入式sql:與動態(tài)sql相似但是要編譯時完全確定下來
??? ??? odbc
??? 動態(tài)sql:直接發(fā)送的語句
??? ??? jdbc
mysql的存儲引擎是插件式的
表管理器:負責創(chuàng)建蚊荣、讀取或修改表定義文件初狰;維護表描述符高速緩存;管理表鎖
??? 表結構定義文件
表修改模塊:表創(chuàng)建互例、刪除奢入、重命名、地處媳叨、更新或插入之類的操作
表維護模塊:表的檢查腥光、修理、備份糊秆、恢復武福、優(yōu)化(碎片整理)及解析
文件中記錄組織
??? 堆文件組織:一條記錄可以放在文件中任何地方
??? 順序文件組織:根據(jù)“搜索碼”值順序存放
??? 散列文件組織:人為的根據(jù)哈希值分“桶”
表空間(table space):一個空間放多個表的空間。
數(shù)據(jù)字典(data dictionary):關系的元數(shù)據(jù)痘番,比如捉片,關系的名字、字段的名字汞舱、字段的類型和長度伍纫、視圖、約束兵拢、用戶名字、授權逾礁、密碼
緩沖區(qū)管理器:
??? 緩沖置換策略
??? 被釘住的塊
mysql啟動裝載的文件说铃,每次執(zhí)行都會裝載一次,以最后一個配置文件的配置為準(~/.my.cnf)
??? 1./etc/my.cnf
??? 2./etc/nysql/my.cnf
??? 3.$MYSQL_HOME/my.cnf
/path/to/file when defaults-extra-file=/path/to/file is specified
??? 4.~/.my.cnf
安裝完成后會有五個用戶
??? root
??? root@127.0.0.1
??? root@localhost
??? ''@localhost
??? ''@hostname
mysql用戶密碼修改
??? 1.#mysqladmin -u USERNAME -p HOSTNAME password 'NEW_PASS' -p 'OLD_PASS'
??? 2.mysql>SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('new-pass');
??? 3.mysql>UPDATE mysql.user SET PASSWORD=PASSWORD('new_pass')WHERE CONDITION;
mysql客戶端工具:
??? mysql
??? mysqldump
??? mysqladmin
??? mysqlcheck
??? mysqlimport
mysql非客戶端工具
??? myisamchk
??? myisampack
兩大存儲引擎
??? MyISAM--->表類型嘹履,無事務腻扇,表鎖
??? ??? 每個表有三個文件
??? ??? ??? .frm:表結構
??? ??? ??? .MYD:表數(shù)據(jù)
??? ??? ??? .MYI:表索引
??? InnoDB--->事務,行鎖
??? ??? 所有表共享一個表空間文件
??? ??? 建議:每表用一個單獨表空間文件
??? ??? ??? .frm:表結構
??? ??? ??? .ibd:表空間(表數(shù)據(jù)索引)
客戶端命令
\c:提前終止語句執(zhí)行
\g:無論語句結束符是什么砾嫉,直接將此語句發(fā)送服務器端執(zhí)行
\G:無論語句結束符是什么幼苛,直接將此語句發(fā)送服務器端執(zhí)行,以豎排方式顯示
\! COMMAND:執(zhí)行shell命令
\w:語句執(zhí)行結束后顯示警告信息
\#:對新建的對象焕刮,支持名稱補全功能
服務器端命令
mysqladmin
??? create DATABASE
??? dorp DATABASE
??? ping
??? processlist
??? status
??? ??? --sleep N:顯示頻率
??? ??? --count N:顯示多個狀態(tài)
??? extended--status:顯示狀態(tài)變量
??? variables:顯示服務器變量
??? flush-privileges:讓mysqld重讀授權表舶沿,等同于reload
??? flush-status:重置大多數(shù)服務器狀態(tài)變量
??? flush-logs:二進制和中繼日志滾動
??? flush-hosts:重置主機、賬戶等計數(shù)器
??? refresh:相當于同時執(zhí)行flush-hosts和flush-logs
??? shutdown:關閉mysql服務器進程
??? start-slave:啟動復制配并,啟動從服務器復制進程
??? ??? SQL thread
??? ??? IO thread
??? stop-slave:關閉復制
數(shù)據(jù)類型
數(shù)值型
??? 精確數(shù)值
??? ??? int
??? ??? ??? TINYINT:占用1字節(jié)
??? ??? ??? SMALLINT:占用2字節(jié)
??? ??? ??? MEDIUMINT:占用3字節(jié)
??? ??? ??? INT:占用4字節(jié)
??? ??? ??? BIGINT:占用8字節(jié)
??? ??? ??? decimal:1.11之類的精確數(shù)值
??? 近似數(shù)值
??? ??? float(4 bytes):單精度浮點型
??? ??? double(8 bytes):雙精度浮點型
??? ??? real
字符型
??? 定長
??? ??? char--->255
??? ??? BINARY
??? 變長
??? ??? VARBINARY
??? ??? varchar(65535-:+1;65535+:+2)--->65535
??? ??? varbinary
??? ??? text
??? ??? ??? TINYTEXT(多占一個字節(jié))--->255
??? ??? ??? TEXT(+2)--->65535
??? ??? ??? MEDIUMTEXT(+3)--->16777215
??? ??? ??? LONGTEXT(+4)--->4294967295
??? TINYBLOB--->255(+1)
??? MEDIUMBLOB--->16Mb(+4)
??? LONGBLOB--->4Gb(+5)
??? BLOB--->64Kb(+3)
枚舉
??? ENUM
集合
??? SET
日期時間型
??? date(3 bytes)
??? time(3 bytes)
??? datetime(8 bytes)
??? timestamp(4 bytes)
??? year(1 bytes)
AUTO_INCERMENT
??? 整形
??? 非空
??? 無符號
??? 主鍵或唯一鍵
MySQL服務器變量
作用域
??? 全局變量
??? ??? SHOW GLOBAL VARIABLES
??? 會話變量
??? ??? SHOW [SESSION]VARIABLES
生效時間
??? 動態(tài)
??? ??? 可即時生效
??? ??? 生效方式
??? ??? ??? 全局:對當前會話無效括荡,只對新建會話有效
??? ??? ??? 會話:即時生效,但只對當前會話有效
??? 靜態(tài)
??? ??? 不需要重啟生效溉旋,但是重啟會失效畸冲。可以寫在配置文件中,通過參數(shù)傳遞給mysqld
服務器變量:@@變量名
??? 顯示:select
??? 設定:set {global|session} 變量名='value'
連接管理器:
??? 接受請求
??? 建立安全連接
??? 創(chuàng)建線程
??? 認證用戶
并發(fā)控制:
并發(fā)控制依賴的手段
??? 鎖
??? 時間戳
??? 多版本和快照隔離
多版本并發(fā)控制:MVCC邑闲。每個用戶執(zhí)行的都是一個語句的副本算行,最后合并副本
簡單的并發(fā)控制依靠鎖
??? 鎖:
??? ??? 讀鎖:共享鎖
??? ??? 寫鎖:獨占鎖(排他鎖)
??? ??? ??? LOCK TABLES tab_name {READ|WRITE};
??? ??? ??? UNLOCK TABLES--->解所有鎖
??? 鎖粒度:從大到小,MySQL服務器僅支持表級鎖苫耸,行鎖需要由存儲引擎完成州邢。越粗糙越容易管理,越精細越容易實現(xiàn)多個操作的并發(fā)性(內部實現(xiàn)的就越復雜)
??? ??? ??? 表鎖:鎖定數(shù)據(jù)表
??? ??? ??? 頁鎖:鎖定一個數(shù)據(jù)塊
??? ??? ??? 行鎖:鎖定一行
??? 事務(狀態(tài):活躍鲸阔、部分提交(最后一句執(zhí)行中)偷霉、失敗的、終止的褐筛、提交的):
??? ??? RDBMS:ACID(原子性类少,一致性,隔離性渔扎,持久性)
??? ??? ??? 原子性:一個事務(transaction)中的所有操作硫狞,要么全部完成,要么全部不完成晃痴,不會結束在中間某個環(huán)節(jié)残吩。事務在執(zhí)行過程中發(fā)生錯誤,會被恢復(Rollback)到事務開始前的狀態(tài)倘核,就像這個事務從來沒有執(zhí)行過一樣泣侮。
??? ??? ??? 一致性:在事務開始之前和事務結束以后,數(shù)據(jù)庫的完整性沒有被破壞紧唱。這表示寫入的資料必須完全符合所有的預設規(guī)則活尊,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預定的工作漏益。
??? ??? ??? 隔離性:數(shù)據(jù)庫允許多個并發(fā)事務同時對其數(shù)據(jù)進行讀寫和修改的能力蛹锰,隔離性可以防止多個事務并發(fā)執(zhí)行時由于交叉執(zhí)行而導致數(shù)據(jù)的不一致。事務隔離分為不同級別绰疤,包括讀未提交(Read uncommitted)铜犬、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)轻庆。
??? ??? ??? 持久性:事務處理結束后癣猾,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失余爆。
MyISAM不支持事務煎谍,InnoDB支持事務
事務日志(順序IO。數(shù)據(jù)文件是隨機IO):
??? 重做日志
??? ??? redo log根據(jù)日志重復操作
??? 撤銷日志
??? ??? undo log每次操作都保留下來龙屉,以保證撤銷
事務隔離(定義了數(shù)據(jù)庫系統(tǒng)中一個操作的結果在何時以何種方式對其他并發(fā)操作可見):
??? 隔離級別:
??? ??? READ UNCOMITTED:未提交讀呐粘,是最低的隔離級別满俗。允許“臟讀”(dirty reads),事務可以看到其他事務“尚未提交”的修改作岖。
??? ??? READ COMMITTED:提交讀級別唆垃,基于鎖機制并發(fā)控制的DBMS需要對選定對象的寫鎖一直保持到事務結束,但是讀鎖在SELECT操作完成后馬上釋放(因此“不可重復讀”現(xiàn)象可能會發(fā)生痘儡,見下面描述)辕万。和前一種隔離級別一樣,也不要求“范圍鎖”沉删。
??? ??? REPATEABLE READ:可重復讀隔離級別渐尿,基于鎖機制并發(fā)控制的DBMS需要對選定對象的讀鎖(read locks)和寫鎖(write locks)一直保持到事務結束,但不要求“范圍鎖”矾瑰,因此可能會發(fā)生“幻影讀”砖茸。--->mysql默認
??? ??? SERIABLIZABLE:可串行。在基于鎖機制并發(fā)控制的DBMS實現(xiàn)可串行化殴穴,要求在選定對象上的讀鎖和寫鎖保持直到事務結束后才能釋放凉夯。在SELECT 的查詢中使用一個“WHERE”子句來描述一個范圍時應該獲得一個“范圍鎖”(range-locks)。這種機制可以避免“幻影讀”(phantom reads)現(xiàn)象采幌。
事務調度:
??? 可恢復調度
??? 無級聯(lián)調度
SQL語句
數(shù)據(jù)庫:
??? CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name [CHARACTER SET=字符集] [COLLATE=排序方式]
??? ALTER DATABASE|SCHEMA CHARACTER SET=字符集 COLLATE=排序方式
??? DROP DATABASE|SCHEMA db_name
表:
??? 1.直接定義一張空表
??? 2.從其他表中查詢出數(shù)據(jù)劲够,并創(chuàng)建新表
??? 3.以其他模板創(chuàng)建一個空表
鍵也成為約束,可用作索引休傍,屬于特殊的索引(有特殊限定):B+TREE的索引結構
DDL(Data Definition Language):
??? CREATE
??? ALTER
??? DROP
??? TRUNCATE
??? COMMENT
??? RENAME
創(chuàng)建表:
??? CREATE TABLE [IF NOT EXISTS] tb_name(col_name col_definition,constraint)
創(chuàng)建索引
??? CREATE INDEX
??? SHOW INDEXS FROM tb_name
單字段:
??? PRIMARY KEY
??? UNIQUE KEY
單或多字段:
??? PRAMARY KEY (col,...)
??? UNIQUE KEY (col,...)
??? INDEX (col,...)
修改表:
??? ALTER TABLE
??? ??? 添加征绎、刪除、修改字段
??? ??? 添加磨取、刪除人柿、修改索引
??? ??? 修改表名
??? ??? 修改表屬性
刪除表:
??? DROP TABLE
創(chuàng)建索引(索引只能創(chuàng)建和刪除,不能被修改寝衫,因為索引是表自動維護的數(shù)據(jù)結構)
??? CREATE INDEX index_name ON tb_name(col,...) USING BTREE;
??? ??? col_name[(length)] [ASC 升序|DESC 降序]
刪除索引
??? DROP INDEX index_name from tb_name;
DML(Data Manipulation Language):
??? SELECT
??? INSERT
??? UPDATE
??? DELETE
??? MERGE
??? CALL
??? EXPLAIN PLAN
??? LOCK TABLE
SELECT select-list FROM tb WHERE qualification
查詢語句類型:
??? 單表查詢
??? 多表查詢
??? 子查詢
單表查詢
SELECT * FROM tb_name;
SELECT filed1,filed2 FROM tb_name; 投影
SELECT [DISTINCT相同的值只顯示一次] * FROM tb_name WHERE qualification; 選擇
FROM子句:要查詢的關系顷扩。表拐邪、多個表慰毅、其他的SELECT語句
WHERE子句:布爾關系表達式
=,>,>=,<,<=
邏輯關系。與(AND &&)扎阶、或(OR ||)汹胃、非(NOT !)關系
ORDER BY field_name{ASC|DESC} 查詢后排序
LIMIT [offset偏移了多少個,]count取多少個
聚合函數(shù)(分組:GROUP BY)
SUM() 求和
MIN() 最小
MAX() 最大
AVG() 平均值
COUNT() 個數(shù)和
GROUP BY:分組
HAVING qualification--->再次過濾
特殊操作符
表示之間的值东臀。BETWEEN...AND...
比較兩個值着饥。LIKE ''
%:任意長度任意字符
_:任意單個字符
支持正則表達式。RLIKE ''
在列表中惰赋。IN
判斷是否為空:IS NULL
判斷是否不空:IS NOT NULL
字段別名:AS
多表查詢
連接
交叉連接:笛卡爾乘積
自然連接:是一種特殊的等值連接宰掉,它要求兩個關系進行比較的分量必須是相同的屬性組呵哨,并且在結果集中將重復屬性列去掉。
外連接:
左外連接 ... LEFT JOIN ... ON ...
右外連接 ... RIGHT JOIN ... ON ...
自連接:表的數(shù)據(jù)連接到表自己中的數(shù)據(jù)
子查詢
比較操作使用子查詢:子查詢只能返回單值
IN()中使用子查詢
FROM中使用子查詢
聯(lián)合查詢
... UNION ...
DELETE:
DELETE FROM tb_name WHERE condition;
INSERT INTO:
INSERT INTO ta_name (col1,col2,...) VALUES (val1,val2,...)[,(val1,val2,...),...]
字符型:單引號
數(shù)值型:不需要引號
日期時間型:不需要引號
空值:NULL
UPDATE:
UPDATE tb_name SET col1=...,col2=... WHERE
視圖:存儲下來的SELECT語句
基于基表的查詢結果
創(chuàng)建視圖
CREATE VIEW
刪除視圖
DROP VIEW
DCL(Data Control Language):
GRANT
REVOKE
GRANT ALL PRIVIEGES ON [object_type] db.* TO username@'%';
GRANT OPTION(資源使用限定)
MAX_QUERIES_PER_HOUR count--->每小時最大查詢次數(shù)
MAX_UPDATES_PER_HOUR count--->每小時最大更新次數(shù)
MAX_CONNECTIONS_PER_HOUR count--->每小時用戶最大連接數(shù)
MAX_USER_CONNECTIONS count--->用戶最大連接數(shù)
REVOKE SELECT ON db.* FROM 'username'@'%';
mysql用戶調用查看的六張表
user:用戶帳號轨奄、全局權限
db:庫級別權限
host:已廢棄(已經(jīng)整合到user表)
tables_priv:表級別權限
columns_priv:列級別權限
procs_priv:存儲過程和存儲函數(shù)相關的權限
proxies_priv:代理用戶權限
用戶帳號:
用戶名@主機
用戶名:16字符以內
主機:
主機名:www.aaaa.com孟害,mysql
ip地址:172.16.10.177
網(wǎng)絡地址:172.16.0.0/255.255.0.0
通配符:172.16.%.%
--skip-name-resolve:略過正解反解名稱
權限級別:
全局級別:SUPER
庫:
表:DELETE,ALTER,TRIGGER
列:SELECT,INSERT,UPDATE
存儲過程和存儲函數(shù)
創(chuàng)建mysql用戶:
CREATE USER username@'%' [IDENTIFIED BY 'password']
INSERT INTO mysql.user;
mysql> FLUSH PRIVILEGES;
刪除mysql用戶:
DROP USER 'username'@'host';
重命名mysql用戶
RENAME USER old_name TO new_name;
TCL(Transaction Control Language):
SAVEPOINT
ROLLBACK
SET TRANSACTION
START TANSACTION:啟動事務
COMMIT:提交事務
ROLLBACK:回滾事務
如果沒有明確啟動事務:
autocommit:能實現(xiàn)自動提交,每一句操作都能直接提交
select @@autocommit
SAVEPOINT:保存點
ROLLBACK TO sid:回滾保存點
SHOW CREATE:查看創(chuàng)建某個對象的時候使用的語句
在shell中可以直接使用mysql -e來調用mysql command
TRUNCATE tb_name:清空表挪拟,并重置AUTOINCREMENT計數(shù)器挨务;delete語句則會清空表不重置計數(shù)器
忘記mysql密碼:
啟動mysqld_safe時傳遞兩個參數(shù):
--skip-grant-tables
--skip-networking
通過更新授權表的方式直接更改其密碼,而后移除兩個選項重啟服務器
日志
錯誤日志
mysql選項:
log_error
log_warnings
erver啟動和關閉過程的信息
server運行過程中的錯誤信息
事件調度器運行一個事件時產(chǎn)生的信息
在從服務器上啟動從服務器進程時產(chǎn)生的信息
一般查詢日志
general_log
general_log_file
log
還可以保存到表中玉组,默認不開啟谎柄,要手動創(chuàng)建該表
慢查詢日志
long_query_time 默認為10秒
log_slow_queries={YES|NO}
slow_query_log 默認關閉
slow_query_log_file 數(shù)據(jù)目錄下的localhost-slow.log
二進制日志:任何引起或可能引起數(shù)據(jù)庫變化的操作(DDL,DML):復制惯雳,即時點恢復
mysqlbinlog
--start-datetime 'yyyy-mm-dd hh:mm:ss' 起始時間
--stop-datetime 'yyyy-mm-dd hh:mm:ss' 結束時間
--start-position 起始位置
--stop-position 結束位置
二進制日志的格式
基于語句:statement
基于行:row
混合方式:mixed
二進制日志事件:
產(chǎn)生事件
相對位置
查看當前正在使用的二進制日志文件
mysql> SHOW MASTER STATUS;
查看二進制日志事件
mysql> SHOW BINLOG ENENTS IN 'mysql-bin.000000x' [FROM position];
查看所有二進制日志文件
mysql> SHOW BINARY LOGS;
刪除二進制日志
mysql> PURGE BINARY LOGS TO 'mysql-bin.000000x';
二進制日志滾動
mysql> FLUSH LOGS;
中繼日志
從主服務器的二進制日志文件中復制而來的事件朝巫,并保存為的日志文件
事務日志:保證ACID,將隨機IO轉換為順序IO
innodb_flush_log_at_trx_commit
0:每秒同步吨凑,并執(zhí)行磁盤flush操作
1:每事務同步捍歪,并執(zhí)行磁盤flush操作
2:沒事務同步,但不執(zhí)行磁盤flush操作
mysql存儲引擎
MyISAM:
不支持事務
表鎖
b-tree索引鸵钝、fulltext索引糙臼、空間索引
支持表壓縮
InnoDB:
事務
行鎖
b-tree索引、聚簇索引恩商、自適應hash索引
表空間变逃,raw磁盤設備
mysql備份
備份內容:
數(shù)據(jù)
配置文件
二進制日志
事務日志
備份類型
熱備:讀寫不受影響
xtrabackup,mysqldump
溫備:能讀不能寫
冷備:離線備份
物理備份:復制數(shù)據(jù)文件
速度快
邏輯備份:將數(shù)據(jù)導出至文本文件中
速度慢、丟失浮點數(shù)精度怠堪。方便使用文本處理工具直接對其處理揽乱、可移植能力強
完全備份:備份全部數(shù)據(jù)
增量備份:僅備份上次完全備份或增量備份以后變化的數(shù)據(jù)
差異備份:僅備份上次完全備份以來變化的數(shù)據(jù)
備份策略:
完全+增量
完全+差異
mysql備份工具:
mysqldump:邏輯備份工具、MyISAM(溫)粟矿、InnoDB(熱)
mysqlhotcopy:物理備份工具凰棉、溫備
參考文檔:
MySQL中的事務與鎖:http://zheming.wang/blog/2015/04/23/16301743-802B-4795-B79F-5DB37C7D587B/