mysql数据的导入和导出
一. mysqldump工具基本用法,不适用于大数据备份
二. 导出纯文本数据
在某些情况下,为了一些特定的目的,经常需要将表里的数据导出为某些符号分割的纯数据文本,而不是 SQL 语句,因为LOAD DATA 的加载速度比普通的 SQL 加载要快 20 倍以上
方法 1:使用 SELECT ...INTO OUTFILE ...命令来导出数据,具体语法如下。
mysql> SELECT * FROM tablename INTO OUTFILE 'target_file' [option];
其中 option 参数可以是以下选项:
| 命令参数 | 说明 |
| fields terminated by '字符' | 字段分隔符,默认字符为制表符'\t' |
| fields [optionally] enclosed by '单字符' | 字段引用符,加上optionally后在数字类型上不会有引用符号 |
| fields escaped by '单字符' | 转义字符,默认为'\' |
| lines starting by '字符' | 每行前都加此支付,默认为空 |
| lines terminated by '字符' | 行结束符,默认为'\n' |
例子1,将 emp 表中数据导出为数据文本,其中,字段分隔符为“,”,每个字段用双引号引用起来,记录结束符为回车符(默认如此,可以不写)
mysql> select * from emp into outfile '/tmp/emp.txt' fields terminated by "," enclosed by '"';
输出结果如下
mysql> system more /tmp/emp.txt
"1","z1","aa"
"2","z1","aa"
"3","z1","aa"
例子2,发现例1中第一列是数值型,如果不希望字段两边用引号,则语句改为如下
mysql> select * from emp into outfile '/tmp/emp.txt' fields terminated by "," optionally enclosed by '"' ;
mysql> system more /tmp/emp.txt
1,"z1","aa"
2,"z1","aa"
3,"z1","aa"
下面测试一下转义字符,大概包括三类,转义字符本身,字段分隔符(导出的文本中用什么符号分隔),记录分隔符(每条记录之间用什么分隔,默认是回车)
例子3,更改上面例子中id=1的name为\"##!aa

update employee set name ='\\"##!aa' where id=1; #更新操作中转义字符本身也需要用转义字符来转义,所以这里有2个\\
# 然后做导出操作
select * from employee into outfile '/tmp/employee' fields terminated by "," optionally enclosed by ‘”’; 导出结果如下
mysql> system more /tmp/emp.txt
1,"\\\"##!aa","aa"
2,"z1","aa"
3,"z1","aa"

说明:name 中含有转义字符本身“\”,域引用符“”“,因此,在输出的数据中我们发现这两种字符前面都加上了转义字符“\”
例子4,将id=1的name更新为含有字段分隔符”,“的字符串

update employee set name='\\"#,#,!aa' where id=1; 然后导出
mysql> system rm /tmp/emp.txt #需要删掉重名文件 mysql> select * from emp into outfile '/tmp/emp.txt' fields terminated by "," optionally enclosed by '"' ; 输出结果如下
mysql> system more /tmp/emp.txt
1,"\\\"#,#,!aa","aa"
2,"z1","aa"
3,"z1","aa"

说明:发现数据中的字符","没有被转义,原因是它和后面真正的字段分隔符之间没有冲突,因为name字段包含在双引号之间。
例子5:继续做测试,将输出文件的字段引用符去掉,这个时候,我们的预期是数据中的“,”将成为转义字符而需要加上“\”

mysql> system rm /tmp/emp.txt
mysql> select * from emp into outfile '/tmp/emp.txt' fields terminated by "," ; 输出结果如下 mysql> system more /tmp/emp.txt
1,\\"#\,#\,!aa,aa
2,z1,aa
3,z1,aa

说明:果然,现在的“,”前面加上了转义字符“\”。而刚才的引用符“””却没有被转义,因为它已经没有什么歧义,不需要被转义
注意:SELECT…INTO OUTFILE...产生的输出文件如果在目标目录下有重名文件,将不会创建成功,源文件不能被自动覆盖
方法 2:用 mysqldump 导出数据为文本。
mysqldump –u username –T target_dir dbname tablename [option]
其中 option 参数可以是以下选项:
1) --fields-terminated-by=name(字段分隔符);
2) --fields-enclosed-by=name 字段引用符,比如每个字段用双引号括起来;
3) --fields-optionally-enclosed-by=name(字段引用符,只用在 char、varchar 和 text 等字符型字段上
4) --fields-escaped-by=name(转义字符);
5) --lines-terminated-by=name(记录结束符)。
-F --flush-logs(备份前刷新日志):加上此选项后,备份前将关闭旧日志,生成新日志。使得进行恢复的时候直接从新日志开始进行重做,大大方便了恢复过程
-l --lock-tables(给所有表加读锁):可以在备份期间使用,使得数据无法被更新,从而使备份的数据保持一致性,可以配合-F选项一起使用。
注意:
MyISAM 存储引擎在备份的时候需要加上-l 参数,表示将所有表加上读锁,在备份期间,所有表将只能读而不能进行数据更新。
但是对于事务存储引擎(InnoDB 和 BDB)来说,可以采用更好的选项--single-transaction,此选项将使得 InnoDB 存储引擎得到一个快照(Snapshot),使得备份的数据能够保证一致性
例子,采用 mysqldump 生成指定分隔符分隔的文本:
mysqldump -uroot -T /tmp test emp --fields-terminated-by ',' --fields-optionally-enclosed-by '"'
输出结果如下
more /tmp/emp.txt
1,"\\\"#,#,!aa","aa"
2,"z1","aa"
3,"z1","aa"
注意:
1)ubuntu测试中会出错,解决方法如下。将输出目录改为/var/lib/mysql-files/. 例子中test是库名,emp是表名,如果不写则备份全部表

