文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL数据的导入导出mysqldump、mysqlimport into outfile和load data

2023-10-25 08:57

关注

0、概述

MySQL数据的导入导出方案通常是配套的,例如:
方案一:使用mysqldump导出数据,再使用mysql客户端导入数据
方案二:使用SELECT INTO OUTFILE命令导出数据,再使用LOAD DATA或mysqlimport导入数据
方案三:使用mysql程序的批处理模式导出数据,再使用LOAD DATA或mysqlimport导入数据

1、mysqldump导出数据+mysql导入数据

1.1、使用mysqldump导出数据

1.1.1、使用–tables导出指定表

# 语法mysqldump  db_name --tables  tb1_name  tb2_name  >  filemname.sql# 实例mysqldump mytest --tables t1 t2 > t1_t2.sql

1.1.2、使用–tab选项将表定义文件和数据文件分开导出

# 语法mysqldump  db_name  --tab=dir# 实例mysqldump mytest1 --tab=/home/mysql/__test

1.1.3、使用–fields-terminated-by选项定义数据分隔符

以下导出时,数据值以逗号分隔

mysqldump mytest1 --tab=/home/mysql/__test   --fields-terminated-by=','

1.1.4、使用–databases选项导出整个库或多个库

参数说明如下:

mysqldump --complete-insert --force --add-drop-database --insert-ignore --hex-blob --databases mytest > mytest_db.sql

1.1.5、使用–all-databases选项导出所有数据库

mysqldump --all-databases --add-drop-database > db.sql

1.1.6、使用–xml选项实现导出格式为XML

mysqldump  --xml  mytest1 >  /tmp/mytest1.xml

1.1.7、使用–ignore-table选项实现导出时忽略指定表

导出时可以选择忽略哪些表,即不导出哪些表,只需加上参数–ignore-table=db_name.tbl_name1、–ignore-table=db_name.tbl_name2。

mysqldump --databases=mytest,mytest1  --ignore-table=mytest.tb1,mytest1.tb2

1.1.8、使用mysql客户端配合mysqldump实现通配符匹配表名的导出

mysqldump不支持直接利用通配符导出多个表,但可以先用SELECT加通配符查询要导出的多张表的表名,将表名写到文件中,然后再用mysqldump读出表名再导出这些表。

#  1. 获得表名,写入文件mysql -N information_schema -e "select table_name from tables where table_name like 'prefix_%' " > tbs.txt#  2. 读取包含表名的文件,导出表mysqldump db 'cat tbs.txt' > dump.sql 

1.1.9、使用mysqldump导出数据的优化方式

  1. 选择MySQL服务器的I/O活动低的时候导出数据。
  2. I/O分离(数据盘和备份盘I/O分离)。
  3. 输出到管道压缩(gzip)。
  4. –quick跳过内存缓冲(–opt默认启用)。
  5. 从数据保留策略上想办法,把不需要修改的大量数据放到历史表中,而不是每次都备份。

1.2、使用mysql导入数据

1.2.1、基本导入方法

mysql db_name < db_name.sql

1.2.2、乱码问题

# 语法mysql --default-character-set=charset_name database_name < import_table.sql # 示例mysql --default-character-set=gbk  < import_table.sql

2、SELECT INTO OUTFILE导出数据+LOAD DATA或mysqlimport导入数据

2.1、使用SELECT INTO OUTFILE导出数据

SELECT * INTO OUTFILE '/tmp/testfile.txt' FROM t1;SELECT * INTO OUTFILE '/tmp/t1.txt'  FIELDS TERMINATED BY ':' OPTIONALLY ENCLOSED BY '+' ESCAPED BY '!'    FROM t1;

2.2、使用LOAD DATA导入数据

2.2.1、使用LOAD DATA导入数据的基本导出方法

  1. 一般来说,只要导出导入操作中使用的选项完全一致,用SELECT…INTO OUTFILE命令导出的文本文件就可以用LOAD DATA命令导入到数据表里去,不会发生任何变化。
  2. SELECT…INTO OUTFILE可以筛选记录,导出表数据到一个文件中,而LOAD DATA INFILE则是相反的操作,是读取这个文件导入表中。
  3. 如果LOAD DATA命令导入的文件不在MySQL服务器上,而是想导入客户端所在的本地文件系统的文件时,则需要使用语法变体LOAD DATA…LOCAL INFILE…,也就是说,如果指定LOCAL关键词,则表明从客户主机读文件。如果没指定LOCAL,那么文件必须位于MySQL服务器上。
