MySQL--数据导出与导入
当我们需要将数据库数据导出存储到文本文档,或则从文本文档导入数据时,用下面语句比较方便:
select into outfile
load data infile
SELECT INTO OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA INFILE语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。配合子句实现更复杂的导入导出:
fields子句:
在FIELDS子句中有三个亚子句:TERMINATED BY、 [OPTIONALLY] ENCLOSED BY和ESCAPED BY。如果指定了FIELDS子句,则这三个亚子句中至少要指定一个。
- TERMINATED BY分隔符:用来指定字段值之间的符号,例如,“TERMINATED BY ','”指定了逗号作为两个字段值之间的标志。默认:tab字符(\t)
- ENCLOSED BY字段扩起字符:子句用来指定包裹文件中字符值的符号,例如,“ENCLOSED BY ' " '”表示文件中字符值放在双引号之间,若加上关键字OPTIONALLY表示所有的值都放在双引号之间。
- ESCAPED BY转义字符:子句用来指定转义字符,例如,“ESCAPED BY '*'”将“*”指定为转义字符,取代“\”,如空格将表示为“*N”。默认:\
lines子句:
在LINES子句中使用TERMINATED BY指定一行结束的标志,如“LINES TERMINATED BY '?'”表示一行以“?”作为结束标志。默认:\n
1. select into outfile
select * from Table into outfile '/路径/文件名'
fields terminated by ','
enclosed by '"'
lines terminated by '\r\n'
执行条件:
(1)路径目录必须有读写权限777
(2)文件名必须唯一
示例:
select * from instance into outfile '/export/servers/wangaimin/instance03_26.txt';
错误:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
出错了,我们不知道 MySQL 默认的导出目录是哪里,甚至都不知道 MySQL 对于数据的导出目录都有所限制。
使用以下命令:
show variables like '%secure%';
如上图所示,我设置的secure-file-priv值为:/var/lib/mysql-files/
解决方式:
1. 将数据直接保存到目录:/var/lib/mysql-files/ 下
2. 我们可以通过打开linux: /etc/my.cnf win: my.ini配置文件进行查看及修改:
修改配置文件后,关闭MYSQL服务,重启。
然后实例:
select * from instance into outfile '/var/lib/mysql-files/instance03_26.txt';
结果:
示例:
select * from instance into outfile '/var/lib/mysql-files/instance03_26_4.txt' fields terminated by ' , ' enclosed by '"' escaped by '*' lines terminated by '\n';
结果:
2. load data infile
LOAD DATA INFILE语句是SELECT INTO OUTFILE语句的补语,该语句可以将一个文件中的数据导入到数据库中。
load data [low_priority] [local] infile'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]
load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用load data infile,在服务器主机上你必须有file的权限。
- 如果你指定关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。
- 如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上。
- replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace,新行将代替有相同的唯一键值的现有行。如果你指定ignore,跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分被忽略。
- load data infile 可以按指定的列把文件导入到数据库中。 当我们要把数据的一部分内容导入的时候,需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。
示例:
load data infile '/var/lib/mysql-files/instance03_26_4.txt' ignore into table test_instance fields terminated by ' , ' enclosed by '"' escaped by '*' lines terminated by '\n';
结果:
End