数据库导入导出常用命令

Posted 晨港飞燕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库导入导出常用命令相关的知识,希望对你有一定的参考价值。

一.Mysql load

使用mysql 中的load 命令,可以将数据文件中的内容加载到数据库表中,load语句导入大量数据到数据库,按照官方的说法:使用load语句要比使用insert语句将近快20倍的速度

进入MySQL后,使用命令:load data local infile 'e:/load_user.txt' into table load_user lines terminated by '\\r\\n' ignore 1 lines;

这个命令与mysqlimport非常相似,但这个方法可以在mysql命令行中使用。也就是说您可以使用API程序调用这个命令,如mysqlimport工具一样,这个命令也有一些可以选择的参数

官方文档:https://dev.mysql.com/doc/refman/8.0/en/load-data.html

基本语法:

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,   )]

(1)、low_priority关键字

如果你指定关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令:

load data  low_priority infile "e:/load_user.txt" into table load_user;  

(2)、local关键字

如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上。

(3)、replace和ignore关键字

replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace,新行将代替有相同的唯一键值的现有行。如果你指定ignore,跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分被忽略。例如:

load data  low_priority infile "e:/load_user.txt" replace into table load_user;

(4)、分隔符

(a) fields关键字指定了文件记段的分割格式,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:

terminated by描述字段的分隔符,以什么字符作为分隔符,默认情况下是tab字符(\\t)

enclosed by描述的是字段的括起字符。

escaped by描述的转义字符。默认的是反斜杠(backslash:\\ )  

例如:load data infile "e:/load_user.txt" replace into table load_user (id,name) terminated by','  ignore 1 lines;(,作为分隔符)

(b)lines 关键字指定了每条记录的分隔符默认为'\\n'即为换行符

如果两个字段都指定了,那fields必须在lines之前。如果不指定fields关键字缺省值,与如果你这样写的相同: fields terminated by'\\t'  enclosed by ' '' ' escaped by'\\\\'

如果你不指定一个lines子句,缺省值与如果你这样写的相同: lines terminated by'\\n'

例如:load data infile "e:/load_user.txt" replace into table test fields terminated by ',' lines terminated by '/n';

(5)、导入指定字段

load data infile 可以按指定的列把文件导入到数据库中。 当我们要把数据的一部分内容导入的时候,需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。比方说,我们要从Access数据库升级到MySQL数据库的时候

下面的例子显示了如何向指定的栏目(field)中导入数据:

load data infile "e:/load_user.txt" into table load_user(id, name);

(6)、文件路径

当在服务器主机上寻找文件时,服务器使用下列规则:

(a)如果给出一个绝对路径名,服务器使用该路径名。

(b)如果给出一个有一个或多个前置部件的相对路径名,服务器相对服务器的数据目录搜索文件。  

(c)如果给出一个没有前置部件的一个文件名,服务器在当前数据库的数据库目录寻找文件。 例如: /myfile txt”给出的文件是从服务器的数据目录读取,而作为“myfile txt”给出的一个文件是从当前数据库的数据库目录下读取。

注意:字段中的空值用\\N表示

如果报3948 - Loading local data is disabled; this must be enabled on both the clie....错误

需要在mysql的配置文件[mysqld],[mysql],[client]后面各自加上local_infile=ON,打开local data开关,用于数据文件导入

如下面例子所示:创建数据表load_user,有两个属性。如下所示:

e盘下,load_user.txt文件如下:

进入数据库后:使用命令:

load data local infile 'e:/load_user.txt' into table load_user lines terminated by '\\r\\n' ignore 1 lines;

以上命令的解释:从客户主机上d盘下读取load_user.txt文件数据,每行以回车换行作为分隔符,同时忽略第一行的数据,

插入数据表load_user。(这里的属性没有知道,默认是以\\t作为分隔符)。

也可以这样指定:fields terminated by '\\t', 说明,txt文件中,各属性以\\t作为分割。命令如下:

load data local infile 'e:/load_user.txt' into table load_user fields terminated by '\\t' lines terminated by '\\r\\n' ignore 1 lines;   

如果执行以上命令报错

1290 - The MySQL server is running with the --secure-file-priv option so it.....

需要在mysql的配置文件[mysqld]后面加上secure_file_priv='',不对mysqld的导入导出做限制,使用show variables like '%secure%'查看值

 fields terminated by可以定义字段间以什么分隔符分隔,比如$

Mysql导出数据文件

select * from load_user into outfile 'e:/load_user2.txt'  fields terminated by '$' optionally enclosed by '"' lines terminated by '\\n';

使用select xxxx into outfile  --- load data 进行数据迁移,导出的只是数据,而不包括数据结构

