在數(shù)據(jù)庫表丟失或損壞的情況下 備份你的數(shù)據(jù)庫是很重要的 如果發(fā)生系統(tǒng)崩潰 你肯定想能夠?qū)⒛愕谋肀M可能丟失最少的數(shù)據(jù)恢復(fù)到崩潰發(fā)生時的狀態(tài) 有時 正是MySQL管理員造成破壞 管理員已經(jīng)知道表以破壞 用諸如vi或Emacs等編輯器試圖直接編輯它們 這對表絕對不是件好事!備份數(shù)據(jù)庫兩個主要方法是用mysqldump程序或直接拷貝數(shù)據(jù)庫文件(如用cp cpio或tar等) 每種方法都有其優(yōu)缺點 mysqldump與MySQL服務(wù)器協(xié)同操作 直接拷貝方法在服務(wù)器外部進行 并且你必須采取措施保證沒有客戶正在修改你將拷貝的表 如果你想用文件系統(tǒng)備份來備份數(shù)據(jù)庫 也會發(fā)生同樣的問題 如果數(shù)據(jù)庫表在文件系統(tǒng)備份過程中被修改 進入備份的表文件主語不一致的狀態(tài) 而對以后的恢復(fù)表將失去意義 文件系統(tǒng)備份與直接拷貝文件的區(qū)別是對后者你完全控制了備份過程 這樣你能采取措施確保服務(wù)器讓表不受干擾 mysqldump比直接拷貝要慢些 mysqldump生成能夠移植到其它機器的文本文件 甚至那些有不同硬件結(jié)構(gòu)的機器上 直接拷貝文件不能移植到其它機器上 除非你正在拷貝的表使用MyISAM存儲格式 ISAM表只能在相似的硬件結(jié)構(gòu)的機器上拷貝 在MySQL 中引入的MyISAM表存儲格式解決了該問題 因為該格式是機器無關(guān)的 所以直接拷貝文件可以移植到具有不同硬件結(jié)構(gòu)的機器上 只要滿足兩個條件 另一臺機器必須也運行MySQL 或以后版本 而且文件必須以MyISAM格式表示 而不是ISAM格式 不管你使用哪種備份方法 如果你需要恢復(fù)數(shù)據(jù)庫 有幾個原則應(yīng)該遵守 以確保最好的結(jié)果 定期實施備份 建立一個計劃并嚴格遵守 讓服務(wù)器執(zhí)行更新日志 當你在崩潰后需要恢復(fù)數(shù)據(jù)時 更新日志將幫助你 在你用備份文件恢復(fù)數(shù)據(jù)到備份時的狀態(tài)后 你可以通過運行更新日志中的查詢再次運用備份后面的修改 這將數(shù)據(jù)庫中的表恢復(fù)到崩潰發(fā)生時的狀態(tài) 以文件系統(tǒng)備份的術(shù)語講 數(shù)據(jù)庫備份文件代表完全傾倒(full dump) 而更新日志代表漸進傾倒(incremental dump) 使用一種統(tǒng)一的和易理解的備份文件命名機制 象backup buckup 等不是特別有意義 當實施你的恢復(fù)時 你將浪費時間找出文件里是什么東西 你可能發(fā)覺用數(shù)據(jù)庫名和日期構(gòu)成備份文件名會很有用 例如 %mysqldump samp_db /usr/archives/mysql/samp_db %mysqldump menagerie /usr/archives/mysql/menagerie 你可能想在生成備份后壓縮它們 備份一般都很大!你也需要讓你的備份文件有過期期限以避免它們填滿你的磁盤 就象你讓你的日志文件過期那樣 用文件系統(tǒng)備份備份你的備份文件 如果遇上了一個徹底崩潰 不僅清除了你的數(shù)據(jù)目錄 也清除了包含你的數(shù)據(jù)庫備份的磁盤驅(qū)動器 你將真正遇上了麻煩 也要備份你的更新日志 將你的備份文件放在不同于用于你的數(shù)據(jù)庫的文件系統(tǒng)上 這將降低由于生成備份而填滿包含數(shù)據(jù)目錄的文件系統(tǒng)的可能性 用于創(chuàng)建備份的技術(shù)同樣對拷貝數(shù)據(jù)庫到另一臺機器有用 最常見地 一個數(shù)據(jù)庫被轉(zhuǎn)移到了運行在另一臺主機上的服務(wù)器 但是你也可以將數(shù)據(jù)轉(zhuǎn)移到同一臺主機上的另一個服務(wù)器 使用mysqldump備份和拷貝數(shù)據(jù)庫 當你使用mysqldumo程序產(chǎn)生數(shù)據(jù)庫備份文件時 缺省地 文件內(nèi)容包含創(chuàng)建正在傾倒的表的CREATE語句和包含表中行數(shù)據(jù)的INSERT語句 換句話說 mysqldump產(chǎn)生的輸出可在以后用作mysql的輸入來重建數(shù)據(jù)庫 你可以將整個數(shù)據(jù)庫傾倒進一個單獨的文本文件中 如下 %mysqldump samp_db /usr/archives/mysql/samp_db 輸出文件的開頭看起來象這樣 # MySQL Dump ## Host: localhost Database: samp_db# # Server version alpha log## Table structure for table absence #CREATE TABLE absence(student_id int( ) unsigned DEFAULT NOT NULL date date DEFAULT NOT NULL PRIMARY KEY (student_id date));## Dumping data for table absence #INSERT INTO absence VALUES ( );INSERT INTO absence VALUES ( );INSERT INTO absence VALUES ( ); 文件剩下的部分有更多的INSERT和CREATE TABLE語句組成 如果你想壓縮備份 使用類似如下的命令 %mysqldump samp_db | gzip /usr/archives/mysql/samp_db gz如果你要一個龐大的數(shù)據(jù)庫 輸出文件也將很龐大 可能難于管理 如果你愿意 你可以在mysqldump命令行的數(shù)據(jù)庫名后列出單獨的表名來傾到它們的內(nèi)容 這將傾倒文件分成較小 更易于管理的文件 下例顯示如何將samp_db數(shù)據(jù)庫的一些表傾到進分開的文件中 %mysqldump samp_db student score event absence grapbook sql%mysqldump samp_db member president hist league sql如果你生成準備用于定期刷新另一個數(shù)據(jù)庫內(nèi)容的備份文件 你可能想用 add drop table選項 這告訴服務(wù)器將DROP TABLE IF EXISTS語句寫入備份文件 然后 當你取出備份文件并把它裝載進第二個數(shù)據(jù)庫時 如果表已經(jīng)存在 你不會得到一個錯誤 如果你倒出一個數(shù)據(jù)庫以便能把數(shù)據(jù)庫轉(zhuǎn)移到另一個服務(wù)器 你甚至不必創(chuàng)建備份文件 要保證數(shù)據(jù)庫存在于另一臺主機 然后用管道傾倒數(shù)據(jù)庫 這樣mysql能直接讀取mysqldump的輸出 例如 你想從主機拷貝數(shù)據(jù)庫samp_db到 可以這樣很容易做到 %mysqladmin h create samp_db%mysqldump samp_db | mysql h samp_db以后 如果你想再次刷新上的數(shù)據(jù)庫 跳過mysqladmin命令 但要對mysqldump加上 add drop table以避免的得到表已存在的錯誤 %mysqldump add drop table samp_db | mysql h samp_dbmysqldump其它有用的選項包括 flush logs和 lock tables組合將對你的數(shù)據(jù)庫檢查點有幫助 lock tables鎖定你正在傾倒的所有表 而 flush logs關(guān)閉并重新打開更新日志文件 新的更新日志將只包括從備份點起的修改數(shù)據(jù)庫的查詢 這將設(shè)置你的更新日志檢查點位備份時間 (然而如果你有需要執(zhí)行個更新的客戶 鎖定所有表對備份期間的客戶訪問不是件好事 )如果你使用 flush logs設(shè)置檢查點到備份時 有可能最好是傾倒整個數(shù)據(jù)庫 如果你傾倒單獨的文件 較難將更新日志檢查點與備份文件同步 在恢復(fù)期間 你通常按數(shù)據(jù)庫為基礎(chǔ)提取更新日志內(nèi)容 對單個表沒有提取更新的選擇 所以你必須自己提取它們 缺省地 mysqldump在寫入前將一個表的整個內(nèi)容讀進內(nèi)存 這通常確實不必要 并且實際上如果你有一個大表 幾乎是失敗的 你可用 quick選項告訴mysqldump只要它檢索出一行就寫出每一行 為了進一步優(yōu)化傾倒過程 使用 opt而不是 quick opt選項打開其它選項 加速數(shù)據(jù)的傾倒和把它們讀回 用 opt實施備份可能是最常用的方法 因為備份速度上的優(yōu)勢 然而 要警告你 opt選項確實有代價 opt優(yōu)化的是你的備份過程 不是其他客戶對數(shù)據(jù)庫的訪問 opt選項通過一次鎖定所有表阻止任何人更新你正在傾倒的任何表 你可在一般數(shù)據(jù)庫訪問上很容易看到其效果 當你的數(shù)據(jù)庫一般非常頻繁地使用 只是一天一次地調(diào)節(jié)備份 一個具有 opt的相反效果的選項是 dedayed 該選項使得mysqldump寫出INSERT DELAYED語句而不是INSERT語句 如果你將數(shù)據(jù)文件裝入另一個數(shù)據(jù)庫并且你想是這個操作對可能出現(xiàn)在該數(shù)據(jù)庫中的查詢的影響最小 delayed對此很有幫助 press選項在你拷貝數(shù)據(jù)庫到另一臺機器上時很有幫助 因為它減少網(wǎng)絡(luò)傳輸字節(jié)的數(shù)量 下面有一個例子 注意到 press對與遠端主機上的服務(wù)器通信的程序才給出 而不是對與本地主機連接的程序 %mysqldump opt samp_db | mysql press h samp_dbmysqldump有很多選項 詳見《MySQL參考手冊》 使用直接拷貝數(shù)據(jù)庫的備份和拷貝方法 另一種不涉及mysqldump備份數(shù)據(jù)庫和表的方式是直接拷貝數(shù)據(jù)庫表文件 典型地 這用諸如cp tar或cpio實用程序 本文的例子使用cp 當你使用一種直接備份方法時 你必須保證表不在被使用 如果服務(wù)器在你則正在拷貝一個表時改變它 拷貝就失去意義 保證你的拷貝完整性的最好方法是關(guān)閉服務(wù)器 拷貝文件 然后重啟服務(wù)器 如果你不想關(guān)閉服務(wù)器 要在執(zhí)行表檢查的同時鎖定服務(wù)器 如果服務(wù)器在運行 相同的制約也適用于拷貝文件 而且你應(yīng)該使用相同的鎖定協(xié)議讓服務(wù)器 安靜下來 假設(shè)服務(wù)器關(guān)閉或你已經(jīng)鎖定了你想拷貝的表 下列顯示如何將整個samp_db數(shù)據(jù)庫備份到一個備份目錄(DATADIR表示服務(wù)器的數(shù)據(jù)目錄) %cd DATADIR%cp r samp_db /usr/archive/mysql單個表可以如下備份 %cd DATADIR/samp_db%cp member * /usr/archive/mysql/samp_db%cp score * /usr/archive/mysql/samp_db 當你完成了備份時 你可 lishixinzhi/Article/program/MySQL/201311/29384
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了安源免費建站歡迎大家使用!
一、數(shù)據(jù)備份
1、使用mysqldump命令備份
mysqldump命令將數(shù)據(jù)庫中的數(shù)據(jù)備份成一個文本文件。表的結(jié)構(gòu)和表中的數(shù)據(jù)將存儲在生成的文本文件中。
mysqldump命令的工作原理很簡單。它先查出需要備份的表的結(jié)構(gòu),再在文本文件中生成一個CREATE語句。然后,將表中的所有記錄轉(zhuǎn)換成一條INSERT語句。然后通過這些語句,就能夠創(chuàng)建表并插入數(shù)據(jù)。
1、備份一個數(shù)據(jù)庫
mysqldump基本語法:
mysqldump -u username -p dbname table1 table2 ...- BackupName.sql
其中:
dbname參數(shù)表示數(shù)據(jù)庫的名稱;
table1和table2參數(shù)表示需要備份的表的名稱,為空則整個數(shù)據(jù)庫備份;
BackupName.sql參數(shù)表設(shè)計備份文件的名稱,文件名前面可以加上一個絕對路徑。通常將數(shù)據(jù)庫被分成一個后綴名為sql的文件;
使用root用戶備份test數(shù)據(jù)庫下的person表
mysqldump -u root -p test person D:\backup.sql
其生成的腳本如下:
文件的開頭會記錄MySQL的版本、備份的主機名和數(shù)據(jù)庫名。
文件中以“--”開頭的都是SQL語言的注釋,以"/*!40101"等形式開頭的是與MySQL有關(guān)的注釋。40101是MySQL數(shù)據(jù)庫的版本號,如果MySQL的版本比1.11高,則/*!40101和*/之間的內(nèi)容就被當做SQL命令來執(zhí)行,如果比4.1.1低就會被當做注釋。
2、備份多個數(shù)據(jù)庫
語法:
mysqldump -u username -p --databases dbname2 dbname2 Backup.sql
加上了--databases選項,然后后面跟多個數(shù)據(jù)庫
mysqldump -u root -p --databases test mysql D:\backup.sql
3、備份所有數(shù)據(jù)庫
mysqldump命令備份所有數(shù)據(jù)庫的語法如下:
mysqldump -u username -p -all-databases BackupName.sql
示例:
mysqldump -u -root -p -all-databases D:\all.sql
2、直接復(fù)制整個數(shù)據(jù)庫目錄
MySQL有一種非常簡單的備份方法,就是將MySQL中的數(shù)據(jù)庫文件直接復(fù)制出來。這是最簡單,速度最快的方法。
不過在此之前,要先將服務(wù)器停止,這樣才可以保證在復(fù)制期間數(shù)據(jù)庫的數(shù)據(jù)不會發(fā)生變化。如果在復(fù)制數(shù)據(jù)庫的過程中還有數(shù)據(jù)寫入,就會造成數(shù)據(jù)不一致。這種情況在開發(fā)環(huán)境可以,但是在生產(chǎn)環(huán)境中很難允許備份服務(wù)器。
注意:這種方法不適用于InnoDB存儲引擎的表,而對于MyISAM存儲引擎的表很方便。同時,還原時MySQL的版本最好相同。
3、使用mysqlhotcopy工具快速備份
一看名字就知道是熱備份。因此,mysqlhotcopy支持不停止MySQL服務(wù)器備份。而且,mysqlhotcopy的備份方式比mysqldump快。mysqlhotcopy是一個perl腳本,主要在Linux系統(tǒng)下使用。其使用LOCK TABLES、FLUSH TABLES和cp來進行快速備份。
原理:先將需要備份的數(shù)據(jù)庫加上一個讀鎖,然后用FLUSH TABLES將內(nèi)存中的數(shù)據(jù)寫回到硬盤上的數(shù)據(jù)庫,最后,把需要備份的數(shù)據(jù)庫文件復(fù)制到目標目錄。
命令格式如下:
[root@localhost ~]# mysqlhotcopy [option] dbname1 dbname2 backupDir/
dbname:數(shù)據(jù)庫名稱;
backupDir:備份到哪個文件夾下;
常用選項:
--help:查看mysqlhotcopy幫助;
--allowold:如果備份目錄下存在相同的備份文件,將舊的備份文件加上_old;
--keepold:如果備份目錄下存在相同的備份文件,不刪除舊的備份文件,而是將舊的文件更名;
--flushlog:本次輩分之后,將對數(shù)據(jù)庫的更新記錄到日志中;
--noindices:只備份數(shù)據(jù)文件,不備份索引文件;
--user=用戶名:用來指定用戶名,可以用-u代替;
--password=密碼:用來指定密碼,可以用-p代替。使用-p時,密碼與-p之間沒有空格;
--port=端口號:用來指定訪問端口,可以用-P代替;
--socket=socket文件:用來指定socket文件,可以用-S代替;
mysqlhotcopy并非mysql自帶,需要安裝Perl的數(shù)據(jù)庫接口包;下載地址為:
目前,該工具也僅僅能夠備份MyISAM類型的表。
二、數(shù)據(jù)還原
1、還原使用mysqldump命令備份的數(shù)據(jù)庫的語法如下:
mysql -u root -p [dbname] backup.sq
示例:
mysql -u root -p C:\backup.sql
2、還原直接復(fù)制目錄的備份
通過這種方式還原時,必須保證兩個MySQL數(shù)據(jù)庫的版本號是相同的。MyISAM類型的表有效,對于InnoDB類型的表不可用,InnoDB表的表空間不能直接復(fù)制。
恢復(fù)整個數(shù)據(jù)庫首先,如果要恢復(fù)的數(shù)據(jù)庫是含有授權(quán)表的mysql數(shù)據(jù)庫,將需要使用--skip-grant-tables選項運行服務(wù)器。否則,服務(wù)器將抱怨無法找到授權(quán)表。在恢復(fù)表之后,執(zhí)行mysqladmin flush-privileges 來告訴服務(wù)器加載授權(quán)表,并用它們啟動。將原數(shù)據(jù)庫目錄的內(nèi)容拷貝到其他的地方。例如,您可能會在稍后用它們進行崩潰表的事后分析檢查(post-mortem examination)。用最新的備份文件重新加載數(shù)據(jù)庫。如果您打算使用由mysqldump 加載的文件,則需要將它們作為mysql的輸入。如果打算使用從數(shù)據(jù)庫中直接拷貝的文件(如,用tar 或c p),則將它們直接拷貝回到該數(shù)據(jù)庫目錄中。但是,在這種情況下,應(yīng)該在拷貝這些文件之前關(guān)閉服務(wù)器,然后再重新啟動它。用更新日志重做在進行備份后又修改了數(shù)據(jù)庫表的查詢。對于所有可用的更新日志,可使用它作為mysql的輸入。指定--one-database 選項,使mysql只對想要恢復(fù)的數(shù)據(jù)庫執(zhí)行查詢。如果您知道需要使用所有的更新日志文件,可在包含日志的目錄中使用下列命令:% ls-t-r-l update.(0-9)* | xargs cat | mysql--one-database db_namels 命令產(chǎn)生更新日志文件的單列列表,更新日志文件根據(jù)服務(wù)器生成的順序進行排序(要知道,如果您修改了其中的任何文件,排序的順序都將改變,這將導(dǎo)致更新日志按錯誤的順序使用)。您很可能必須使用某些更新日志。例如,如果自備份以來所產(chǎn)生的日志命名為update.392、pdate.393 等等,可以重新運行它們中的命令:% mysql--one-database db_name updata.392% mysql--one-database db_name updata.393…如果正在運行恢復(fù)并打算使用更新日志恢復(fù)由于失策的DROP DATA BASE、DROPTABLE或DELETE 語句而丟失的信息,應(yīng)確保先從更新日志中刪除這些語句?;謴?fù)單個的表恢復(fù)單個表是很困難的。如果有通過mysqldump 生成的備份文件并且它恰好不包含您想要的表數(shù)據(jù),則需要抽取相關(guān)的行并用它們作為mysql的輸入,這部分較容易。困難的是抽取應(yīng)用于該表的更新日志的片段。您會發(fā)現(xiàn): mysql_find_rows 實用程序?qū)@方面有幫助,它可以從更新日志中抽取多行查詢。另一種可能性是用另一個服務(wù)器恢復(fù)整個數(shù)據(jù)庫,然后將所要的該表的文件拷貝到原始數(shù)據(jù)庫中。這實際很容易!在將文件拷貝回數(shù)據(jù)庫目錄時,應(yīng)確保原始數(shù)據(jù)庫的服務(wù)器關(guān)閉。
備份數(shù)據(jù)庫
使用mysqldump命令備份數(shù)據(jù)庫
還原數(shù)據(jù)庫
1、使用mysql命令還原數(shù)據(jù)庫
將game_backup.sql 還原至 game 數(shù)據(jù)庫:
2、使用source命令還原數(shù)據(jù)庫
如果數(shù)據(jù)庫過大,建議可以使用source命令
一、Mysql數(shù)據(jù)庫備份指令格式:
mysqldump -h主機名 -P端口 -u用戶名 -p密碼 (–database) 數(shù)據(jù)庫名 文件名.sql
注:直接cmd執(zhí)行該指令即可,不需要先mysql -u root -p鏈接數(shù)據(jù)庫
1、備份MySQL數(shù)據(jù)庫的命令
mysqldump -hhostname -uusername -ppassword databasename backupfile.sql
2、備份MySQL數(shù)據(jù)庫為帶刪除表的格式,能夠讓該備份覆蓋已有數(shù)據(jù)庫而不需要手動刪除原有數(shù)據(jù)庫。
mysqldump -–add-drop-table -uusername -ppassword databasename backupfile.sql
二、數(shù)據(jù)庫還原有三種方式:source命令、mysql、gunzip命令
1、source 命令
進入mysql數(shù)據(jù)庫控制臺,
mysql -u root -p
mysqluse 數(shù)據(jù)庫
然后使用source命令,后面參數(shù)為腳本文件(如這里用到的.sql)
mysqlsource /home/work/db/bkdb.sql
2、mysql
mysql -hhostname -uusername -ppassword databasename backupfile.sql
3、gunzip
gunzip backupfile.sql.gz | mysql -uusername -ppassword databasename
在實際工作中,一個MySQL實例中可能有多個database。而我們備份時,通常采用完全備份,將所有database都備份到一個文件中。
但是,偶爾會遇到只恢復(fù)一個database或者一個表的情況。怎么解決呢?科多大數(shù)據(jù)帶你來看看。
一、利用全備恢復(fù)一個庫 (database) 的數(shù)據(jù)
案例:朋友在群里問, MySQL全庫備份。如何只恢復(fù)一個庫?
1、采用–one-database 選項。不建議使用該方式,經(jīng)常出現(xiàn)問題。
# mysql -uroot -pxx -D db1 -o
2、從全備份文件中將需要的庫的建表語句和INSERT數(shù)據(jù)拿出來,然后再導(dǎo)入
# sed -n '/^-- Current Database: `db1`/,/^-- Current Database: `/p' all.dmp db1.sql
# mysql -uroot -pxx -D db1
二、利用全備恢復(fù)一張表 (table) 的數(shù)據(jù)
生產(chǎn)中遇到開發(fā)同事更新表時未加上where條件,造稱 order_status 列所有數(shù)據(jù)都被更新為0.
通常,mysqldump對全庫進行備份?;謴?fù)時如果恢復(fù)全庫,太耗時間又沒有必要。所以,我們只恢復(fù)想要的表即可。
mysqldump備份中,既有表結(jié)構(gòu),又有INSERT INTO語句包含數(shù)據(jù)。所以獲得者兩部分內(nèi)容即可。
1、獲得表結(jié)構(gòu)
# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `ecs_ugo_order_info`/!d;q' mysqldump_2017-05-23.sql
2、獲得INSERT INTO 語句,用于數(shù)據(jù)的恢復(fù)
# grep -i 'INSERT INTO `ecs_ugo_order_info`' mysqldump_2017-05-23.sql data.sql
3、根據(jù)得到的表結(jié)構(gòu)創(chuàng)建表,并導(dǎo)入數(shù)據(jù)
mysql -uroot -pxxx xx
4、拼接update語句
mysql select concat('update xx.ecs_ugo_order_info set order_status=',order_status,' where order_id=',order_id,';') from ecs_ugo_order_info into outfile '/tmp/ecs_ugo_order_info_rercovery.sql';
結(jié)果如下:
1.update xx.ecs_ugo_order_info set order_status=6 where order_id=3254778;
2.update xx.ecs_ugo_order_info set order_status=6 where order_id=3254824;
3.update xx.ecs_ugo_order_info set order_status=6 where order_id=3254870;
5、在生產(chǎn)庫中將order_status恢復(fù)成正常值
# mysql -uroot -pxxx xx /tmp/ecs_ugo_order_info_rercovery.sql