MySQL之Navicat、into outfile、mysql命令、mysqldump、mysqlpump、mydumper等导出导入文本数据(csv、txt、sql等)

0    272    2

Tags:

👉 本文共约5225个字,系统预计阅读时间或需20分钟。

我的总结

Navicat、into outfile、mysql命令、mysqldump、mysqlpump、mydumper导出导入数据

工具导出命令导入命令导出文件模式导出导入文件位置导入效率
Navicat界面操作1、界面操作、LOAD DATA INFILE
2、mysqlimport命令
csv、txt或SQL客户端
into outfileselect * from sbtest.sbtest6 into outfile '/mysqldata/sbtest6.sql' FIELDS TERMINATED BY ',' ;1、LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY ',';
2、mysqlimport命令
csv、txt服务器LOAD DATA需要花费5小时
mysql命令mysql -h127.0.0.1 -uroot -plhr -q -D lhrdb --execute="select * from sensor;" > sensor_mysql.txt1、LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY ',';
2、mysqlimport命令
csv、txt客户端
mysqldumpmysqldump -S/tmp/mysql.sock --databases business_db_jingbain --set-gtid-purged=OFF --tables sensor > sensor_mysqldump.sql1、source a.sql
2、mysql -f -h192.168.1.35 -P3340 -u root -plhr < sbtest_data.sql
SQL客户端开4个线程,导入花费需要6小时
mysqlpumpmysqlpump -uroot -plhr -h192.168.66.35 -P13341 sbtest sbtest1 --single-transaction --set-gtid-purged=OFF --default-parallelism=4 > /bk/sbtest_sbtest1.sql1、source a.sql
2、mysql -f -h192.168.1.35 -P3340 -u root -plhr < sbtest_data.sql
SQL客户端开4个线程,导入花费需要6小时
mydumpermydumper -h 192.168.66.35 -u root -p lhr -P 13341 -B sbtest -T sbtest1 -l 14400 -r 100000 -t 8 -k -o /data/1、myloader -h localhost -u root -p lhr -B sbtest -o sbtest1 -t 4 -d /data/ -v 3
2、source a.sql 3、mysql -f -h192.168.1.35 -P3340 -u root -plhr < sbtest_data.sql
SQL客户端开4个线程,导入花费需要385分钟,大概6.5小时
MySQL Shellutil.dumpSchemas(['sbtest'],'/data/backup/schema')util.loadDump("/data/backup/full",{loadUsers: true})txt客户端

实例SQL

mysqldump

参考:https://www.dbaup.com/shiyongmysqldumpqianyileimysqlshujuku.html

其它方案

待测方案:mysqldump、mydumper、select outfile 语句、Util.dumpTablesUtil.exportTable

环境配置信息

配置项说明
MySQL 版本5.7.39
磁盘随机读写100 MiB/sec
测试表名test.t_order_info
行数1000W
字段数6

建表语句

导出文件

  • 包含数据结构和数据的 备份文件 (mysqldump、mydumper、Util.dumpTables)
  • 只包含数据的 数据文件 (select outfile、Util.exportTable)

导出导入命令

导出导入
mysqldumpsource 或 mysql< xxx.sql
mydumpermyloader
select outfileload data
Util.dumpTablesUtil.loadDump
Util.exportTableUtil.importTable

方案测试

测试首先考虑的是 提升导入效率,并新增了 MySQL Shell 的使用。

mysqldump

单表导出(备份文件)

  • --master-data=2 参数会在备份期间对所有表加锁 FLUSH TABLES WITH READ LOCK,并执行 SHOW MASTER STATUS 语句以获取二进制日志信息。因此,在备份期间可能会影响数据库的并发性能。如果您不需要进行主从复制,则可以考虑不使用 --master-data=2 参数。
  • --single-transaction 参数用于在备份期间“使用事务来确保数据一致性”,从而避免在备份期间锁定表。[必须有]

备份文件

文件内容。

文件内容解释:

  • 没有建库语句,因为是单表备份。
  • 有删除表,建立表的语句,小心导入目标库时,删除表的语句,造成数据误删。
  • INSERT 语句没有字段名称,导入时表结构要一致。
  • 导入过程中有 lock table write 操作,导入过程中相关表不可写。
  • ALTER TABLE t_order_info DISABLE KEYS 此语句将禁用该表的所有非唯一索引,这可以提高插入大量数据时的性能。 对应的文件末尾有 ALTER TABLE t_order_info ENABLE KEYS;