-- 导出csv数据文件

select * from load_user into outfile 'e:/load_user.csv'  fields terminated by '$'  lines terminated by '\\n';

-- 导入csv数据文件

load data infile "e:/load_user.csv" replace into table load_user  fields terminated by'$'  

执行成功

二.Oracle sqlldr

简介

sql*loader是oracle的数据加载工具,通常用来将操作系统文件(数据)迁移到oracle数据库中。sql*loader是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(direct,parallel)。

语法和参数

语法: sqlldr keyword=value [,keyword=value,...];

Sqlldr 参数一览

Keyword

默认值

描述

userid

ORACLE 用户名/口令      

control

控制文件名

log

日志文件名

bad

错误文件名

data

数据文件名

discard

废弃文件名

discardmax

全部

允许废弃的文件的数目

skip

0

要跳过的逻辑记录的数目

load

全部

要加载的逻辑记录的数目

errors

允许的错误的数目

rows

常规:64  默认路径:全部

常规路径绑定数组中或直接路径保存数据间的行数

bindsize

256000

常规路径绑定数组的大小

silent

运行过程中隐藏消息

direct

FALSE

使用直接路径

parfile

参数文件: 包含参数说明的文件的名称

parallel

FALSE

执行并行加载

file

执行文件

skip_unusable_indexes

FALSE

不允许/允许使用无用的索引或索引分区

skip_index_maintenance

FALSE

没有维护索引, 将受到影响的索引标记为无用

commit_discontinued

FALSE

提交加载中断时已加载的行

readsize

1048576

读取缓冲区的大小

external_table

NOT_USED

使用外部表进行加载;
 NOT_USED, GENERATE_ONLY, EXECUTE

columnarrayrows

5000

直接路径列数组的行数

streamsize

256000

直接路径流缓冲区的大小 (以字节计)

multithreading

在直接路径中使用多线程

resumable

FALSE

启用或禁用当前的可恢复会话

resumable_name

有助于标识可恢复语句的文本字符串

resumable_timeout

7200

RESUMABLE 的等待时间 (以秒计)

date_cache

1000

日期转换高速缓存的大小 (以条目计)

 利用PLSQL生成测试数据cux_sqlldr_test.txt

BEGIN

  FOR iIN1..100

    LOOP

      IFMOD(i,2)=1THEN

        dbms_output.put_line('"'||i||'","column1_'||i||'",'||'"column2_'||i||'",'||'"column3_'||i||'",'||'"show_column_'||i||'",'||'"hide_column_'||i||'","2017-01-01"');

      ELSE

        dbms_output.put_line('"'||i||'","column1_'||i||'", ,'||'"column3_'||i||'",'||'"show_column_'||i||'",'||'"hide_column_'||i||'"');         

      ENDIF;

    ENDLOOP;

END;

建表

CREATETABLE cux.cux_sqlldr_test

(line_num NUMBER,

 seq_num NUMBER,

 column1 VARCHAR2(30),

 column2 VARCHAR2(30)NOTNULL,

 column3 VARCHAR2(30)DEFAULT'column2',

 show_column VARCHAR2(30),

 hide_column VARCHAR2(30),

 creation_date DATE

);

CREATEORREPLACE SYNONYM apps.cux_sqlldr_test FOR cux.cux_sqlldr_test;

CREATESEQUENCE cux.cux_sqlldr_test_sSTARTWITH10001;

CREATEORREPLACESYNONYM apps.cux_sqlldr_test_s FOR cux.cux_sqlldr_test_s;

Sqlldr 有两种使用方式

(1)在控制文件中包含数据.

创建一个文件命名为cux_sqlldr_test.ctl,在服务器下创建目录Sqlldr,在sqlldr下创建log和bad文件夹,

上传cux_sqlldr_test.ctl至服务器

cux_sqlldr_test.ctl内容如下。

OPTIONS (skip=3,rows=128)

load data     

CHARACTERSET ZHS16GBK  

infile  *      

badfile  "/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.bad"

discardfile  "/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.disc"

TRUNCATE into table cux_sqlldr_test

WHEN column1 != "column1_1"

Fields terminated by ","

Optionally enclosed by '"'

TRAILING NULLCOLS

(

line_num  RECNUM ,

seq_num  "cux_sqlldr_test_s.nextval" ,

column1 ,

column2 ,

column3 NULLIF (column3="column3_4"),

show_column "UPPER(:show_column)" ,

hide_column  FILLER ,

creation_date  DATE  'YYYY-MM-DD' "CASE WHEN :creation_date is null THEN TO_CHAR(sysdate,'YYYY-MM-DD')  ELSE :creation_date END"

)

