数据库导入导出常用命令
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 | 使用外部表进行加载; |
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 | 加载数据 |
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" , | 取每条记录的第一个字段,此处应 |
代码 | 说明 |
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/
以上是关于数据库导入导出常用命令的主要内容,如果未能解决你的问题,请参考以下文章