探讨MySQL导入数据出错的原因和解决方法

记得上次帮隔壁王先生导入数据。
他急得满头大汗,屏幕上全是红字。
经过询问,我发现他使用的CSV文件中所有字段都用逗号分隔。
结果他的手抖了,甚至在导入命令中用了逗号。
现在所有数据都收集在一起了。
MySQL怎么理解这个呢?
1 .数据表不存在 这是最常见的事情。
比如你导出数据的时候用的是Products表,但是导入的时候却写成了Products,或者你不建表就敢导入。
我记得有一次,当我安装新系统时,我通过滑动将表的名称从 user_data 更改为 userdat。
一封信丢失了,数据也被卡住了。
解决?首先使用SHOW TABLES;确认表名。
如果不存在,则立即创建该表。
字段顺序和类型必须正确。

2 数据格式混乱 上次,客户使用Excel导入数据,得到的日期格式为01 /01 /2 02 3 默认情况下,MySQL 认为它们是美国日期并立即报告错误。
更有趣的是,字符串字段没有加引号,并且使用空格作为分隔符。
解决?用记事本打开文件,检查分隔符是否为逗号(默认为CSV),将日期更改为YYYY-MM-DD,并为所有文本添加双引号。
如果数据量很大,需要进行预处理。
使用 Python 脚本来完成此操作,只需几分钟即可完成。

3 版本不兼容 我记得MySQL 5 .7 之前不支持JSON。
有客户导出时使用了5 .8 的语法,结果导入到5 .7 的数据库爆炸了。
解决?要么客户升级数据库(需要花钱),要么您在使用 mysqldump 导入数据时添加 --兼容=ansi 参数,将高版本的功能降级为旧语法。
最愚蠢的方法是手动转换数据文件并将JSON字段转换为'',但我光想想就累了。

4 数据量很大,服务器挂掉了。
有一次导入了1 00G的数据,直接导致数据库崩溃。
后来发现max_allowed_pa​​cket很小,默认只有4 MB。
解决?暂时将配置文件改为[mysqld] max_allowed_pa​​cket=5 00M,或者批量导入。
例如,使用awk每1 000行截断一次,然后逐行导入。
如果还是慢,可以考虑关闭sql_log_bin=0来减少二进制日志写入。

等一下,还有一件事——我在导入数据时忘记添加 IGNORE,结果所有重复数据都被删除了。
这次我特地在表 products IGNORE 1 LINES 中添加了 LOAD DATA INFILE '/path/data.csv';用于防止标题行被用作数据的命令。

我突然想到,如果文件中含有扭曲的汉字怎么办?上次以 GBK 编码文件时,导入时会导致块格式错误。
解决?以 utf8 格式使用 iconv 进行转换,在命令行输入 iconv -f gbk -t utf8 data.csv -o new_data.csv,就完成了。

那么问题来了,如果数据中填充了特殊符号,比如全角符号、换行符等,还能直接导入吗?

mysql数据库导入错误,请高手帮忙解决。

重复的键会导致错误。
aijuhe_lxz_freei_me_cache 表的键列为主键。

进口前需要确认。
或者删除重复的键并重新导入。

或者删除主键。
但这会导入重复的值。
你自己看看吧。

MySQL数据库导入出错

上周有客户问我,如果从库数据与主库不一致,导致复制错误,而且全库数据量大,重新创建从库太慢怎么办?是否可以只恢复该表的数据?这件事其实就发生在我身上,下面我就讲一下我的经历。

首先你应该知道,一般情况下,不可能只修复一张表的数据,因为这涉及到各个表的不一致状态。
然而,人们总是在寻找解决方案。
我说一下两种场景的解决方案。

场景一:如果复制报错后,没有使用跳过错误、复制过滤等方法修复主从复制。
主库数据不断更新,从库数据一直处于错误状态。
目前可以在主库备份表t,然后恢复到从库,然后开始复制。
但问题就在这里。
复制起点为aaaa:1 01 ,从库上表t的数据状态领先于其他表。
如果有事务修改了表t中的数据,就会导致复制错误。
解决方案是在开始复制时跳过此事务。
具体操作如下:
1 .备份主库上的t表; 2 、设置复制过滤和过滤表t; 3 、开始复制,播放到指定GTID时停止复制; 4 . 删除复制过滤器并照常开始复制。

注意:这里使用mysqldump--single-transaction--master-data=2 来记录备份快照对应的GTID。

场景二:如果复制时报错,您已经通过跳过错误、复制过滤等方式修复了主从复制,并且主从数据库数据已更新。
目前可以在主库备份表t,停止从库复制,将表t恢复到从库,然后开始复制。
但问题就在这里。
复制的起点是aaaa:2 0001 如果有事务修改了表t的数据,这部分数据就会从数据库中丢失。
解决方案是从备份开始到复制开始期间锁定表t,以确保没有事务修改表t。
具体操作如下:
1 .向表t添加读取key; 2 、备份主库上的t表; 3 .停止从数据库的复制并恢复表t; 4 、开始复制; 5 . 解锁t表。

如果是大表,可以使用可传输表空间来备份和恢复表,以减少表锁定时间。

无论如何,这取决于你的决定。
这件事还是需要根据实际情况来决定。
我还在思考这个问题,也许有更好的办法。