mysql> load data infile '/tmp/t2.txt' into table t2; 

2.2.2、导出导入csv格式文件

# 生成csv文件mysql> select field_list from table_name  into outfile '/home/garychen/tmp/table_name_2.csv' fields terminated by ','  optionally enclosed by '"' lines terminated by '\n';# 导入文件mysql>  load data local infile '/home/garychen/tmp/table_name_2.csv' into table table_name fields terminated by ',' lines terminated by '\n'(field1,field2,field3);

2.2.3、SELECT INTO OUTFILE导出+LOAD DATA导入方案的优势

  1. 相较于普通的mysql命令,LOAD DATA执行SQL文件导入的方式要快得多,一般可以达到每秒几万条记录的插入速度。
  2. 如果有很多表,那么使用mysqldump会更简单。如果是导入个别大表,而且对于时间有很高的要求,那么LOAD DATA未尝不可。mysqldump默认的导出文件,其实已经包含了一些优化了,会有禁用key、启用key的操作,而且是一条INSERT语句包括多行记录的。

2.2.4、LOAD DATA的优化

2.3、使用mysqlimport导入数据

# 语法mysqlimport databasename tablename.txt# 实例mysqlimport mytest /tmp/t2.txt 

3、使用mysql程序的批处理模式导出数据

使用mysql程序的批处理模式,支持比较灵活的导出数据,因为可以利用SQL语句。

  1. 可以基于mysql的批处理模式,做语句级别的导出,以下两种方式等价:
# 方式一,-e选项mysql --batch --default-character-set=utf8 -e "SELECT * FROM t2;" mytest > t2.txt# 方式二,--executemysql --batch --default-character-set=utf8 "--execute=SELECT * FROM t2;" mytest > t3.txt
  1. vertical选项,将查询结果按纵向导出:
mysql --batch --default-character-set=utf8  --vertical  -e "SELECT * FROM t2;" mytest > t2.txt
  1. html选项:将查询结果按html格式导出:
mysql --batch --default-character-set=utf8  --html  -e "SELECT * FROM t2;" mytest > t2.txt
  1. xml选项,将查询结果按xml格式导出:
mysql --batch --default-character-set=utf8  --xml  -e "SELECT * FROM t2;" mytest > t2.txt

4、使用Linux的split切割文件,加速导入数据

split [OPTION] [INPUT [PREFIX]]
split -l 10000 /tmp/t1.txt t1_split_sub_

5、总结

MySQL导出导入数据(即数据转储)主要有以下三种方式:

  1. mysqldump导出+mysql导入:这种方式下导出的是SQL语句而非数据本身,所以导入时效率相对较低,但是胜在可以整库甚至多个库、多个表一起导出,适合整库的转储。
  2. SELECT INTO OUTFILE导出+LOAD DATA或mysqlimport导入:这种方式下导出的是纯数据,所以导入时效率会很高。适合单个大表的转储。
  3. mysql批处理模式导出+LOAD DATA或mysqlimport导入:这种方式下导出的也是纯数据,所以导入时效率会很高。优点除了导入效率高,由于是用SQL语句选择数据,所以很灵活,缺点则是使用门槛高。

注:设置MYSQL数据导出与导入,secure_file_priv参数设置

通过show variables like ‘%secure_file_priv%’;
secure_file_priv参数说明

这个参数用来限制数据导入和导出操作的效果,例如执行LOAD DATA、SELECT … INTO OUTFILE语句和LOAD_FILE()函数。这些操作需要用户具有FILE权限。
secure_file_priv=null 不允许导入导出
secure_file_priv=具体文件路径 只允许从这个路径导入导出
secure_file_priv=空 可以从任意路径导入导出。

此时修改secure_file_priv的参数只需要修改mysql

此时,需要修改:

/etc/mysql/mysql.conf.d/mysqld.cnf 文件,如图

在末尾添加一句secure_file_priv=”/”即可将数据导出到任意目录

来源地址:https://blog.csdn.net/eagle89/article/details/132501069

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