BEGINDATA

"1","column1_1","column2_1","column3_1","show_column_1","hide_column_1","2017-01-01"

"2","column1_2", ,"column3_2","show_column_2","hide_column_2"

"3","column1_3","column2_3","column3_3","show_column_3","hide_column_3","2017-01-01"

"4","column1_4", ,"column3_4","show_column_4","hide_column_4"

"5","column1_5","column2_5","column3_5","show_column_5","hide_column_5","2017-01-01"

"6","column1_6", ,"column3_6","show_column_6","hide_column_6"

"7","column1_7","column2_7","column3_7","show_column_7","hide_column_7","2017-01-01"

"8","column1_8", ,"column3_8","show_column_8","hide_column_8"

"9","column1_9","column2_9","column3_9","show_column_9","hide_column_9","2017-01-01"

"10","column1_10", ,"column3_10","show_column_10","hide_column_10"

运行命令

sqlldr userid=apps/appsjiahuicontrol=/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/file/cux_sqlldr_test.ctl  log=$CUX_TOP/sqlldr/file/cux_sqlldr_test.log

运行命令后,在file文件夹下生成了cux_sqlldr_test.log,在bad下生成了cux_sqlldr_test.bad,下面分析一下cux_sqlldr_test.ctl的内容和结果

代码

说明

OPTIONS (skip=3,rows=128)

sqlldr 的内容可以写在cotrol文件
load_data的前面,此处跳过前3行,每次提交128行

load data     

加载数据

CHARACTERSET ZHS16GBK  

字符集编码(如果出现乱码要考虑一下)

infile  *      

加载的文件,* 表示本文件

badfile 

错误的数据所放的文件(校验错误)

discardfile

丢弃的数据放的路径(记录的格式错误或过滤行)

TRUNCATE into table cux_sqlldr_test 

先TRUNCATE  cux_sqlldr_test再将记录插入表

WHEN column1 != "column1_1"

过滤行,对于值为column1_1的行过滤

Fields terminated by ","

多个字段间用“,”隔开

Optionally enclosed by '"'

单个字段用“"”,“"”开始结束

TRAILING NULLCOLS 

对于值为空的字段允许为空

(line_num  RECNUM ,

序号,自动生成,并不取自数据

seq_num  "cux_sqlldr_test_s.nextval" ,

取每条记录的第一个字段,此处应
为1..10,但是这里赋值序列。

代码

说明

column1 ,

column1

column2 ,

column2,表定义为非空字段,虽然上面
允许为空,但是如果该值为空,不能插入表种

column3 NULLIF (column3="column3_4"),

column3="column3_4"时候默认为空

show_column "UPPER(:show_column)" ,

大写列(调用UPPER大写函数)

hide_column  FILLER , 

FILLER 隐藏列

creation_date  DATE  'YYYY-MM-DD'

"CASE WHEN :creation_date is null THEN

TO_CHAR(sysdate,'YYYY-MM-DD') 

ELSE :creation_date END"

日期类型,格式为YYYY-MM-DD,为空的时候取系统日期

)

BEGINDATA

数据开始

*******

数据内容,默认每行一条记录

插入表的4种方式

insert,为缺省方式,在数据装载开始时要求表为空

append,在表中追加新记录

replace,(delete table) 删除旧记录,替换成新装载的记录

truncate,(truncate table)删除旧记录,替换成新装载的记录

(2)在控制文件中不包含数据.

上传cux_sqlldr_test.txt,cux_sqlldr_test.ctl至服务器,cux_sqlldr_test.txt由上面PLSQL脚本生成,cux_sqlldr_test.ctl如下

OPTIONS (skip=3,rows=128)

load data     

CHARACTERSET ZHS16GBK  

infile  "/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/file/cux_sqlldr_test.txt"     

badfile  "/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.bad"

discardfile "/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.disc"

TRUNCATE into table cux_sqlldr_test

WHEN column1 != "column1_4"

Fields terminated by ","

Optionally enclosed by '"'

TRAILING NULLCOLS

(

line_num  RECNUM ,

seq_num  "cux_sqlldr_test_s.nextval" ,

column1 ,

column2 "nvl(:column2,'***')",

column3 NULLIF (column3="column3_4"),

show_column "UPPER(:show_column)" ,

hide_column  FILLER ,

creation_date  DATE  'YYYY-MM-DD' "CASE WHEN :creation_date is null THEN TO_CHAR(sysdate,'YYYY-MM-DD')  ELSE :creation_date END"

)

运行命令

