股票数据
下载10个左右。
初始化数据库
进入mysql
create database stock charset utf8;
create user stock@'%' identified by '123456';
grant all privileges on stock.* to stock@'%' with grant option
flush privileges
用curl命令下载这10个文件
linux下采用如下的方法。
curl curl ‘http://pan.itshine.cn:5080/?explorer/share/fileOut&shareID=64h6PiQQ&path=%7BshareItemLink%3A64h6PiQQ%7D%2F%E5%A4%A7%E6%95%B0%E6%8D%AE%2F%E8%82%A1%E7%A5%A8%E6%95%B0%E6%8D%AE%2Fstock%2F000006.csv' > ‘./000006.csv’
创建数据库表
head -1 000006.csv | sed -e 's/,/` varchar(255),`/g' -e 's/^/`/g' -e 'icreate table stock (' -e 's/\r$/` varchar(255) ) default charset=utf8;/g' | mysql stock
导入数据
注意,需要合并这10个文件,去除头上的字段名称
语法如下
load data local infile '/root/000020.csv' into table stock fields terminated by ',' ignore 1 lines;
在mysql5.7和8.0 中,由于安全问题,load data 命令默认不能使用,
因此需要使用在服务器端设置环境变量和客户端增加参数
mysql --local-infile=1 stock mysql> set global local_infile=1; mysql>exit
必须创建stock数据库和用户,我写脚本来检查。
脚本如下:
#!/bin/bash
for ip in `cat hosts`
do
# sshpass -p'123456' ssh -o StrictHostKeyChecking=no root@192.168.10.41
echo "checking $ip ... "
if [ "X$1" = "Xdebug" ] ; then
mysql -ustock -p123456 -h$ip stock -e "select count(*) from stock;"
else
mysql -ustock -p123456 -h$ip -e "select 1;" 2>/dev/null >&2
fi
if [ $? -eq 0 ] ; then
echo "checking $ip success"
else
echo "checking $ip failed"
fi
done
练习,删除用户和数据库,重新创建,伪代码如下
--clear.sh--
mysql <<EOF
drop user
drop database
EOF
--- import.sh
mysql <<EOF
create user
create base
grant
EOF
head -1 .... |mysql
mysql <<EOF
load data ..
EOF
参考答案
mysql << EOF
drop user stock;
drop database stock;
EOF
#!/bin/bash
mysql << EOF
create database stock charset utf8;
create user stock@'%' identified by '123456';
grant all privileges on stock.* to stock@'%' with grant option;
flush privileges;
EOF
head -1 /root/000001.csv | sed 's/,/ varchar(255),/g'| sed 's/^/create table stock(/g'|sed 's/\r$/ varchar(255)) default charset utf8;/g' | mysql stock
# for ((i=1;i<=999;i++))
# do
# tail -n +2 /root/000$(printf %3d $i).csv 2>/dev/null >>/root/all.csv
#done
>all.data
for f in /root/*csv
do
cat $f | sed 1d >>all.data
done
mv all.data all.csv
mysql << EOF
use stock;
load data local infile '/root/all.csv' into table stock fields terminated by ',' ignore 1 lines;
EOF
rm -f /root/all.csv
load data 用法
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE ‘file_name’
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name,…)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY ‘string’]
[[OPTIONALLY] ENCLOSED BY ‘char’]
[ESCAPED BY ‘char’]
]
[LINES
[STARTING BY ‘string’]
[TERMINATED BY ‘string’]
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var,…)]
[SET col_name = expr,…]
语法解释及实例分析
file_name: 文件名file_name需要是字符串,在windows下, 路径可以为斜杠’/‘ 或双反斜杠’\‘ (windows下验证)。
PARTITION: MySQL 5.6.2及其后续版本,LOAD DATA INFILE开始支持PARTITION分区选项。对于分区表应采用使用表锁的存储引擎,例如myisam,不适用与行锁的存储引擎,如Innodb,因为LOAD DATA不能移除任何分区锁。
CHARACTER SET: 由character_set_database系统变量指示的字符集被用于解释文件中的信息。SET NAMES和character_set_client的设置不会影响对输入的解释。假如文件中的字符编码与默认不一致,最好用CHARACTER SET语句指定编码方式,这就需要我们通过mysqldump或SELECT … INTO OUTFILE导出文件时通过参数–default-character-set指定导出文件的编码格式。
注意:导入文件不支持ucs2, utf16, utf16le, 或 utf32编码格式。
LOW_PRIORITY: 该参数适用于表锁存储引擎,比如MyISAM, MEMORY, 和 MERGE,在写入过程中如果有客户端程序读表,写入将会延后,直至没有任何客户端程序读表再继续写入。
CONCURRENT: 使用该参数,允许在写入过程中其它客户端程序读取表内容。
对复制的影响:使用基于语句格式(statement-based)的复制,在mysql5.5.1之前,CONCURRENT参数不能被复制。使用基于行格式(row-based)的复制,在mysql5.1及其后续版本,都可以被正确复制。mysql5.6认为使用LOAD DATA INFILE是不安全的,当使用statement-based格式的日志时会发出警告,使用mixed格式的日志时会被存储为row格式。
LOCAL: 该关键字影响文件的预期读取位置及错误句柄。需要客户端及服务端都开启该选项,如果mysqld的启动参数包含local-infile=0,那么指定该参数是无效的。
对文件查找的影响:
指定该选项:文件将会由客户端程序在客户端主机上查找,然后发送到服务端。可以指定文件的绝对路径和相对路径,指定相对路径的话会在客户端程序目录下查找。
执行导入的时候会先将文件复制到服务端的临时文件夹下(linux下是 /tmp, windows下是C:\WINDOWS\TEMP),如果临时文件夹空间不足将会导致LOAD DATA失败。
未指定该选项:文件将由服务端程序在服务端主机上查找,查找规则如下:
如果给定了一个绝对的路径名称,则服务器使用此路径名称。
如果给定了带有一个或多个引导组件的相对路径名称,则服务器会搜索相对于服务器(数据目录)的文件。
如果给定了一个不带引导组件的文件名称,则服务器会在默认(数据库)的(数据库目录)中寻找文件。
例如:./myfile.txt会在数据库的data目录下查找,myfile.txt会在我们连接时使用的默认数据库,如test的数据目录下查找。
LOCAL对错误句柄的影响:
使用LOAD DATA INFILE,数据解释和主键冲突error会终止操作。
使用LOAD DATA LOCAL INFILE数据解释和主键冲突error会变成warning,操作继续,因为mysql server没有办法在操作过程中结束数据的传输。对于主键冲突error来讲,该方法类似于指定IGNORE。
REPLACE 与 IGNORE: 控制输入的行与唯一主键的重复。
REPLACE: 输入行替换已经存在的行。即与主键或唯一索引列的重复。
IGNORE: 输入行与已经存在的行主键或唯一索引列重复,则丢弃。
假如二者都未指定:行为就会取决于是否指定了LOCAL参数。
导入数据过程中忽略(外键约束)可以在LOAD DATA前执行SET foreign_key_checks = 0 。
LINES STARTING BY ‘prefix_string’:如果所有希望读入的行都含有一个我们希望忽略的共用前缀,则可以使用’prefix_string’来跳过前缀(以及该前缀前的所有字符)。如果某行不包括前缀,则整个行被跳过
最后编辑:严锋 更新时间:2025-05-22 13:03