這一篇《我的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 @[email protected]@CHARACTER_SET_CLIENT */; /*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; /*!40101 SET @[email protected]@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @[email protected]@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @[email protected]@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 [email protected]_TIME_ZONE */; /*!40101 SET [email protected]_SQL_MODE */; /*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; /*!40014 SET [email protected]_UNIQUE_CHECKS */; /*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; /*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; /*!40101 SET [email protected]_COLLATION_CONNECTION */; /*!40111 SET S[email protected]_SQL_NOTES */; -- Dump completed on 2014-07-23 22:04:16
可以看到,備份文件包含了一些信息,文件開頭首先寫明瞭mysqldump工具的版本號;
然後是主機信息,以及備份的數據庫名稱,最後是mysql服務器的版本號5.5.20
備份文件接下來的部分是一些SET語句,這些語句將一些系統變量賦值給用戶定義變量,以確保被恢復的數據庫的系統變量和原來
備份時的變量相同
例如:
/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;
該set語句將當前系統變量character_set_client的值賦值給用戶變量@OLD_CHARACTER_SET_CLIENT
備份文件的最後幾行mysql使用set語句恢復服務器系統變量原來的值,例如:
/*!40101 SET [email protected]_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 @[email protected]@CHARACTER_SET_CLIENT */; /*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; /*!40101 SET @[email protected]@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @[email protected]@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @[email protected]@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 [email protected]_TIME_ZONE */; /*!40101 SET [email protected]_SQL_MODE */; /*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; /*!40014 SET [email protected]_UNIQUE_CHECKS */; /*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; /*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; /*!40101 SET [email protected]_COLLATION_CONNECTION */; /*!40111 SET [email protected]_SQL_NOTES */; -- Dump completed on 2014-07-23 22:24:29
備份文件中的內容跟前面的介紹是一樣的,唯一不同的是隻包含了book表的CREATE語句和INSERT語句
3、使用mysqldump備份多個數據庫
如果要使用mysqldump備份多個數據庫,需要使用–databases參數。
使用–databases參數之後,必須指定至少一個數據庫的名稱,多個數據庫名稱之間用空格隔開
使用mysqldump備份school庫和test庫
備份文件裏的內容,基本上跟第一個例子一樣,但是指明瞭裏面的內容那一部分屬於test庫,哪一部分屬於school庫
4、使用–all-databases參數備份系統中所有的數據庫
使用–all-databases不需要指定數據庫名稱
執行完畢之後會產生all_2014-7-10.sql的備份文件,裏面會包含了所有數據庫的備份信息
提示:如果在服務器上進行備份,並且表均爲myisam,應考慮使用mysqlhotcopy
因爲可以更快地進行備份和恢復
使用mysqlhotcopy,如果是Windows操作系統,需要先安裝perl腳本組件才能使用,因爲mysqlhotcopy是使用perl來編寫的
提示
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 ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[test]( [a] [int] NULL ) ON [PRIMARY] GO INSERT [dbo].[test] ([a]) VALUES (10) GO
由於test表是沒有任何索引的,所以腳本里看不到CREATE INDEX語句
實際上各種數據庫的備份恢復方法都是大同小異的
邏輯備份和物理備份
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服務纔可以拷貝物理數據文件,爲的都是保證數據一致性
我之前寫的一篇文章《達夢7的試用 與SQLSERVER的簡單技術對比》,達夢數據庫支持脫機還原,實際上脫機備份的時候數據庫也是需要停止寫入數據的
物理備份方法
1、直接複製整個數據庫目錄
因爲MYSQL表保存爲文件方式,所以可以直接複製MYSQL數據庫的存儲目錄以及文件進行備份。
MYSQL的數據庫目錄位置不一定相同,在Windows平臺下,MYSQL5.6存放數據庫的目錄通常默認爲
C:\Documents and Settings\All User\Application Data\MySQL\MYSQL Server 5.6\data
或者其他用戶自定義的目錄;
在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]<filename.sql
user是執行backup.sql中語句的用戶名;-p表示輸入用戶密碼;dbname是數據庫名
如果filename.sql文件爲mysqldump工具創建的包含創建數據庫語句的文件,執行的時候不需要指定數據庫名
用mysql命令將school_2014-7-10.sql文件中的備份導入到數據庫中
mysql -u root -h 127.0.0.1 -p school<c:\school_2014-7-10.sql
執行語句之前我們必須建好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.abc.com主機上的mysql數據庫全部遷移到www.bcd.com主機上。
在www.abc.com主機上執行以下命令:
mysqldump -h www.abc.com -u root -p dbname | mysql -h www.bcd.com -u root -p
mysqldump導入的數據直接通過管道符|,傳給mysql命令導入到主機www.bcd.com數據庫中,dbname爲需要遷移的數據庫名稱
如果要遷移全部數據庫,可以使用–all -databases參數
不同版本的mysql數據庫之間的遷移
因爲數據庫升級,需要將舊版本mysql數據庫中的數據遷移到新版本數據庫中。
mysql服務器升級,需要先停止服務,然後卸載舊版本,並安裝新版本的mysql,這種更新方法很簡單。
如果想保留舊版本中的用戶訪問控制信息,則需要備份mysql的mysql庫,
在新版本mysql安裝完成後,重新讀入mysql備份文件中的信息
舊版本和新版本的mysql可能使用不同的默認字符集,例如mysql.4.x中大多數使用latin1作爲默認字符集,
而mysql5.x的默認字符集爲utf8。如果數據庫中有中文數據,遷移過程中需要對默認字符集進行修改,不然可能無法正常顯示結果
新版本對舊版本有一定兼容性。從舊版本的mysql向新版本mysql遷移時,對於myisam引擎的表,可以直接複製數據庫文件,
也可以用mysqlhotcopy工具、mysqldump工具。
對於innodb引擎的表一般只能使用mysqldump將數據導出。然後使用mysql命令導入目標服務器。
從新版本向舊版本mysql遷移數據時要小心,最好使用mysqldump命令導出,然後導入目標數據庫中。
不同數據庫之間的遷移
不同類型的數據庫之間的遷移,是指把mysql數據庫遷移到其他的數據庫,例如從mysql遷移到oracle,從oracle遷移到mysql
從mysql遷移到SQLSERVER等。
遷移之前,需要了解不同數據庫的結構,比較他們的差異。不同數據庫定義相同類型的數據的關鍵字可能不同。
例如:mysql中日期字段分爲DATE 和TIME兩種,而ORACLE的日期字段只有DATE。
數據庫遷移可以使用一些工具,例如,在Windows系統下,可以使用MyODBC實現mysql和SQLSERVER之間的遷移(使用SQLSERVER導入導出嚮導)
mysql官方提供的工具:MYSQL Migration Toolkit也可以在不同數據庫間進行數據遷移。
表的導入導出
MYSQL數據庫可以將數據導出成sql文本文件、xml文件、html文件。同樣這些導出文件也可以導入到MYSQL數據庫中
一般異構數據庫遷移都是採用文本文件的方式來導數據
導出
1、用SELECT…INTO OUTFILE導出文本文件
mysql導出數據時,允許使用包含表定義的select語句進行數據的導出操作
該文件被創建在服務器主機上,因此必須有文件寫入權限(FILE權限),才能使用此語法
SELECT INTO…OUTFILE語法:
select columnlist from Table WHERE condition into outfile 'filename' [OPTIONS] fields terminated by 'VALUE' fields [OPTIONALLY] 。從舊版本的mysql向新版本mysql遷移時,對於myisam引擎的表,可以直接複製數據庫文件,也可以用mysqlhotcopy工具、mysqldump工具。
對於innodb引擎的表一般只能使用mysqldump將數據導出。然後使用mysql命令導入目標服務器。
從新版本向舊版本mysql遷移數據時要小心,最好使用mysqldump命令導出,然後導入目標數據庫中。
不同數據庫之間的遷移
不同類型的數據庫之間的遷移,是指把mysql數據庫遷移到其他的數據庫,例如從mysql遷移到oracle,從oracle遷移到mysql
從mysql遷移到SQLSERVER等。
遷移之前,需要了解不同數據庫的結構,比較他們的差異。不同數據庫定義相同類型的數據的關鍵字可能不同。
例如:mysql中日期字段分爲DATE 和TIME兩種,而ORACLE的日期字段只有DATE。
數據庫遷移可以使用一些工具,例如,在Windows系統下,可以使用MyODBC實現mysql和SQLSERVER之間的遷移(使用SQLSERVER導入導出嚮導)
mysql官方提供的工具:MYSQL Migration Toolkit也可以在不同數據庫間進行數據遷移。
表的導入導出
MYSQL數據庫可以將數據導出成sql文本文件、xml文件、html文件。同樣這些導出文件也可以導入到MYSQL數據庫中
一般異構數據庫遷移都是採用文本文件的方式來導數據
導出
1、用SELECT…INTO OUTFILE導出文本文件
mysql導出數據時,允許使用包含表定義的select語句進行數據的導出操作
該文件被創建在服務器主機上,因此必須有文件寫入權限(FILE權限),才能使用此語法
SELECT INTO…OUTFILE語法:
select columnlist from Table WHERE condition into outfile 'filename' [OPTIONS] fields terminated by 'VALUE' fields [OPTIONALLY] ENCLOSED BY 'VALUE' fields ESCAPED BY 'VALUE' lines STARTING by 'VALUE' lines terminated by 'VALUE'into outfile語句的作用就是把前面select語句查詢出來的結果導出到名稱爲「filename」的外部文件中
[OPTIONS]部分爲可選參數,[OPTIONS]部分的語法包括FILED和LINES子句,其可能取值爲:
● fields子句:在FIELDS子句中有三個子句:TERMINATED BY、 [OPTIONALLY] ENCLOSED BY和ESCAPED BY。
如果指定了FIELDS子句,則這三個子句中至少要指定一個。
(1)TERMINATED BY用來指定字段值之間的符號,例如,「TERMINATED BY ‘,’」指定了逗號作爲兩個字段值之間的標誌,默認爲「\t」製表符。
(2)ENCLOSED BY子句用來指定包裹文件中字符值的符號,例如,「ENCLOSED BY ‘ 」 ‘」表示文件中字符值放在雙引號之間,若加上關鍵字OPTIONALLY表示所有的值都放在雙引號之間,則只有CHAR和VARCHAR等字符數據字段被包括。
(3)ESCAPED BY子句用來指定轉義字符,例如,「ESCAPED BY ‘*’」將「*」指定爲轉義字符,取代「\」,如空格將表示爲「*N」。
● LINES子句:在LINES子句中使用TERMINATED BY指定一行結束的標誌,如「LINES TERMINATED BY ‘?’」表示一行以「?」作爲結束標誌,默認值爲「\n」。TERMINATED BY也是同樣的原理
FIELDS子句和LINES子句都是自選的,但是如果兩個都被指定了,FIELDS子句必須位於LINES子句的前面
SELECT INTO…OUTFILE只能在本機執行,如果要在其他服務器上導出數據,則需要使用下面命令來生成文件
mysql (3)ESCAPED BY子句用來指定轉義字符,例如,「ESCAPED BY ‘*’」將「*」指定爲轉義字符,取代「\」,如空格將表示爲「*N」。
● LINES子句:在LINES子句中使用TERMINATED BY指定一行結束的標誌,如「LINES TERMINATED BY ‘?’」表示一行以「?」作爲結束標誌,默認值爲「\n」。TERMINATED BY也是同樣的原理
FIELDS子句和LINES子句都是自選的,但是如果兩個都被指定了,FIELDS子句必須位於LINES子句的前面
SELECT INTO…OUTFILE只能在本機執行,如果要在其他服務器上導出數據,則需要使用下面命令來生成文件
mysql -e "select ...">filename-e, –execute=name Execute command and quit. (Disables –force and history
SELECT INTO…OUTFILE是LOAD DATA INFILE的補語。用於語句的OPTIONS部分的語法包括部分FIELDS子句和LINES子句
這些子句與LOAD DATA INFILE語句同時使用
使用SELECT INTO…OUTFILE將test數據庫中的person表的記錄導出到文本文件
建表腳本
View Code
輸入命令如下
SELECT * FROM test.person INTO OUTFILE "C:\person0.txt" ;由於指定了INTO OUTFILE 子句,SELECT將查詢出來的3個字段的值保存到C:\person0.txt文件,打開文件內容如下
1 green 29 lawer 2 suse 26 dancer 3 evans 27 sports man 4 mary 26 singer可以看到默認情況下,MYSQL使用製表符「\t」分隔不同的字段,字段沒有被其他字符括起來
另外在Windows平臺下,使用記事本打開該文件,顯示的格式與這裏並不相同,這是因爲Windows系統下回車換行爲「\r\n」
默認換行符爲「\n」,因此會在person.txt中可能看到類似黑色方塊的字符,所有的記錄也會在同一行顯示
默認情況下,NULL值會顯示爲「\N」,轉義字符會顯示爲「\」
使用SELECT ..INTO OUTFILE將test庫中的person表中的記錄導出到文本文件,使用FIELDS選項和LINES選項,要求字段之間
使用逗號「,」間隔,所有字段值用雙引號括起來,定義轉移字符爲單引號「\’」
SELECT * FROM test.person INTO OUTFILE "C:\person1.txt" FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\'' LINES TERMINATED BY '\r\n';在C盤下生成的person1文件內容
'1','green','29','lawer' OUTFILE "C:\person1.txt" FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\''