本次使用的MySQL版本為8.0.20
目錄
一、數(shù)據(jù)備份
1.使用 MySQLdump 命令備份
(1)使用MySQLdump備份單個數(shù)據(jù)庫中的所有表
案例:完成數(shù)據(jù)插入后,輸入備份命令如下:
(2)使用MySQLdump備份數(shù)據(jù)庫中的某個表
案例:備份booksDB數(shù)據(jù)庫中的books表,輸入語句如下:
(3)使用MySQLdump備份多個數(shù)據(jù)庫
案例:使用MySQLdump備份booksDB和test_db數(shù)據(jù)庫,輸入語句如下:
二、數(shù)據(jù)恢復(fù)
1.使用MySQL命令恢復(fù)
案例:使用MySQL命令將C:\backup\booksdb_20190301.sql文件中的備份導(dǎo)入到數(shù)據(jù)庫中,輸入語句如下:
案例:使用root用戶登錄到服務(wù)器,然后使用source導(dǎo)入本地的備份文件bookdb_20221016.sql,輸入語句如下:
三、表的導(dǎo)出和導(dǎo)入
1.使用MySQLdump命令導(dǎo)出文本文件
案例:使用MySQLdump將test_db數(shù)據(jù)庫person表中的記錄導(dǎo)出到文本文件,執(zhí)行的命令如下:?
案例:使用MySQLdump命令將test_db數(shù)據(jù)庫person表中的記錄導(dǎo)出到文本文件,使用FIELDS選項,要求字段之間使用逗號“,”間隔,所有字符類型字段值用雙引號括起來,定義轉(zhuǎn)義字符為問號“?”,每行記錄以回車換行符“\r\n”結(jié)尾,執(zhí)行的命令如下:?
2.使用MySQLimport命令導(dǎo)入文本文件
案例:使用MySQLimport命令將D盤目錄下的person.txt文件內(nèi)容導(dǎo)入到test_db數(shù)據(jù)庫中,字段之間使用逗號“,”間隔,字符類型字段值用雙引號括起來,將轉(zhuǎn)義字符定義為問號“?”,每行記錄以回車換行符“\r\n”結(jié)尾,執(zhí)行的命令如下:?
一、數(shù)據(jù)備份
1.使用 MySQLdump 命令備份
????????MySQLdump 是 MySQL 提供的一個非常有用的數(shù)據(jù)庫備份工具。MySQLdump 命令執(zhí)行時,可以將數(shù)據(jù)庫備份成一個文本文件,該文件中實際包含了多個 CREATE 和 INSERT 語句,使用這些語句可以重新創(chuàng)建表和插入數(shù)據(jù)。
????????MySQLdump 備份數(shù)據(jù)庫語句的基本語法格式如下:
mysqldump -u user -h host -ppassword dbname[tbname, [tbname...]] > filename.sql
????????user表示用戶名稱;host表示登錄用戶的主機名稱;password為登錄密碼;dbname為需要備 份的數(shù)據(jù)庫名稱;tbname為dbname數(shù)據(jù)庫中需要備份的數(shù)據(jù)表,可以指定多個需要備份的表;右 箭頭符號“>”告訴MySQLdump將備份數(shù)據(jù)表的定義和數(shù)據(jù)寫入備份文件;filename.sql為備份文件的名稱。
(1)使用MySQLdump備份單個數(shù)據(jù)庫中的所有表
????????為了更好地理解MySQLdump工具是如何工作的,這里給出一個完整的數(shù)據(jù)庫例子。首先登錄MySQL,按下面數(shù)據(jù)庫結(jié)構(gòu)創(chuàng)建booksDB數(shù)據(jù)庫和各個表,并插入數(shù)據(jù)記錄。數(shù)據(jù)庫和表定義如下:
[root@client01 home]# mysql -uroot -p123456
CREATE DATABASE booksDB;
use booksDB;
CREATE TABLE books
(
bk_id INT NOT NULL PRIMARY KEY,
bk_title VARCHAR(50) NOT NULL,
copyright YEAR NOT NULL
);
INSERT INTO books
VALUES (11078, 'Learning MySQL', 2010),
(11033, 'Study Html', 2011),
(11035, 'How to use php', 2003),
(11072, 'Teach yourself javascript', 2005),
(11028,'Learning C++', 2005),
(11069, 'MySQL professional', 2009),
(11026, 'Guide to MySQL 8.0', 2008),
(11041, 'Inside VC++', 2011);
CREATE TABLE authors
(
auth_id INT NOT NULL PRIMARY KEY,
auth_name VARCHAR(20),
auth_gender CHAR(1)
);
INSERT INTO authors
VALUES (1001,'WriterX','f'),
(1002,'WriterA','f'),
(1003,'WriterB','m'),
(1004,'WriterC','f'),
(1011,'WriterD','f'),
(1012,'WriterE' ,'m'),
(1013,'WriterF','m'),
(1014,'WriterG' ,'f'),
(1015,'WriterH','f');
CREATE TABLE authorbook
(
auth_id INT NOT NULL,
bk_id INT NOT NULL,
PRIMARY KEY (auth_id, bk_id),
FOREIGN KEY (auth_id) REFERENCES authors (auth_id),
FOREIGN KEY (bk_id) REFERENCES books (bk_id)
);
INSERT INTO authorbook
VALUES (1001, 11033), (1002, 11035), (1003, 11072), (1004, 11028),
(1011, 11078), (1012, 11026),(1012, 11041), (1014, 11069);
exit
-
案例:完成數(shù)據(jù)插入后,輸入備份命令如下:
# 要保證 mysql_back 目錄存在才可執(zhí)行
[root@client01 home]# mysqldump -u root -p booksDB > /home/mysql_back/bookdb_20221016.sql
Enter password:
[root@client01 home]# ls /home/mysql_back/
bookdb_20221016.sql
????????輸入密碼之后,MySQL便對數(shù)據(jù)庫進行了備份,在/home/mysql_back文件夾下面查看剛才備份過的文件,使用VS Code 打開文件可以看到,備份文件包含了一些信息,文件開頭首先表明了備份文件使用的MySQLdump工具的版本號;然后是備份賬戶的名稱和主機信息,以及備份的數(shù)據(jù)庫的名稱,最后是MySQL服務(wù)器的版本號,在這里為8.0.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。其他變量與此類似。
????????備份文件中以“--”字符開頭的行為注釋語句;以“/*!”開頭、“*/”結(jié)尾的語句為可執(zhí)行的MySQL注釋,這些語句可以被MySQL執(zhí)行,但在其他數(shù)據(jù)庫管理系統(tǒng)中將被作為注釋忽略,以提高數(shù)據(jù)庫的可移植性。另外,備份文件開始的一些語句以數(shù)字開頭,代表的是MySQL版本號,這些語句只有在指定的MySQL版本或者比該版本高的情況下才能執(zhí)行。例如,40101,表明這些語句只有在MySQL版本號為4.01.01或者更高的條件下才可以被執(zhí)行。
(2)使用MySQLdump備份數(shù)據(jù)庫中的某個表
其語法格式為:
mysqldump –u user –h host –p dbname [tbname, [tbname...]] > filename.sql
????????tbname表示數(shù)據(jù)庫中的表名,多個表名之間用空格隔開。備份表和備份數(shù)據(jù)庫中所有表的語句中不同的地方在于,要在數(shù)據(jù)庫名稱dbname之后指定需要備份的表名稱。
-
案例:備份booksDB數(shù)據(jù)庫中的books表,輸入語句如下:
[root@client01 mysql_back]# mysqldump -u root -p booksDB books > /home/mysql_back/books_20221017.sql
Enter password:
[root@client01 mysql_back]# ls
bookdb_20221016.sql books_20221017.sql
(3)使用MySQLdump備份多個數(shù)據(jù)庫
????????如果要使用MySQLdump備份多個數(shù)據(jù)庫,就需要使用--databases參數(shù)。備份多個數(shù)據(jù)庫的語句格式如下:
mysqldump –u user –h host –p --databases [dbname, [dbname...]] > filename.sql
????????使用--databases參數(shù)之后,必須指定至少一個數(shù)據(jù)庫的名稱,多個數(shù)據(jù)庫名稱之間用空格隔開。
-
案例:使用MySQLdump備份booksDB和test_db數(shù)據(jù)庫,輸入語句如下:
mysqldump -u root -p --databases booksDB test_db > /home/mysql_back/booksdb_test_db_20221017
另外,使用--all-databases參數(shù)可以備份系統(tǒng)中所有的數(shù)據(jù)庫,語句如下:
mysqldump -u root -p --all-databases > /home/mysql_back/alldbinMySQL.sql
?使用參數(shù)--all-databases時,不需要指定數(shù)據(jù)庫名稱。
二、數(shù)據(jù)恢復(fù)
1.使用MySQL命令恢復(fù)
????????對于已經(jīng)備份的包含CREATE、INSERT語句的文本文件,可以使用MySQL命令導(dǎo)入到數(shù)據(jù)庫中。本此使用MySQL命令導(dǎo)入sql文件的方法。
????????備份的sql文件中包含CREATE、INSERT語句(有時也會有DROP語句)。MySQL命令可以直接執(zhí)行文件中的這些語句。其語法如下:
mysql –u user –p [dbname] < filename.sql
????????user是執(zhí)行backup.sql中語句的用戶名;-p表示輸入用戶密碼;dbname是數(shù)據(jù)庫名。如果filename.sql文件為MySQLdump工具創(chuàng)建的包含創(chuàng)建數(shù)據(jù)庫語句的文件,執(zhí)行的時候不需要指定數(shù)據(jù)庫名。
-
案例:使用MySQL命令將C:\backup\booksdb_20190301.sql文件中的備份導(dǎo)入到數(shù)據(jù)庫中,輸入語句如下:
mysql –u root –p booksDB < /home/mysql_back/bookdb_20221016.sql
????????執(zhí)行該語句前,必須先在MySQL服務(wù)器中創(chuàng)建booksDB數(shù)據(jù)庫,如果不存在恢復(fù)過程將會出錯。命令執(zhí)行成功之后bookdb_20221016.sql文件中的語句就會在指定的數(shù)據(jù)庫中恢復(fù)以前的表。
如果已經(jīng)登錄連接MySQL服務(wù)器,還可以使用source命令導(dǎo)入sql文件。source語句語法如下:
source filename
-
案例:使用root用戶登錄到服務(wù)器,然后使用source導(dǎo)入本地的備份文件bookdb_20221016.sql,輸入語句如下:
--選擇要恢復(fù)到的數(shù)據(jù)庫
mysql> use booksDB;
Database changed
--使用source命令導(dǎo)入備份文件
mysql> source /home/mysql_back/bookdb_20221016.sql
????????命令執(zhí)行后,會列出備份文件bookdb_20221016.sql中每一條語句的執(zhí)行結(jié)果。source命令執(zhí)行成功后,bookdb_20221016.sql中的語句會全部導(dǎo)入到現(xiàn)有數(shù)據(jù)庫中。
執(zhí)行source命令前,必須使用use語句選擇數(shù)據(jù)庫。不然,恢復(fù)過程中會出現(xiàn)“ERROR 1046 (3D000): No database selected”的錯誤。
三、表的導(dǎo)出和導(dǎo)入
1.使用MySQLdump命令導(dǎo)出文本文件
????????前面介紹了使用MySQLdump備份數(shù)據(jù)庫,該工具不僅可以將數(shù)據(jù)導(dǎo)出為包含CREATE、INSERT的sql文件,也可以導(dǎo)出為純文本文件。MySQLdump創(chuàng)建一個包含創(chuàng)建表的CREATE TABLE語句的tablename.sql文件和一個包含其數(shù)據(jù)的tablename.txt文件。MySQLdump導(dǎo)出文本文件的基本語法格式如下:
mysqldump -T path -u root -p dbname [tables] [OPTIONS]
--OPTIONS選項
--fields-terminated-by=value
--fields-enclosed-by=value
--fields-optionally-enclosed-by=value
--fields-escaped-by=value
--lines-terminated-by=value
????????只有指定了-T參數(shù)才可以導(dǎo)出純文本文件;path表示導(dǎo)出數(shù)據(jù)的目錄;tables為指定要導(dǎo)出的表名稱,如果不指定,將導(dǎo)出數(shù)據(jù)庫dbname中所有的表;[OPTIONS]為可選參數(shù)選項,這些選項需要結(jié)合-T選項使用。
使用OPTIONS常見的取值有:
- --fields-terminated-by=value:設(shè)置字段之間的分隔字符,可以為單個或多個字符,默認情況下為制表符“\t”。
- --fields-enclosed-by=value:設(shè)置字段的包圍字符。
- --fields-optionally-enclosed-by=value:設(shè)置字段的包圍字符,只能為單個字符,只能包括CHAR和VERCHAR等字符數(shù)據(jù)字段。
- --fields-escaped-by=value:控制如何寫入或讀取特殊字符,只能為單個字符,即設(shè)置轉(zhuǎn)義字符,默認值為反斜線“\”。
- --lines-terminated-by=value:設(shè)置每行數(shù)據(jù)結(jié)尾的字符,可以為單個或多個字符,默認值為“\n”。
-
案例:使用MySQLdump將test_db數(shù)據(jù)庫person表中的記錄導(dǎo)出到文本文件,執(zhí)行的命令如下:?
mysqldump -T /home/mysql_back test_db person -u root -p
????????語句執(zhí)行成功,/home/mysql_back/目錄下面將會有兩個文件,分別為person.sql和person.txt。person.sql包含創(chuàng)建person表的CREATE語句;person.txt包含數(shù)據(jù)包中的數(shù)據(jù),其內(nèi)容如下:
-
案例:使用MySQLdump命令將test_db數(shù)據(jù)庫person表中的記錄導(dǎo)出到文本文件,使用FIELDS選項,要求字段之間使用逗號“,”間隔,所有字符類型字段值用雙引號括起來,定義轉(zhuǎn)義字符為問號“?”,每行記錄以回車換行符“\r\n”結(jié)尾,執(zhí)行的命令如下:?
mysqldump -T /home/mysql_back test_db person -u root -p --fields-terminated-by=, --fields-optionally-enclosed-by=\" --fields-escaped-by=? --lines-terminated-by=\r\n
Enter password:******
????????上面語句要在一行中輸入,語句執(zhí)行成功,/home/backup/目錄下面將會有兩個文件,分別為person.sql和person.txt。person.sql包含創(chuàng)建person表的CREATE語句,其內(nèi)容與前面例子中的相同,person.txt文件的內(nèi)容與上一個例子不同,顯示如下:
1,"Green",21,"Lawyer"
2,"Suse",22,"dancer"
3,"Mary",24,"Musician"
4,"Willam",20,"sports man"
5,"Laura",25,?N
6,"Evans",27,"secretary"
7,"Dale",22,"cook"
8,"Edison",28,"singer"
9,"Harry",21,"magician"
10,"Harriet",19,"pianist"
????????可以看到,只有字符類型的值被雙引號括了起來,而數(shù)值類型的值沒有;第5行記錄中的NULL值表示為“?N”,使用問號“?”替代了系統(tǒng)默認的反斜線轉(zhuǎn)義字符“\”。
2.使用MySQLimport命令導(dǎo)入文本文件
????????使用MySQLimport可以導(dǎo)入文本文件,并且不需要登錄MySQL客戶端。使用MySQLimport語句需要指定所需的選項、導(dǎo)入的數(shù)據(jù)庫名稱以及導(dǎo)入的數(shù)據(jù)文件的路徑和名稱。MySQLimport命令的基本語法格式如下:
mysqlimport -u root-p dbname filename.txt [OPTIONS]
--OPTIONS選項
--fields-terminated-by=value
--fields-enclosed-by=value
--fields-optionally-enclosed-by=value
--fields-escaped-by=value
--lines-terminated-by=value
--ignore-lines=n
????????dbname為導(dǎo)入的表所在的數(shù)據(jù)庫名稱。注意,MySQLimport命令不指定導(dǎo)入數(shù)據(jù)庫的表名稱,數(shù)據(jù)表的名稱由導(dǎo)入文件名稱確定,即文件名作為表名,導(dǎo)入數(shù)據(jù)之前該表必須存在。
[OPTIONS]為可選參數(shù)選項,其常見的取值有:文章來源:http://www.zghlxwxcb.cn/news/detail-515330.html
- ?--fields-terminated-by= 'value':設(shè)置字段之間的分隔字符,可以為單個或多個字符,默認情況下為制表符“\t”。
- ?--fields-enclosed-by= 'value':設(shè)置字段的包圍字符。
- ?--fields-optionally-enclosed-by= 'value':設(shè)置字段的包圍字符,只能為單個字符,包括CHAR和VERCHAR等字符數(shù)據(jù)字段。
- ?--fields-escaped-by= 'value':控制如何寫入或讀取特殊字符,只能為單個字符,即設(shè)置轉(zhuǎn)義字符,默認值為反斜線“\”。
- ?--lines-terminated-by= 'value':設(shè)置每行數(shù)據(jù)結(jié)尾的字符,可以為單個或多個字符,默認值為“\n”。
- ?--ignore-lines=n:忽視數(shù)據(jù)文件的前n行。
-
案例:使用MySQLimport命令將D盤目錄下的person.txt文件內(nèi)容導(dǎo)入到test_db數(shù)據(jù)庫中,字段之間使用逗號“,”間隔,字符類型字段值用雙引號括起來,將轉(zhuǎn)義字符定義為問號“?”,每行記錄以回車換行符“\r\n”結(jié)尾,執(zhí)行的命令如下:?
mysqlimport -u root -p test_db /home/mysql_back/person.txt --fields-terminated-by=, --fields-optionally-enclosed-by=\" --fields-escaped-by=? --lines-terminated-by=\r\n
上面的語句要在一行中輸入,語句執(zhí)行成功,將把person.txt中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫。文章來源地址http://www.zghlxwxcb.cn/news/detail-515330.html
到了這里,關(guān)于MySQL 數(shù)據(jù)備份與恢復(fù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!