用途,可以将备份文件中的数据导入自定义库,“文件内容解释”部分遇到的问题可以使用下面参数解决。

  • --no-create-info 不包含建表语句(可以手动创建 create table tablename like dbname.tablename;
  • --skip-add-drop-database 不包含删库语句
  • --skip-add-drop-table 不包含删表语句
  • --skip-add-locks INSERT 语句前不包含 LOCK TABLES t_order_info WRITE;
  • --complete-insert INSERT 语句中包含 列名称(新表的列有增加的时候)。

单表导出备份数据(只导出数据)。

导出单库中的某表为 CSV。

小结

1G 的备份文件,测试结果如下:

  1. 使用 mysql< xxx.sql 导入,耗时 5 分钟。
  2. 使用用 source xxx.sql 导入, 耗时 10 分钟。

推荐第一种,都是单线程。

mydumper

  • 版本 0.14.4

多线程导出

  • 多线程导入

小结

耗时 2 分钟,建议如下:

  • 在数据量大于 50G 的场景中,更推荐 mydumper。
  • 补充场景,支持导出 CSV,也支持 --where 过滤。

导入命令同上,且可以按需手动进行 LOAD DATA

SELECT OUTFILE 语句

Tips:适合于单表数据的导出,不支持多表。

导出命令,耗时 15 秒。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!

导入命令,耗时 3 分钟。

小结

  • 支持跨表导入。A 表的数据可以导入 B 表,因为备份文件中只有数据。
  • 可自定义导出部分列,导出导入速度较快,最常用。

MySQL_Shell > dumpTables

单表导出,耗时 4 秒。

部分导出。

导入,耗时 3 分钟。

注意:不支持部分导入,不支持跨数据库版本。

因为导入时最大支持 2 个参数,可以将导出的部分数据全部导入到新的库中。

导入命令:util.loadDump("/backup",{schema: "test_new"})

小结

  • 支持跨库导入,A 库的数据可以导入 B 库。表名需要一致。不支持增量到已有数据的表中。
  • 导出时和 SELECT OUTFILE 同效,导入时,比 LOAD DATA 快(默认 4 线程)。

注意:

  1. 部分导出功能需要较新的 MySQL Shell 版本,如 8.0.33。
  2. LOAD DATA 单线程导入 耗时 1h20min。

MySQL_Shell > exportTable

单表导出,耗时 10 秒。

部分导出。

导入,耗时 10 分钟。

部分导入(不推荐使用)。

有报错 MySQL Error 1205 (HY000): Lock wait timeout exceeded; try restarting transaction @ file bytes range [450000493, 500000518) 需要重复执行一次,才能保证数据完整。

根据报错提示可以使用以下命令导入:

MySQL 5.7 也推荐直接使用 LOAD DATA

小结

  • 支持跨库导入,A 库的数据可以导入 B 库,表名需要一致。
  • 导出时和 SELECT OUTFILE 同效。导入时,比 LOAD DATA 快(默认 8 线程)。

总结

可以通过数据大小进行选用:

导出导入优点推荐度(效率)
mysqldumpsource xxx.sql MySQL< xxx.sql原生,可远程⭐⭐⭐ 数据量<10G
mydumpermyloader多线程⭐⭐⭐ 数据量>50G
SELECT OUTFILELOAD DATA最灵活⭐⭐ 数据量<20G
Util.dumpTablesUtil.loadDump原生,多线程⭐⭐⭐ 数据量<50G
Util.exportTableUtil.importTable原生,单线程⭐ 数据量<20G
  • MySQL< 导入时,需要避免数据丢失。
  • 前 3 种都支持 WHERE 过滤,mydumper 是最快的。SELECT OUTFILE 最常用(因为支持自定义导出部分列)。
  • 前 2 种因为是备份工具,所以有 FTWRL 锁。
  • Util.dumpTables 不支持增量到已有数据的表中,因为包含了库表的元数据信息,像 mydumper。
  • Util.exportTable 备份是单线程,导入是多线程,不推荐的原因是导入容易出错(多次导入可解决)。
  • 使用建议:按照数据量选择,全表备份最快用 Util.dumpTables,部分备份用 SELECT OUTFILE
  • 测试之后再使用,导出和导入均需要进行数据验证。

参考

https://mp.weixin.qq.com/s/8NkM07nwa48nuwsOQfe70Q

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复