第一篇:我的MYSQL學習心得
我的MYSQL學習心得
(十一)視圖
我的MYSQL學習心得
(一)簡單語法 我的MYSQL學習心得
(二)數據類型寬度 我的MYSQL學習心得
(三)查看字段長度
我的MYSQL學習心得
(四)數據類型 我的MYSQL學習心得
(五)運算符 我的MYSQL學習心得
(六)函數 我的MYSQL學習心得
(七)查詢
我的MYSQL學習心得
(八)插入 更新 刪除 我的MYSQL學習心得
(九)索引
我的MYSQL學習心得
(十)自定義存儲過程和函數 我的MYSQL學習心得
(十二)觸發器 我的MYSQL學習心得
(十三)權限管理 我的MYSQL學習心得
(十四)備份和恢復 我的MYSQL學習心得
(十五)日志 我的MYSQL學習心得(十六)優化 我的MYSQL學習心得(十七)復制
這一篇《我的MYSQL學習心得
(十一)》將會講解MYSQL的視圖 使用視圖的理由是什么?
1、安全性:一般是這樣做的:創建一個視圖,定義好該視圖所操作的數據。
之后將用戶權限與視圖綁定,這樣的方式是使用到了一個特性:grant語句可以針對視圖進行授予權限。
2、查詢性能提高
3、有靈活性的功能需求后,需要改動表的結構而導致工作量比較大,那么可以使用虛擬表的形式達到少修改的效果。這是在實際開發中比較有用的
4、復雜的查詢需求,可以進行問題分解,然后將創建多個視圖獲取數據。將視圖聯合起來就能得到需要的結果了。
創建視圖 創建視圖的語法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 其中,CREATE:表示新建視圖; REPLACE:表示替換已有視圖 ALGORITHM :表示視圖選擇算法 view_name :視圖名 column_list:屬性列
select_statement:表示select語句
[WITH [CASCADED | LOCAL] CHECK OPTION]參數表示視圖在更新時保證在視圖的權限范圍之內
可選的ALGORITHM子句是對標準SQL的MySQL擴展。
ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。
如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。
對于MERGE,會將引用視圖的語句的文本與視圖定義合并起來,使得視圖定義的某一部分取代語句的對應部分。
對于TEMPTABLE,視圖的結果將被置于臨時表中,然后使用它執行語句。
對于UNDEFINED,MySQL自己選擇所要使用的算法。如果可能,它傾向于MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。
LOCAL和CASCADED為可選參數,決定了檢查測試的范圍,默認值為CASCADED。腳本 視圖的數據來自于兩個表
CREATE TABLE student(stuno INT ,stuname NVARCHAR(60))CREATE TABLE stuinfo(stuno INT ,class NVARCHAR(60),city NVARCHAR(60))
INSERT INTO student VALUES(1,'wanglin'),(2,'gaoli'),(3,'zhanghai')
INSERT INTO stuinfo VALUES(1,'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong')
--創建視圖
CREATE VIEW stu_class(id,NAME,glass)AS SELECT student.`stuno`,student.`stuname`,stuinfo.`class` FROM student ,stuinfo WHERE student.`stuno`=stuinfo.`stuno`
SELECT * FROM stu_class
查看視圖
查看視圖必須要有SHOW VIEW權限
查看視圖的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW DESCRIBE查看視圖基本信息
DESCRIBE 視圖名 DESCRIBE stu_class 結果顯示了視圖的字段定義、字段的數據類型、是否為空、是否為主/外鍵、默認值和額外信息
DESCRIBE一般都簡寫成DESC
SHOW TABLE STATUS語句查看查看視圖基本信息 查看視圖的信息可以通過SHOW TABLE STATUS的方法
SHOW TABLE STATUS LIKE 'stu_class'
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
stu_class(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)VIEW
COMMENT的值為VIEW說明該表為視圖,其他的信息為NULL說明這是一個虛表,如果是基表那么會基表的信息,這是基表和視圖的區別
SHOW CREATE VIEW語句查看視圖詳細信息
SHOW CREATE VIEW stu_class View Create View character_set_client collation_connection-----------------------------------------------------------------
stu_class CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_class` AS select `student`.`stuno` AS `id`,`student`.`stuname` AS `name`,`stuinfo`.`class` AS `class` from(`student` join `stuinfo`)where(`student`.`stuno` = `stuinfo`.`stuno`)utf8 utf8_general_ci 執行結果顯示視圖的名稱、創建視圖的語句等信息
在VIEWS表中查看視圖的詳細信息
在MYSQL中,INFORMATION_SCHEMA VIEWS表存儲了關于數據庫中的視圖的信息 通過對VIEWS表的查詢可以查看數據庫中所有視圖的詳細信息
SELECT * FROM `information_schema`.`VIEWS` TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION-------------------------------------------------------------------------------------------------------------------------------------------def school stu_class select
`school`.`student`.`stuno` AS `id`,`school`.`student`.`stuname` AS `name`,`school`.`stuinfo`.`class` AS `class` from `school`.`student` join `school`.`stuinfo` where(`school`.`student`.`stuno` = `school`.`stuinfo`.`stuno`)NONE YES root@localhost DEFINER utf8 utf8_general_ci 當前實例下只有一個視圖stu_class
修改視圖
修改視圖是指修改數據庫中存在的視圖,當基本表的某些字段發生變化時,可以通過修改視圖來保持與基本表的一致性。
MYSQL中通過CREATE OR REPLACE VIEW 語句和ALTER語句來修改視圖 語法如下:
ALTER OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 該語句用于更改已有視圖的定義。其語法與CREATE VIEW類似。當視圖不存在時創建,存在時進行修改
修改視圖 DELIMITER $$
CREATE OR REPLACE VIEW `stu_class` AS SELECT
`student`.`stuno` AS `id` FROM(`student` JOIN `stuinfo`)WHERE(`student`.`stuno` = `stuinfo`.`stuno`)$$
DELIMITER;
通過DESC來查看更改之后的視圖定義
DESC stu_class 可以看到只查詢一個字段
ALTER語句修改視圖
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 這里關鍵字跟前面的一樣,這里不做介紹
使用ALTER語句修改視圖 stu_class ALTER VIEW stu_class AS SELECT stuno FROM student;使用DESC查看
DESC stu_class
更新視圖
更新視圖是指通過視圖來插入、更新、刪除表數據,因為視圖是虛表,其中沒有數據。通過視圖更新的時候都是轉到基表進行更新,如果對視圖增加或者刪除記錄,實際上是對基表增加或刪除記錄
我們先修改一下視圖定義
ALTER VIEW stu_class AS SELECT stuno,stuname FROM student;查詢視圖數據
UPDATE
UPDATE stu_class SET stuname='xiaofang' WHERE stuno=2
查詢視圖數據
更新成功
INSERT INSERT INTO stu_class VALUES(6,'haojie')
插入成功
DELETE
DELETE FROM stu_class WHERE stuno=1
刪除成功 當視圖中包含如下內容的時候,視圖的更新操作將不能被執行(1)視圖中包含基本中被定義為非空的列
(2)定義視圖的SELECT語句后的字段列表中使用了數學表達式(3)定義視圖的SELECT語句后的字段列表中使用聚合函數
(4)定義視圖的SELECT語句中使用了DISTINCT、UNION、TOP、GROUP BY、HAVING子句
第二篇:我的MYSQL學習心得
我的MYSQL學習心得
一、使用視圖的理由是什么?
1.安全性。一般是這樣做的:創建一個視圖,定義好該視圖所操作的數據。之后將用戶權限與視圖綁定。這樣的方式是使用到了一個特性:grant語句可以針對視圖進行授予權限。2.查詢性能提高。
3.有靈活性的功能需求后,需要改動表的結構而導致工作量比較大。那么可以使用虛擬表的形式達到少修改的效果。這是在實際開發中比較有用的
例子:假如因為某種需要,a表與b表需要進行合并起來組成一個新的表c。最后a表與b表都不會存在了。而由于原來程序中編
寫sql分別是基于a表與b表查詢的,這就意味著需要重新編寫大量的sql(改成向c表去操作數據)。而通過視圖就可以做到不修改。定義兩個視圖名字還是原來的表名a和b。a、b視圖完成從c表中取出內容。說明:使用這樣的解決方式,基于對視圖的細節了解越詳細越好。因為使用視圖還是與使用表的語法上沒區別。比如視圖名a,那么查詢還是“select * from a”。
4.復雜的查詢需求。可以進行問題分解,然后將創建多個視圖獲取數據。將視圖聯合起來就能得到需要的結果了。
視圖的工作機制:當調用視圖的時候,才會執行視圖中的sql,進行取數據操作。視圖的內容沒有存儲,而是在視圖被引用的時候才派生出數據。這樣不會占用空間,由于是即時引用,視圖的內容總是與真實表的內容是一致的。視圖這樣設計有什么好處?節省空間,內容是總是一致的話,那么我們不需要維護視圖的內容,維護好真實表的內容,就可以保證視圖的完整性了。
二、通過更新視圖實現更新真實表
看到很多例子,更新視圖可以更新真實表。原因,我是這樣理解的:視圖并沒有保存內容。只是引用數據。那么,更新視圖,其實就是以引用的方式操作了真實表 with check option:對視圖進行更新操作的時,需要檢查更新后的值是否還是滿足視圖公式定義的條件。通俗點,就是所更新的結果是否還會在視圖中存在。如果更新后的值不在視圖范圍內,就不允許更新如果創建視圖的時候,沒有加上with check option,更新視圖中的某項數據的話,mysql并不會進行有效性檢查。刪掉了就刪掉了。在視圖中將看不到了。
使用有效性檢查,實際意義是什么?
視圖的實踐:重新組織表的需求
CREATE TABLE `result`(`MATH_NO` INT(10)NOT NULL unsigned AUTO_INCREMENT PRIMARY KEY, `TEAMNO` INT(10)NOT NULL, `PLAYERNO` INT(10)NOT NULL, `WON` VARCHAR(10)NOT NULL, `LOST` VARCAHR(10)NOT NULL, `CAPTAIN` INT(10)NOT NULL COMMIT '就是PLAYERNO的另外名字', `DIVISION` VARCHAR(10)NOT NULL)ENGINE=MYISAM DEFAULT CHARSET=utf8 COMMIT='重新組的新表' AUTO_INCREMENT=1
針對每個表創建一個視圖,將數據保存進去: CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION)AS SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result
報錯:#1050-Table 'teams' already exists
說明,因為視圖也是一種表,是虛擬表。不能與已有的表(視圖)出現重名
接下來,刪掉表teams,再執行創建視圖的代碼。
將視圖看成與表一樣的東西,更加容易理解使用規則。下面這樣對比也許使自己更好理解:
1.在使用視圖的時候,就是與使用表的語法一樣的。2.創建視圖的時候,該視圖的名字如果與已經存在表重名的話,那么會報錯,不允許創建。視圖就是一種特殊的表
3.創建視圖的時候,可以這樣使用CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION),可以定義視圖表的結構。
4.在phpmyadmin中。左邊的表列表中將視圖與表列在了一起。只有通過右側的狀態“View:teams”可以知道該表是視圖表。
視圖在mysql中的內部管理機制:
視圖的記錄都保存在information_schema數據庫中的一個叫views的表中。具體某個視圖的定義代碼以及屬于哪個數據庫等信息可以從里面看到理解視圖的兩種工作機制:
語句:select * from teams
針對上面語句,總結幾個知識點
1.確認是視圖的過程:teams也可以是表名。由于表與視圖的物理機制不同。視圖本身是不存儲內容的。所以,在使用sql的 時候,mysql是怎么知道teams是一個視圖還是表。是因為有一個查看目錄的例程在做這件事。
2.mysql對處理視圖的兩種方法:替代方式和具體化方式。替換方式理解,視圖名直接使用視圖的公式替換掉了。針對上面視圖teams,mysql會使用該視圖的公式進行替換,視圖公式合并到了select中。結果就是變成了如下sql語句: select * from(SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result)。也就是最后提交給mysql處理該sql語句。
具體化方式理解,mysql先得到了視圖執行的結果,該結果形成一個中間結果暫時存在內存中。之后,外面的select語句就調用了這些中間結果(臨時表)。
看起來都是要得到結果,形式上有區別,好像沒體會到本質上的區別。兩種方式又有什么樣的不同呢?
替換方式,將視圖公式替換后,當成一個整體sql進行處理了。具體化方式,先處理視圖結果,后處理外面的查詢需求。替換方式可以總結為,先準備,后執行。具體化方式總結理解為,分開處理。
哪種方式好?不知道。mysql會自己確定使用哪種方式進行處理的。自己在定義視圖的時候也可以指定使用何種方式。像這樣使用:
CREATE ALGORITHM=merge VIEW teams as SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result
ALGORITHM有三個參數分別是:merge、TEMPTABLE、UNDEFINED
看mysql手冊中提到,替換與具體化的方式的各自適用之處,可以這樣理解:
因為臨時表中的數據不可更新。所以,如果使用參數是TEMPTABLE,無法進行更新。
當你的參數定義是UNDEFINED(沒有定義ALGORITHM參數)。mysql更傾向于選擇合并方式。是因為它更加有效。
第三篇:MySQL學習心得
MySQL學習心得
第一章
一、數據庫管理系統(DBMS)是操作和管理數據庫的大型軟件,它按一定的數據模型組織數據。
例如:Oracle、SQL Server、MySQL、Access。
二、數據庫應用系統在數據庫管理系統(DBMS)支持下建立的計算機應用系統,簡寫:DBAS。
例如:.net Java。
三、字符集從大到小排序:utf8--gbk--gb2312。
四、mysql的特點:
適用于中小型網站中,體積小、速度快、總體擁有成本低,尤其是有開放源碼這一特點。
五、目前Internet上滸的網站構架方式是LAMP(Linux+apache+mysql+php)即使用Linux作為操作系統,Apache作為Web服務器,MySQL作為數據庫,PHP作為服務器端腳本解釋器,由于4個軟件都是遵循GPL的開放源碼軟件,因此使用這種方式不用花一分錢就可以建立起一個穩定、免費的網站系統。
第二章
一、安裝過程中遇到的問題及解決方法:
安裝過程中沒有完成時計算機關機。(沒有刪除完文件)安裝完成時找不到所配置的路徑。(可以從配置文件中找到)
安裝完成后無法正常使用。(在計算機管理中重新啟動MySQL服務)安裝到一半時沒有出現下一步。(誤把配置文件刪除了)安裝到最后一步時start service錯誤。到控制面板里面先把mysql刪除.到c盤C:Program Files目錄下把mysql目錄刪除.如果在其他盤還有設置目錄也要刪除.空目錄也要刪除 到regedit把注冊表
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL 有的話,全部刪除?。记桑河肍3循環查找“mysql”)如果任務管理器里有關mysql內容也刪除 把防火墻關了
重新裝mysql(這里我沒有重啟計算機)
重裝時候有必要的話,重啟計算機,停用IIS,和刪除temp里的臨時文件.實在不行的話,配置mysql時候,把mysql服務換個服務名.使用時輸入中文會出錯。(在配置時在“Character Set”選框中將latinl修改為gb2312;也可以在配置文件中修改)
二、啟動服務器的方法: ① 方法1:
在 “計算機管理”中的“服務”項目中啟動與停止。② 方法2: 使用命令(net start mysql和net stop mysql)
三、連接MySQL 格式: mysql-h主機地址-u用戶名 -p用戶密碼
①先在打開DOS窗口,然后進入目錄 mysqlbin(如果設置了環境變量,則直接輸入命令即可。)②鍵入命令mysql-uroot-proot ③接回車即可進入到MYSQL中了 MYSQL的提示符是:mysql> 注明:直接打開Mysql command line client
四、MySQL注釋符有三種: ①#...②“--...” ③
五、忘記密碼重新更改密碼
先停止mysql服務,修改D:MySQLMySQL Server 5.0 目錄下的my.ini文件,在[mysqld]下添加skip-grant-tables 啟動mysql服務后就可以以空密碼登錄,之后別忘記修改root密碼
use mysql update user set password=password('hanaixia')where user='root';(分號不能少)password('hanaixia')此處必須用函數設置。
修改密碼后需要重新啟動服務或者使用 flush privileges;語句,用于從mysql數據庫中的授權表重新載入權限。
把 skip-grant-tables 這一句刪掉再重啟mysql服務。
第四篇:Mysql數據庫學習心得
Mysql數據庫學習心得(1)
由于工作中需要使用mysql,筆者通過網上學習,動手實踐,終于從一個“數據庫菜鳥”變成了能熟練操作mysql的“準大蝦”了,:)。現將學習心得整理如下。
MySQL是完全網絡化的跨平臺關系型數據庫系統,一個真正的多用戶、多線程SQL數據庫服務器,同時是具有客戶機/服務器體系結構的分布式數據庫管理系統。它具有功能強、使
用簡便、管理方便、運行速度快、安全可靠性強等優點,用戶可利用許多語言編寫訪問MySQL數據庫的程序,對于中、小型應用系統是非常理想的。除了支持標準的ANSI SQL語句,更重要的是,它還支持多種平臺,而在Unix系統上該軟件支持多線程運行方式,從而能獲得相當好的性能。對于不使用Unix的用戶,它可以在Windows NT系統上以系統服務方式運行,或者在Windows 95/98系統上以普通進程方式運行。而在Unix/Linux系統上,MySQL支持多線程運行方式,從而能獲得相當好的性能,而且它是屬于開放源代碼軟。
MySQL是以一個客戶機/服務器結構的實現,它由一個服務器守護程序mysqld和很多不同的客戶程序和庫組成,MySQL的執行性能非常高,運行速度非常快,并非常容易使用,是一個非常棒的數據庫。MySQL的官方發音是“My Ess Que Ell”(不是MY-SEQUEL)。
一.獲得MySQL
首先必須下載MySQL。Mysql的官方網站是:www.tmdps.cnf copy為c:my.cnf,并把c:mysqlibgwinb19.dll copy到winntsystem32。
3。啟動mysql的方法是:
c:mysqlinmysqld-shareware--install
net start mysql
這么簡單,就可以啟動了。
4。更改超級用戶(root)的密碼:
C:mysqlinmysql mysql
mysql> UPDATE user SET password=PASSWORD('your password')swheresuser='root';
mysql> QUIT
C:mysqlinmysqladmin reload
使用命令C:mysqlinmysqlshow去看看檢測一下。在這里應該顯示:
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
看到這些信息這一步就證明沒問題了
再來:
C:mysqlinmysqlshow--user=root--password=your password mysql
在這里應該顯示:
Database: mysql
+--------------+
| Tables |
+--------------+
| columns_priv |
| db |
| host |
| tables_priv |
| user |
+--------------+
一切搞定!
5。C:mysqlinmysqladmin version status proc
應該可以看到這些版本信息的:
mysqladmin Ver 8.0 Distrib 3.22.32, for Win95/Win98 on i586
TCX Datakonsult AB, by Monty
Server version 3.22.32-shareware-debug
Protocol version 10
Connection localhost via TCP/IP
TCP port 3306
Uptime: 1 hour 29 min 30 sec
Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K Max memory
used: 16490K
Uptime: 5370 Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K
Max memory used: 16490K
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+----+---------+------+-------+------------------+
| 35 | ODBC | localhost | | Query | 0 | | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
接著,用show databases命令可以將安裝的數據庫列出來:
mysql> show databases;
你就可以看到:
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+ rows in set(0.00 sec)
如果一切正常的話,那說明MySQL可以完全工作了!如果要退出程序,輸入:exit
mysql> exit;
Bye
Mysql數據庫學習心得(3)------------------
三.Mysql常識
(一)字段類型
1.INT[(M)]
正常大小整數類型
2.DOUBLE[(M,D)] [ZEROFILL]
正常大小(雙精密)浮點數字類型
3.DATE
日期類型。支持的范圍是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式來顯示DATE值,但是允許你使用字符串或數字把值賦給
DATE列
4.CHAR(M)
定長字符串類型,當存儲時,總是是用空格填滿右邊到指定的長度
5.BLOB TEXT
BLOB或TEXT類型,最大長度為65535(2^16-1)個字符。
6.VARCHAR
變長字符串類型,最常用的類型。
(二)基本操作
1:顯示數據庫
mysql>SHOW DATABASES;
2:當前選擇的數據庫,mysql> SELECT DATABASE();
+------------+
| DATABASE()|
+------------+
| test |
+------------+
3.當前數據庫包含的表信息:
mysql> SHOW TABLES;
+---------------------+
| Tables in test |
+---------------------+
| mytable1 |
| mytable2 |
+---------------------+
4.獲取表結構
mysql> desc mytable1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| s1 | varchar(20)| YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5.創建表
表是數據庫的最基本元素之一,表與表之間可以相互獨立,也可以相互關聯。創建表的基本語法如下:
create table table_name
(column_name datatype {identity |null|not null},…)
其中參數table_name和column_name必須滿足用戶數據庫中的識別器(identifier)的要求,參數datatype是一個標準的SQL類型或由用戶數
據庫提供的類型。用戶要使用non-null從句為各字段輸入數據。
create table還有一些其他選項,如創建臨時表和使用select子句從其他的表中讀取某些字段組成新表等。還有,在創建表是可用PRIMARY
KEY、KEY、INDEX等標識符設定某些字段為主鍵或索引等。書寫上要注意:在一對圓括號里的列出完整的字段清單。字段名間用逗號隔開
。字段名間的逗號后要加一個空格。最后一個字段名后不用逗號。所有的SQL陳述都以分號“;”結束。
例:
mysql>CREATE TABLE guest(name varchar(10),sex varchar(2),age int(3),career varchar(10));
6.創建索引
索引用于對數據庫的查詢。一般數據庫建有多種索引方案,每種方案都精于某一特定的查詢類。索引可以加速對數據庫的查詢過程。創建
索引的基本語法如下:
create index index_name
on table_name(col_name[(length)],...)
例:
mysql> CREATE INDEX number ON guest(number(10));
7.執行查詢
查詢是使用最多的SQL命令。查詢數據庫需要憑借結構、索引和字段類型等因素。大多數數據庫含有一個優化器(optimizer),把用戶的查
詢語句轉換成可選的形式,以提高查詢效率。
值得注意的是MySQL不支持SQL92標準的嵌套的where子句,即它只支持一個where子句。其基本語法如下:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
其中where從句是定義選擇標準的地方,where_definition可以有不同的格式,但都遵循下面的形式:
字段名操作表達式
字段名操作字段名
在第一種形式下,標準把字段的值與表達式進行比較;在第二種形式下,把兩個字段的值進行比較。根據所比較的數據類型,search_condition中的操作可能選以下幾種:
=檢查是否相等
!=檢查是否不等
>(或>=)檢查左邊值是否大于(或大于等于)右邊值
<(或<=)檢查左邊值是否小于(或小于等于)右邊值
[not] between檢查左邊值是否在某個范圍內
[not] in檢查左邊是否某個特定集的成員
[not] like檢查左邊是否為右邊的子串
is [not] null檢查左邊是否為空值
在這里,可以用通配符_代表任何一個字符,%代表任何字符串。使用關鍵字、和可以生成復雜的詞,它們運行檢查時使用
布爾表達式的多重標準集。
例:
mysql> select t1.name, t2.salary from employee AS t1, info AS t2swherest1.name = t2.name;
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select col_name from tbl_nameswherescol_name > 0;
8.改變表結構
在數據庫的使用過程中,有時需要改變它的表結構,包括改變字段名,甚至改變不同數據庫字段間的關系??梢詫崿F上述改變的命令是
alter,其基本語法如下:
alter table table_name alter_spec [, alter_spec...]
例:
mysql> alter table dbname add column userid int(11)not null primary key auto_increment;
這樣,就在表dbname中添加了一個字段userid,類型為int(11)。
9.修改表中數據
在使用數據庫過程中,往往要修改其表中的數據,比如往表中添加新數據,刪除表中原有數據,或對表中原有數據進行更改。它們的基本
語法如下:
數據添加:
insert [into] table_name [(column(s))]
values(expression(s))
例:
mysql>insertsintosmydatabase values('php','mysql','asp','sqlserver','jsp','oracle');Mysql數據庫學習心得(4)------------------
10.表的數據更新
(1)一次修改一個字段,再次注意語法。文本需要加引號但數字不要。
mysql>update table01 set field03='new info'swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(2)一次改變多個字段,記住在每一個更新的字段間用逗號隔開。
mysql>update table01 set field04=19991022, field05=062218swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(3)一次更新多個數據
mysql>update table01 set field05=152901swheresfield04>19990101;
Query OK, 3 rows affected(0.00 sec)
11.刪除數據
mysql>delete from table01swheresfield01=3;
Query OK, 1 row affected(0.00 sec)
12.導入數據庫表
(1)創建.sql文件
(2)先產生一個庫如auction.c:mysqlin>mysqladmin-u root-p creat auction,會提示輸入密碼,然后成功創建。
(3)導入auction.sql文件
c:mysqlin>mysql-u root-p auction < auction.sql。
通過以上操作,就可以創建了一個數據庫auction以及其中的一個表auction。
13.mysql數據庫的授權
mysql>grant select,insert,delete,create,drop
on *.*(或test.*/user.*/..)
to用戶名@localhost
identified by '密碼';
如:新建一個用戶帳號以便可以訪問數據庫,需要進行如下操作:
mysql> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.15 sec)
此后就創建了一個新用戶叫:testuser,這個用戶只能從localhost連接到數據庫并可以連接到test數據庫。下一步,我們必須指定
testuser這個用戶可以執行哪些操作:
mysql> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.00 sec)
此操作使testuser能夠在每一個test數據庫中的表執行SELECT,INSERT和DELETE以及UPDATE查詢操作?,F在我們結束操作并退出MySQL客戶
程序:
mysql> exit
Bye
14.授權MySQL用戶密碼
MySQL數據庫的默認用戶名為“root”(MS SQL Server的sa相似),密碼默認為空。在DOS提示符(注 意,不是mysql提示符)下輸入
c:mysqlin>“mysqladmin-u root-p password newpassword
回車后會提示你輸入原來的密碼,由于原來密碼為空,直接回車,root用戶的密碼便改為”newpassword“了。
Mysql數據庫學習心得(5)------------------
四.安裝phpMyAdmin
MySQL圖形界面管理器phpMyAdmin是一套以php3寫成,針對MySQL數據庫系統的Web管理界面。它可以很方便地以圖形化界面,來對MySQL數據庫里的字段、數據進行增加、刪除等的動作,更可以做數據庫本身的增刪管理;phpMyAdmin可以管理整個MySQL服務器(需要超級用戶),也可以管理單個數據庫。另外,您也可以通過使用這個圖形化界面來學習SQL正確的語法,直至熟練掌握。那要等到你看過MySQL手冊中相關的部分。你可以到http://www.phpwizard.net/phpMyAdmin/去下載最新的版本。
首先,將phpMyAdmin軟件包解到一個目錄下。
1.修改文檔config.inc.php3。
將原來的設定:
§cfgServers[1]['host'] = '';// MySQL hostname
§cfgServers[1]['port'] = '';// MySQL port-leave blank fordefault port
§cfgServers[1]['adv_auth'] = false;// Use advanced authentication?
§cfgServers[1]['stduser'] = '';// MySQL standard user(only needed with advanced auth)
§cfgServers[1]['stdpass'] = '';// MySQL standard password(only needed with advanced auth)
§cfgServers[1]['user'] = '';// MySQL user(only needed withbasic auth)
§cfgServers[1]['password'] = '';// MySQL password(only needed with basic auth)
§cfgServers[1]['only_db'] = '';// If set to a db-name, only this db is accessible
§cfgServers[1]['verbose'] = '';// Verbose name for this host-leave blank to show the hostname
:
:
require(”english.inc.php3“);
修改成:
§cfgServers[1]['host'] = 'MySQL Server的hostname';//填入您的MySQL Server的主機名稱
§cfgServers[1]['port'] = '';//填入連結MySQL的port,不填則以預設的port進行連結
§cfgServers[1]['adv_auth'] = true;//改成true則進入phpMyAdmin必須先身份認證
§cfgServers[1]['stduser'] = 'root';// MySQL使用者的帳號
§cfgServers[1]['stdpass'] = '密碼';// MySQL使用者的密碼
§cfgServers[1]['user'] = 'root';// MySQL管理帳號
§cfgServers[1]['password'] = '密碼';// MySQL管理密碼
§cfgServers[1]['only_db'] = '';//指定管理的資庫名稱,不填則可以管理整個Server
§cfgServers[1]['verbose'] = '';//指定MySQL的名稱,不填則使用系統本身的hostname
:
:
require(”chinese_gb.inc.php3");//將語言改成中文
說明:
(1)因本管理接口,可以以一個接口,管理多個MySQL Server,所以可以在config.inc.php3中找到
§cfgServers[1]...§cfgServers[1]...§cfgServers[1]...:
§cfgServers[2]...§cfgServers[2]...§cfgServers[2]...其中[1]代表第一個MySQL Server,[2]代表第二個MySQL Server,您要管理的MySQL Server超過三臺以上,您可以依照同樣的?述,增加[4].....下去!
(2)若您的MySQL Server與http Server是同一臺,則§cfgServers[1]['host'] =可直接填入localhost。
最后,打開流覽器,輸入你的網址/phpMyAdmin之后您會看到一個密碼驗證的小窗口,輸入您的MySQL管理帳號及密碼,即可成功地看到phpMyAdmin的管理畫面。通過phpmyadmin,你就可以圖形化的、方便的管理你的所有數據庫了。
五.小結
通過以上的學習和操作,終于可以自由操作mysql數據庫了,也可以輕車熟路的使用php或者asp調用mysql了。最后,筆者要特別感謝開發了mysql并且免費貢獻的天才以及在網上提供mysql使用說明的大蝦們。
第五篇:我的MYSQL學習心得備份和恢復
備份
邏輯備份方法
使用MYSQLDUMP命令備份
MYSQLDUMP是MYSQL提供的一個非常有用的數據庫備份工具。mysqldump命令執行時將數據庫備份成一個文本文件,該文件中實際上包含了多個CREATE 和INSERT語句,使用這些語句可以重新創建表和插入數據
MYSQLDUMP的語法和選項
mysqldump-u user-p pwd-h host dbname[tbname,[tbname...]]>filename.sql
選項/Option 作用/Action Performed--add-drop-table
這個選項將會在每一個表的前面加上DROP TABLE IF EXISTS語句,這樣可以保證導回MySQL數據庫的時候不會出錯,因為每次導回的時候,都會首先檢查表是否存在,存在就刪除--add-locks這個選項會在INSERT語句中捆上一個LOCK TABLE和UNLOCK TABLE語句。這就防止在這些記錄被再次導入數據庫時其他用戶對表進行的操作-c or-complete_insert 這個選項使得mysqldump命令給每一個產生INSERT語句加上列(field)的名字。當把數據導出導另外一個數據庫時這個選項很有用。--delayed-insert 在INSERT命令中加入DELAY選項-F or-flush-logs 使用這個選項,在執行導出之前將會刷新MySQL服務器的log.-f or-force 使用這個選項,即使有錯誤發生,仍然繼續導出--full 這個選項把附加信息也加到CREATE TABLE的語句中-l or-lock-tables 使用這個選項,導出表的時候服務器將會給表加鎖。-t or-no-create-info 這個選項使的mysqldump命令不創建CREATE TABLE語句,這個選項在您只需要數據而不需要DDL(數據庫定義語句)時很方便。-d or-no-data 這個選項使的mysqldump命令不創建INSERT語句。
在您只需要DDL語句時,可以使用這個選項。--opt 此選項將打開所有會提高文件導出速度和創造一個可以更快導入的文件的選項。-q or-quick 這個選項使得MySQL不會把整個導出的內容讀入內存再執行導出,而是在讀到的時候就寫入導文件中。-T path or-tab = path 這個選項將會創建兩個文件,一個文件包含DDL語句或者表創建語句,另一個文件包含數據。DDL文件被命名為table_name.sql,數據文件被命名為table_name.txt.路徑名是存放這兩個文件的目錄。目錄必須已經存在,并且命令的使用者有對文件的特權。-w “WHERE Clause” or-where = “Where clause ” 如前面所講的,您可以使用這一選項來過篩選將要放到 導出文件的數據。
假定您需要為一個表單中要用到的帳號建立一個文件,經理要看今年(2004年)所有的訂單(Orders),它們并不對DDL感興趣,并且需要文件有逗號分隔,因為這樣就很容易導入到Excel中。為了完成這個任務,您可以使用下面的句子:
bin/mysqldump –p –where “Order_Date >='2000-01-01'” –tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders 這將會得到您想要的結果。schema:模式
The set of statements, expressed in data definition language, that completely describe the structure of a data base.一組以數據定義語言來表達的語句集,該語句集完整地描述了數據庫的結構。SELECT INTO OUTFILE :
mysqldump提供了很多選項,包括調試和壓縮的,在這里只是列舉最有用的。運行幫助命令mysqldump--help可以獲得特定版本的完整選項列表
user表示用戶名稱;
host表示登錄用戶的主機名稱; pwd為登錄密碼;
dbname為需要備份的數據庫名稱;
tbname為dbname數據庫中需要備份的數據表,可以指定多個需要備份的表; 右箭頭“>”告訴mysqldump將備份數據庫表定義和數據寫入備份文件; filename為備份文件的名稱
1、使用mysqldump備份單個數據庫中的所有表 數據庫的記錄是這樣的
打開cmd,然后執行下面的命令
可以看到C盤下面已經生成了school_2014-7-10.sql文件
使用editplus來打開這個sql文件
--MySQL dump 10.13 Distrib 5.5.20, for Win32(x86)----Host: 127.0.0.1 Database: school---------------------------Server version 5.5.20-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;----Table structure for table `book`--DROP TABLE IF EXISTS `book`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `book`(`bookid` int(11)NOT NULL, `bookname` varchar(255)NOT NULL, `authors` varchar(255)NOT NULL, `info` varchar(255)DEFAULT NULL, `comment` varchar(255)DEFAULT NULL, `year_publication` year(4)NOT NULL, KEY `BkNameIdx`(`bookname`))ENGINE=MyISAM DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `book`--
LOCK TABLES `book` WRITE;/*!40000 ALTER TABLE `book` DISABLE KEYS */;INSERT INTO `book` VALUES(1,'鍓戝湥','灝忔槑','13','hao',2013);/*!40000 ALTER TABLE `book` ENABLE KEYS */;UNLOCK TABLES;----Table structure for table `student`--DROP TABLE IF EXISTS `student`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `student`(`stuno` int(11)DEFAULT NULL, `stuname` varchar(60)DEFAULT NULL)ENGINE=InnoDB DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `student`--
LOCK TABLES `student` WRITE;/*!40000 ALTER TABLE `student` DISABLE KEYS */;INSERT INTO `student` VALUES
(2,'xiaofang'),(3,'zhanghai'),(6,'haojie');/*!40000 ALTER TABLE `student` ENABLE KEYS */;UNLOCK TABLES;----Table structure for table `stuinfo`--DROP TABLE IF EXISTS `stuinfo`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `stuinfo`(`stuno` int(11)DEFAULT NULL, `class` varchar(60)DEFAULT NULL, `city` varchar(60)DEFAULT NULL)ENGINE=InnoDB DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `stuinfo`--
LOCK TABLES `stuinfo` WRITE;/*!40000 ALTER TABLE `stuinfo` DISABLE KEYS */;INSERT INTO `stuinfo` VALUES
(1,'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong');/*!40000 ALTER TABLE `stuinfo` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;--Dump completed on 2014-07-23 22:04:16
可以看到,備份文件包含了一些信息,文件開頭首先寫明了mysqldump工具的版本號; 然后是主機信息,以及備份的數據庫名稱,最后是mysql服務器的版本號5.5.20
備份文件接下來的部分是一些SET語句,這些語句將一些系統變量賦值給用戶定義變量,以確保被恢復的數據庫的系統變量和原來 備份時的變量相同 例如:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;該set語句將當前系統變量character_set_client的值賦值給用戶變量@OLD_CHARACTER_SET_CLIENT 備份文件的最后幾行mysql使用set語句恢復服務器系統變量原來的值,例如:
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;該語句將用戶定義變量@OLD_CHARACTER_SET_CLIENT 中保存的值賦值給實際的系統變量OLD_CHARACTER_SET_CLIENT 備份文件中的“--”字符開頭的行為注釋語句;以“/*!”開頭、以“*/”結尾的語句為可執行的mysql注釋,這些語句可以被mysql執行
但在其他數據庫管理系統將被作為注釋忽略,這可以提高數據庫的可移植性
另外注意到,備份文件開始的一些語句以數字開頭,這些數字代表了mysql版本號,該數字告訴我們這些語句只有在指定的mysql版本 或者比該版本高的情況下才能執行。
例如:40101,表明這些語句只有在mysql版本為4.01.01或者更高版本的條件下才可以執行
2、使用mysqldump備份數據庫中的某個表 備份school數據庫里面的book表
--MySQL dump 10.13 Distrib 5.5.20, for Win32(x86)----Host: 127.0.0.1 Database: school---------------------------Server version 5.5.20-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;----Table structure for table `book`--DROP TABLE IF EXISTS `book`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `book`(`bookid` int(11)NOT NULL, `bookname` varchar(255)NOT NULL, `authors` varchar(255)NOT NULL, `info` varchar(255)DEFAULT NULL, `comment` varchar(255)DEFAULT NULL, `year_publication` year(4)NOT NULL, KEY `BkNameIdx`(`bookname`))ENGINE=MyISAM DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `book`--
LOCK TABLES `book` WRITE;/*!40000 ALTER TABLE `book` DISABLE KEYS */;INSERT INTO `book` VALUES(1,'劍圣','小明','13','hao',2013);/*!40000 ALTER TABLE `book` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;--Dump completed on 2014-07-23 22:24:29
備份文件中的內容跟前面的介紹是一樣的,唯一不同的是只包含了book表的CREATE語句和INSERT語句
3、使用mysqldump備份多個數據庫
如果要使用mysqldump備份多個數據庫,需要使用--databases參數。
使用--databases參數之后,必須指定至少一個數據庫的名稱,多個數據庫名稱之間用空格隔開
使用mysqldump備份school庫和test庫
備份文件里的內容,基本上跟第一個例子一樣,但是指明了里面的內容那一部分屬于test庫,哪一部分屬于school庫
View Code
4、使用--all-databases參數備份系統中所有的數據庫 使用--all-databases不需要指定數據庫名稱
執行完畢之后會產生all_2014-7-10.sql的備份文件,里面會包含了所有數據庫的備份信息
提示:如果在服務器上進行備份,并且表均為myisam,應考慮使用mysqlhotcopy 因為可以更快地進行備份和恢復
使用mysqlhotcopy,如果是Windows操作系統,需要先安裝perl腳本組件才能使用,因為mysqlhotcopy是使用perl來編寫的提示
(1)如果你未使用--quick或者--opt選項,那么mysqldump將在轉儲結果之前把全部內容載入到內存中。這在你轉儲大數據量的數據庫時將會有些問題。該選項默認是打開的,但可以使用--skip-opt來關閉它。
(2)使用--skip-comments可以去掉導出文件中的注釋語句
(3)使用--compact選項可以只輸出最重要的語句,而不輸出注釋及刪除表語句等等(4)使用--database或-B選項,可以轉儲多個數據庫,在這個選項名后的參數都被認定為數據庫名
SQLSERVER邏輯備份
我發現SQLSERVER的備份概念并沒有ORACLE和MYSQL那么多 我們通常都會使用下面的兩個SQL語句來備份SQLSERVER數據庫,例如備份test庫
BACKUP DATABASE test TO DISK='c:test.bak' BACKUP LOG test TO DISK='c:test_log.bak'
第一個SQL是完整備份test庫,如果加上WITH DIFFERENTIAL就是差異備份 第二個SQL是備份test庫的日志
實際上從我眼中的理解,SQLSERVER就是將數據文件和必要的日志信息放入一個壓縮包里面,類似于MYSQL的物理備份,直接復制文件,只是MYSQL并沒有進行打包壓縮
SQLSERVER的邏輯備份
邏輯備份就是生成表定義腳本和數據插入腳本,SQLSERVER2008開始支持生成數據腳本,在SQLSERVER2008之前只支持生成表定義腳本 我所用的數據庫是SQLSERVER2012 SP1 選中需要生成腳本的數據庫
比如我要導出test表的數據和表定義
要選擇架構和數據,并且要選擇索引,這樣就會生成表的數據、定義、索引
生成的腳本如下
USE [sss]GO/****** Object: Table [dbo].[test] Script Date: 2014/7/24 11:27:44 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[test]([a] [int] NULL)ON [PRIMARY]
GOINSERT [dbo].[test]([a])VALUES(10)GO
由于test表是沒有任何索引的,所以腳本里看不到CREATE INDEX語句
實際上各種數據庫的備份恢復方法都是大同小異的 ORACLE冷備份與恢復
邏輯備份和物理備份
1、導出create table、create index、insert into 表等語句(邏輯備份)mysql:mysqldump、load data infile、select into outfile sqlserver:生成腳本、導入導出向導 oracle:(exp/imp)
2、直接復制文件(物理備份)
sqlserver:backup database語句、backup log語句、停SQLSERVER服務直接拷貝數據文件
mysql:mysqlhotcopy、innobackupex oracle:rman、直接將關鍵性文件拷貝到另外的位置、(exp/imp)、(expdp/impdp)相似點:上面的各種數據庫的各種備份還原方法,每一種基本上都會有一個單獨的工具來做 例如sqlserver導入導出向導就是一個單獨的exe來做 oracle的rman也是一個單獨的工具
冷備份和熱備份:無論oracle、sqlserver、mysql都有冷備份和熱備份的概念 冷備份其實可以簡單理解為:停止服務進行備份
熱備份其實可以簡單理解為:不停止服務進行備份(在線)上面的停止服務,正確的來講應該是停止數據庫的寫入
為什么mysql的myisam引擎只支持冷備份呢? 大家可以先想一下innodb引擎,innodb引擎是事務性存儲引擎,每一條語句都會寫日志,并且每一條語句在日志里面都有時間點
那么在備份的時候,mysql可以根據這個日志來進行redo和undo,將備份的時候沒有提交的事務進行回滾,已經提交了的進行重做
但是myisam不行,myisam是沒有日志的,為了保證一致性,只能停機或者鎖表進行備份
在書《MYSQL性能調優和架構設計》里面說到了事務的作用
大家可以想一想,為什么sqlserver支持從某一個lsn或者時刻進行恢復數據庫,他也是從日志里面讀取日志的lsn號來進行恢復到某一個lsn時刻的數據或者某一個時刻的數據 假如沒有事務日志,那么sqlserver是做不到時點還原的熱備份、冷備份
為什么SQLSERVER需要停止SQLSERVER服務才可以拷貝物理數據文件,為的都是保證數據一致性
物理備份方法
1、直接復制整個數據庫目錄
因為MYSQL表保存為文件方式,所以可以直接復制MYSQL數據庫的存儲目錄以及文件進行備份。
MYSQL的數據庫目錄位置不一定相同,在Windows平臺下,MYSQL5.6存放數據庫的目錄通常默認為
C:Documents and SettingsAll UserApplication DataMySQLMYSQL Server 5.6data 或者其他用戶自定義的目錄;
在Linux平臺下,數據庫目錄位置通常為/var/lib/mysql/,不同Linux版本下目錄會有不同
這是一種簡單、快速、有效的備份方式。要想保持備份一致,備份前需要對相關表執行LOCK TABLES操作,然后對表執行 FLUSH TABLES。這樣當復制數據庫目錄中的文件時,允許其他客戶繼續查詢表。需要FLUSH TABLES語句來確保開始 備份前將所有激活的索引頁寫入磁盤。當然,也可以停止MYSQL服務再進行備份操作
這種方法雖然簡單,但并不是最好的方法。因為這種方法對INNODB存儲引擎的表不適用。使用這種方法備份的數據最好還原
到相同版本的服務器中,不同的版本可能不兼容。
注意:在mysql版本中,第一個數字表示主版本號,主版本號相同的MYSQL數據庫文件格式相同
2、使用mysqlhotcopy工具快速備份
mysqlhotcopy是一個perl腳本,最初由Tim Bunce編寫并提供。他使用LOCK TABLES、FLUSH TABLES和cp或scp 來快速備份數據庫。他是備份數據庫或單個表的最快途徑,但他只能運行在數據庫目錄所在機器上,并且只能備份myisam類型的表。語法
mysqlhotcopy db_name_1,...db_name_n /path/to/new_directory db_name_1...n代表要備份的數據庫的名稱; path/to/new_directory指定備份文件目錄
示例
在Linux下面使用mysqlhotcopy備份test庫到/usr/backup mysqlhotcopy-u root-p test /usr/backup
要想執行mysqlhotcopy,必須可以訪問備份的表文件,具有那些表的SELECT權限、RELOAD權限(以便能夠執行FLUSH TABLES)和LOCK TABLES權限
提示:mysqlhotcopy只是將表所在目錄復制到另一個位置,只能用于備份myisam和archive表。備份innodb表會出現錯誤信息
由于他復制本地格式的文件,故也不能移植到其他硬件或操作系統下
邏輯還原
1、使用mysql命令進行還原
對于已經備份的包含CREATE、INSERT語句的文本文件,可以使用myslq命令導入數據庫中
還原
備份的sql文件中包含CREATE、INSERT語句(有時也會有DROP語句)。mysql命令可以直接執行文件中的這些語句 其語法如下:
mysql-u user-p [dbname] 用mysql命令將school_2014-7-10.sql文件中的備份導入到數據庫中 mysql-u root-h 127.0.0.1-p school 如果已經登錄mysql,那么可以使用source命令導入備份文件 使用source命令導入備份文件school_2014-7-10.sql 執行source命令前必須使用use 語句選擇好數據庫,不然會出現ERROR 1046(3D000):NO DATABASE SELECTED 的錯誤 還有一點要注意的是只能在cmd界面下執行,不能在mysql工具里面執行source命令,否則會報錯 因為cmd是直接調用mysql.exe來執行命令的 而這些mysql 編輯工具只是利用mysql connector連接mysql,來管理mysql并不是直接調用mysql.exe,所以執行source會報錯 物理還原 2、直接復制到數據庫目錄 如果數據庫通過復制數據庫文件備份,可以直接復制備份文件到MYSQL數據目錄下實現還原。通過這種方式還原時,必須保證備份數據的數據庫和待還原的數據庫服務器的主版本號相同。而且這種方式只對MYISAM引擎有效,對于innodb引擎的表不可用 執行還原以前關閉mysql服務,將備份的文件或目錄覆蓋mysql的data目錄,啟動mysql服務。 對于Linux操作系統來說,復制完文件需要將文件的用戶和組更改為mysql運行的用戶和組,通常用戶是mysql,組也是mysql 3、mysqlhotcopy快速恢復 mysqlhotcopy備份后的文件也可以用來恢復數據庫,在mysql服務器停止運行時,將備份的數據庫文件復制到mysql存放數據的位置 (mysql的data文件夾),重新啟動mysql服務即可。 如果根用戶執行該操作,必須指定數據庫文件的所有者,輸入語句如下: chown-R mysql.mysql /var/lib/mysql/dbname 從mysqlhotcopy復制的備份恢復數據庫 cp-R /usr/backup/test usr/local/mysql/data 執行完該語句,重啟服務器,mysql將恢復到備份狀態 注意:如果需要恢復的數據庫已經存在,則在使用DROP語句刪除已經存在的數據庫之后,恢復才能成功。另外mysql不同版本之間必須兼容,恢復之后的數據才可以使用! 數據庫遷移 數據庫遷移就是把數據從一個系統移動到另一個系統上。遷移的一般原因: 1、需要安裝新的數據庫服務器 2、mysql版本更新 3、數據庫管理系統變更(從SQLSERVER遷移到mysql) 相同版本的MYSQL數據庫之間遷移 相同版本mysql數據庫間的遷移就是主版本號相同的mysql數據庫直接進行數據庫移動。前面講解備份和還原的時候,知道最簡單的方法就是復制數據庫文件目錄,但是這種方法只適合于myisam表 對于innodb表,不能直接復制文件來備份數據庫 最常用的方法是使用mysqldump導出數據,然后在目標數據庫服務器使用mysql命令導入 將www.tmdps.cn/2001/XMLSchema-instance“> 導入 1、使用LOAD DATA INFILE 方式導入文本文件 mysql允許將數據導出到外部文件,也可以從外部文件導入數據。 MYSQL提供了一些導入數據的工具,這些工具有:LOAD DATA語句、source命令、mysql命令 LOAD DATA INFILE語句用于高速地從一個文本文件中讀取行,并裝入一個表中。文件名稱必須為文字字符串 語法如下: LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char' ] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number LINES] [(col_name_or_user_var,...)] [SET col_name = expr,...]] load data infile語句從一個文本文件中以很高的速度讀入一個表中。使用這個命令之前,mysqld進程(服務)必須已經在運行。 當讀取的文本文件不在本機,而是位于服務器上的文本文件時,使用load data infile語句,在服務器主機上你必須有file的權限。、如果你指定關鍵詞low_priority,那么MySQL將會等到沒有其他人讀取這個表的時候,才插入數據。例如如下的命令: load data low_priority infile ”/home/mark/data.sql“ into table Orders;2、如果指定local關鍵詞,則表明讀取的文件在本機,那么必須指定local參數。3、replace和ignore參數控制對現有表的唯一鍵記錄重復的處理。如果你指定replace,新行將代替有相同的唯一鍵值的現有行。 (1)如果你指定ignore,跳過有唯一鍵的現有行的重復行的輸入。 (2)如果你不指定任何一個選項,當找到重復鍵時,出現一個錯誤,并且文本文件的余下部分被忽略。 FIELDS TERMINATED BY ','表示字段之間用逗號分隔 ENCLOSED BY '''表示每個字段用雙引號括起來 ESCAPED BY '''表示將系統默認的轉移字符替換為單引號 LINES STARTING BY ''表示每行數據開頭的字符,可以為單個或多個,默認不是有任何字符 LINES TERMINATED BY 'rn'表示每行以回車換行符結尾,保證每一條記錄占一行 [IGNORE number LINES] 選項表示忽略文件開始處的行數,number表示忽略的行數。 基本上格式上的參數跟SELECT...INTO OUTFILE是一樣的 使用LOAD DATA命令將C:person0。txt文件中的數據導入到test庫中的test表 LOAD DATA INFILE 'C:person0.txt' INTO TABLE test.person 先刪除person表里的數據,然后執行LOAD DATA命令 使用mysqlimport命令導入文本文件 2、使用mysqlimport命令導入文本文件 mysqlimport是一個單獨的exe,他提供了許多與LOAD DATA INFILE語句相同的功能 大多數選項直接對應LOAD DATA INFILE子句 mysqlimport的語法如下 mysqlimport-u root-p dbname filename.txt [OPTIONS]--[OPTIONS] 選項 FIELDS TERMINATED BY 'value' ENCLOSED BY 'value' ESCAPED BY 'value' LINES TERMINATED BY 'value' IGNORE LINES [OPTIONS] 選項基本上與LOAD DATA INFILE 語句是一樣的,這里不做介紹了 mysqlimport不能指定導入的表名稱,表名稱由導入文件名稱確定,即文件名作為表名,導入數據之前該表必須存在 使用mysqlimport命令將C:目錄下person.txt文件內容導入到test庫 先刪除test庫的person表的數據 DELETE FROM `person`; person.txt文件內容 1 green 29 lawer2 suse 26 dancer3 evans 27 sports man4 mary 26 singer 命令如下 mysqlimport-u root-p test C:person.txt 導入成功 mysqlimport的常見選項: 顯示幫助消息并退出。 ·--columns=column_list,-c column_list 該選項采用用逗號分隔的列名作為其值。列名的順序指示如何匹配數據文件列和表列。 ·--compress,-C 壓縮在客戶端和服務器之間發送的所有信息(如果二者均支持壓縮)。 ·---debug[=debug_options],-# [debug_options] 寫調試日志。debug_options字符串通常是'd:t:o,file_name'?!?-delete,-D 導入文本文件前清空表。 ·--fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--lines-terminated-by=...這些選項與LOAD DATA INFILE相應子句的含義相同。參見13.2.5節,“LOAD DATA INFILE語法”。 ·--force,-f 忽視錯誤。例如,如果某個文本文件的表不存在,繼續處理其它文件。不使用--force,如果表不存在則mysqlimport退出。 ·--host=host_name,-h host_name 將數據導入給定主機上的MySQL服務器。默認主機是localhost。 ·--ignore,-i 參見--replace選項的描述?!?-ignore-lines=n 忽視數據文件的前n行。 ·--local,-L 從本地客戶端讀入輸入文件。 ·--lock-tables,-l 處理文本文件前鎖定所有表以便寫入。這樣可以確保所有表在服務器上保持同步。 ·--password[=password],-p[password] 當連接服務器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間不能有空格。如果在命令行中--password或-p選項后面沒有 密碼值,則提示輸入一個密碼?!?-port=port_num,-P port_num 用于連接的TCP/IP端口號。 ·--protocol={TCP | SOCKET | PIPE | MEMORY} 使用的連接協議。 ·--replace,-r --replace和--ignore選項控制復制唯一鍵值已有記錄的輸入記錄的處理。如果指定--replace,新行替換有相同的唯一鍵值的已有行。如果指定--ignore,復制已有的唯一鍵值的輸入行被跳過。如果不指定這兩個選項,當發現一個復制鍵值時會出現一個錯誤,并且忽視文本文件的剩余部分?!?-silent,-s 沉默模式。只有出現錯誤時才輸出。 ·--socket=path,-S path 當連接localhost時使用的套接字文件(為默認主機)。 ·--user=user_name,-u user_name 當連接服務器時MySQL使用的用戶名。 ·--verbose,-v 冗長模式。打印出程序操作的詳細信息。 ·--version,-V 顯示版本信息并退出。 提示: LOAD DATA INFILE語句中有一個mysqlimport工具中沒有特點: LOAD DATA INFILE 可以按指定的字段把文件導入到數據庫中。當我們要把數據的一部分內容導入的時候,這個特點就很重要。 比方說,我們要從Access數據庫升級到MySQL數據庫的時候,需要加入一些字段(列/字 段/field)到MySQL數據庫中,以適應一些額外的需要。 這個時候,我們的Access數據庫中的數據仍然是可用的,但是因為這些數據的字段(field)與MySQL中的不再匹配,因此而無法再使用mysqlimport工具。 盡管如此,我們仍然可以使用LOAD DATA INFILE,下面的例子顯示了如何向指定的字段(field)中導入數據: LOAD DATA INFILE ”/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID); 如您所見,我們可以指定需要的字段(fields)。這些指定的字段依然是以括號括起,由逗號分隔的,如果您遺漏了其中任何一個,MySQL將會提醒您^_^ 如何選擇備份工具? 直接復制數據文件是最為直接、快速的備份方法,但缺點是基本上不能實現增量備份。備份時必須確保沒有使用這些表。如果在復制一個表的物理數據文件的同時服務器正在修改他,則復制無效。 備份文件時,最好關閉服務器,然后重新啟動服務器,為了保證數據的一致性,需要在備份文件前執行以下SQL FLUSH TABLES WITH READ LOCK;也就是把內存中的數據刷新到磁盤中,同時鎖定數據表,以保證復制過程中不會有新的數據寫入。 這種方法備份出來的數據恢復很簡單,直接復制回原來的數據庫目錄下即可 mysqlhotcopy是一個PERL程序,他使用LOCK TABLES、FLUSH TABLES和CP或SCP來快速備份數據庫 他是備份數據庫或單個表的最快的途徑,但他只能運行在數據庫文件所在機器上,并且mysqlhotcopy只能用于備份myisam表 mysqlhotcopy適合于小型數據庫的備份,數據量不大,可以使用mysqlhotcopy程序每天進行一次完全備份 mysqldump將數據表導出為SQL腳本,在不同的MYSQL版本之間升級時相對比較合適,這也是最常用的備份方法。mysqldump比直接復制要慢些。 使用mysqldump備份整個數據庫成功,把表和數據庫刪除了,但使用備份文件卻不能恢復數據庫? 出現這種情況是因為備份的時候沒有指定--databases參數。默認情況下,如果只指定數據庫名稱,mysqldump 備份的是數據庫中的所有表,而不包括數據庫的創建語句,如下 mysqldump-u root-p booksdb >c:booksdb_2014-7-1.sql 該語句只備份了booksdb數據庫下的所有表,讀者打開該文件,可以看到文件中不包含創建booksdb數據庫 的CREATE DATABASE語句,因此如果把booksdb也刪除了,使用該sql文件不能還原以前的表,還原時會出現ERROR 1046(3D000):NO DATABASE SELECTED 的錯誤信息 而下面的語句,數據庫刪除之后,可以正常還原備份時的狀態 mysqldump-u root-p--databases booksdb>C:booksdb_db_2014-7-1.sql 該語句不僅備份了所有數據庫下的表結構,而且包括創建數據庫的語句 MYSQL中的備份和還原,還有數據庫的遷移,異構數據庫之間的遷移基本上都用導出文件文件的方法 如果是小數據量尚可以,如果數據量比較大,導出文本文件也會很大,不是太可取