(拓展)MySQL三大范式:
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:申請域名、虛擬主機、營銷軟件、網站建設、寧洱網站維護、網站推廣。
補充:
關系數(shù)據庫的幾種設計范式介紹
1、第一范式(1NF)
在任何一個關系數(shù)據庫中,第一范式(1NF)是對關系模式的基本要求,不滿足第一范式(1NF)的數(shù)據庫就不是關系數(shù)據庫。
所謂第一范式(1NF)是指數(shù)據庫表的每一列都是不可分割的基本數(shù)據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。如果出現(xiàn)重復的屬性,就可能需要定義一個新的實體,新的實體由重復的屬性構成,新實體與原實體之間為一對多關系。在第一范式(1NF)中表的每一行只包含一個實例的信息。例如,對于圖3-2 中的員工信息表,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個員工的信息,一個員工的信息在表中只出現(xiàn)一次。簡而言之,第一范式就是無重復的列。
2、第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據庫表中的每個實例或行必須可以被唯一地區(qū)分。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標識。如圖3-2 員工信息表中加上了員工編號(emp_id)列,因為每個員工的員工編號是唯一的,因此每個員工可以被唯一區(qū)分。這個唯一屬性列被稱為主關鍵字或主鍵、主碼。
第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二范式就是非主屬性非部分依賴于主關鍵字。
3、第三范式(3NF)
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數(shù)據庫表中不包含已在其它表中已包含的非主關鍵字信息。例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在圖3-2的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。如果不存在部門信息表,則根據第三范式(3NF)也應該構建它,否則就會有大量的數(shù)據冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。
為什么要有數(shù)據庫:文件 管理數(shù)據的問題:
1.數(shù)據冗余和不一致性
2.大數(shù)據訪問困難
3.數(shù)據孤立
4.完整性和原子性
5.并發(fā)訪問異常
6.安全性問題
由此,有了數(shù)據庫。。。
數(shù)據庫概述
數(shù)據庫:指的是以一定方式存儲在一起、能為多個用戶共享,具有盡可能小的冗余度的特點、是與應用程序彼此獨立的數(shù)據集合。
數(shù)據庫服務器的基本概念
數(shù)據庫
DBMS 數(shù)據庫管理系統(tǒng)(能夠操作和管理數(shù)據庫的大型軟件)
RDBMS 關系式數(shù)據庫(=DBMS)
1.數(shù)據以表格的形式出現(xiàn)
2.每行為各種記錄名稱
3.每列為記錄名稱所對應的數(shù)據域
4.許多的行和列組成一張表單
5.若干的表單組成database
數(shù)據表
數(shù)據(記錄)
字段(id name ....)
類型(定義字段中的內容)
主鍵(檢索時用)
數(shù)據庫的三種基本形式
層次模型:
按照層次結構的形式組織數(shù)據庫數(shù)據的模型
缺點:冗余數(shù)據
網狀模型:
按照網狀結構的形式組織數(shù)據庫數(shù)據的模型
缺點:后期維護困難
關系模型:
按照關系結構的形式組織數(shù)據庫數(shù)據的模型
sql語句:
結構化查詢語句
sql類型:
DML 數(shù)據操作語言:用來操作數(shù)據庫中的數(shù)據
INSERT
DELETE
SELECT
UPDATE
DDL 數(shù)據描述語言:用來建立數(shù)據庫、定義數(shù)據關系
CREATE
DROP
ALTER
DCL 數(shù)據控制語言:用來控制數(shù)據庫組建的權限
GRANT
REVOKE
關系式數(shù)據庫結構
文件邏輯關系:
上層:文件
底層:二進制的方式存儲在硬盤的數(shù)據塊中
中間層:文件系統(tǒng)
數(shù)據庫邏輯關系:
上層:數(shù)據表
底層:文件
中間層:存儲引擎(提供存儲、創(chuàng)建、更新、查詢數(shù)據的實現(xiàn)方法)
mysql 支持的存儲引擎:
MYISAM
默認引擎、插入和查詢速度較快
不支持事務、行級鎖和外鍵約束等功能
注:
事務:一段sql語句的批處理、為了保證數(shù)據原子性
鎖:行級鎖(沖突少、速度慢);表級鎖(沖突多、速度快);頁級鎖(折中方案)
約束
域約束:數(shù)據類型約束
外鍵約束:引用完整性約束
主鍵約束:某字段能惟一標識此字段所屬的實體,并且不允許為空
一張表中只能有一個主鍵
惟一性約束:每一行的某字段都不允許出現(xiàn)相同值,可以為空
一張表中可以有多個
檢查性約束: age: int
INNODB
支持事務、行級鎖和外鍵約束等功能
MEMORY
工作在內存中,通過散列保存數(shù)據,速度快、不能永久保存數(shù)據
數(shù)據的存儲和查詢
存儲管理器(實現(xiàn)存儲的功能,通過DDL創(chuàng)建數(shù)據表的結構,再通過DML來保存數(shù)據)
事務管理器:提供事務功能
文件管理器:保存數(shù)據庫數(shù)據和文件的對應關系
權限及完整性管理器:設置存儲權限
緩沖管理器:管理緩沖空間
查詢管理器(實現(xiàn)查詢的功能,接收用戶的查詢請求、理解用戶查詢請求,將查詢請求提交給存儲管理器、實現(xiàn)最終存儲)
DDL 、DML解釋器
查詢執(zhí)行引擎
數(shù)據庫工作模式:
單進程多線程的工作模式
守護線程
應用線程(用戶線程)
補充:apache的工作模式:
一個進程處理一個請求
一個線程處理一個請求
一個線程處理多個請求
mysql優(yōu)化
1.垂直擴展
2.線程重用
3.緩存機制(NOSQL
缺點:
SMP 對稱多處理器架構
3. E-R模型
實體關系建模
實體:數(shù)據對象,即看得見摸得著
聯(lián)系:表示一個或多個實體之間的關聯(lián)
屬性:實體的某一特性
數(shù)據庫—基本概述
數(shù)據庫的版本
1.社區(qū)版
2.企業(yè)版
3.集群版
數(shù)據庫的安裝
專用軟件包管理器(二進制)
deb 、rpm等
mysql MySQL客戶端程序和共享庫
mysql-server MySQL服務器需要的相關程序
源代碼軟件包(編譯安裝)
configure、cmake
數(shù)據庫常用的配置選項
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql ----指定殘可安裝路徑(默認的就是/usr/local/mysql)
-DMYSQL_DATADIR=/data/mysql ----mysql的數(shù)據文件路徑
-DSYSCONFDIR=/etc ----配置文件路徑
-DWITH_INNOBASE_STORAGE_ENGINE=1 ----使用INNOBASE存儲引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 ----常應用于日志記錄和聚合分析,不支持索引
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 ----黑洞存儲引擎
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 編譯過程中取消一些存儲引擎指令介紹
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
-DWITH_READLINE=1 ----支持批量導入mysql數(shù)據
-DWITH_SSL=system ----mysql支持ssl會話,實現(xiàn)基于ssl的數(shù)據復
-DWITH_ZLIB=system ----壓縮庫
-DWITH_LIBWRAP=0 ----是否可以基于WRAP實現(xiàn)訪問控制
-DMYSQL_TCP_PORT=3306 ----默認端口
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock ----默認套接字文件路徑
-DENABLED_LOCAL_INFILE=1 ----是否啟用LOCAL_INFILE功能
-DEXTRA_CHARSETS=all ----是否支持額外的字符集
-DDEFAULT_CHARSET=utf8 ----默認編碼機制
-DDEFAULT_COLLATION=utf8_general_ci ----設定默認語言的排序規(guī)則
-DWITH_DEBUG=0 ----DEBUG功能設置
-DENABLE_PROFILING=1 ----性能分析功能是否啟用
服務:mysqld
端口:3306
主配置文件:/etc/my.cnf
腳本:mysql_install_db
mysqld_safe
數(shù)據目錄 :/var/lib/mysql
套接字文件:/var/lib/mysql/mysql.sock
當意外關閉數(shù)據庫時,再開啟時假如開啟不了,找到這個,刪除再啟動
進程文件:/var/run/mysqld/mysqld.pid
登錄及退出mysql環(huán)境
a) 設置密碼 mysqladmin -uroot password ‘123’
b) 登錄 mysql -u 用戶名 -p
-p 用戶密碼
-h 登陸位置(主機名或ip地址)
-P 端口號(3306改了就不是了)
-S 套接字文件(/var/lib/mysql/mysql.sock)
c) 退出 exit
d) 創(chuàng)建登錄用戶 create user 用戶名@’%’ identified by ‘密碼’
e) 修改密碼 set password=password(‘新密碼’)
set password for 用戶@登錄位置=password(‘新密碼’) — — — root用戶為其他用戶找回密碼
當管理員把自己密碼忘記了,怎么找回???
1)關閉數(shù)據庫
2)修改主配置文件(/etc/my.cnf)<------ skip-grant-tables
3)啟動數(shù)據庫
4)空密碼登錄并修改密碼
update mysql.user set password=password(‘新密碼’) where user=’root’;
5)刪除skip-grant-tables,重啟數(shù)據庫驗證新密碼
SQL語句
關于庫的操作:
Mysql命令 | 功能 |
show databases | 查看服務器中當前有哪些數(shù)據庫 |
use 數(shù)據庫名 | 選擇所使用的數(shù)據庫 |
create database 數(shù)據庫名 | 創(chuàng)建數(shù)據庫 |
drop database 數(shù)據庫名 | 刪除指定的數(shù)據庫 |
關于表的操作
MySQL命令 | 功能 |
create table 表名 (字段1 類型1,...) | 在當前數(shù)據庫中創(chuàng)建數(shù)據表 |
show tables | 顯示當前數(shù)據庫中有哪些數(shù)據表 |
describe 表名 | 顯示當前或指定數(shù)據庫中指定數(shù)據表的結構(字段)信息 |
drop table 表名 | 刪除當前或指定數(shù)據庫中指定的數(shù)據表 |
alter table 舊表名 rename 新表名 | 修改數(shù)據表的名稱 |
alter table 表名 modify 字段 類型 | 修改字段的類型 |
alter table 表名 change 舊字段名 新字段名 類型 | 修改字段 |
alter table 表名 add 字段 類型(first/after) | 增加字段 |
alter table 表名 drop 字段 | 刪除字段 |
MySQL命令 | 功能 |
insert into 表名(字段1,字段2,……) values(字段1的值, 字段2的值,……) | 向數(shù)據表中插入新的記錄 |
update 表名 set 字段名 =新數(shù)據 where 條件表達式 | 修改、更新數(shù)據表中的記錄 |
select 字段名1,字段名2……from 表名 where 條件表達式 | 從數(shù)據表中查找符合條件的記錄 |
select * from 表名 | 顯示當前數(shù)據庫的表中的記錄 |
delete from 表名 where 條件表達式 between...and... | 在數(shù)據表中刪除指定的記錄 指定范圍 |
delete from 表名 | 將當前數(shù)據庫表中記錄清空 |
注:庫和表的刪除用drop,記錄刪除用delete
權限
grant 權限1,權限2,...... on 數(shù)據庫.數(shù)據表 to 用戶@登錄位置 (identified by ‘密碼’);
revoke 取消的權限1,取消的權限2,...... on 數(shù)據庫.數(shù)據表 from 用戶@登錄位置;
show grants for 用戶@登錄位置;
備份和還原
冷備份:把數(shù)據庫關閉,離線備份(使用cp、tar等命令直接備份數(shù)據庫所存放的目錄)
FRM 結構
MYI 索引
MYD 數(shù)據
快照備份:(利用邏輯卷)
邏輯備份:
mysqldump
備份:mysqldump -u 用戶名 -p 數(shù)據庫名 > /備份路徑/備份文件名(備份單個數(shù)據庫)
mysqldump -u 用戶名 -p 數(shù)據庫名 表名 > /備份路徑/備份文件名(備份數(shù)據表)
--databases 庫1,庫2 (此時還原--->mysql < 備份文件)
--all-databases —備份服務器中的所有數(shù)據庫內容
還原:mysql 數(shù)據庫 < 備份文件
mysqlhotcopy
備份:mysqlhotcopy --flushlog -u=’用戶’ -p=’密碼’ --regexp=正則 備份目錄
還原:cp -rpf 備份目錄 數(shù)據目錄(/var/lib/mysql)
補充的備份機制
1.日志備份
>mysql show global variables like ‘%log%’
列出mysql中和日志相關的變量
錯誤日志
服務器啟動和關閉時的信息
服務器運行過程中的錯誤信息
從服務器啟動從服務器進程時產生的信息
log-error 錯誤日志的路徑
一般日志(不啟用)
記錄用戶對數(shù)據庫的查詢操作
general-log=ON 啟動一般查詢日志
log=ON 全局日志開關
log-output 日志的記錄類型
慢查詢日志
記錄需要較長時間的查詢操作
log-slow-queries=保存路徑 啟動慢查詢日志,并設置個路徑
二進制日志
所有對數(shù)據庫狀態(tài)更改的操作(create、drop、update等)
log-bin=位置 啟動二進制日志
>mysql show binary logs 查看當前使用的二進制日志
>mysql show binlog events in ‘二進制日志(mysql-bin.000001)’ 查看二進制日志的內容
還原:(mysqlbinlog)
按時間還原:
mysqlbinlog --start-datetime ‘YY-MM-DD HH:MM:SS’ --stop-datetime ‘YY-MM-DD HH:MM:SS’ 二進制日志 | mysql(-urot -p)
按文件大小還原:
--start-position
--stop-position
事務日志:記錄事務相關的日志信息
中繼日志:記錄從服務器的備份信息
2.多機備份
主從配置:實時備份
主主配置:(配置了2遍的主從)實時備份、負載均衡
多從一主:實時備份(更多的備份節(jié)點)
多主一從:實時備份、節(jié)約成本
實驗
1.創(chuàng)建mysql的登錄用戶yzh可以登錄mysql服務器
創(chuàng)建登錄用戶
在另一臺虛擬機上測試
創(chuàng)建的用戶為自己更改密碼
root用戶為其他用戶找回密碼
root找回自己的密碼并修改
數(shù)據庫的增刪改查實驗
創(chuàng)建數(shù)據庫
創(chuàng)建數(shù)據表
復雜一點的,,,
插入數(shù)據
將表a2的數(shù)據復制到表a1
刪除數(shù)據庫
刪除數(shù)據表
刪除表里的數(shù)據記錄
刪除年齡在23-25之間的
修改表中的數(shù)據
修改數(shù)據表的名稱
修改數(shù)據表的字段類型
修改數(shù)據表的字段
添加字段
刪除字段
給用戶授權
1.給用戶全部權限
取消yzh用戶的刪除庫、表、表中數(shù)據的權限
備份和還原數(shù)據庫文件
1.把數(shù)據庫aa 備份到/root目錄下
2.模擬數(shù)據庫aa丟失(刪除數(shù)據庫aa)
3.還原
備份多個數(shù)據庫(--databases)
還原
備份有規(guī)則的數(shù)據庫
模擬數(shù)據庫刪除
還原
關于二進制日志還原
開啟二進制日志
查看二進制日志文件
按時間還原:
如果數(shù)據庫中的bb庫被刪,需要還原
查看二進制日志內容
還原并查看
按文件大小還原:
還原到bb庫被刪除的數(shù)據狀態(tài)
查看bb庫被刪除前后的文件大小
還原并查看