sqlldr userid=apps/appsjiahuicontrol=/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/file/cux_sqlldr_test.ctl  log=$CUX_TOP/sqlldr/file/cux_sqlldr_test.log

三.mysqlimport

mysqlimport客户端实际上就是“LOAD DATA”命令的一个包装实现,所以大部分参数选项与LOAD DATA相同。

文件名与导入表相同,例如patient.txt, patient.text和 patient都将被导入到指定表patient中。

语法: mysqlimport [options] db_name textfile1 [textfile2 ...]

简单导入命令:

mysqlimport -uroot -p dbcy --columns=tid,tname /home/t1.txt

[root@chengyu ~]# mysqlimport --help

.....

The following options may be given as the first argument:

--print-defaults         打印默认选项.

--no-defaults           除了登录文件,不读取其他选项文件中的任意默认参数.

--defaults-file=#       仅读取指定文件中的默认参数.

--defaults-extra-file=# global选项文件之后读取的指定选项文件.

--defaults-group-suffix=# Also read groups with concat(group, suffix)

--login-path=# 从.mylogin.cnf中读取登录路径选项.

--bind-address= 在具有多个网络接口的计算机上,使用此选项选择用于连接到MySQL服务器的接口.

--character-sets-dir=name 字符集的安装目录.

--default-character-set=name 指定字符集.

-c, --columns=name  指定列名,以逗号分隔.

-C, --compress      Use compression in server/client protocol.

-#, --debug[=#]      编写调试日志.

--debug-check         程序退出时打印调试信息.

--debug-info         程序退出时打印调试信息,内存和CPU统计信息.

--default-auth=name Default authentication client-side plugin to use.

-d, --delete        导入前清空表数据.

--enable-cleartext-plugin

  Enable/disable the clear text authentication plugin.

--fields-terminated-by=name 字段分隔符

--fields-enclosed-by=name 字段包括符

--fields-optionally-enclosed-by=name 列可选包括符

--fields-escaped-by=name 列终止符

-f, --force         忽略SQL error强制执行

-?, --help          帮助信息展示

-h, --host=name     将数据导入给定主机上的MySQL服务器,默认主机为localhost.

-i, --ignore        数据重复导入时,保存旧的.

--ignore-lines=#    忽略导入文件前n行.

--lines-terminated-by=name 行终止符

-L, --local         读取客户端本地数据文件.

-l, --lock-tables   锁表以写入

--low-priority      Use LOW_PRIORITY when updating the table.

-p, --password[=name] 用户密码

--plugin-dir=name   客户端plugins路径.

-P, --port=#       连接端口.

--protocol=name     protocol名(tcp, socket, pipe, memory).

-r, --replace       数据重复时,替换旧的.

-s, --silent        静默模式,仅在发生错误时才产生输出.

-S, --socket=name   指定socket.

--server-public-key-path=name 包含RSA公钥的文件的路径名.

--ssl-mode=name     与服务器连接的所需SSL    

--ssl-ca=name       包含受信任的SSL证书颁发机构列表的文件    

--ssl-capath=name   包含受信任的SSL证书颁发机构证书文件的目录    

--ssl-cert=name     包含X.509证书的文件    

--ssl-cipher=name   连接加密的允许密码    

--ssl-key=name      包含X.509密钥的文件    

--ssl-crl=name      包含证书吊销列表的文件    

--ssl-crlpath=name  包含证书吊销列表文件的目录    

--tls-version=name  允许的TLS协议进行加密连接,允许的值有: TLSv1, TLSv1.1, TLSv1.2, TLSv1.3

--ssl-fips-mode=name 是否在客户端启用FIPS模式,允许的值有: OFF, ON, STRICT

--tls-ciphersuites=name 允许的TLSv1.3密码套件用于加密连接

--use-threads=#     多线程执行.

-u, --user=name     用户名.

-v, --verbose       详细信息

-V, --version       显示版本信息并退出  

--compression-algorithms=name 用于服务器连接的允许压缩算法    

--zstd-compression-level=# 与使用zstd压缩的服务器的连接的压缩级别,有效区间1-22,默认值3.

参考博文:

https://blog.csdn.net/spring_model/article/details/54090878
https://blog.csdn.net/dingguanyi/article/details/82259685
https://blog.csdn.net/u010257584/article/details/106995361/

以上是关于数据库导入导出常用命令的主要内容,如果未能解决你的问题,请参考以下文章

数据库导入导出常用命令

数据库导入导出常用命令

PostgreSQL 常用命令 总结 ||数据库导入导出

PostgreSQL 常用命令 总结 ||数据库导入导出

Docker 镜像和容器的导入导出及常用命令

12数据库导入导出命令(结构+数据)?