故障分析

2023-10-27

作者:刘晨

网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Oracle ACE ,腾讯云TVP,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,CSDN & ITPub 专家博主,公众号"bisal的个人杂货铺",长期坚持分享技术文章,多次在线上和线下分享技术主题。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


同事提了一个MySQL数据导入的问题,使用load data将本地文件(.csv)导入数据库表的时候,提示这个错误,

| Warning | 1265 | Data truncated for column 'c1' at row 1 |

为了能更好的说明问题,屏蔽业务信息,我们来构造测试数据模拟。

一、准备工作

(1)csv测试文件,如下所示,简化了原始文件,包含两个日期类型的数据,和一个字符串类型的数据,

cat online.csv
"2022-01-01 00:00:00","A","2022-02-01 00:00:00"
"2022-01-02 00:00:00","B","2022-02-02 00:00:00"
"2022-01-03 00:00:00","C","2022-02-03 00:00:00"
"2022-01-04 00:00:00","D","2022-02-04 00:00:00"
"2022-01-05 00:00:00","E","2022-02-05 00:00:00"

我们知道,csv 文件可以用 excel 打开,如下所示,

(2)测试表结构,如下所示,

bisal@mysqldb 18:21:  [test]> desc t;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | bigint      | NO   | PRI | NULL    | auto_increment |
| c1    | datetime    | YES  |     | NULL    |                |
| c2    | varchar(10) | YES  |     | NULL    |                |
| c3    | datetime    | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

(3)原始执行的导入指令是,

load data local infile '/home/mysql/online.csv' 
into table test fields terminated by ',' lines terminated by '\n' 
(c1, c2, c3) 
set c1=date_format(@c1, '%Y-%m-%d %H:%i:%s'), 
c3=date_format(@c3, '%Y-%m-%d %H:%i:%s');

P. S. 如果执行出现这个错误,

ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides

可以看下local_infile变量值,

bisal@mysqldb 18:23:  [test]> show global variables like 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

如果是OFF,需要改为ON,

bisal@mysqldb 18:23:  [test]> set global local_infile=1;
Query OK, 0 rows affected (0.00 sec)

再次执行导入,如果报这个错,

ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

可以在客户端登录的时候,加上参数–local-infile=1,

mysql -ubisal -pbisal --local-infile=1

二、实际测试

(1)第一次尝试

如下导入指令,提示了1265的错误,

bisal@mysqldb 18:50:  [test]> load data local infile '/home/mysql/online.csv' into table t fields
    -> terminated by ',' lines terminated by '\n'
    -> (c1, c2, c3) set c1=date_format(@c1, '%Y-%m-%d %H:%i:%s'), c3=date_format(@c3, '%Y-%m-%d %H:%i:%s');
