
mysqldump
bitsCN.com
根據(jù)mysql 5.5第6.4章節(jié)理解和自己翻譯水平有限如有紕漏請(qǐng)指教,原文如下.http://dev.mysql.com/doc/refman/5.5/en/using-mysqldump.html 6.4 使用mysqldump備份(Using mysqldump for Backups)首先多余的不用說了備份用來干什么大家都清楚。mysqldump備份分兩種輸出形式:1. 無--tab選項(xiàng),輸出標(biāo)準(zhǔn)的SQL格式。輸出包含CREATE語句(databases,tables,stored routines,and so forth),INSERT語句插入數(shù)據(jù)到表。輸出可以保存成一個(gè)文件,之后可以用mysql再次創(chuàng)建。選項(xiàng)可以控制輸出SQL語句格式,文件類型。2. 含--tab選項(xiàng),每個(gè)表對(duì)應(yīng)兩個(gè)備份文件。一個(gè)文件為由tab分割的文本,一行對(duì)應(yīng)一條數(shù)據(jù)記錄,在目錄中這個(gè)文件輸出名為tb1_name.txt。同樣會(huì)創(chuàng)建一個(gè)含有CREATE TABLE語句,名為tb1_name.sql的文件。 6.4.1 使用mysqldump備份SQL數(shù)據(jù)(Dumping Data in SQL Format with mysqldump)默認(rèn)語法
shell>mysqldump [arguments] > file_name
備份所有數(shù)據(jù)庫(kù)
shell>mysqldump --all-databases > dump.sql
如果你數(shù)據(jù)庫(kù)有密碼上面那樣當(dāng)然是不行的加上用用戶密碼選項(xiàng)
shell>mysqldump -uroot -p --all-databases > dump.sql
選擇性的備份數(shù)據(jù)庫(kù)
shell>mysqldump --databases db1 db2 db3 > dump.sql
--databases選項(xiàng)會(huì)把后面幾個(gè)名稱作為數(shù)據(jù)庫(kù)名。沒有這個(gè)選項(xiàng)mysqldump會(huì)把第一個(gè)當(dāng)成數(shù)據(jù)庫(kù)名,后面的當(dāng)成表名。 --all-databases或--databases,mysqldump會(huì)為每一個(gè)數(shù)據(jù)庫(kù)寫入CREATE DATABASE和USE。以確保當(dāng)備份文件被再次載入的時(shí)候,如果數(shù)據(jù)庫(kù)不存在則創(chuàng)建數(shù)據(jù)庫(kù),然后設(shè)置為當(dāng)前數(shù)據(jù)庫(kù)(USE DATABASES),當(dāng)INSERT的時(shí)候數(shù)據(jù)庫(kù)的內(nèi)容均會(huì)加載到同一個(gè)數(shù)據(jù)庫(kù)中。 如果想要備份文件載入時(shí)強(qiáng)制刪除數(shù)據(jù)庫(kù),可以使用--add-drop-database。這樣mysqldump會(huì)在CREATE DATABASE前寫入DROP DATABASE。 備份單個(gè)數(shù)據(jù)庫(kù)
shell>mysqldump --databases test > dump.sql
在單個(gè)數(shù)據(jù)庫(kù)時(shí)可以這樣簡(jiǎn)寫
shell>mysqldump test > dump.sql
省略--databases時(shí)備份文件沒有CREATE DATABASE,USE。有下面幾方面含義。1.當(dāng)你導(dǎo)入備份文件時(shí),你必須選擇一個(gè)默認(rèn)數(shù)據(jù)庫(kù)名這樣程序才知道要導(dǎo)入到哪個(gè)數(shù)據(jù)庫(kù)。2.當(dāng)導(dǎo)入到時(shí)候你可以選擇一個(gè)不同的數(shù)據(jù)庫(kù)名。3.如果要導(dǎo)入到數(shù)據(jù)庫(kù)不存在,你必須提前創(chuàng)建。4.因?yàn)?/script>輸出文件沒有CREATE DATABASE,所以--add-drop-database選項(xiàng)沒有效果,如果你使用也沒有DROP DATABASE。 選擇表備份,表名跟在數(shù)據(jù)庫(kù)名之后
shell>mysqldump test t1 t3 t7 > dump.sql
6.4.2 導(dǎo)入SQL備份文件(Reloading SQL-Format Backups)導(dǎo)入由mysqldump備份的文件,如果使用了--all-databases或--databases選項(xiàng),包含CREATE DATABASE和USE。且不需要導(dǎo)入到不同的數(shù)據(jù)庫(kù)中,可以這樣寫。
另外在mysql內(nèi)部你可以這樣寫
如果是簡(jiǎn)寫單個(gè)數(shù)據(jù)庫(kù)導(dǎo)出沒有CREATE DATABASE和USE,如果需要?jiǎng)t先創(chuàng)建數(shù)據(jù)庫(kù)。
shell>mysqladmin create db1
接著選擇具體的數(shù)據(jù)庫(kù)
shell>mysql db1 < dump.sql
另外在mysql內(nèi)部創(chuàng)建數(shù)據(jù)庫(kù),選擇數(shù)據(jù)庫(kù),導(dǎo)入備份:
mysql>CREATE DATABASE IF NOT EXISTS db1;
mysql>USE db1;
mysql>source dump.sql
6.4.3 使用mysqldump以分割文本方式備份(Dumping Data in Delimited-Text Format with mysqldump)mysqldump備份時(shí)使用--tab=dir_name,使用dir_name作為備份文件輸出目錄,每一個(gè)表對(duì)應(yīng)兩個(gè)文件,文件名為表名。例如表名為t1,文件名則為t1.sql和t1.txt。.sql文件含表的CREATE TABLE語句。.txt文件含表的數(shù)據(jù),一行對(duì)應(yīng)一條數(shù)據(jù)記錄。例如備份數(shù)據(jù)庫(kù)db1到/tmp目錄
shell>mysqldump --tab=/tmp db1
.txt文件被服務(wù)器創(chuàng)建其中包含表數(shù)據(jù),為系統(tǒng)用戶所有。當(dāng)程序運(yùn)行SELECT ... INTO OUTFILE寫入文件時(shí)你必須擁有相應(yīng)權(quán)限,.txt存在時(shí)會(huì)發(fā)生錯(cuò)誤。 服務(wù)器發(fā)送創(chuàng)建CREATE備份表命令給mysqldump寫入.sql,因此文件是mysqldump所有。 --tab最好的用法是本地備份。如果你用來備份遠(yuǎn)程服務(wù)器,--tab的目錄必須本地和遠(yuǎn)程服務(wù)器都存在,.txt文件將會(huì)寫入到遠(yuǎn)程服務(wù)器(on the server host)目錄中,.sql文件將會(huì)寫入到本地目錄中(on the client host)。 對(duì)于mysql --tab,默認(rèn)情況下服務(wù)器將表數(shù)據(jù)寫入.txt一行一條記錄兩個(gè)值之間tab分割,沒有引號(hào),新的一行在行的末尾。(這些都為相同的默認(rèn)值SELECT ... INTO OUTFILE) 通過選項(xiàng)輸出不同的格式,mysqldump支持如下:--fields-terminated-by=str字段值之間的分隔符默認(rèn)為tab --fields-enclosed-by=char字段值兩邊的分隔符默認(rèn)為空(PS這個(gè)翻譯過來真不知道說的對(duì)不對(duì).效果可以參考INSERT INTO中如果VALUE是字符型就要加上雙引號(hào)中的雙引號(hào)) --fields-optionally-enclosed-by=char這個(gè)效果同上但只有字符型的字段值才會(huì)加默認(rèn)值為空 --fields-escaped-by=char轉(zhuǎn)義特殊字符的字符默認(rèn)值無 --lines-terminated-by=str記錄之間的分隔符默認(rèn)值是換行 根據(jù)這些選項(xiàng)你可以指定任何值,可能需要在命令行中對(duì)值進(jìn)行適當(dāng)?shù)囊没蜣D(zhuǎn)義。另外可以使用16進(jìn)制表示值,假設(shè)想要mysqldump輸出的值引用雙引號(hào)。可以添加 --fields-enclosed-by 選項(xiàng)指定值為雙引號(hào)。但是這個(gè)值往往是特殊的轉(zhuǎn)義字符需要處理一下。例如在unix上可以這樣使用雙引號(hào):--fields-enclosed-by='"'在其他的平臺(tái)可以使用16進(jìn)制表示:--fields-enclosed-by=0x22 這是幾個(gè)選項(xiàng)的同時(shí)使用的例子,記錄以逗號(hào)分隔多條記錄之間用換行/回車:
shell> mysqldump --tab=/tmp --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by=0x0d0adb1
(windows平臺(tái)--fields-enclosed-by要等于0x22。換行符也沒有出來變成了亂碼,這個(gè)可能也需要改)當(dāng)設(shè)置了數(shù)據(jù)輸出格式,在導(dǎo)入備份數(shù)據(jù)的時(shí)候同樣也要設(shè)置相同的格式,以保證內(nèi)容正確導(dǎo)入。 6.4.4 導(dǎo)入以分割文本方式的備份(Reloading Delimited-Text Format Backups)使用mysqldump --tab文件備份,每一個(gè)表都被存儲(chǔ)成包含CREATE TABLE語句的.sql文件和保護(hù)表數(shù)據(jù)的.txt文件。導(dǎo)入表之前先定位到備份文件的目錄。這樣.sql文件先創(chuàng)建空的表,然后.txt文件導(dǎo)入數(shù)據(jù):
1 shell> mysql db1 < t1.sql
2 shell> mysqlimport db1 t1.txt
另外在mysql端導(dǎo)入需要使用LOAD DATA INFILE:
1 mysql> USE db1;
2 mysql> LOAD DATA INFILE 't1.txt' INTO TABLE t1;
(PS:范例中t1.txt的路徑為當(dāng)前選中數(shù)據(jù)庫(kù)的路徑,可以修改為絕對(duì)路徑'C:/t1.txt') 如果在備份文件時(shí)使用了控制數(shù)據(jù)格式的選項(xiàng),在使用mysqlimport或LOAD DATA INFILE導(dǎo)入時(shí)也需設(shè)置相同的選項(xiàng):
1 shell>mysqlimport --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1 t1.txt
或
1 mysql>USE db1;
2 mysql>LOAD DATA INFILE 't1.txt' INTO TABLE t1
3 ->FIELDS TERMINATED BY ',' FIELDS ENCLOSED BY '"'
4 ->LINES TERMINATED BY '/r/n';
6.4.5 mysqldump技巧(mysqldump Tips)這一章解決些常見問題所需的技術(shù)如何創(chuàng)建備份數(shù)據(jù)庫(kù)如何從一個(gè)服務(wù)器將數(shù)據(jù)庫(kù)拷貝到另一個(gè)服務(wù)器如何備份一個(gè)存儲(chǔ)程序(存儲(chǔ)過程函數(shù),觸發(fā)器,日志)如何備份數(shù)據(jù)和創(chuàng)建分離 6.4.5.1 創(chuàng)建數(shù)據(jù)庫(kù)備份文件(Making a Copy of a Database)
1 shell> mysqldump db1 > dump.sql
2 shell> mysqladmin create db2
3 shell> mysql db2 < dump.sql
在使用db1備份文件覆蓋db2時(shí)不要使用--databases選項(xiàng)因?yàn)槟菢訒?huì)在備份文件中寫入U(xiǎn)SE db1. 6.4.5.2 從一個(gè)服務(wù)器復(fù)制數(shù)據(jù)庫(kù)到另一個(gè)服務(wù)器(Copy a Database from one Server to Another)服務(wù)器1:
1 shell>mysqldump --databases db1 > dump.sql
將備份文件復(fù)制到服務(wù)器2 服務(wù)器2:
使用mysqldump時(shí)添加--database選項(xiàng)備份文件會(huì)包含CREATE DATABASE和USE語句,如果不存在則會(huì)創(chuàng)建同時(shí)設(shè)為默認(rèn)數(shù)據(jù)庫(kù)在導(dǎo)入數(shù)據(jù)。 你可以忽略--database選項(xiàng),但在導(dǎo)入數(shù)據(jù)庫(kù)的時(shí)候需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)(如果需要)然后設(shè)置為當(dāng)前數(shù)據(jù)庫(kù)。 服務(wù)器1:
1 shell>mysqldump db1 > dump.sql
服務(wù)器2:
1 shell> mysqladmin create db1
2 shell> mysql db1 < dump.sql
所以忽略--database選項(xiàng)就可以選擇不同的數(shù)據(jù)庫(kù)導(dǎo)入。 6.4.5.3 備份存儲(chǔ)程序(Dumping Stored Programs)以下是存儲(chǔ)程序幾個(gè)可選選項(xiàng)(存儲(chǔ)過程函數(shù),觸發(fā)器,日志)--events:調(diào)度事件--routines:存儲(chǔ)過程和函數(shù)--triggers:觸發(fā)器 triggers默認(rèn)是備份的routines,events需要選擇性備份默認(rèn)是不備份的可以選擇跳過--skip-events, --skip-routines, --skip-triggers。 6.4.5.4 備份表定義和內(nèi)容分開(Dumping Table Definitions and Content Separately)--no-data選項(xiàng)告訴mysqldump不備份表數(shù)據(jù),備份文件僅包括創(chuàng)建表。相對(duì)的--no-create-info選項(xiàng)告訴mysqldump備份僅包含數(shù)據(jù)。示例:
1 shell> mysqldump --no-data test > dump-defs.sql
2 shell> mysqldump --no-create-info test > dump-data.sql
一個(gè)只備份CREATE存儲(chǔ)和事件的例子:
shell> mysqldump --no-data --routines --event stest > dump-defs.sql
6.4.5.5 用備份來測(cè)試mysql升級(jí)后兼容的問題(Using mysqldump to test for Upgrade Incompatibilities)當(dāng)考慮mysql升級(jí)時(shí)需要謹(jǐn)慎的考慮安裝新的版本,獨(dú)立于現(xiàn)有的版本。這時(shí)可以備份現(xiàn)有數(shù)據(jù)庫(kù)導(dǎo)入到新的版本中。(這是一個(gè)測(cè)試新版本經(jīng)常使用的方法)在現(xiàn)有服務(wù)器:
shell> mysqldump --all-databases --no-data --routines --events > dump-defs.sql
在新服務(wù)器:
shell> mysql < dump-defs.sql
因?yàn)閭浞菸募]有表數(shù)據(jù)庫(kù),所以可以處理的很快。這可以發(fā)現(xiàn)潛在的不兼容,而不需要長(zhǎng)時(shí)間的數(shù)據(jù)加載操作。查看備份文件處理時(shí)發(fā)生的警告或錯(cuò)誤。在驗(yàn)證了沒有兼容性問題后備份表數(shù)據(jù)導(dǎo)入到新服務(wù)器在現(xiàn)有服務(wù)器:
shell> mysqldump --all-databases --no-create-info > dump-data.sql
在新服務(wù)器:
shell> mysql < dump-data.sql
現(xiàn)在檢查表內(nèi)容運(yùn)行一些測(cè)試查詢bitsCN.com
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com