需求背景:将redis rdb解析的结果集文件快速录入的mysql
表结构
CREATE TABLE `redis_analyze` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`db_index` int(11) DEFAULT NULL COMMENT 'redis db 下标',
`key_name` varchar(255) DEFAULT NULL COMMENT 'key name',
`data_type` varchar(20) DEFAULT NULL COMMENT '数据类型',
`expiry` int(11) DEFAULT NULL COMMENT '是否设置过期时间0-未设置,1-设置',
`element_count` int(11) DEFAULT NULL COMMENT '列表或hash等集合数据结构的key元素个数',
`total_size` int(11) DEFAULT NULL COMMENT 'values大小,单位字节',
`cluster_name` varchar(50) DEFAULT NULL COMMENT '集群名',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `udk_key` (`cluster_name`,`key_name`)
) ENGINE=InnoDB AUTO_INCREMENT=256 DEFAULT CHARSET=utf8mb4
待导入的数据文件格式
cat rdb_bigkey.txt
db key dataType expiry elementCount totalSize(byte)
0 KEY_1 string 0 1 52981
0 KEY_X string 0 1 54360
- 官方文档上未找到选择性录入文本中字段的方法
- 操作mysql的用户需要具备file权限
- 通过loccal指定从客户端寻找文件,否则从server端寻找文件
- 文本中的字段个数一定要和表中字段数量或者手动指定的字段数量一样
- 对于文本中没有的表字段可以通过set赋值
- 可以通过ignore 忽略表头
- 字段分割符号默认非空格,所以要指定分隔符为空格
具体sql
load data local infile './rdb_bigkey.txt' replace into table redis_analyze FIELDS TERMINATED BY ' ' IGNORE 1 rows (db_index,key_name,data_type,expiry,element_count,total_size) set cluster_name='test';
Query OK, 11 rows affected, 2 warnings (0.01 sec)
Records: 11 Deleted: 0 Skipped: 0 Warnings: 2
如果是从标准输出中load数据,可以这样写
方法来自
bash
awk '{ /* My script that spits out a CSV */ }' | mysql --local-infile=1 -u user -ppassword mydatabase -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE mytable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';"