MySQL心得8-2-使用SQL语句备份和恢复表数据(非重点)

时间:2024-03-07 09:22:27

1. 使用SQL语句备份和恢复表数据(提一下,不细讲)

用户可以使用SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。

SELECT INTO…OUTFILE格式:

SELECT *  INTO OUTFILE \'file_name\' export_options

          |DUMPFILE \'file_name\'

其中,export_options为:

[FIELDS

       [terminated BY \'string\']

       [[optionally] ENCLOSED BY \'char\']

       [escaped BY \'char\' ]

]

[LINES TERMINATED BY \'string\' ]

说明:

这个语句的作用是将表中SELECT语句选中的行写入到一个文件中,file_name是文件的名称。文件默认在服务器主机上创建,并且文件名不能是已经存在的(这可能将原文件覆盖)。如果要将该文件写入到一个特定的位置,则要在文件名前加上具体的路径。在文件中,数据行以一定的形式存放,空值用“\N”表示。

使用OUTFILE时,可以在export_options中加入以下两个自选的子句,它们的作用是决定数据行在文件中存放的格式:

●  fields子句:在FIELDS子句中有三个亚子句:TERMINATED BY、 [OPTIONALLY] ENCLOSED BY和ESCAPED BY。如果指定了FIELDS子句,则这三个亚子句中至少要指定一个。

(1)TERMINATED BY用来指定字段值之间的符号,例如,“TERMINATED BY \',\'”指定了逗号作为两个字段值之间的标志。

(2)ENCLOSED BY子句用来指定包裹文件中字符值的符号,例如,“ENCLOSED BY \' " \'”表示文件中字符值放在双引号之间,若加上关键字OPTIONALLY表示所有的值都放在双引号之间。

(3)ESCAPED BY子句用来指定转义字符,例如,“ESCAPED BY \'*\'”将“*”指定为转义字符,取代“\”,如空格将表示为“*N”。

●   LINES子句:在LINES子句中使用TERMINATED BY指定一行结束的标志,如“LINES TERMINATED BY \'?\'”表示一行以“?”作为结束标志。

如果FIELDS和LINES子句都不指定,则默认声明以下子句:

FIELDS TERMINATED BY \'\t\'ENCLOSED BY \'\' ESCAPED BY \'\\\'

LINES TERMINATED BY \'\n\'

如果使用DUMPFILE而不是使用OUTFILE,导出的文件里所有的行都彼此紧挨着放置,值和行之间没有任何标记,成了一个长长的值。

5.LOAD DATA …INFILE语句是SELECT INTO…OUTFILE语句的补语,该语句可以将一个文件中的数据导入到数据库中。

LOAD DATA …INFILE格式:

LOAD DATA [LOW_PRIORITY | concurrent][LOCAL] INFILE \'file_name.txt\'

   [replace | ignore]

   INTO TABLE tbl_name

   [FIELDS

       [TERMINATED BY \'string\']

       [[OPTIONALLY] ENCLOSED BY \'char\']

       [ESCAPED BY \'char\' ]

   ]

   [LINES

       [STARTING BY \'string\']

       [TERMINATED BY \'string\']

   ]

   [IGNORE number LINES]

   [(col_name_or_user_var,...)]

   [SET col_name = expr,...)]

说明:

●   LOW_PRIORITY | CONCURRENT:若指定LOW_PRIORITY,则延迟语句的执行。若指定CONCURRENT,则当LOAD DATA正在执行的时候,其他线程可以同时使用该表的数据

●   LOCAL:若指定了LOCAL,则文件会被客户主机上的客户端读取,并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。若未指定LOCAL,则文件必须位于服务器主机上,并且被服务器直接读取。与让服务器直接读取文件相比,使用LOCAL速度略慢,这是因为文件的内容必须通过客户端发送到服务器上。

●  file_name:待载入的文件名,文件中保存了待存入数据库的数据行。输入文件可以手动创建,也可以使用其他的程序创建。可以指定文件的绝对路径,如“D:/file/myfile.txt”,则服务器根据该路径搜索文件。若不指定路径,如“myfile.txt”,则服务器在默认数据库的数据库目录中读取。若文件为“./myfile.txt”,则服务器直接在数据目录下读取,即MySQL的data目录。出于安全原因,当读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。

注意:这里使用正斜杠指定Windows路径名称,而不是使用反斜杠。

●  tb_name:需要导入数据的表名,该表在数据库中必须存在,表结构必须与导入文件的数据行一致。

●  REPLACE | IGNORE:如果指定了REPLACE则当文件中出现与原有行相同的唯一关键字值时,输入行会替换原有行。如果指定了IGNORE则把与原有行有相同的唯一关键字值的输入行跳过

●   FIELDS子句:此处的FIELDS子句和SELECT..INTO OUTFILE语句中类似。用于判断字段之间和数据行之间的符号。

●  LINES子句:TERMINATED BY亚子句用来指定一行结束的标志。STARTING BY亚子句则指定一个前缀,导入数据行时,忽略行中的该前缀和前缀之前的内容。如果某行不包括该前缀,则整个行被跳过。

●  IGNORE number LINES:这个选项可以用于忽略文件的前几行。例如,可以使用IGNORE 1 LINES来跳过第一行。

●  col_name_or_user_var:如果需要载入一个表的部分列或文件中字段值顺序与表中列的顺序不同,就必须指定一个列清单,其中可以包含列名或用户变量。

SET子句:SET子句可以在导入数据时修改表中列的值。

例: 备份XSCJ数据库中的KC表中数据到D盘FILE目录中,要求字段值如果是字符就用双引号标注,字段值之间用逗号隔开,每行以“?”为结束标志。最后将备份后的数据导入到一个和KC表结构一样的空表COURSE表中。

首先导出数据

USE XSCJ;

SELECT * FROM KC

   INTO OUTFILE\'D:/FILE/myfile1.txt\'

     FIELDS  TERMINATED BY \' , \'

        OPTIONALLYENCLOSED BY \' " \'

     LINES TERMINATED BY \'? \';

文件备份完后可以将文件中的数据导入到COURSE表中,使用以下命令:

LOAD DATA INFILE \'D:/FILE/myfile1.txt\'

   INTO TABLE COURSE

     FIELDS  TERMINATED BY \' , \'

          OPTIONALLYENCLOSED BY \' " \'

     LINES TERMINATED BY \'? \';

注意:在导入数据时,必须根据文件中数据行的格式指定判断的符号。例如,在myfile1.txt文件中字段值是以逗号隔开的,导入数据时一定要使用“TERMINATED BY \',\'”子句指定逗号为字段值之间的分隔符,与SELECT…INTOOUTFILE语句相对应。

因为MySQL表保存为文件形式,所以备份很容易。但是在多个用户使用MySQL的情况下,为了得到一个一致的备份,在相关的表上需要做一个读锁定,防止在备份过程中表被更新;当恢复数据时,需要一个写锁定,以避免冲突。在备份或恢复完以后要对表进行解锁。

2.   启用日志

二进制日志可以在启动服务器的时候启用,这需要修改C:\Program Files\MySQL文件夹中的my.ini选项文件。打开该文件,找到[mysqld]所在行,在该行后面加上以下格式的一行:

 log-bin[=filename]

说明:加入该选项后,服务器启动时就会加载该选项,从而启用二进制日志。如果filename包含扩展名,则扩展名被忽略。MySQL服务器为每个二进制日志名后面添加一个数字扩展名。每次启动服务器或刷新日志时该数字增加1。如果filename未给出,则默认为主机名。假设这里filename取名为bin_log。若不指定目录,则在MySQL的data目录下自动创建二进制日志文件。由于下面使用mysqlbinlog工具处理日志时,日志必须处于bin目录下,所以日志的路径就指定为bin目录,添加的行改为以下一行:

log-bin=C:/Program Files/MySQL/MySQLServer 5.1/bin/bin_log

保存,重启服务器。重启服务器的方法可以是:

先关闭服务器,

net stop mysql 

再启动服务器:

net start mysql

此时,MySQL安装目录的bin目录下多出两个文件:bin_log.000001和bin_log.index。bin_log.000001就是二进制日志文件,以二进制形式存储,用于保存数据库更新信息。当这个日志文件大小达到最大,MySQL还会自动创建新的二进制文件。bin_log.index是服务器自动创建的二进制日志索引文件,包含所有使用的二进制日志文件的文件名

使用mysqlbinlog实用工具可以检查二进制日志文件。命令格式为:  mysqlbinlog[options] log-files...

说明:log-files是二进制日志的文件名。

例如,运行以下命令可以查看bin_log.000001的内容:

mysqlbinlog bin_log.000001

由于二进制数据可能非常庞大,无法在屏幕上延伸,可以保存到文本文件中

mysqlbinlogbin_log.000001>D:/FILE/lbin-log000001.txt

使用日志恢复数据的命令格式如下:

mysqlbinlog [options] log-files… |mysql [options]

例: 假设用户在星期一下午1点使用mysqldump工具进行数据库XSCJ的完全备份,备份文件为file.sql。从星期一下午1点开始用户启用日志,bin_log.000001文件保存了从星期一下午1点到星期二下午1点的所有更改,在星期二下午1点运行一条SQL语句:

Flush logs;

此时创建了bin_log.000002文件,在星期三下午1点时数据库崩溃。现要将数据库恢复到星期三下午1点时的状态。首先将数据库恢复到星期一下午1点时的状态,在DOS窗口输入以下命令:

mysqldump -uroot -p123456 XSCJ<file.sql

使用以下命令将数据库恢复到星期二下午时的状态:

mysqlbinlog bin_log.000001 | mysql-uroot -p123456

再使用以下命令即可将数据库恢复到星期三下午1点时的状态:

mysqlbinlog bin_log.000002 | mysql-uroot -p123456

由于日志文件要占用很大的硬盘资源,所以要及时将没用的日志文件清除掉。以下这条SQL语句用于清除所有的日志文件:

Reset master;

如果要删除部分日志文件,可以使用purge master logs语句。

语法格式为:PURGE {MASTER |BINARY} LOGS TO \'log_name\'

或: PURGE {MASTER | BINARY} LOGS BEFORE \'date\'

说明:第一个语句用于删除特定的日志文件,log_name为文件名。第二个语句用于删除时间date之前的所有日志文件。MASTER和BINARY是同义词。