數(shù)據(jù)備份將數(shù)據(jù)庫里面的數(shù)據(jù),復(fù)制到對(duì)應(yīng)的文件,保存到對(duì)應(yīng)的磁盤空間。如果在以后需要使用數(shù)據(jù)的時(shí)候,可以通過備份文件將數(shù)據(jù)還原到對(duì)應(yīng)的數(shù)據(jù)庫。
數(shù)據(jù)備份分為三種方式:文件備份,表數(shù)據(jù)備份,SQL備份
文件備份就是將數(shù)據(jù)庫對(duì)應(yīng)的文件夾或者文件進(jìn)行備份。
InnoDB和myisam的備份方式不一樣:存儲(chǔ)引擎文件存儲(chǔ)的方式不一樣。
InnoDB備份:表結(jié)構(gòu)文件和ibdata1,如果有一些額外的數(shù)據(jù),iblogfile也需要備份
myisam備份:直接被分三個(gè)文件:結(jié)構(gòu),索引和數(shù)據(jù)
文件備份還原:直接將文件放到對(duì)應(yīng)的數(shù)據(jù)庫文件夾下。
數(shù)據(jù)表備份指的是只針對(duì)某一張具體的表內(nèi)的數(shù)據(jù)進(jìn)行備份。需要通過mysql提供的命令,將數(shù)據(jù)表中的數(shù)據(jù)導(dǎo)出到對(duì)應(yīng)的外部文件。
備份語法
select */字段列表 into outfile 文件路徑 from 表名;
注意:只備份純數(shù)據(jù),沒有表結(jié)構(gòu)
指定結(jié)構(gòu)備份:行數(shù)據(jù)如何處理,字段如何處理
select */字段列表 into outfile 文件路徑 [fields 操作] [lines 操作] from 表名;
fields操作
terminated by:字段以什么結(jié)束,字段后面跟什么內(nèi)容,默認(rèn)的是“\t”
enclosed by:字段以什么包裹,字段兩邊用什么字符來包裹,默認(rèn)是’’,什么都沒有
escaped by:字段的特殊字符如何處理,默認(rèn)的是使用’\\’
lines 操作
starting by:每行一開始用什么字符顯示,默認(rèn)是’’
terminated by:每行用什么來結(jié)束(換行),默認(rèn)的是’\r\n’
所有的文件備份,只能將數(shù)據(jù)備份到不存在的文件里面,如果文件存在,那么備份失敗。
將文件中的數(shù)據(jù)按照指定的格式,還原到對(duì)應(yīng)的數(shù)據(jù)表
還原語法
load data infile 文件路徑 into table 表名[(字段列表)] [fields 操作] [lines 操作];
不管是字段還是行操作都是與備份時(shí)應(yīng)該一一對(duì)應(yīng)。
正確還原
備份的數(shù)據(jù)可以不需要清空數(shù)據(jù)表就進(jìn)行數(shù)據(jù)還原:前提是備份的數(shù)據(jù)可以插入到表中,而不會(huì)因?yàn)閿?shù)據(jù)重復(fù)出錯(cuò)。
SQL備份:系統(tǒng)對(duì)需要備份的表,系統(tǒng)自動(dòng)的組織表的創(chuàng)建語句和數(shù)據(jù)的插入語句(SQL語句),然后將對(duì)應(yīng)的SQL語句備份到外部文件。即便在表不存在的情況下,系統(tǒng)也能根據(jù)備份的SQL語句自動(dòng)創(chuàng)建表,并將備份的數(shù)據(jù)插入到表中。
SQL備份必須通過客戶端(mysqldump.exe)來操作,而不是通過SQL命令實(shí)現(xiàn)。
既然是通過客戶端操作服務(wù)器:必須要連接認(rèn)證(-hPup)
語法
mysqldump/mysqldump.exe –hPup 數(shù)據(jù)庫 數(shù)據(jù)表1 數(shù)據(jù)表2 … > 文件路徑
SQL備份的最大顆粒度是到數(shù)據(jù)庫,不能對(duì)整個(gè)數(shù)據(jù)庫系統(tǒng)進(jìn)行備份。
還原就是將對(duì)應(yīng)的SQL語句重新執(zhí)行。
SQL備份還原有兩種方式:mysql.exe進(jìn)行外部還原和進(jìn)入到SQL環(huán)境下使用命令還原。
語法
mysql/mysql.exe –hPhp 數(shù)據(jù)庫名字 < 文件路徑
要使用命令還原,必須先進(jìn)入數(shù)據(jù)庫環(huán)境。
語法
source 文件路徑;
三種備份中,SQL備份用的最多。
如果數(shù)據(jù)量很大,那么備份的效率會(huì)很低,所以備份時(shí)間顯得非常重要。
SQL備份適用于全表備份。如果是想備份最新的數(shù)據(jù)SQL備份做不到。
增量備份就是指對(duì)新的東西進(jìn)行備份,將上次備份點(diǎn)之后的所有數(shù)據(jù)操作都備份,備份的SQL的日志。
什么是事務(wù)安全?
事務(wù):事務(wù)指的是一連串的數(shù)據(jù)寫操作,操作之間是互相影響的
事務(wù)安全:保證一連串的操作都是成功的
銀行賬戶:小王和小明
小王欠小明100,還錢
小王賬號(hào)里,扣去100
小明賬戶里,增加100
從某個(gè)指定點(diǎn)開始,將所有的操作都捆綁到一起,最后通過結(jié)果判斷,要么都成功,要么都失敗。
事務(wù)流程
1. 開啟事務(wù)(事務(wù)起始點(diǎn))
begin/start transaction;
從這個(gè)點(diǎn)開始,后面所有的操作,都是一起的,不是分開的,要么都成功,要么都失敗
2. 事務(wù)操作,所有捆綁的事件
3. 事務(wù)結(jié)束
a) 成功:commit;提交
b) 失?。?/span>rollback;回滾(撤銷)
1. 開啟事務(wù)
2. 事務(wù)操作
操作1
操作2
3. 結(jié)束事務(wù),先判斷事務(wù),選擇如何結(jié)束
都成功:commit
不成功:rollback
如果事務(wù)操作過程中斷(意外),系統(tǒng)會(huì)自動(dòng)判定事務(wù)處理失敗
事務(wù)在操作的過程中,可能有很多個(gè)節(jié)點(diǎn),后續(xù)的節(jié)點(diǎn)必須依賴前面節(jié)點(diǎn)的成功而操作,但是有可能操作失敗,需要先回到上一個(gè)成功的節(jié)點(diǎn)重新開始下一次操作,就需要在某個(gè)節(jié)點(diǎn)的時(shí)候設(shè)置回滾點(diǎn),允許后面回到該點(diǎn)上。
語法
savepoint 回滾點(diǎn)名字;
回到回滾點(diǎn)
rollback to 回滾點(diǎn)名字
系統(tǒng)默認(rèn)的就是自動(dòng)事務(wù)提交,本來每一個(gè)操作都需要用戶進(jìn)行確認(rèn)操作。
查看自動(dòng)提交
show variables like 'autocommit%’;
關(guān)閉自動(dòng)提交:
set autocommit = Off;
效果
注意:一般情況下事務(wù)都是 自動(dòng)提交,除非特殊情況下(轉(zhuǎn)賬)才會(huì)使用事務(wù),使用事務(wù)的時(shí)候手動(dòng)使用。
事務(wù)有4個(gè)特點(diǎn):原子性,一致性,隔離性和永久性
事務(wù)特點(diǎn)ACID
原子性:Atomicity,事務(wù)是整體,從開始到結(jié)束,之間所有的操作都是一個(gè)整體,要么全部成功,要么全部失敗。
一致性:consistency,事務(wù)前后數(shù)據(jù)完整性一致,數(shù)據(jù)在操作過程中沒有影響到數(shù)據(jù)的變化,直到事務(wù)被提交,才改變數(shù)據(jù)。
持久性:Durability事務(wù)一旦提交,數(shù)據(jù)改變永久
隔離性:isolation,多用戶并發(fā)互不干擾,相互隔離
存儲(chǔ)引擎是InnoDB
在mysql中,變量分為兩種:系統(tǒng)變量和自定義變量
系統(tǒng)已經(jīng)定義好的變量。
show variables;
show variables; -- 查看所有
show variables like 'pattern’; -- 查看部分
select @@變量名; -- 查看具體變量
語法1:修改變量(會(huì)話級(jí)別:當(dāng)前連接修改有效)
set 變量名 = 值;
語法2:修改全局變量(變量本身是全局變量,針對(duì)所有用戶所有連接都有效)
set GLOBAL 變量名 = 值;
set @@global.變量名 = 值;
語法3:修改全局變量
找到mysql的配置文件,在配置項(xiàng)里面修改。(不建議)
語法1:定義變量并賦值
set @變量名 = 值;
語法2:直接從記錄中將數(shù)據(jù)存放到變量
select 字段列表 from 表名 where條件into 變量列表(@變量名);
select @變量 := 字段,… from 表名 where條件;
在SQL中,=有其特殊的函數(shù):比較運(yùn)算符,也可以用于變量賦值,SQL為了區(qū)分賦值符號(hào)和比較符號(hào),特意新增了一個(gè)賦值符號(hào): :=
與系統(tǒng)變量一致
select @變量名;
所有的變量,要進(jìn)行修改必須使用關(guān)鍵字set
set @變量名 = 值;
系統(tǒng)沒有提供刪除變量的方式,要?jiǎng)h除變量,其實(shí)就是將變量置空
set @變量 = null;
用戶自定義的變量全部都是會(huì)話級(jí)別的,當(dāng)前連接有效,斷開就無效了。
用戶自定義的變量是屬于會(huì)話級(jí)別,但是是全系統(tǒng)有效(跨庫)
變量作用的范圍,在SQL中,變量的作用域分為兩種:全局作用域和局部作用域,與js一樣,全局變量可以在任何地方使用,而局部變量只能在函數(shù)內(nèi)部使用。
凡是使用@符號(hào)定義的變量,都是全局變量(函數(shù)內(nèi)部也可以定義全局變量)
局部變量語法:沒有@符號(hào),也不用set聲明
declare 變量名 數(shù)據(jù)類型default 默認(rèn)值;
需求:
有兩張表:訂單表和商品表
每增加一張訂單,對(duì)應(yīng)的商品庫存數(shù)量要減少。
觸發(fā)器:一個(gè)代碼的容器,將一堆要執(zhí)行的代碼捆綁到一起,在某一件事情發(fā)生的時(shí)候,自動(dòng)的觸發(fā)這段代碼。
創(chuàng)建觸發(fā)器的語法
臨時(shí)語句結(jié)束符:delimiter
delimiter $$ -- 從當(dāng)前開始,后面的所有代碼,直到碰到$$才認(rèn)為一條語句結(jié)束
create trigger 觸發(fā)器名字 觸發(fā)時(shí)間 事件類型 on 表名 for each row
begin
捆綁的代碼
代碼是以行為單位,每行都必須有語句結(jié)束符:”;”
end
$$
delimiter ; -- 將語句結(jié)束符改回來
觸發(fā)時(shí)間:分為兩種,數(shù)據(jù)操作前和操作后
before:數(shù)據(jù)真正寫入到表之前
after:數(shù)據(jù)已經(jīng)寫入到表之后
事件類型:所有的觸發(fā)器都是針對(duì)數(shù)據(jù)寫操作(增刪改)
insert:新增
update:修改
delete:刪除
觸發(fā)時(shí)間和事件類型共同組成了觸發(fā)器的類型:觸發(fā)器類型一共6種。一張表最多可以有6個(gè)觸發(fā)器。同一種觸發(fā)器一張表只能有一個(gè)。
查看所有的觸發(fā)器
show triggers\G
觸發(fā)器的使用不是用戶手動(dòng)調(diào)用,而是在操作數(shù)據(jù)的時(shí)候如果滿足某一個(gè)特定的條件,就會(huì)自動(dòng)觸發(fā)。
語法
drop trigger 觸發(fā)器名字;
在觸發(fā)器的內(nèi)部,內(nèi)置了兩個(gè)對(duì)象:old和new,兩個(gè)對(duì)象代表了觸發(fā)前和觸發(fā)后的數(shù)據(jù)記錄??梢允褂眠@兩個(gè)對(duì)象來訪問對(duì)應(yīng)的數(shù)據(jù)。
語法:
old.字段名/new.字段名
只有更新語句可以使用old和new,但是刪除的觸發(fā)器只有old,新增的觸發(fā)器只有new
效果
觸發(fā)器主要用戶數(shù)據(jù)的連表操作(對(duì)多條記錄進(jìn)行寫的連帶操作)
觸發(fā)器雖好,但是會(huì)導(dǎo)致數(shù)據(jù)庫數(shù)據(jù)維護(hù)變得不可控,那么從php的角度出發(fā),程序很少使用觸發(fā)器。
作業(yè)
1. 一張表最多有幾個(gè)觸發(fā)器?6個(gè)
2. 當(dāng)一張表6個(gè)觸發(fā)器都存在的時(shí)候,以下情況會(huì)觸發(fā)哪些觸發(fā)器
a) insert on duplicate key,主鍵重復(fù)
b) replace into,主鍵重復(fù)
1. 什么是索引?
索引就是類似書的目錄,提高檢索數(shù)據(jù)的效率。
索引是系統(tǒng)按照某個(gè)具體的算法(哈希,散列,二叉樹),將數(shù)據(jù)從全部數(shù)據(jù)里進(jìn)行提取,維護(hù)成一個(gè)索引文件,然后系統(tǒng)在進(jìn)行數(shù)據(jù)查詢的時(shí)候,發(fā)現(xiàn)如果查詢條件剛好滿足索引條件,就可以從索引文件中快速的定位的數(shù)據(jù)所在位置。
mysql中有哪些索引?
主鍵索引(primary key效率最高的索引)
唯一索引(unique key):不為空的情況下效率最高
普通索引(index)對(duì)數(shù)據(jù)沒有要求,文件很大,效率比較低
全文索引(fulltext),對(duì)整個(gè)文章內(nèi)部進(jìn)行關(guān)鍵字索引(mysql5.5以后InnoDB支持全文索引)
英文的全文索引很簡(jiǎn)單:英文單詞默認(rèn)是用空格分離的
中文的全文索引很難:中文的詞組成很麻煩,需要利用分詞工具(sphinx)
root是超級(jí)管理員用戶,擁有最大權(quán)限,可以進(jìn)行任何操作。
1. 創(chuàng)建用戶
create user 用戶信息 identified by 密碼; -- 創(chuàng)建用戶使用密碼
用戶信息:用戶名@主機(jī)名,主機(jī)名是允許訪問的主機(jī)地址,local@192.168.114.%,允許局域網(wǎng)內(nèi)部用戶訪問
密碼:系統(tǒng)里面默認(rèn)使用sha1加密方式加密,但是該處使用明文密碼,系統(tǒng)自動(dòng)加密
所有的用戶都在mysql數(shù)據(jù)庫下的user表中存在
2. 授權(quán):給用戶指定數(shù)據(jù)庫的操作權(quán)限
grant 權(quán)限列表 on 庫名.表名 to 用戶;
權(quán)限列表:select,update,delete….
用戶:用戶名@主機(jī)地址
效果
權(quán)限列表
一次性賦予全部權(quán)限
grant all privileges on 庫.* to user;
3. 回收權(quán)限
revoke 權(quán)限列表 on 庫.表 from user;
回收權(quán)限之后需要用戶下次登錄的時(shí)候才會(huì)生效。
4. 刪除用戶
drop user 用戶;
如果有時(shí)候會(huì)因?yàn)闄?quán)限的阻塞,緩存沒有刷新,需要刷新權(quán)限緩存。
flush privileges;
root密碼忘了?怎么辦?
重裝數(shù)據(jù)庫
1. 關(guān)閉服務(wù)器
2. 無權(quán)限重啟:重新啟動(dòng)服務(wù)使用以下命令
mysqld.exe –skip-grant-tables
3. 無用戶直接進(jìn)入數(shù)據(jù)庫
mysql直接訪問
4. 進(jìn)入到mysql數(shù)據(jù)庫內(nèi)的user表中修改root用戶的密碼
修改密碼的時(shí)候,必須使用password函數(shù)進(jìn)行加密
update user set password = password('root’) where user=’root’ and host ='localhost’;
5. 重啟服務(wù)器
6. 使用新的密碼進(jìn)行登錄
注意:在進(jìn)行無權(quán)限登錄的時(shí)候,所有人都可以無條件進(jìn)入數(shù)據(jù)庫,而且擁有全部權(quán)限。所以在進(jìn)行root密碼找回的時(shí)候,必須特別謹(jǐn)慎。(可以利用操作系統(tǒng)的安全性),應(yīng)該在最沒有用戶訪問的情況下,進(jìn)行修改,將損失減小到最低。
聯(lián)系客服