起因:
本来电脑上装的是mysql5.5,有三十多个数据库,都是平时自己写demo创建的。数据量差不多有5G左右,后来公司要求用mysql5.7,因为不想直接删库,又不想直接一个一个导出来,索性直接全部导到一个文件中AllMySql20200331.sql。导出来容易,导进去难。我用Navicat导入的时候,发现很多数据都无法导进去,而且耗时很长。于是就想出分割文件的方法。把这一个文件分成三十多个文件,每个数据库有自己的sql
总思路:
先求AllMySql20200331.sql的总行数,求每个数据库定义语言和插入语言的开始行号和结束行号,执行这两者之间的sql就相当于创建一个数据库并且插入数据。
下面是代码:
--
-- Current Database: `bootstudy`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `bootstudy` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `bootstudy`;
--
-- Table structure for table `t_huser`
-
--
-- Current Database: `community`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `community` /*!40100 DEFAULT CHARACTER SET utf8 */;
这是AllMySql20200331.sql文件的demo,表示这个sql里面有两个数据库,当读取文件的时候,利用Current Database 来做分割的条件。
public class Db {
private String dbName; /*数据库名*/
private Long beginRow; /*大sql文件的开始行:创建某个数据库的开始语句行号*/
private Long endRow; /*大sql文件的结束行:创建某个数据库的结束语句行号*/
}
工具类
public class SplitSql {
public static void main(String[] args) {
BufferedReader reader = null;
BufferedWriter writer = null;
long totalRow = 0; //定义总行数
ArrayList<Db> dbs = new ArrayList<Db>(); //封装每个数据库的名字,开始行号和结束行号
try {
reader = new BufferedReader(new FileReader("D:\\IDEA\\workspace\\javabianchengsixiang\\src\\io\\AllMySql20200331.sql")); //读文件
String row; //存放每一行的sql语句
long beginRow;
long endRow;
while ((row = reader.readLine()) != null) {
++totalRow;
if (row.contains("Current Database")) {
String dbName = row.split(":")[1].trim().replaceAll("`", ""); //截取数据库名
Db db = new Db(dbName, totalRow, null);
dbs.add(db);
}
}
for (int i = 0; i < dbs.size() - 1; i++) {
Db first = dbs.get(i);
Db second = dbs.get(i + 1);
first.setEndRow(second.getBeginRow() - 1);
}
dbs.get(dbs.size()-1).setEndRow(totalRow);
for (int i = 0; i < dbs.size(); i++) {
System.out.println(dbs.get(i));
}
for (int i = 0; i < dbs.size(); i++) {
Db db = dbs.get(i); //为每个对象创建一个sql文件
writer = new BufferedWriter(new FileWriter(db.getDbName() + ".sql"));
reader = new BufferedReader(new FileReader("D:\\IDEA\\workspace\\javabianchengsixiang\\src\\io\\AllMySql20200331.sql"));
for (int j = 1; j <= totalRow; ++j) {
row = reader.readLine();
if(j>=db.getBeginRow()&&j<=db.getEndRow()){
writer.append(row+"\r\n");
}
}
writer.flush(); //很重要,不然sql文件为空
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
截取部分运行结果
原sql
截取后的sql
具体文件
后来发现有另一种方法,可以导入单个数据库的大文件,但是没有实践,详情参考:https://blog.csdn.net/diyinqian/article/details/80268371