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