7.2.1 数据库备份和恢复
用户可以使用select into…outfile语句把表数据导出到一个文本文件中,并用load data…infile语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复表的原来结构。
语法格式:
其中,“输出选项”为:
语法说明:
①使用outfile时,可以在输出选项中加入两个自选的字句,它们的作用是决定数据行在文件中存放的格式。
②fileds子句,在fields子句中有terminated by、[optionally]enclosed by和escaped by三个亚子句。如果指定了fileds字句,则这3个亚子句中至少要指定一个。其中,terminated by用来指定字段值之间的符号,例如,terminated by指定逗号作为两个字段值之间的标志;enclosed by子句用来指定包裹文件中字符值的符号,例如,enclosed by
表示文件中字符值放在双引号之间,若加上关键字optionally,表示所有的值都放在双引号之间;escaped by子句用来指定转义字符,例如,escaped by
将*指定为转义字符,取代\,如空格将表示为*N。③lines子句在lines子句中使用terminated by指定一行结束的标记,如lines terminated by
表示一行以?作为结束标志。
④如果fields和lines子句都不指定,则默认声明以下子句。
如果使用dumpfile而不是outfile,导出文件中所有的行都彼此紧密挨着放置,值和行之间没有任何标记,成了一个长长的值。
该语句的作用是将表中select语句选中的行写入一个文件中,file_name是文件的名称,文件默认在服务器主机上创建,并且文件名不能是已经存在的(这可能将原文件覆盖)。如果要将该文件写入一个特定位置,则要在文件名前加上具体的路径。在文件中,数据行以一定的形式存放,空值用\N表示。
load data…infile语句是select into…outfile的补充,该语句可以将一个文件中的数据导入到数据库中。
语句格式:
语法说明:
①文件名,待载入的文件名,文件中保存了待存入数据库的数据行。待载入的文件可以手动创建也可以使用其他的程序创建。载入文件时,可以指定文件的绝对路径,如D:/file/myfile.txt,则服务器根据该路径搜索文件。若不指定路径,如myfile.txt,则服务器在默认数据库的数据目录中读取。若文件为./myfile.txt,则服务器直接在数据目录下读取,即MySQL的data目录。出于安全原因,当读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。
注:这里使用“/”指定Windows路径而不是“\”。
②表名,需要导入数据表的名,该表在数据库中必须存在,表结构必须与导入文件的数据行一致。
③fields子句,此处的fileds子句和select…into outfile语句类似。用于判断字段之间和数据行之间的符号。
④lines子句,terminated by亚子句用来指定一行结束的标志;starting by亚子句则指定一个前缀,导入数据行时,忽略行中该前缀和前缀之前的内容,如果某行不包括该前缀,则整行被跳过。
例如,文件myfile.txt中有以下内容:
导入数据时,添加以下子句:
最后只得到数据("row",1)和("row",2)。
【例7.1】备份bookstore数据库的members表中数据到d盘file目录中,要求字段值是字符就用双引号标注,字段值之间用逗号隔开,每行以“?”为结束标志。备份后的数据导入到一个和members表结构一样的空表member_copy中。
①导出数据。
SQL代码:
导出成功后,可以查看d盘file文件夹下的myfile1.txt文件。
②文件备份完后,可以将文件中的数据导入到member_copy表中,使用以下命令。
SQL代码:
在导入数据时,必须根据文件中数据行的格式指定判断的符号。例如,在myfile1.txt文件中,字段值是以逗号隔开的,导入数据时一定要使用terminated by子句指定逗号为字段值之间的分隔符,与select…into outfile语句相对应。