Query OK, 5 rows affected, 10 warnings (0.01 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 10

bisal@mysqldb 18:51:  [test]> show warnings;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1265 | Data truncated for column 'c1' at row 1 |
| Warning | 1265 | Data truncated for column 'c3' at row 1 |
| Warning | 1265 | Data truncated for column 'c1' at row 2 |
| Warning | 1265 | Data truncated for column 'c3' at row 2 |
| Warning | 1265 | Data truncated for column 'c1' at row 3 |
| Warning | 1265 | Data truncated for column 'c3' at row 3 |
| Warning | 1265 | Data truncated for column 'c1' at row 4 |
| Warning | 1265 | Data truncated for column 'c3' at row 4 |
| Warning | 1265 | Data truncated for column 'c1' at row 5 |
| Warning | 1265 | Data truncated for column 'c3' at row 5 |
+---------+------+-----------------------------------------+
10 rows in set (0.00 sec)

检索数据,虽然导入了文件中的5条记录,但日期字段,都给截断了,存储的是空值,

(2)第二次尝试

从(1)的指令看,要将文件online.csv的数据,按照","分隔,导入t表的字段中,其中c1和c3是datetime日期类型的,而且load data指令中使用了set,需要对数据进行二次处理,按照日期格式,进行转换存储,

c1=date_format(@c1,'%Y-%m-%d%H:%i:%s')
c3=date_format(@c3,'%Y-%m-%d%H:%i:%s'),

因此,load data指令中()括号内的字段,应该使用变量,

load data local infile '/home/mysql/online.csv' into table t fields 
terminated by ',' lines terminated by '\n' 
(@c1, c2, @c3) 
set c1=date_format(@c1, '%Y-%m-%d %H:%i:%s'), 
c3=date_format(@c3, '%Y-%m-%d %H:%i:%s');

修改指令,再次执行导入,还是报错了,但这次是1292的错误,根据报错的数据,文件中的第一个字段日期多了双引号,第三个字段日期则多了双引号和"\x0D"(了解ASCII的同学,肯定知道这是回车的意思),

bisal@mysqldb 18:51:  [test]> load data local infile '/home/mysql/online.csv' into table t fields
    -> terminated by ',' lines terminated by '\n'
    -> (@c1, c2, @c3) set c1=date_format(@c1, '%Y-%m-%d %H:%i:%s'), c3=date_format(@c3, '%Y-%m-%d %H:%i:%s');
Query OK, 5 rows affected, 10 warnings (0.02 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 10

bisal@mysqldb 18:51:  [test]> show warnings;
+---------+------+-------------------------------------------------------+
| Level   | Code | Message                                               |
+---------+------+-------------------------------------------------------+
| Warning | 1292 | Incorrect datetime value: '"2022-01-01 00:00:00"'     |
| Warning | 1292 | Incorrect datetime value: '"2022-02-01 00:00:00"\x0D' |
| Warning | 1292 | Incorrect datetime value: '"2022-01-02 00:00:00"'     |
| Warning | 1292 | Incorrect datetime value: '"2022-02-02 00:00:00"\x0D' |
| Warning | 1292 | Incorrect datetime value: '"2022-01-03 00:00:00"'     |
| Warning | 1292 | Incorrect datetime value: '"2022-02-03 00:00:00"\x0D' |
| Warning | 1292 | Incorrect datetime value: '"2022-01-04 00:00:00"'     |
| Warning | 1292 | Incorrect datetime value: '"2022-02-04 00:00:00"\x0D' |
| Warning | 1292 | Incorrect datetime value: '"2022-01-05 00:00:00"'     |
| Warning | 1292 | Incorrect datetime value: '"2022-02-05 00:00:00"\x0D' |
+---------+------+-------------------------------------------------------+
10 rows in set (0.00 sec)

当然这两个日期字段还是被截断的,

(3)第三次尝试

我们先解决双引号的问题,向指令中增加 enclosed by ‘"’ ,目的是删除包裹的双引号,

bisal@mysqldb 18:52:  [test]> load data local infile '/home/mysql/online.csv' into table t fields
    -> terminated by ',' enclosed by '"' lines terminated by '\n'
    -> (@c1, c2, @c3) set c1=date_format(@c1, '%Y-%m-%d %H:%i:%s'), c3=date_format(@c3, '%Y-%m-%d %H:%i:%s');
Query OK, 3 rows affected, 5 warnings (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 5

bisal@mysqldb 18:52:  [test]> show warnings;
+---------+------+----------------------------------------------------------------------------------+
| Level   | Code | Message                                                                          |
+---------+------+----------------------------------------------------------------------------------+
| Warning | 1292 | Truncated incorrect datetime value: '2022-02-01 00:00:00"
"2022-01-02 00:00:00' |
| Warning | 1262 | Row 1 was truncated; it contained more data than there were input columns        |
| Warning | 1292 | Truncated incorrect datetime value: '2022-02-03 00:00:00"
"2022-01-04 00:00:00' |
| Warning | 1262 | Row 2 was truncated; it contained more data than there were input columns        |
| Warning | 1292 | Incorrect datetime value: '"2022-02-05 00:00:00"
'                              |
+---------+------+----------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

可以看到,有两行数据正确插入了,但是另外三行存在错误,要么是第三个字段被截断了,要么就是没插入进来,要解决回车问题,

(4)第四次尝试

除了回车问题,我们可以看到,此处用的是date_format函数,但实际上从文件中读到的是字符串,因此可改为str_to_date函数,格式相同,

bisal@mysqldb 18:53:  [test]> load data local infile '/home/mysql/online.csv' into table t fields
    -> terminated by ',' enclosed by '"' lines terminated by '\n'
    -> (@c1, c2, @c3) set c1=str_to_date(@c1, '%Y-%m-%d %H:%i:%s'), c3=str_to_date(@c3, '%Y-%m-%d %H:%i:%s');
Query OK, 3 rows affected, 5 warnings (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 5

bisal@mysqldb 18:53:  [test]> show warnings;
+---------+------+----------------------------------------------------------------------------------+
| Level   | Code | Message                                                                          |
+---------+------+----------------------------------------------------------------------------------+
| Warning | 1292 | Truncated incorrect datetime value: '2022-02-01 00:00:00"
"2022-01-02 00:00:00' |
| Warning | 1262 | Row 1 was truncated; it contained more data than there were input columns        |
| Warning | 1292 | Truncated incorrect datetime value: '2022-02-03 00:00:00"
"2022-01-04 00:00:00' |
| Warning | 1262 | Row 2 was truncated; it contained more data than there were input columns        |
| Warning | 1411 | Incorrect datetime value: '"2022-02-05 00:00:00"
' for function str_to_date     |
+---------+------+----------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

数据还是没都插入成功,

(5)第五次尝试

我们这次解决回车的问题,lines terminated by增加\r,执行指令,正常,

bisal@mysqldb 18:53:  [test]> load data local infile '/home/mysql/online.csv' into table t fields
    -> terminated by ',' enclosed by '"' lines terminated by '\r\n'
    -> (@c1, c2, @c3) set c1=str_to_date(@c1, '%Y-%m-%d %H:%i:%s'), c3=str_to_date(@c3, '%Y-%m-%d %H:%i:%s');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

验证一下数据,都正常插入了,

针对这个问题,从表象上是load data指令各种参数的用法,但实际上考查了很多内容,有技术上的,有问题排查思路的,

(1)是否了解load data不让执行的原因,需要做什么配置改动。

(2)是否了解load data中各个参数的含义,terminated by、enclosed by、lines terminated by,包括()括号内用的是字段名称还是@变量名称,set二次处理数据应该怎么用。

(3)是否了解csv用txt和excel打开显示不同?用txt打开,会看到每个字段有双引号,逗号分隔,而excel打开,则是正常的单元格显示,会产生误解。

(4)是否了解date_format函数和str_to_date函数有什么不同?

(5)MySQL中执行各种指令报错,通过show warnings显示的错误信息中,能看到些端倪,例如Truncated incorrect date time value:'2022-02-0100:00:00",可以知道是文件中的第一个字段还是第三个字段存在问题,当然因为这是为了做测试,特意将数据做成有规律的,如果是生产实际执行的,不一定能很有规律的呈现出来,这就要更仔细地理解这些错误提示,从中找到线索,往往这种能力,除了具备天赋,是碰到更多的问题锻炼出来的,这就要关注平时的积累。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

故障分析 的相关文章

  • node实现文件上传(1)

    1 FormData对象 以对象的方式来表示页面中的表单 又称为表单对象 以key value的方式来保存数据 XMLHttpRequest对象可以轻松的表单对象发送的服务器端 1 是一个构造函数 new FormData 2 常用的API
  • 分布式事务的二阶段提交和三阶段提交

    分布式事务 是指存在多个跨库事务的事务一致性问题 或者是指分布式架构下由多个应用节点组成的多个事务之间的事务一致性问题 在单点服务时 某电商会员购买上市时会出现以下情况 开启数据库事务 创建订单 会员积分减少 商品库存减少 提交数据库事务
  • MYSQL获取最近7天的日期

    写一个简单的 获取最近7填日期的sql select DATE SUB curdate INTERVAL 1 DAY day1 union select DATE SUB curdate INTERVAL 2 DAY day2 union
  • Zookeeper基础知识(一)

    一 Zookeeper是什么 ZooKeeper是一个开放源码的分布式协调服务 它是集群的管理者 监视着集群中各个节点的状态根据节点提交的反馈 进行下一步合理操作 最终 将简单易用的接口和性能高效 功能稳定的系统提供给用户 分布式应用程序可

随机推荐

  • echarts的grid——图表的位置配置

    博主 小猫娃来啦 文章核心 echarts的grid 图表的位置配置 文章目录 认识并了解grid grid有哪些属性 有什么用 关键点 grid所有属性 containLabel属性 总结 认识并了解grid 首先还是先认识grid 要弄
  • VMware中安装Ubuntu

    前言 本文档将演示通过 VMware 安装 Ubuntu 所使用的文件如下 VMware Workstation Pro ubuntu 16 04 6 desktop amd64 iso 本文档分为三个部分 新建虚拟机 安装系统 调整页面
  • gradle引入依赖包/maven引入依赖包

    1 打开https mvnrepository com 搜索出需要的jar包 2 点击进入需要jar包 选择maven或gradle的tab页 复制依赖url即可 如图 3 gradle项目的话 点击buildDependents即可 如图
  • 工业机器人仿真参考

    最近有一些朋友看到我做的关于Unity3d仿真机器人的项目 本次我在平台做以分享 希望的朋友或者有需要在此基础做开发的可以参考下 开发工具 下位机 Unity3D 上位机 Visual Studio 机械臂模型 TH6 QKM SCARA
  • Linux内核启动过程学习

    过完年来 敲着键盘都有点生疏了 很多东西都有点忘记了 还有刚上班还有点不习惯 状态还没有转换过来 没有办法趁这个机会就复习一下Linux的启动过程吧 asmlinkage void init start kernel void char c
  • 用python做自动化测试--序

    几年来 都有个想法 写个 用Python做自动化测试 的系列文章 把自己的经验和大家共享 和大家多交流 同时总结下自己掌握的东西 但苦于一直忙 其实准确点的说是自己懒 迟迟没有开始 我想不能再懒了 要不以后会更忙 更懒 我为什么选择pyth
  • Python统计学实例之正态分布:计算男女身高相差>5厘米的概率

    正态分布计算 示例1 正态分布计算实例 计算男女身高相差 gt 5厘米的概率 解题思路 用到的公式 总结 正态分布计算实例 计算男女身高相差 gt 5厘米的概率 假设男生身高 X N 71 20 25 女生身高 Y N 64 16 解题思路
  • Docker安装部署FastDFS详细过程

    FastDFS分布式文件存储的由来 在我们的项目中有很多需要存储的内容出现 比如图片 视频 文件等等 在早期的时候用户量不大 产生的文件也不是很多 这时我们可以把文件和服务程序放在一个服务器中 随着文件越来越多 服务器的资源会被文件资源大量
  • centos7:搭建部署confluence(6.10.0)

    1 test env host ip 20 20 20 20 host name centos7 ssh soft 2 安装jdk sudo rpm ivh jdk 8u181 linux x64 rpm sudo vim etc prof
  • 【C++】对象初始化和清理

    对象的初始化和清理 首先 我们创建完一个类后 当我们需要对类进行初始化 而当我们完成工作后 需要对类进行清理 这些工作 分别需要调用构造函数和析构函数 构造函数和析构函数的定义与特点 构造函数 1 作用 主要作用于对创建的对象成员属性进行初
  • 好的asp.net网站和论坛(转)

    站点推荐 http expert csdn net Expert topic 3008 3008621 xml temp 8 143252E 02 1 ASP Net中怎么样实现水晶报表在客户端打印 ms help MS VSCC 2003
  • linux下svn revert递归恢复

    svn revert R
  • 记住看小电影前一定要检查网址是不是 HTTPS 的,不然…

    看小电影还是浏览正常网站 一定要检查是不是 HTTPS 的 HTTP有可能被中间人攻击和拦截 下面就是详细的 HTTPS 原理 细思极恐 1 HTTP 协议在谈论 HTTPS 协议之前 先来回顾一下 HTTP 协议的概念 1 1 HTTP
  • Wireshark的流量分析例题

    简述流量分析 网络流量分析是记录和分析网络流量以出于性能 安全性 网络操作 管理和排障为目的分析网络流量的过程 它是使用自动技术检查网络流量中的详细级别细节和统计信息的过程 为了更好的去体会流量分析 我们使用wireshark来进行演示 演
  • JAVA学习【2】错误:无法从静态上下文中引用非静态

    编程时遇到 错误 无法从静态上下文中引用非静态 输出10到20的数字 程序如下 public class MyCode1 int count 10 public static void main String args while coun
  • 顺序表的实现与基本操作

    1 顺序表定义 1 1 顺序表定义 静态分配 c语言实现 include
  • sqli-labs 5~6 多命通关攻略

    sqli labs 5 6 多命通关攻略 描述 判断注入类型 正常输入 不正常输入 错误输入 判断 SQL 查询结果的列数 猜测 SQL 查询结果中的列数为两列 猜测 SQL 查询结果中的列数为三列 猜测 SQL 查询结果中的列数为四列 爆
  • 全面了解虚幻引擎 5

    Incredibuild 与 Epic 合作密切 并与虚幻引擎深度集成 因此对于虚幻引擎 5 的发布 我们也是既期待又兴奋 不得不说 虚幻引擎 5 没有辜负我们的期待 在技术上达到了真正的 虚幻 级别 虚幻引擎 4 的进步本身也不少 公正地
  • Python---Anaconda安装

    目录 前言 Anaconda介绍 特点 一 下载安装包 1 1 官网直接下载 1 2 清华镜像网下载 二 安装 三 配置 3 1 配置环境变量 3 2 验证安装 anaconda验证 python版本验证 3 3 anaconda设置 更改
  • 故障分析

    作者 刘晨 网名 bisal 具有十年以上的应用运维工作经验 目前主要从事数据库应用研发能力提升和技术管理相关的工作 Oracle ACE 腾讯云TVP 拥有 Oracle OCM OCP EXIN DevOps Master SCJP 等