首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL低版本数据传入高版本报错的解决办法

MySQL低版本数据传入高版本报错的解决办法

最近处理了一个非常棘手的老程序,高并发,但是偏偏又是采用的MySQL5.0,并发数一高就会无法链接,本地链接返回报错“too much connections”。

我本身php和SQL语言都不算精通,所以无法从程序上解决这个问题,不过在摸索的过程中意外的了解到了如何把低版本的MySQL数据传入高版本的MySQL中。

说在最前面的是,MySQL最快的数据导入方式是复制MySQL的Data文件夹,除了mysql库,其他的库即为需要迁移的数据库。这个文件夹的路径记录在my.ini(Windows系统)或者my.cnf(Linux系统)里,其中有一列为datadir,这后面是一个路径,这个路径内的文件即为所有数据,再次说明,data/mysql文件夹一定不要也复制过去,系统表似乎存在兼容性问题(未测试,印象中)。

接下来说一说那些不能直接复制的情况,比如云数据库、虚拟主机数据库等情况。

首先当然是从旧数据库中还原出SQL,接下来可以尽量使用第三方的数据库管理工具,一定是可以试试看到报错的,我使用的是Navicat。

褒贬不一,但是处理一些特定问题很好用

这个软件在导入数据的时候会把导入失败的表抛出,在导入失败的时候,可以记录下导入失败的表的名字,一般来说,导入失败多数分为两种,

1.表创建失败

2.表创建成功,但是数据导入失败

无论哪种失败,为了缩小范围,可以把导出失败的表单独导出,以编辑模式打开,其中通常包含两类语句,一种是

DROP TABLE IF EXISTS‘database_name’;

CREATE TABLE`database_name` (

...

);

(简单的解释一下drop table if exists是看看名为“database_name”的数据库是不是已经存在,如果没存在就创建一个名为“database_name”的数据库。)

另一种是

INSERT INTO`data_name`VALUES('data');

(简单解释一下insert into就是传入一条数据。)

升级过程中,常见的创建表失败一般来自date或者primary key。date一般用来提取当前的时间,老一些的数据库中这里通常会为时间格式写一个非常严格的规范,比如,

`date` date not null default '1970-00-00',

这里我们可以给一个空值,即把这里语句修改为,

`date` date NULL,

这里说的细一些,'date'在create table语句中,置于后面的( )中,如果是在Navicat中显示则为表头一般的存在。意思是创建一列,这一列中显示的内容是时间。date not null default '1970-00-00'部分则是给时间的一个规则,改为date NULL则意为给这个时间的初始值是一个空值,而不是更多的限制。

再说primary key,意为主键约束,在众多文档中的描述里,主要是有三条要求,

主键必须包含唯一的值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,并且每个表只能有一个主键。

举例说明

primary key (`YN`)

比如后续传输的数据里,有一列的头是`YN`,其数值只为Yes和No,或者1和0的话,那么创建好的标最多只能传输成功两条数据,因为主键约束里的列是不能重复的。

除了这里距离的Yes or No,1和0之外,date也经常会出现错误,但是通常是格式错误,事实上,条件允许的话,可以把date的数据类型改为varchar,大概这样写,

`date` varchar(20),

这样时间将以字符的形式保存,如果不存在后续数据中保存两条一样的时间的话,就不会出问题。

当主键中存在多个条件时,比如

PRIMARY KEY (`date`,`YN`)

也可以把主键约束修改为唯一约束,这也是最简单粗暴的改法,修改后如下,

UNIQUE KEY(`date`,`YN`)

这里目前我还在了解之中,不过相对于主键约束,唯一约束的要求更低一些。不过我目前接触到我网站项目中,还没有因此触发了BUG的,有待考证。

多数的表创建失败问题结束后,遇到的问题基本上就是数据插入问题了,上面提到的

INSERT INTO`data_name`VALUES('data');

在之前描述的标创建过程中给每列数据设置了类型,比如说这里的data_name的要求是每行的内容不能一致,每行的内容不能是空值。而后面的data则是实际要插入的值,这个值要满足data_name的要求。

所以说,如果后续插入的数据不满足要求,一一的排查是那行数据,具体是什么数据即可。

本文对MySQL,或者说是SQL语言完全一窍不通的人可能没有帮助。但是不客气的说一句,如果完全不会SQL语言,企图做SQL优化不是太天方夜谭了吗?

The End

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181112G10I3D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券