第一篇:我的MYSQL學(xué)習(xí)心得備份和恢復(fù)
備份
邏輯備份方法
使用MYSQLDUMP命令備份
MYSQLDUMP是MYSQL提供的一個非常有用的數(shù)據(jù)庫備份工具。mysqldump命令執(zhí)行時將數(shù)據(jù)庫備份成一個文本文件,該文件中實際上包含了多個CREATE 和INSERT語句,使用這些語句可以重新創(chuàng)建表和插入數(shù)據(jù)
MYSQLDUMP的語法和選項
mysqldump-u user-p pwd-h host dbname[tbname,[tbname...]]>filename.sql
選項/Option 作用/Action Performed--add-drop-table
這個選項將會在每一個表的前面加上DROP TABLE IF EXISTS語句,這樣可以保證導(dǎo)回MySQL數(shù)據(jù)庫的時候不會出錯,因為每次導(dǎo)回的時候,都會首先檢查表是否存在,存在就刪除--add-locks這個選項會在INSERT語句中捆上一個LOCK TABLE和UNLOCK TABLE語句。這就防止在這些記錄被再次導(dǎo)入數(shù)據(jù)庫時其他用戶對表進行的操作-c or-complete_insert 這個選項使得mysqldump命令給每一個產(chǎn)生INSERT語句加上列(field)的名字。當(dāng)把數(shù)據(jù)導(dǎo)出導(dǎo)另外一個數(shù)據(jù)庫時這個選項很有用。--delayed-insert 在INSERT命令中加入DELAY選項-F or-flush-logs 使用這個選項,在執(zhí)行導(dǎo)出之前將會刷新MySQL服務(wù)器的log.-f or-force 使用這個選項,即使有錯誤發(fā)生,仍然繼續(xù)導(dǎo)出--full 這個選項把附加信息也加到CREATE TABLE的語句中-l or-lock-tables 使用這個選項,導(dǎo)出表的時候服務(wù)器將會給表加鎖。-t or-no-create-info 這個選項使的mysqldump命令不創(chuàng)建CREATE TABLE語句,這個選項在您只需要數(shù)據(jù)而不需要DDL(數(shù)據(jù)庫定義語句)時很方便。-d or-no-data 這個選項使的mysqldump命令不創(chuàng)建INSERT語句。
在您只需要DDL語句時,可以使用這個選項。--opt 此選項將打開所有會提高文件導(dǎo)出速度和創(chuàng)造一個可以更快導(dǎo)入的文件的選項。-q or-quick 這個選項使得MySQL不會把整個導(dǎo)出的內(nèi)容讀入內(nèi)存再執(zhí)行導(dǎo)出,而是在讀到的時候就寫入導(dǎo)文件中。-T path or-tab = path 這個選項將會創(chuàng)建兩個文件,一個文件包含DDL語句或者表創(chuàng)建語句,另一個文件包含數(shù)據(jù)。DDL文件被命名為table_name.sql,數(shù)據(jù)文件被命名為table_name.txt.路徑名是存放這兩個文件的目錄。目錄必須已經(jīng)存在,并且命令的使用者有對文件的特權(quán)。-w “WHERE Clause” or-where = “Where clause ” 如前面所講的,您可以使用這一選項來過篩選將要放到 導(dǎo)出文件的數(shù)據(jù)。
假定您需要為一個表單中要用到的帳號建立一個文件,經(jīng)理要看今年(2004年)所有的訂單(Orders),它們并不對DDL感興趣,并且需要文件有逗號分隔,因為這樣就很容易導(dǎo)入到Excel中。為了完成這個任務(wù),您可以使用下面的句子:
bin/mysqldump –p –where “Order_Date >='2000-01-01'” –tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders 這將會得到您想要的結(jié)果。schema:模式
The set of statements, expressed in data definition language, that completely describe the structure of a data base.一組以數(shù)據(jù)定義語言來表達的語句集,該語句集完整地描述了數(shù)據(jù)庫的結(jié)構(gòu)。SELECT INTO OUTFILE :
mysqldump提供了很多選項,包括調(diào)試和壓縮的,在這里只是列舉最有用的。運行幫助命令mysqldump--help可以獲得特定版本的完整選項列表
user表示用戶名稱;
host表示登錄用戶的主機名稱; pwd為登錄密碼;
dbname為需要備份的數(shù)據(jù)庫名稱;
tbname為dbname數(shù)據(jù)庫中需要備份的數(shù)據(jù)表,可以指定多個需要備份的表; 右箭頭“>”告訴mysqldump將備份數(shù)據(jù)庫表定義和數(shù)據(jù)寫入備份文件; filename為備份文件的名稱
1、使用mysqldump備份單個數(shù)據(jù)庫中的所有表 數(shù)據(jù)庫的記錄是這樣的
打開cmd,然后執(zhí)行下面的命令
可以看到C盤下面已經(jīng)生成了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工具的版本號; 然后是主機信息,以及備份的數(shù)據(jù)庫名稱,最后是mysql服務(wù)器的版本號5.5.20
備份文件接下來的部分是一些SET語句,這些語句將一些系統(tǒng)變量賦值給用戶定義變量,以確保被恢復(fù)的數(shù)據(jù)庫的系統(tǒng)變量和原來 備份時的變量相同 例如:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;該set語句將當(dāng)前系統(tǒng)變量character_set_client的值賦值給用戶變量@OLD_CHARACTER_SET_CLIENT 備份文件的最后幾行mysql使用set語句恢復(fù)服務(wù)器系統(tǒng)變量原來的值,例如:
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;該語句將用戶定義變量@OLD_CHARACTER_SET_CLIENT 中保存的值賦值給實際的系統(tǒng)變量OLD_CHARACTER_SET_CLIENT 備份文件中的“--”字符開頭的行為注釋語句;以“/*!”開頭、以“*/”結(jié)尾的語句為可執(zhí)行的mysql注釋,這些語句可以被mysql執(zhí)行
但在其他數(shù)據(jù)庫管理系統(tǒng)將被作為注釋忽略,這可以提高數(shù)據(jù)庫的可移植性
另外注意到,備份文件開始的一些語句以數(shù)字開頭,這些數(shù)字代表了mysql版本號,該數(shù)字告訴我們這些語句只有在指定的mysql版本 或者比該版本高的情況下才能執(zhí)行。
例如:40101,表明這些語句只有在mysql版本為4.01.01或者更高版本的條件下才可以執(zhí)行
2、使用mysqldump備份數(shù)據(jù)庫中的某個表 備份school數(shù)據(jù)庫里面的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
備份文件中的內(nèi)容跟前面的介紹是一樣的,唯一不同的是只包含了book表的CREATE語句和INSERT語句
3、使用mysqldump備份多個數(shù)據(jù)庫
如果要使用mysqldump備份多個數(shù)據(jù)庫,需要使用--databases參數(shù)。
使用--databases參數(shù)之后,必須指定至少一個數(shù)據(jù)庫的名稱,多個數(shù)據(jù)庫名稱之間用空格隔開
使用mysqldump備份school庫和test庫
備份文件里的內(nèi)容,基本上跟第一個例子一樣,但是指明了里面的內(nèi)容那一部分屬于test庫,哪一部分屬于school庫
View Code
4、使用--all-databases參數(shù)備份系統(tǒng)中所有的數(shù)據(jù)庫 使用--all-databases不需要指定數(shù)據(jù)庫名稱
執(zhí)行完畢之后會產(chǎn)生all_2014-7-10.sql的備份文件,里面會包含了所有數(shù)據(jù)庫的備份信息
提示:如果在服務(wù)器上進行備份,并且表均為myisam,應(yīng)考慮使用mysqlhotcopy 因為可以更快地進行備份和恢復(fù)
使用mysqlhotcopy,如果是Windows操作系統(tǒng),需要先安裝perl腳本組件才能使用,因為mysqlhotcopy是使用perl來編寫的提示
(1)如果你未使用--quick或者--opt選項,那么mysqldump將在轉(zhuǎn)儲結(jié)果之前把全部內(nèi)容載入到內(nèi)存中。這在你轉(zhuǎn)儲大數(shù)據(jù)量的數(shù)據(jù)庫時將會有些問題。該選項默認(rèn)是打開的,但可以使用--skip-opt來關(guān)閉它。
(2)使用--skip-comments可以去掉導(dǎo)出文件中的注釋語句
(3)使用--compact選項可以只輸出最重要的語句,而不輸出注釋及刪除表語句等等(4)使用--database或-B選項,可以轉(zhuǎn)儲多個數(shù)據(jù)庫,在這個選項名后的參數(shù)都被認(rèn)定為數(shù)據(jù)庫名
SQLSERVER邏輯備份
我發(fā)現(xiàn)SQLSERVER的備份概念并沒有ORACLE和MYSQL那么多 我們通常都會使用下面的兩個SQL語句來備份SQLSERVER數(shù)據(jù)庫,例如備份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就是將數(shù)據(jù)文件和必要的日志信息放入一個壓縮包里面,類似于MYSQL的物理備份,直接復(fù)制文件,只是MYSQL并沒有進行打包壓縮
SQLSERVER的邏輯備份
邏輯備份就是生成表定義腳本和數(shù)據(jù)插入腳本,SQLSERVER2008開始支持生成數(shù)據(jù)腳本,在SQLSERVER2008之前只支持生成表定義腳本 我所用的數(shù)據(jù)庫是SQLSERVER2012 SP1 選中需要生成腳本的數(shù)據(jù)庫
比如我要導(dǎo)出test表的數(shù)據(jù)和表定義
要選擇架構(gòu)和數(shù)據(jù),并且要選擇索引,這樣就會生成表的數(shù)據(jù)、定義、索引
生成的腳本如下
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語句
實際上各種數(shù)據(jù)庫的備份恢復(fù)方法都是大同小異的 ORACLE冷備份與恢復(fù)
邏輯備份和物理備份
1、導(dǎo)出create table、create index、insert into 表等語句(邏輯備份)mysql:mysqldump、load data infile、select into outfile sqlserver:生成腳本、導(dǎo)入導(dǎo)出向?qū)?oracle:(exp/imp)
2、直接復(fù)制文件(物理備份)
sqlserver:backup database語句、backup log語句、停SQLSERVER服務(wù)直接拷貝數(shù)據(jù)文件
mysql:mysqlhotcopy、innobackupex oracle:rman、直接將關(guān)鍵性文件拷貝到另外的位置、(exp/imp)、(expdp/impdp)相似點:上面的各種數(shù)據(jù)庫的各種備份還原方法,每一種基本上都會有一個單獨的工具來做 例如sqlserver導(dǎo)入導(dǎo)出向?qū)Ь褪且粋€單獨的exe來做 oracle的rman也是一個單獨的工具
冷備份和熱備份:無論oracle、sqlserver、mysql都有冷備份和熱備份的概念 冷備份其實可以簡單理解為:停止服務(wù)進行備份
熱備份其實可以簡單理解為:不停止服務(wù)進行備份(在線)上面的停止服務(wù),正確的來講應(yīng)該是停止數(shù)據(jù)庫的寫入
為什么mysql的myisam引擎只支持冷備份呢? 大家可以先想一下innodb引擎,innodb引擎是事務(wù)性存儲引擎,每一條語句都會寫日志,并且每一條語句在日志里面都有時間點
那么在備份的時候,mysql可以根據(jù)這個日志來進行redo和undo,將備份的時候沒有提交的事務(wù)進行回滾,已經(jīng)提交了的進行重做
但是myisam不行,myisam是沒有日志的,為了保證一致性,只能停機或者鎖表進行備份
在書《MYSQL性能調(diào)優(yōu)和架構(gòu)設(shè)計》里面說到了事務(wù)的作用
大家可以想一想,為什么sqlserver支持從某一個lsn或者時刻進行恢復(fù)數(shù)據(jù)庫,他也是從日志里面讀取日志的lsn號來進行恢復(fù)到某一個lsn時刻的數(shù)據(jù)或者某一個時刻的數(shù)據(jù) 假如沒有事務(wù)日志,那么sqlserver是做不到時點還原的熱備份、冷備份
為什么SQLSERVER需要停止SQLSERVER服務(wù)才可以拷貝物理數(shù)據(jù)文件,為的都是保證數(shù)據(jù)一致性
物理備份方法
1、直接復(fù)制整個數(shù)據(jù)庫目錄
因為MYSQL表保存為文件方式,所以可以直接復(fù)制MYSQL數(shù)據(jù)庫的存儲目錄以及文件進行備份。
MYSQL的數(shù)據(jù)庫目錄位置不一定相同,在Windows平臺下,MYSQL5.6存放數(shù)據(jù)庫的目錄通常默認(rèn)為
C:Documents and SettingsAll UserApplication DataMySQLMYSQL Server 5.6data 或者其他用戶自定義的目錄;
在Linux平臺下,數(shù)據(jù)庫目錄位置通常為/var/lib/mysql/,不同Linux版本下目錄會有不同
這是一種簡單、快速、有效的備份方式。要想保持備份一致,備份前需要對相關(guān)表執(zhí)行LOCK TABLES操作,然后對表執(zhí)行 FLUSH TABLES。這樣當(dāng)復(fù)制數(shù)據(jù)庫目錄中的文件時,允許其他客戶繼續(xù)查詢表。需要FLUSH TABLES語句來確保開始 備份前將所有激活的索引頁寫入磁盤。當(dāng)然,也可以停止MYSQL服務(wù)再進行備份操作
這種方法雖然簡單,但并不是最好的方法。因為這種方法對INNODB存儲引擎的表不適用。使用這種方法備份的數(shù)據(jù)最好還原
到相同版本的服務(wù)器中,不同的版本可能不兼容。
注意:在mysql版本中,第一個數(shù)字表示主版本號,主版本號相同的MYSQL數(shù)據(jù)庫文件格式相同
2、使用mysqlhotcopy工具快速備份
mysqlhotcopy是一個perl腳本,最初由Tim Bunce編寫并提供。他使用LOCK TABLES、FLUSH TABLES和cp或scp 來快速備份數(shù)據(jù)庫。他是備份數(shù)據(jù)庫或單個表的最快途徑,但他只能運行在數(shù)據(jù)庫目錄所在機器上,并且只能備份myisam類型的表。語法
mysqlhotcopy db_name_1,...db_name_n /path/to/new_directory db_name_1...n代表要備份的數(shù)據(jù)庫的名稱; path/to/new_directory指定備份文件目錄
示例
在Linux下面使用mysqlhotcopy備份test庫到/usr/backup mysqlhotcopy-u root-p test /usr/backup
要想執(zhí)行mysqlhotcopy,必須可以訪問備份的表文件,具有那些表的SELECT權(quán)限、RELOAD權(quán)限(以便能夠執(zhí)行FLUSH TABLES)和LOCK TABLES權(quán)限
提示:mysqlhotcopy只是將表所在目錄復(fù)制到另一個位置,只能用于備份myisam和archive表。備份innodb表會出現(xiàn)錯誤信息
由于他復(fù)制本地格式的文件,故也不能移植到其他硬件或操作系統(tǒng)下
邏輯還原
1、使用mysql命令進行還原
對于已經(jīng)備份的包含CREATE、INSERT語句的文本文件,可以使用myslq命令導(dǎo)入數(shù)據(jù)庫中
還原
備份的sql文件中包含CREATE、INSERT語句(有時也會有DROP語句)。mysql命令可以直接執(zhí)行文件中的這些語句 其語法如下:
mysql-u user-p [dbname] 用mysql命令將school_2014-7-10.sql文件中的備份導(dǎo)入到數(shù)據(jù)庫中 mysql-u root-h 127.0.0.1-p school 如果已經(jīng)登錄mysql,那么可以使用source命令導(dǎo)入備份文件 使用source命令導(dǎo)入備份文件school_2014-7-10.sql 執(zhí)行source命令前必須使用use 語句選擇好數(shù)據(jù)庫,不然會出現(xiàn)ERROR 1046(3D000):NO DATABASE SELECTED 的錯誤 還有一點要注意的是只能在cmd界面下執(zhí)行,不能在mysql工具里面執(zhí)行source命令,否則會報錯 因為cmd是直接調(diào)用mysql.exe來執(zhí)行命令的 而這些mysql 編輯工具只是利用mysql connector連接mysql,來管理mysql并不是直接調(diào)用mysql.exe,所以執(zhí)行source會報錯 物理還原 2、直接復(fù)制到數(shù)據(jù)庫目錄 如果數(shù)據(jù)庫通過復(fù)制數(shù)據(jù)庫文件備份,可以直接復(fù)制備份文件到MYSQL數(shù)據(jù)目錄下實現(xiàn)還原。通過這種方式還原時,必須保證備份數(shù)據(jù)的數(shù)據(jù)庫和待還原的數(shù)據(jù)庫服務(wù)器的主版本號相同。而且這種方式只對MYISAM引擎有效,對于innodb引擎的表不可用 執(zhí)行還原以前關(guān)閉mysql服務(wù),將備份的文件或目錄覆蓋mysql的data目錄,啟動mysql服務(wù)。 對于Linux操作系統(tǒng)來說,復(fù)制完文件需要將文件的用戶和組更改為mysql運行的用戶和組,通常用戶是mysql,組也是mysql 3、mysqlhotcopy快速恢復(fù) mysqlhotcopy備份后的文件也可以用來恢復(fù)數(shù)據(jù)庫,在mysql服務(wù)器停止運行時,將備份的數(shù)據(jù)庫文件復(fù)制到mysql存放數(shù)據(jù)的位置 (mysql的data文件夾),重新啟動mysql服務(wù)即可。 如果根用戶執(zhí)行該操作,必須指定數(shù)據(jù)庫文件的所有者,輸入語句如下: chown-R mysql.mysql /var/lib/mysql/dbname 從mysqlhotcopy復(fù)制的備份恢復(fù)數(shù)據(jù)庫 cp-R /usr/backup/test usr/local/mysql/data 執(zhí)行完該語句,重啟服務(wù)器,mysql將恢復(fù)到備份狀態(tài) 注意:如果需要恢復(fù)的數(shù)據(jù)庫已經(jīng)存在,則在使用DROP語句刪除已經(jīng)存在的數(shù)據(jù)庫之后,恢復(fù)才能成功。另外mysql不同版本之間必須兼容,恢復(fù)之后的數(shù)據(jù)才可以使用! 數(shù)據(jù)庫遷移 數(shù)據(jù)庫遷移就是把數(shù)據(jù)從一個系統(tǒng)移動到另一個系統(tǒng)上。遷移的一般原因: 1、需要安裝新的數(shù)據(jù)庫服務(wù)器 2、mysql版本更新 3、數(shù)據(jù)庫管理系統(tǒng)變更(從SQLSERVER遷移到mysql) 相同版本的MYSQL數(shù)據(jù)庫之間遷移 相同版本mysql數(shù)據(jù)庫間的遷移就是主版本號相同的mysql數(shù)據(jù)庫直接進行數(shù)據(jù)庫移動。前面講解備份和還原的時候,知道最簡單的方法就是復(fù)制數(shù)據(jù)庫文件目錄,但是這種方法只適合于myisam表 對于innodb表,不能直接復(fù)制文件來備份數(shù)據(jù)庫 最常用的方法是使用mysqldump導(dǎo)出數(shù)據(jù),然后在目標(biāo)數(shù)據(jù)庫服務(wù)器使用mysql命令導(dǎo)入 將004km.cn/2001/XMLSchema-instance“> 導(dǎo)入 1、使用LOAD DATA INFILE 方式導(dǎo)入文本文件 mysql允許將數(shù)據(jù)導(dǎo)出到外部文件,也可以從外部文件導(dǎo)入數(shù)據(jù)。 MYSQL提供了一些導(dǎo)入數(shù)據(jù)的工具,這些工具有: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進程(服務(wù))必須已經(jīng)在運行。 當(dāng)讀取的文本文件不在本機,而是位于服務(wù)器上的文本文件時,使用load data infile語句,在服務(wù)器主機上你必須有file的權(quán)限。、如果你指定關(guān)鍵詞low_priority,那么MySQL將會等到?jīng)]有其他人讀取這個表的時候,才插入數(shù)據(jù)。例如如下的命令: load data low_priority infile ”/home/mark/data.sql“ into table Orders;2、如果指定local關(guān)鍵詞,則表明讀取的文件在本機,那么必須指定local參數(shù)。3、replace和ignore參數(shù)控制對現(xiàn)有表的唯一鍵記錄重復(fù)的處理。如果你指定replace,新行將代替有相同的唯一鍵值的現(xiàn)有行。 (1)如果你指定ignore,跳過有唯一鍵的現(xiàn)有行的重復(fù)行的輸入。 (2)如果你不指定任何一個選項,當(dāng)找到重復(fù)鍵時,出現(xiàn)一個錯誤,并且文本文件的余下部分被忽略。 FIELDS TERMINATED BY ','表示字段之間用逗號分隔 ENCLOSED BY '''表示每個字段用雙引號括起來 ESCAPED BY '''表示將系統(tǒng)默認(rèn)的轉(zhuǎn)移字符替換為單引號 LINES STARTING BY ''表示每行數(shù)據(jù)開頭的字符,可以為單個或多個,默認(rèn)不是有任何字符 LINES TERMINATED BY 'rn'表示每行以回車換行符結(jié)尾,保證每一條記錄占一行 [IGNORE number LINES] 選項表示忽略文件開始處的行數(shù),number表示忽略的行數(shù)。 基本上格式上的參數(shù)跟SELECT...INTO OUTFILE是一樣的 使用LOAD DATA命令將C:person0。txt文件中的數(shù)據(jù)導(dǎo)入到test庫中的test表 LOAD DATA INFILE 'C:person0.txt' INTO TABLE test.person 先刪除person表里的數(shù)據(jù),然后執(zhí)行LOAD DATA命令 使用mysqlimport命令導(dǎo)入文本文件 2、使用mysqlimport命令導(dǎo)入文本文件 mysqlimport是一個單獨的exe,他提供了許多與LOAD DATA INFILE語句相同的功能 大多數(shù)選項直接對應(yīng)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不能指定導(dǎo)入的表名稱,表名稱由導(dǎo)入文件名稱確定,即文件名作為表名,導(dǎo)入數(shù)據(jù)之前該表必須存在 使用mysqlimport命令將C:目錄下person.txt文件內(nèi)容導(dǎo)入到test庫 先刪除test庫的person表的數(shù)據(jù) DELETE FROM `person`; person.txt文件內(nèi)容 1 green 29 lawer2 suse 26 dancer3 evans 27 sports man4 mary 26 singer 命令如下 mysqlimport-u root-p test C:person.txt 導(dǎo)入成功 mysqlimport的常見選項: 顯示幫助消息并退出。 ·--columns=column_list,-c column_list 該選項采用用逗號分隔的列名作為其值。列名的順序指示如何匹配數(shù)據(jù)文件列和表列。 ·--compress,-C 壓縮在客戶端和服務(wù)器之間發(fā)送的所有信息(如果二者均支持壓縮)。 ·---debug[=debug_options],-# [debug_options] 寫調(diào)試日志。debug_options字符串通常是'd:t:o,file_name'。·--delete,-D 導(dǎo)入文本文件前清空表。 ·--fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--lines-terminated-by=...這些選項與LOAD DATA INFILE相應(yīng)子句的含義相同。參見13.2.5節(jié),“LOAD DATA INFILE語法”。 ·--force,-f 忽視錯誤。例如,如果某個文本文件的表不存在,繼續(xù)處理其它文件。不使用--force,如果表不存在則mysqlimport退出。 ·--host=host_name,-h host_name 將數(shù)據(jù)導(dǎo)入給定主機上的MySQL服務(wù)器。默認(rèn)主機是localhost。 ·--ignore,-i 參見--replace選項的描述?!?-ignore-lines=n 忽視數(shù)據(jù)文件的前n行。 ·--local,-L 從本地客戶端讀入輸入文件。 ·--lock-tables,-l 處理文本文件前鎖定所有表以便寫入。這樣可以確保所有表在服務(wù)器上保持同步。 ·--password[=password],-p[password] 當(dāng)連接服務(wù)器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間不能有空格。如果在命令行中--password或-p選項后面沒有 密碼值,則提示輸入一個密碼?!?-port=port_num,-P port_num 用于連接的TCP/IP端口號。 ·--protocol={TCP | SOCKET | PIPE | MEMORY} 使用的連接協(xié)議。 ·--replace,-r --replace和--ignore選項控制復(fù)制唯一鍵值已有記錄的輸入記錄的處理。如果指定--replace,新行替換有相同的唯一鍵值的已有行。如果指定--ignore,復(fù)制已有的唯一鍵值的輸入行被跳過。如果不指定這兩個選項,當(dāng)發(fā)現(xiàn)一個復(fù)制鍵值時會出現(xiàn)一個錯誤,并且忽視文本文件的剩余部分?!?-silent,-s 沉默模式。只有出現(xiàn)錯誤時才輸出。 ·--socket=path,-S path 當(dāng)連接localhost時使用的套接字文件(為默認(rèn)主機)。 ·--user=user_name,-u user_name 當(dāng)連接服務(wù)器時MySQL使用的用戶名。 ·--verbose,-v 冗長模式。打印出程序操作的詳細信息。 ·--version,-V 顯示版本信息并退出。 提示: LOAD DATA INFILE語句中有一個mysqlimport工具中沒有特點: LOAD DATA INFILE 可以按指定的字段把文件導(dǎo)入到數(shù)據(jù)庫中。當(dāng)我們要把數(shù)據(jù)的一部分內(nèi)容導(dǎo)入的時候,這個特點就很重要。 比方說,我們要從Access數(shù)據(jù)庫升級到MySQL數(shù)據(jù)庫的時候,需要加入一些字段(列/字 段/field)到MySQL數(shù)據(jù)庫中,以適應(yīng)一些額外的需要。 這個時候,我們的Access數(shù)據(jù)庫中的數(shù)據(jù)仍然是可用的,但是因為這些數(shù)據(jù)的字段(field)與MySQL中的不再匹配,因此而無法再使用mysqlimport工具。 盡管如此,我們?nèi)匀豢梢允褂肔OAD DATA INFILE,下面的例子顯示了如何向指定的字段(field)中導(dǎo)入數(shù)據(jù): LOAD DATA INFILE ”/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID); 如您所見,我們可以指定需要的字段(fields)。這些指定的字段依然是以括號括起,由逗號分隔的,如果您遺漏了其中任何一個,MySQL將會提醒您^_^ 如何選擇備份工具? 直接復(fù)制數(shù)據(jù)文件是最為直接、快速的備份方法,但缺點是基本上不能實現(xiàn)增量備份。備份時必須確保沒有使用這些表。如果在復(fù)制一個表的物理數(shù)據(jù)文件的同時服務(wù)器正在修改他,則復(fù)制無效。 備份文件時,最好關(guān)閉服務(wù)器,然后重新啟動服務(wù)器,為了保證數(shù)據(jù)的一致性,需要在備份文件前執(zhí)行以下SQL FLUSH TABLES WITH READ LOCK;也就是把內(nèi)存中的數(shù)據(jù)刷新到磁盤中,同時鎖定數(shù)據(jù)表,以保證復(fù)制過程中不會有新的數(shù)據(jù)寫入。 這種方法備份出來的數(shù)據(jù)恢復(fù)很簡單,直接復(fù)制回原來的數(shù)據(jù)庫目錄下即可 mysqlhotcopy是一個PERL程序,他使用LOCK TABLES、FLUSH TABLES和CP或SCP來快速備份數(shù)據(jù)庫 他是備份數(shù)據(jù)庫或單個表的最快的途徑,但他只能運行在數(shù)據(jù)庫文件所在機器上,并且mysqlhotcopy只能用于備份myisam表 mysqlhotcopy適合于小型數(shù)據(jù)庫的備份,數(shù)據(jù)量不大,可以使用mysqlhotcopy程序每天進行一次完全備份 mysqldump將數(shù)據(jù)表導(dǎo)出為SQL腳本,在不同的MYSQL版本之間升級時相對比較合適,這也是最常用的備份方法。mysqldump比直接復(fù)制要慢些。 使用mysqldump備份整個數(shù)據(jù)庫成功,把表和數(shù)據(jù)庫刪除了,但使用備份文件卻不能恢復(fù)數(shù)據(jù)庫? 出現(xiàn)這種情況是因為備份的時候沒有指定--databases參數(shù)。默認(rèn)情況下,如果只指定數(shù)據(jù)庫名稱,mysqldump 備份的是數(shù)據(jù)庫中的所有表,而不包括數(shù)據(jù)庫的創(chuàng)建語句,如下 mysqldump-u root-p booksdb >c:booksdb_2014-7-1.sql 該語句只備份了booksdb數(shù)據(jù)庫下的所有表,讀者打開該文件,可以看到文件中不包含創(chuàng)建booksdb數(shù)據(jù)庫 的CREATE DATABASE語句,因此如果把booksdb也刪除了,使用該sql文件不能還原以前的表,還原時會出現(xiàn)ERROR 1046(3D000):NO DATABASE SELECTED 的錯誤信息 而下面的語句,數(shù)據(jù)庫刪除之后,可以正常還原備份時的狀態(tài) mysqldump-u root-p--databases booksdb>C:booksdb_db_2014-7-1.sql 該語句不僅備份了所有數(shù)據(jù)庫下的表結(jié)構(gòu),而且包括創(chuàng)建數(shù)據(jù)庫的語句 MYSQL中的備份和還原,還有數(shù)據(jù)庫的遷移,異構(gòu)數(shù)據(jù)庫之間的遷移基本上都用導(dǎo)出文件文件的方法 如果是小數(shù)據(jù)量尚可以,如果數(shù)據(jù)量比較大,導(dǎo)出文本文件也會很大,不是太可取 我的MYSQL學(xué)習(xí)心得 (十一)視圖 我的MYSQL學(xué)習(xí)心得 (一)簡單語法 我的MYSQL學(xué)習(xí)心得 (二)數(shù)據(jù)類型寬度 我的MYSQL學(xué)習(xí)心得 (三)查看字段長度 我的MYSQL學(xué)習(xí)心得 (四)數(shù)據(jù)類型 我的MYSQL學(xué)習(xí)心得 (五)運算符 我的MYSQL學(xué)習(xí)心得 (六)函數(shù) 我的MYSQL學(xué)習(xí)心得 (七)查詢 我的MYSQL學(xué)習(xí)心得 (八)插入 更新 刪除 我的MYSQL學(xué)習(xí)心得 (九)索引 我的MYSQL學(xué)習(xí)心得 (十)自定義存儲過程和函數(shù) 我的MYSQL學(xué)習(xí)心得 (十二)觸發(fā)器 我的MYSQL學(xué)習(xí)心得 (十三)權(quán)限管理 我的MYSQL學(xué)習(xí)心得 (十四)備份和恢復(fù) 我的MYSQL學(xué)習(xí)心得 (十五)日志 我的MYSQL學(xué)習(xí)心得(十六)優(yōu)化 我的MYSQL學(xué)習(xí)心得(十七)復(fù)制 這一篇《我的MYSQL學(xué)習(xí)心得 (十一)》將會講解MYSQL的視圖 使用視圖的理由是什么? 1、安全性:一般是這樣做的:創(chuàng)建一個視圖,定義好該視圖所操作的數(shù)據(jù)。 之后將用戶權(quán)限與視圖綁定,這樣的方式是使用到了一個特性:grant語句可以針對視圖進行授予權(quán)限。 2、查詢性能提高 3、有靈活性的功能需求后,需要改動表的結(jié)構(gòu)而導(dǎo)致工作量比較大,那么可以使用虛擬表的形式達到少修改的效果。這是在實際開發(fā)中比較有用的 4、復(fù)雜的查詢需求,可以進行問題分解,然后將創(chuàng)建多個視圖獲取數(shù)據(jù)。將視圖聯(lián)合起來就能得到需要的結(jié)果了。 創(chuàng)建視圖 創(chuàng)建視圖的語法 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]參數(shù)表示視圖在更新時保證在視圖的權(quán)限范圍之內(nèi) 可選的ALGORITHM子句是對標(biāo)準(zhǔn)SQL的MySQL擴展。 ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。 如果沒有ALGORITHM子句,默認(rèn)算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。 對于MERGE,會將引用視圖的語句的文本與視圖定義合并起來,使得視圖定義的某一部分取代語句的對應(yīng)部分。 對于TEMPTABLE,視圖的結(jié)果將被置于臨時表中,然后使用它執(zhí)行語句。 對于UNDEFINED,MySQL自己選擇所要使用的算法。如果可能,它傾向于MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。 LOCAL和CASCADED為可選參數(shù),決定了檢查測試的范圍,默認(rèn)值為CASCADED。腳本 視圖的數(shù)據(jù)來自于兩個表 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') --創(chuàng)建視圖 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權(quán)限 查看視圖的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW DESCRIBE查看視圖基本信息 DESCRIBE 視圖名 DESCRIBE stu_class 結(jié)果顯示了視圖的字段定義、字段的數(shù)據(jù)類型、是否為空、是否為主/外鍵、默認(rèn)值和額外信息 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說明這是一個虛表,如果是基表那么會基表的信息,這是基表和視圖的區(qū)別 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 執(zhí)行結(jié)果顯示視圖的名稱、創(chuàng)建視圖的語句等信息 在VIEWS表中查看視圖的詳細信息 在MYSQL中,INFORMATION_SCHEMA VIEWS表存儲了關(guān)于數(shù)據(jù)庫中的視圖的信息 通過對VIEWS表的查詢可以查看數(shù)據(jù)庫中所有視圖的詳細信息 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 當(dāng)前實例下只有一個視圖stu_class 修改視圖 修改視圖是指修改數(shù)據(jù)庫中存在的視圖,當(dāng)基本表的某些字段發(fā)生變化時,可以通過修改視圖來保持與基本表的一致性。 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類似。當(dāng)視圖不存在時創(chuàng)建,存在時進行修改 修改視圖 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] 這里關(guān)鍵字跟前面的一樣,這里不做介紹 使用ALTER語句修改視圖 stu_class ALTER VIEW stu_class AS SELECT stuno FROM student;使用DESC查看 DESC stu_class 更新視圖 更新視圖是指通過視圖來插入、更新、刪除表數(shù)據(jù),因為視圖是虛表,其中沒有數(shù)據(jù)。通過視圖更新的時候都是轉(zhuǎn)到基表進行更新,如果對視圖增加或者刪除記錄,實際上是對基表增加或刪除記錄 我們先修改一下視圖定義 ALTER VIEW stu_class AS SELECT stuno,stuname FROM student;查詢視圖數(shù)據(jù) UPDATE UPDATE stu_class SET stuname='xiaofang' WHERE stuno=2 查詢視圖數(shù)據(jù) 更新成功 INSERT INSERT INTO stu_class VALUES(6,'haojie') 插入成功 DELETE DELETE FROM stu_class WHERE stuno=1 刪除成功 當(dāng)視圖中包含如下內(nèi)容的時候,視圖的更新操作將不能被執(zhí)行(1)視圖中包含基本中被定義為非空的列 (2)定義視圖的SELECT語句后的字段列表中使用了數(shù)學(xué)表達式(3)定義視圖的SELECT語句后的字段列表中使用聚合函數(shù) (4)定義視圖的SELECT語句中使用了DISTINCT、UNION、TOP、GROUP BY、HAVING子句 我的MYSQL學(xué)習(xí)心得 一、使用視圖的理由是什么? 1.安全性。一般是這樣做的:創(chuàng)建一個視圖,定義好該視圖所操作的數(shù)據(jù)。之后將用戶權(quán)限與視圖綁定。這樣的方式是使用到了一個特性:grant語句可以針對視圖進行授予權(quán)限。2.查詢性能提高。 3.有靈活性的功能需求后,需要改動表的結(jié)構(gòu)而導(dǎo)致工作量比較大。那么可以使用虛擬表的形式達到少修改的效果。這是在實際開發(fā)中比較有用的 例子:假如因為某種需要,a表與b表需要進行合并起來組成一個新的表c。最后a表與b表都不會存在了。而由于原來程序中編 寫sql分別是基于a表與b表查詢的,這就意味著需要重新編寫大量的sql(改成向c表去操作數(shù)據(jù))。而通過視圖就可以做到不修改。定義兩個視圖名字還是原來的表名a和b。a、b視圖完成從c表中取出內(nèi)容。說明:使用這樣的解決方式,基于對視圖的細節(jié)了解越詳細越好。因為使用視圖還是與使用表的語法上沒區(qū)別。比如視圖名a,那么查詢還是“select * from a”。 4.復(fù)雜的查詢需求??梢赃M行問題分解,然后將創(chuàng)建多個視圖獲取數(shù)據(jù)。將視圖聯(lián)合起來就能得到需要的結(jié)果了。 視圖的工作機制:當(dāng)調(diào)用視圖的時候,才會執(zhí)行視圖中的sql,進行取數(shù)據(jù)操作。視圖的內(nèi)容沒有存儲,而是在視圖被引用的時候才派生出數(shù)據(jù)。這樣不會占用空間,由于是即時引用,視圖的內(nèi)容總是與真實表的內(nèi)容是一致的。視圖這樣設(shè)計有什么好處?節(jié)省空間,內(nèi)容是總是一致的話,那么我們不需要維護視圖的內(nèi)容,維護好真實表的內(nèi)容,就可以保證視圖的完整性了。 二、通過更新視圖實現(xiàn)更新真實表 看到很多例子,更新視圖可以更新真實表。原因,我是這樣理解的:視圖并沒有保存內(nèi)容。只是引用數(shù)據(jù)。那么,更新視圖,其實就是以引用的方式操作了真實表 with check option:對視圖進行更新操作的時,需要檢查更新后的值是否還是滿足視圖公式定義的條件。通俗點,就是所更新的結(jié)果是否還會在視圖中存在。如果更新后的值不在視圖范圍內(nèi),就不允許更新如果創(chuàng)建視圖的時候,沒有加上with check option,更新視圖中的某項數(shù)據(jù)的話,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 針對每個表創(chuàng)建一個視圖,將數(shù)據(jù)保存進去: CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION)AS SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result 報錯:#1050-Table 'teams' already exists 說明,因為視圖也是一種表,是虛擬表。不能與已有的表(視圖)出現(xiàn)重名 接下來,刪掉表teams,再執(zhí)行創(chuàng)建視圖的代碼。 將視圖看成與表一樣的東西,更加容易理解使用規(guī)則。下面這樣對比也許使自己更好理解: 1.在使用視圖的時候,就是與使用表的語法一樣的。2.創(chuàng)建視圖的時候,該視圖的名字如果與已經(jīng)存在表重名的話,那么會報錯,不允許創(chuàng)建。視圖就是一種特殊的表 3.創(chuàng)建視圖的時候,可以這樣使用CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION),可以定義視圖表的結(jié)構(gòu)。 4.在phpmyadmin中。左邊的表列表中將視圖與表列在了一起。只有通過右側(cè)的狀態(tài)“View:teams”可以知道該表是視圖表。 視圖在mysql中的內(nèi)部管理機制: 視圖的記錄都保存在information_schema數(shù)據(jù)庫中的一個叫views的表中。具體某個視圖的定義代碼以及屬于哪個數(shù)據(jù)庫等信息可以從里面看到理解視圖的兩種工作機制: 語句:select * from teams 針對上面語句,總結(jié)幾個知識點 1.確認(rèn)是視圖的過程:teams也可以是表名。由于表與視圖的物理機制不同。視圖本身是不存儲內(nèi)容的。所以,在使用sql的 時候,mysql是怎么知道teams是一個視圖還是表。是因為有一個查看目錄的例程在做這件事。 2.mysql對處理視圖的兩種方法:替代方式和具體化方式。替換方式理解,視圖名直接使用視圖的公式替換掉了。針對上面視圖teams,mysql會使用該視圖的公式進行替換,視圖公式合并到了select中。結(jié)果就是變成了如下sql語句: select * from(SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result)。也就是最后提交給mysql處理該sql語句。 具體化方式理解,mysql先得到了視圖執(zhí)行的結(jié)果,該結(jié)果形成一個中間結(jié)果暫時存在內(nèi)存中。之后,外面的select語句就調(diào)用了這些中間結(jié)果(臨時表)。 看起來都是要得到結(jié)果,形式上有區(qū)別,好像沒體會到本質(zhì)上的區(qū)別。兩種方式又有什么樣的不同呢? 替換方式,將視圖公式替換后,當(dāng)成一個整體sql進行處理了。具體化方式,先處理視圖結(jié)果,后處理外面的查詢需求。替換方式可以總結(jié)為,先準(zhǔn)備,后執(zhí)行。具體化方式總結(jié)理解為,分開處理。 哪種方式好?不知道。mysql會自己確定使用哪種方式進行處理的。自己在定義視圖的時候也可以指定使用何種方式。像這樣使用: CREATE ALGORITHM=merge VIEW teams as SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result ALGORITHM有三個參數(shù)分別是:merge、TEMPTABLE、UNDEFINED 看mysql手冊中提到,替換與具體化的方式的各自適用之處,可以這樣理解: 因為臨時表中的數(shù)據(jù)不可更新。所以,如果使用參數(shù)是TEMPTABLE,無法進行更新。 當(dāng)你的參數(shù)定義是UNDEFINED(沒有定義ALGORITHM參數(shù))。mysql更傾向于選擇合并方式。是因為它更加有效。 MySQL學(xué)習(xí)心得 第一章 一、數(shù)據(jù)庫管理系統(tǒng)(DBMS)是操作和管理數(shù)據(jù)庫的大型軟件,它按一定的數(shù)據(jù)模型組織數(shù)據(jù)。 例如:Oracle、SQL Server、MySQL、Access。 二、數(shù)據(jù)庫應(yīng)用系統(tǒng)在數(shù)據(jù)庫管理系統(tǒng)(DBMS)支持下建立的計算機應(yīng)用系統(tǒng),簡寫:DBAS。 例如:.net Java。 三、字符集從大到小排序:utf8--gbk--gb2312。 四、mysql的特點: 適用于中小型網(wǎng)站中,體積小、速度快、總體擁有成本低,尤其是有開放源碼這一特點。 五、目前Internet上滸的網(wǎng)站構(gòu)架方式是LAMP(Linux+apache+mysql+php)即使用Linux作為操作系統(tǒng),Apache作為Web服務(wù)器,MySQL作為數(shù)據(jù)庫,PHP作為服務(wù)器端腳本解釋器,由于4個軟件都是遵循GPL的開放源碼軟件,因此使用這種方式不用花一分錢就可以建立起一個穩(wěn)定、免費的網(wǎng)站系統(tǒng)。 第二章 一、安裝過程中遇到的問題及解決方法: 安裝過程中沒有完成時計算機關(guān)機。(沒有刪除完文件)安裝完成時找不到所配置的路徑。(可以從配置文件中找到) 安裝完成后無法正常使用。(在計算機管理中重新啟動MySQL服務(wù))安裝到一半時沒有出現(xiàn)下一步。(誤把配置文件刪除了)安裝到最后一步時start service錯誤。到控制面板里面先把mysql刪除.到c盤C:Program Files目錄下把mysql目錄刪除.如果在其他盤還有設(shè)置目錄也要刪除.空目錄也要刪除 到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 有的話,全部刪除!(技巧:用F3循環(huán)查找“mysql”)如果任務(wù)管理器里有關(guān)mysql內(nèi)容也刪除 把防火墻關(guān)了 重新裝mysql(這里我沒有重啟計算機) 重裝時候有必要的話,重啟計算機,停用IIS,和刪除temp里的臨時文件.實在不行的話,配置mysql時候,把mysql服務(wù)換個服務(wù)名.使用時輸入中文會出錯。(在配置時在“Character Set”選框中將latinl修改為gb2312;也可以在配置文件中修改) 二、啟動服務(wù)器的方法: ① 方法1: 在 “計算機管理”中的“服務(wù)”項目中啟動與停止。② 方法2: 使用命令(net start mysql和net stop mysql) 三、連接MySQL 格式: mysql-h主機地址-u用戶名 -p用戶密碼 ①先在打開DOS窗口,然后進入目錄 mysqlbin(如果設(shè)置了環(huán)境變量,則直接輸入命令即可。)②鍵入命令mysql-uroot-proot ③接回車即可進入到MYSQL中了 MYSQL的提示符是:mysql> 注明:直接打開Mysql command line client 四、MySQL注釋符有三種: ①#...②“--...” ③ 五、忘記密碼重新更改密碼 先停止mysql服務(wù),修改D:MySQLMySQL Server 5.0 目錄下的my.ini文件,在[mysqld]下添加skip-grant-tables 啟動mysql服務(wù)后就可以以空密碼登錄,之后別忘記修改root密碼 use mysql update user set password=password('hanaixia')where user='root';(分號不能少)password('hanaixia')此處必須用函數(shù)設(shè)置。 修改密碼后需要重新啟動服務(wù)或者使用 flush privileges;語句,用于從mysql數(shù)據(jù)庫中的授權(quán)表重新載入權(quán)限。 把 skip-grant-tables 這一句刪掉再重啟mysql服務(wù)。 數(shù)據(jù)備份方案SYMANTEC NetBackup(NBU)簡介 SYMANTEC NetBackup軟件是一個功能強大的企業(yè)級數(shù)據(jù)備份管理軟件,它為UNIX、Windows和Netware混合環(huán)境提供了完整的數(shù)據(jù)保護機制,具有保護企業(yè)從工作組到企業(yè)級服務(wù)器的所有的數(shù)據(jù)的能力。管理員能夠通過圖形界面來管理備份和恢復(fù)的所有方面,制定企業(yè)統(tǒng)一的備份策略。NetBackup針對Oracle、DB2、SAP R/ 3、Informix、Sybase、Microsoft SQL Server 和 Microsoft Exchange Server 等數(shù)據(jù)庫提供了備份和恢復(fù)的解決方案。 NetBackup模塊功能介紹 Master Server 在NetBackup Enterprise Server中,Master Server是第一個組件。Master Server是管理一切數(shù)據(jù)保護工作的最核心的部件。所管理的工作包括,任務(wù)調(diào)度,客戶端備份,介質(zhì)管理,設(shè)備管理等等。Media Server 當(dāng)需要備份的數(shù)據(jù)在不同地點或數(shù)據(jù)量比較大的時候,我們需要使用多個Media Servers來做分擔(dān)備份管理的任務(wù)。Media Server是NetBackup中第二個組件。Media Server通過網(wǎng)絡(luò)承擔(dān)著本地各個機器上的數(shù)據(jù)備份,它可以和Master Server或其他的Media Server共享備份設(shè)備,或使用自己的備份設(shè)備也可以。在有多個Media Servers的情況下,一個Media Server因故障停止數(shù)據(jù)保護工作的時候,可以由Master Server把這個Media Server的數(shù)據(jù)保護工作轉(zhuǎn)移到另外的Media Servers上。Clients(Protected Server) 第三個組件就是Clients,客戶端。所有的通過網(wǎng)絡(luò)把數(shù)據(jù)傳到Master Server或Media Servers上來做數(shù)據(jù)保護的機器,都是客戶端。在客戶端上要安裝NetBackup的客戶端軟件。注意:Master Server和Media Server本身也是NetBackup的Clients,它們在備份自己的數(shù)據(jù)的時候就是客戶端。 NetBackup Tape Library and Rototics Support NetBackup支持所有主流的磁帶機、磁帶庫和光盤庫設(shè)備,包括StorageTek,IBM,Quantum|ATL,ADIC 和HP等等等。所謂NetBackup支持這些設(shè)備不是單指能夠往其磁帶上寫數(shù)據(jù),主要是指對其的設(shè)備管理和介質(zhì)管理功能。磁盤緩沖(DISK STAGING) 磁盤緩沖(DISK STAGING)為NetBackup管理員提供了一種備份方法,首先在磁盤上創(chuàng)建備份鏡像,然后將鏡像轉(zhuǎn)移到另一種介質(zhì)上。NetBackup軟件的磁盤緩沖分三個步驟完成:首先在磁盤上創(chuàng)建NetBackup備份鏡像,然后在可以配置的稍后時間,將鏡像轉(zhuǎn)移到另外一個介質(zhì)上。 備份方案設(shè)計 目前使用比較廣泛的備份方式有以下兩種備份方式: LAN備份 LAN備份是基于數(shù)據(jù)量不大的情況下,結(jié)構(gòu)簡單,但是要占用生產(chǎn)的網(wǎng)絡(luò)帶寬,其結(jié)構(gòu)圖如下: 采用SAN存儲架構(gòu)的LAN-free備份方式: 采用san存儲架構(gòu)的解決方案,也稱為LAN-Free備份。它將磁帶庫和磁盤陣列各自作為獨立的光纖結(jié)點,備份時,數(shù)據(jù)流直接從磁盤陣列傳到磁帶庫內(nèi),是一種無需占用網(wǎng)絡(luò)帶寬(LAN-Free)的解決方案。以下是它的結(jié)構(gòu)圖: 備份和恢復(fù)的定義及實現(xiàn) 備份系統(tǒng)資源的定義 在系統(tǒng)備份前,首先必須定義備份系統(tǒng),分配磁帶庫資源??梢匀缦屡渲脗浞菹到y(tǒng)資源: 將帶庫中所有磁帶驅(qū)動器定義成一組或幾組資源(術(shù)語:Storage Unit)。這樣,當(dāng)你備份一組數(shù)據(jù)時,系統(tǒng)就會允許使用相應(yīng)的磁帶驅(qū)動器去備份相應(yīng)的數(shù)據(jù)了。 對每個數(shù)據(jù)庫服務(wù)器,我們可以定義一組磁帶,作為一個磁帶池(術(shù)語:Volume Pool),在自動備份時,備份系統(tǒng)回自動將該數(shù)據(jù)庫備份到這個磁帶池中。這里我們可以定義: 1.Volume Pool for主數(shù)據(jù)庫 2.Volume Pool for 文件系統(tǒng) 備份策略的定義 定義好備份資源后,必須根據(jù)實際需要配置備份策略。定義備份策略,涉及到以下內(nèi)容: 1.在什么時間 2.將什么數(shù)據(jù) 3.以什么方式(如全備份或增量備份)、4.通過哪組磁帶驅(qū)動器(備份通道,如:磁帶驅(qū)動器)、5.備份到哪一個磁帶組(備份目的地,如:Volume Pool for 主數(shù)據(jù)庫)而備份的方式可以分為三種:全備份、增量備份、累計增量備份。1.全備份 每次備份定義的所有數(shù)據(jù),優(yōu)點是恢復(fù)快,缺點是備份數(shù)據(jù)量大,數(shù)據(jù)多時可能做一次全備份需很長時間 2.增量備份 備份自上一次備份以來更新的所有數(shù)據(jù),其優(yōu)點是每次備份的數(shù)據(jù)量少,缺點是恢復(fù)時需要全備份及多份增量備份 3.差分備份 備份自上一次全備份以來更新的所有數(shù)據(jù)。我們可以結(jié)合這三種方式,靈活應(yīng)用。數(shù)據(jù)備份的過程 在業(yè)務(wù)系統(tǒng)中,我們會在所有數(shù)據(jù)庫服務(wù)器上部署相應(yīng)的Netbackup SAN Media Server軟件及用于數(shù)據(jù)庫在線熱備份的Agent。 在定義好備份資源和策略后,在指定的時間,備份系統(tǒng)就會自動的將數(shù)據(jù)庫服務(wù)器上的數(shù)據(jù)從服務(wù)器上、采用指定的方式、通過指定的磁帶驅(qū)動器備份到指定磁盤池中。 在備份結(jié)束后,系統(tǒng)會報告?zhèn)浞莸臓顩r,然后,系統(tǒng)管理員就會在VEIRTAS Netbackup管理界面上清楚地看到已經(jīng)備份的數(shù)據(jù)的描述。在VERITAS Netbackup上對備份介質(zhì)上的數(shù)據(jù)的管理采用的是簡單易懂的目錄結(jié)構(gòu)。系統(tǒng)管理員通過該目錄下的備份項目可以非常方便的察看已經(jīng)備份的數(shù)據(jù)的情況,包括:這個數(shù)據(jù)是什么時候?qū)δ膫€數(shù)據(jù)庫的備份,采用的是哪一種備份方式(全備份?增量備份?還是累計增量備份?)。一個完整的備份包括一條或幾條備份項目,一般包括一個全備份項目、一個累計增量備份項目、幾個增量備份項目。你可以保留以前的備份—在最近一次全備份以前的備份。也可以同時對一份數(shù)據(jù)做兩個備份。 備份系統(tǒng)對數(shù)據(jù)庫的備份采用的是在線備份,通過VERITAS Netbackup的database Agent,我們可以在不停止數(shù)據(jù)庫運行的情況下,對數(shù)據(jù)庫數(shù)據(jù)進行備份,包括全備份、累計增量備份或者增量備份。這種備份方式,保證了系統(tǒng)的7x24小時的運行。 數(shù)據(jù)的恢復(fù) 當(dāng)發(fā)生數(shù)據(jù)損壞時,我們需要從磁帶庫恢復(fù)數(shù)據(jù)。 有了VERITAS Netbackup,數(shù)據(jù)的恢復(fù)是非??焖俸秃唵蔚摹Mㄟ^Netbackup管理界面,系統(tǒng)管理員只需要選定相應(yīng)的數(shù)據(jù)備份項目(備份管理目錄下的相應(yīng)的項目名,對應(yīng)某個時間點備份的某個數(shù)據(jù)庫的數(shù)據(jù),并有說明),進行恢復(fù)(Restore)即可。選擇備份項目時,如前所述,首先選定最近一次全備份進行恢復(fù),然后選定最近一次累計增量備份,最后選定這次累計增量備份以后的所有增量備份項目,依時間順序進行恢復(fù)即可。 備份系統(tǒng)基礎(chǔ)知識 數(shù)據(jù)備份的原則 對數(shù)據(jù)進行備份是為了保證數(shù)據(jù)的一致性和完整性,消除系統(tǒng)使用者和操作者的后顧之憂。不同的應(yīng)用環(huán)境要求不同的解決方案來適應(yīng),一般來說,一個完善的備份系統(tǒng),需要滿足以下原則: ? 穩(wěn)定性 備份產(chǎn)品的主要作用是為系統(tǒng)提供一個數(shù)據(jù)保護的方法,于是該產(chǎn)品本身的穩(wěn)定性和可靠性就變成了最重要的一個方面。首先,備份軟一定要與操作系統(tǒng)100%的兼容,其次,當(dāng)事故發(fā)生時,能夠快速有效地恢復(fù)數(shù)據(jù)。? 全面性 包括了各種操作平臺,如各種廠家的UNIX、NetWare、Windows NT、VMS等,并安裝了各種應(yīng)用系統(tǒng),如ERP、數(shù)據(jù)庫、群件系統(tǒng)等。選用的備份軟件,要支持各種操作系統(tǒng)、數(shù)據(jù)庫和典型應(yīng)用。? 自動化 很多系統(tǒng)由于工作性質(zhì),對何時備份、用多長時間備份都有一定的限制。在下班時間系統(tǒng)負荷輕,適于備份??墒沁@會增加系統(tǒng)管理員的負擔(dān),因此,備份方案應(yīng)能提供定時的自動備份。在自動備份過程中,還要有日志記錄功能,并在出現(xiàn)異常情況時自動報警。? 高性能 隨著業(yè)務(wù)的不斷發(fā)展,數(shù)據(jù)越來越多,更新越來越快,在休息時間來不及備份如此多的內(nèi)容,在工作時間備份又會影響系統(tǒng)性能。這就要求在設(shè)計備份時,盡量考慮到提高數(shù)據(jù)備份的速度,利用多個磁帶機并行操作的方法。? 操作簡單 需要一個直觀的、操作簡單的圖形化用戶界面,縮短操作人員的學(xué)習(xí)時間,減輕操作人員的工作壓力,使備份工作得以輕松地設(shè)置和完成。? 實時性 關(guān)鍵性的任務(wù)是要24小時不停機運行的,在備份的時候,有一些文件可能仍然處于打開的狀態(tài)。那么在進行備份的時候,要采取措施,實時地查看文件大小、進行事務(wù)跟蹤,以保證正確地備份系統(tǒng)中的所有文件。? 容災(zāi)考慮 將磁帶庫中的磁帶拷貝一份,存放在遠離數(shù)據(jù)中心的地方,以防數(shù)據(jù)中心發(fā)生不可預(yù)測的災(zāi)難。 備份系統(tǒng)組成 能否安全有效的備份取決于以下三個因素: 1.執(zhí)行備份的磁帶機 磁帶機的質(zhì)量與性能在整個備份過程中是至關(guān)重要的,它是能否進行高速高質(zhì)量備份的關(guān)鍵所在。2.存儲備份數(shù)據(jù)的介質(zhì) 介質(zhì)是數(shù)據(jù)的負載物,它的質(zhì)量一定要有保證,使用質(zhì)量不過關(guān)的介質(zhì)無疑是拿自己的數(shù)據(jù)冒險。3.控制備份的軟件 優(yōu)秀備份軟件包括加速備份、自動操作、災(zāi)難恢復(fù)等特殊功能,對于安全有效的數(shù)據(jù)備份是非常重要的。 確定介質(zhì)保存時間 備份過程中要用到大量的存儲介質(zhì),備份介質(zhì)的保留時間的長短將決定所需購置和維護的介質(zhì)量。目前的備份策略都是基于多磁帶輪換制,即保存有過時數(shù)據(jù)的介質(zhì)可重新覆蓋使用,輪換頻率可根據(jù)備份類型和備份的窗口來確定。 計算所需磁帶介質(zhì)數(shù)量 1.備份系統(tǒng)所需的介質(zhì)數(shù)量可根據(jù)下述流程確定: 2.確定介質(zhì)容量 3.計算每個服務(wù)器上的數(shù)據(jù)做全備份所需的介質(zhì)數(shù)量 4.根據(jù)每種介質(zhì)的保留時間或輪換頻率即可計算出所需的介質(zhì)數(shù)目 售后服務(wù)承諾第二篇:我的MYSQL學(xué)習(xí)心得
第三篇:我的MYSQL學(xué)習(xí)心得
第四篇:MySQL學(xué)習(xí)心得
第五篇:NBU備份恢復(fù)方案