股票数据

股票数据的位置 http://pan.itshine.cn:5080/#s/64h6PiQQ&view=%E5%A4%A7%E6%95%B0%E6%8D%AE/%E8%82%A1%E7%A5%A8%E6%95%B0%E6%8D%AE/stock

下载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’来跳过前缀(以及该前缀前的所有字符)。如果某行不包括前缀,则整个行被跳过

作者:严锋  创建时间:2023-09-18 15:42
最后编辑:严锋  更新时间:2025-05-22 13:03