如何快速的进行sql脚本升级

/ mysql / 没有评论 / 1979浏览

sql脚本升级即从一个老的脚本升级到一个新的全量的脚本。比如公司有某一个项目,有的客户已经用这个项目了,数据库里面去掉以前的初始化数据外,现在还有了客户自己的数据。但是这个版本中有严重的bug,所以为了让最新的war包适配以前数据库,必须对以前的数据库进行升级。在这里脚本升级以mysql脚本升级到mysql脚本(mysql升级到oracle,oracle升级到mysql这里没有考虑)

在升级脚本的过程中我们的已知条件是:以前老版本的初始化脚本(包括创建表,初始化数据)这里用A表示,还有新版本的初始化脚本(包括创建表,初始化数据)这里用B表示。所以升级脚本(B-A)

我们已知B-A的内容可能有新增了的一些表,一些索引,一些视图等等。还有多了很多初始化数据。 如果我们直接用肉眼未免太慢,也不保险。

所以必须通过其他方式解决。

第一步:看新脚本中比老脚本中多了哪些表,哪些索引:

sql语句是:其中TABLE_SCHEMA='A'或者TABLE_SCHEMA='B'就是我们常讲的数据库名。这个sql检查的是A库中比B库中多的表。

select * from (
select table_name from information_schema.`TABLES` where TABLE_SCHEMA='A'
) a 
where a.table_name  not in (
select table_name from information_schema.`TABLES` where TABLE_SCHEMA='B'
);

select * from (
select index_name from information_schema.STATISTICS where TABLE_SCHEMA='B'
) a 
where 
a.index_name not in (
select index_name from information_schema.STATISTICS where TABLE_SCHEMA='B'
);

第二步是看新脚本中的表结构是否改变,也就是是否在一个表中增加了一列,或者减少了一列,或者某列的数据类型和长度改变了。

查询数据库A的每张表中的列数

设A=select a.table_name,count(a.column_name) column_count from information_schema.columns a
where table_schema = 'A'
group by a.table_name order by a.table_name;

查询数据库B的每张表中的列数 设B:

select a.table_name,count(a.column_name) column_count from information_schema.columns a
where table_schema = 'A'
group by a.table_name order by a.table_name;

则查询的语句是:

select * from A LEFT JOIN  B on A.table_name=B.table_name;

把上面的A和B代入得到总的sql语句,sql语句如下所示:

select * from (select a.table_name,count(a.column_name) column_count from information_schema.columns a
where table_schema = 'thailand'
group by a.table_name order by a.table_name) A LEFT JOIN (
select a.table_name,count(a.column_name) column_count 
from information_schema.columns a
where table_schema = 'thailand'
group by a.table_name order by a.table_name) B on A.table_name=B.table_name;

通过这两个sql语句,可以为我们升级脚本减少一些时间。