mysql> mysql> select * from person into outfile '/tmp/x.txt' fields terminated by ",";
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
mysql> show global variables like "%secure%";
+--------------------------+-----------------------+
| Variable_name | Value |
+--------------------------+-----------------------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ |
+--------------------------+-----------------------+

2)如果非要用/tmp,则需要做如下操作 (测试了下又不行了...)
在/etc/apparmor.d/usr.sbin.mysqld文件中加入一行代码如下
/data/export/** rw, 保存退出后
/etc/init.d/apparmor reload #重新载入配置
再次导出即可。
三. 导入纯文本数据
这里只讨论用 SELECT… INTO OUTFILE 或者 mysqldump 导出的纯数据文本的导入方法。和导出类似,导入也有两种不同的方法,分别是 LOAD DATA INFILE…和mysqlimport,它们的本质是一样的,区别只是在于一个在 MySQL 内部执行,另一个在 MySQL 外部执行。
需要注意的是在导入纯文本数据之前,需要事先创建好表结构
1. 一个简单的完整例子
首先准备表结构和文本数据,新建test库:create database test,然后在test下新建表person

create table person(
id int not null auto_increment,
name varchar(40) not null,
city varchar(20),
salary int,
primary key(id)
)
engine=innodb default charset=utf8;

张三 北京 3000
李四 杭州 4000
王五 /N 4500
小明 天津 /N
每一项之间用Tab键进行分隔,如果该字段为NULL,则用/N表示。
进入mysql并且切换到对应的库后,执行下面命令导入数据:
load data local infile "/var/lib/mysql/test/data.txt" into table person(name,city,salary);
注意
1. data.txt存放的位置,其他地方会报错
2. 在mysql配置文件中修改字符编码

mysql 5.6
sudo vim /etc/mysql/my.cnf,重启mysql来完成字符集的设置。添加以下两行 (如果是上传安装包,vim /etc/my.cnf)
[mysqld]
character_set_server=utf8
binlog_format=row mysql 5.7 可能需要在etc/mysql/mysql.conf.d/mysqld.cnf中额外增加如下代码,有时候也不需要
[client]
default-character-set=utf8

2. 使用“LOAD DATA INFILE…”命令导入数据详解
mysql > LOAD DATA [LOCAL] INFILE ‘filename’ INTO TABLE tablename [option]
option 可以是以下选项:
1. FIELDS TERMINATED BY 'string'(字段分隔符,默认为制表符'\t');
2. FIELDS [OPTIONALLY] ENCLOSED BY 'char' 字段引用符,如果加 OPTIONALLY 选项则只会做用在char, varchar和text等字符型字段上,其他类型字段默认不使用引用符
3. FIELDS ESCAPED BY 'char'(转义字符,默认为'\');
4. LINES STARTING BY 'string'(每行前都加此字符串,默认'');
5. LINES TERMINATED BY 'string'(行结束符,默认为'\n');
6. IGNORE number LINES(忽略输入文件中的前 n 行数据);
7. (col_name_or_user_var,...) (按照列出的字段顺序和字段数量加载数据);
8. SET col_name = expr,... 将列做一定的数值转换后再加载。
注意:
1. 其中 char 表示此符号只能是单个字符,string 表示可以是字符串。
2. FILELD 和 LINES 和前面 SELECT …INTO OUTFILE…的含义完全相同,不同的是多了几个不同的选项
例子1:将文件“/tmp/emp.txt”中的数据加载到表 emp 中
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by'"' ;
例子2:如果不希望加载文件中的前2行,加上ignore字段
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines;
例子3:如果发现文件中的列顺序和表中的列顺序不符,或者只想加载部分列,可以在命令行中加上列的顺序
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id,content,name);
如果只想加载第一列,字段的列表里面可以只加第一列的名称:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id);
例子4:如果希望将 id 列的内容+10 后再加载到表中,可以如下操作:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' set id=id+10;
3. 用 mysqlimport 来实现导入数据详解,具体命令如下
shell>mysqlimport –u root –p*** [--LOCAL] dbname order_tab.txt [option]
其中 option 参数可以是以下选项:
1. --fields-terminated-by=name(字段分隔符);
2. --fields-enclosed-by=name(字段引用符);
3. --fields-optionally-enclosed-by=name(字段引用符,只用在 char、varchar 和 text 等字符型字段上
4. --fields-escaped-by=name(转义字符);
5. --lines-terminated-by=name(记录结束符);
6. -- ignore-lines=number(或略前几行)。
这与 mysqldump 的选项几乎完全相同,这里不再详细介绍,简单来看一个例子:
mysqlimport -uroot test /tmp/emp.txt --fields-terminated-by=',' --fields-enclosed-by='"'
转载出处:https://www.cnblogs.com/regit/p/8041762.html
mysql数据的导入和导出的更多相关文章
- mysql数据的导入与导出
参考:http://blog.sina.com.cn/s/blog_81b2b2a1010188q0.html http://blog.csdn.net/xin_yu_xin/article/det ...
- mysql 数据到 导入导出 总结
数据库数据的导入和导出受secure_file_priv配置项影响#限制导入导出,null时无法进行数据的导入导出,空时不限制,设置了目录则只能对该目录下的文件进行导入导出show variables ...
- 利用Java进行MySql数据库的导入和导出
利用Java来进行Mysql数据库的导入和导出的总体思想是通过Java来调用命令窗口执行相应的命令. MySql导出数据库的命令如下: mysqldump -uusername -ppassword ...
- Oracle 数据的导入和导出(SID service.msc)
一:版本号说明: (1)(Oracle11 32位系统)Oracle - OraDb11g_home1: (2)成功安装后显演示样例如以下:第一个图是管理工具.创建连接.创建表:第二个是数据库创建工 ...
- 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理
在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能给系统用户更好的操作体验,也提高了用户录入数据的效率.我在较早时期的EasyUI的Web框架上, ...
- 基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform ...
- Matlab文件和数据的导入与导出
ref: https://blog.csdn.net/zengzeyu/article/details/72530596 Matlab文件和数据的导入与导出 2017年05月19日 15:18:35 ...
- Sqoop- sqoop将mysql数据表导入到hive报错
sqoop将mysql数据表导入到hive报错 [root@ip---- lib]# sqoop import --connect jdbc:mysql://54.223.175.12:3308/gx ...
- (转)基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理
http://www.cnblogs.com/wuhuacong/p/4777720.html 在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能 ...
随机推荐
- 线程ThreadDemo04
package day190109; public class 线程ThreadDemo04 { public static void main(String[] args) throws Inter ...
- c/c++ 标准库 pair 介绍
标准库 pair 介绍 问题:map里的元素由key和value组成,这个key和value的组合是什么类型呢??? 答案:pair类型 pair介绍: 它是模板 有2个公有成员可供访问. first ...
- spring拦截器(interceptor)简介
1. 拦截器用途 (1)拦截未登录用户直接访问某些链接 (2)拦截日志信息 (3)拦截非法攻击,比如sql注入 2. 涉及jar.类 (1)spring-webmvc.jar (2)HandlerIn ...
- [Hive_10] Hive 的分析函数
0. 说明 Hive 的分析函数 窗口函数 | 排名函数 | 最大值 | 分层次 | lead && lag 统计活跃用户 | cume_dist 1. 窗口函数(开窗函数) ove ...
- PHP中cURL的应用
这里是慕课网上讲cURL 的一张图,觉得吧这个过程说的很清楚,因此就不错了. 1, 打开一个网页,下载网页内容 <?php $curl = curl_init("http://www. ...
- Python爬虫-05:Ajax加载的动态页面内容
1. 获取AJAX加载动态页面的内容 1.1. Introduction 如果所爬取的网址是通过Ajax方式加载的,就直接抓包,拿他后面传输数据的文件 有些网页内容使用AJAX加载,只要记得,AJAX ...
- Celery 异步任务
Celery https://www.cnblogs.com/DragonFire/p/10356615.html 介绍: Celery 是芹菜 Celery 是基于Python实现的模块, 用于执行 ...
- 设计模式のBridgePattern(桥接模式)----结构模式
一.产生背景 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体 ...
- idea在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误
在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误 在maven projects中图标toggle'skip Tests' Mode //宏杰帮助 网上案例:https://blo ...
- 第一章 mysql的体系结构与存储引擎
数据库从逻辑上可以分为两部分,一部分负责存储即文件系统,这部分有个更时髦的名字叫存储引擎,存储引擎负责如何把数据以及索引相关的内容以合适的形式组织并存储到磁盘上.另一部分为server部分,负责和用户 ...