12.1 數據備份的三種方式
12.1.1 使用mysqldump命令備份
mysqldump是MySQL提供的一個非常有用的數據庫備份工具。mysqldump命令執行時,可以將數據庫備份成一個文本文件,該文件中實際上包含了多個CREATE和INSERT語句,使用這些語句可以重新創建表和插入數據。
mysqldump –u user –h host –ppassword dbname[tbname, [tbname...]]> filename.sql
12.1.2 直接復制整個數據庫目錄
因為MySQL表保存為文件方式,所以可以直接復制mysql數據庫的存儲目錄及文件進行備份。
InnoDB存儲引擎的表不適用。使用這種方法備份的數據最好還原到相同版本的服務器中,因為不同的版本可能不兼容。
目錄的位置可在mysql命令行中輸入如下指令找到
show global variables like "%datadir%";
12.1.3 使用mysqlhotcopy工具快速備份
mysqlhotcopy是一個Perl腳本,它使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫。
只可以備份MyISAM類型的表
實例
使用mysqlhotcopy備份test_db數據庫到/user/backup目錄下
mysqlhotcopy -u root -p xxx /user/backup
12.2 數據還原
12.2.1 使用mysql命令還原
對於已經備份的包含CREATE、INSERT語句的文本文件,可以使用mysql命令導入到數據庫中。本小節將介紹mysql命令導入sql文件方法。
mysql -u user -p [dbname] < filename.sql
實例
使用命令將c:\backup\1.sql文件中的備份導入數據庫中
mysql -u root -p xxx <c:/backup/1.sql
12.2.2 直接復制到數據庫目錄
如果數據庫通過復制數據庫文件備份,可以直接復制備份的文件到到MySQL數據目錄下實現還原。通過這種方式還原時,必須保存備份數據的數據庫和待還原的數據庫服務器的主版本號相同。而且這種方式只對MyISAM引擎的表有效。對於InnoDB引擎的表不可用。
12.2.3 mysqlhotcopy快速恢復
mysqlhotcopy備份后的文件也可以用來恢復數據庫,在MySQL服務器停止運行時,將備份的數據庫文件拷貝到MySQL存放數據的位置(MySQL的Data文件夾中),重新啟動MySQL服務即可。如果以根用戶執行該操作,必須指定數據庫文件的所有者。
實例
從mysqlhotcopy復制的備份恢復數據庫
cp -R /user/backup/test user/local/mysql/data
12.3 數據庫遷移
12.3.1 相同版本的MySQL數據庫之間的遷移
相同版本的MySQL數據庫之間的遷移就是在主版本號相同的MySQL數據庫之間進行數據庫移動。遷移過程其實就是在源數據庫備份和目標數據庫還原過程的組合。
實例
將www.abc.com主機上的mysql數據庫全部遷移到www.bcd.com主機上,在www.abc.com主機上執行的命令如下
mysqldump -h www.bac.com -uroot -ppassword dbname | mysql -h www.bcd.com -uroot -ppassword
通過管道符來傳遞命令
12.3.2 不同版本的MySQL數據庫之間的遷移
因為數據庫升級等原因,需要將較舊版本MySQL數據庫中的數據遷移到的較新版本的數據庫中。
12.3.3 不同數據庫之間遷移
不同類型的數據庫之間的遷移,是指從把MySQL的數據庫轉移到其他類型的數據庫,例如從MySQL遷移到ORACLE,從ORACLE遷移到MySQL和從MySQL遷移到sqlserver等。
12.4 表的導出和導入
12.4.1 用SELECT…INTO OUTFILE導出文本文件
MySQL數據庫導出數據時,允許使用包含導出定義的SELECT語句進行數據的導出操作。該文件被創建到服務器主機上。
SELECT columnlist FROM table
WHERE condition
INTO OUTFILE ‘filename’ [OPTIONS]
這里回報一個錯誤
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
這時候需要找到my.ini文件(C:\ProgramData\MySQL\MySQL Server 8.0),然后找到該C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\字段
在其下方添加:
secure-file-priv="D:/"字段即可,並把上方的字段用#注釋掉
12.4.2 用mysqldump命令導出文本文件
mysqldump工具不僅可以將數據導出為包含CREATE、INSERT的sql文件,也可以導出為純文本文件。
mysqldump -T path-u root -p
dbname [tables] [OPTIONS]
12.4.3 用mysql命令導出文本文件
mysql是一個功能豐富的工具命令,還可以在命令行模式下執行SQL指令將查詢結果導入到文本文件中。
mysql -u root -p
--execute=”SELECT 語句” dbname
> filename.txt
12.4.4 用LOAD DATA INFILE方式導入文本文件
LOAD DATA INFILE語句用於高速地從一個文本文件中讀取行,並裝入一個表中。文件名稱必須為一個文字字符串。
LOAD DATA INFILE 'filename.txt'
INTO TABLE tablename [OPTIONS] [IGNORE number LINES]
12.4.5 用mysqlimport命令導入文本文件
mysqlimport可以導入文本文件,使用mysqlimport不需要登錄MySQL客戶端。使用mysqlimport語句需要指定所需的選項、導入的數據庫名稱以及導入的數據文件的路徑和名稱。
mysqlimport –u root –p
dbname filename.txt [OPTIONS]
12.5 綜合案例——數據的備份與恢復
備份有助於保護數據庫,通過備份可以完整保存MySQL中各個數據庫的特定狀態。而通過還原,可防在系統出現故障數據丟失或者不合理操作對數據庫造成的災難時,恢復數據庫中的數據。本章綜合案例將向讀者提供數據庫備份與還原的方法與過程。
一.使用MySQLdump命令將me表備份到d:/beifen/me1.sql
在命令窗口下輸入如下指令
mysqldump -u root -p 1test me > d:/beifen/me1.sql
Enter password: *************
二.使用mysql命令將備份文件me1.sql中的數據恢復到me表
為了驗證恢復之后數據的正確性,刪除me表的所有數據。
mysql> delete from me;
Query OK, 2 rows affected (0.08 sec)
mysql> select * from me;
Empty set (0.00 sec)
然后執行恢復語句 source
mysql> source d:/beifen/me_bk1.sql;
三.使用select ...into outfile語句導出me表中的記錄,導出文件位於d:/下,名稱為me1.txt
mysql> select * from 1test.me into outfile 'd:me1.txt';
四.使用load data infile 語句導入me1.txt數據到me表
首先還是使用delete語句刪除表中的數據
delete from me;
然后執行如下語句
load data infile 'd:/me1.txt' into table 1test.me;
五.將me表中的記錄導出到文件c:/me1.html中
在命令窗口下輸入如下語句
C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -u root -p --html --execute="select * from me;" 1test > c:\1.html
Enter password: *************
疑問解答
MySQLdump備份的文件只能在MySQL中使用么?
MySQLdump備份的文本文件實際上是數據庫的一個副本,使用該文件不僅可以在MySQL中恢復數據庫,而且通過對該文件的簡單修改可以使用該文件在SQL Server或者Sybase等其他數據庫中恢復數據庫。這在某種程度上實現了數據庫之間的遷移。
如何選擇備份工具
直接復制數據文件是最為直接、快速的備份方法,但缺點是基本尚不能實現增量備份。備份時必須確保沒有使用這些表。如果在復制一個表的同時服務器正在修改它,復制就會無效。備份文件時,最好關閉服務器,然后重新啟動服務器。為了保證數據的一致性,需要在本分文件前執行以下SQL語句。
flush tables with read bock
就是把內存中的數據都刷到磁盤中,同時鎖定數據表,以保證復制過程中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接復制回原來的數據庫目錄即可。
MySQLhoscopy是一個PERL程序,它使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫。這是備份數據庫或單個表最快的途徑,但只能運行在數據庫文件所在的機器上,並且MySQLhotcopy只能用於備份MyISAM表。MySQLhotcopy適合小型數據庫的備份數據量不大,可以使用MySQLhotcopy程序每天進行一次完全備份。
mysqldump將數據表導成SQL腳本文件,在不同的mysql版本之間升級時相對比較合適,這也是常用的備份方法。使用MySQLdump比直接復制慢一些
使用mysqldump備份整個數據庫成功,把表和數據庫都刪除,但使用備份文件不能恢復數據庫,是為什么?
出現這種情況,是因為備份的時候沒有指定--databases參數。默認情況下,如果只指定數據庫名稱,mysqldump備份的就是數據庫中所有的表,而不包括數據庫的創建語句。
mysqldump -u root -p booksDB > C:/1.sql;
該語句只備份了booksDB數據庫下所有的表,備份的文件並不寶華創建數據庫的create databases語句,因此如果把booksDB刪除,就必須用MySQL命令行創建booksDB數據庫,並使用use語句選擇booksDB之后才可以恢復。
而下面的語句,在數據庫刪除之后,可以正常恢復備份時的狀態。
mysqldump -u root -p --databases booksDB > C:/2.sql;
該語句不僅備份了所有的數據庫下的表結構,而且包括創建數據庫的語句