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
领取专属 10元无门槛券
私享最新 技术干货