1

手头有一个小项目,线上是 SQLite 数据库,本地开发环境为了管理方便用的是 MySQL 数据库。有时为了验证线上的一些数据问题,想要把线上的数据同步到本地来,然后导入到 MySQL 中。本来以为很简单的事情,实际还是花了些时间。

完整的过程主要分三步:

1. 下载线上的 SQLite 数据库到本地,并导出为 SQL 文件

这一步很简单,用 scp 命令可以解决文件的下载。导出成 SQL 文件也只需要使用下面的命令:

sqlite3 database.sqlite .dump > sqlite_dump.sql

database.sqlite 是下载的 SQLite 数据库名称,sqlite_dump.sql 就是导出后的 SQL 格式数据文件。

2. 转换 SQL 文件内容

SQLite 导出的 SQL 文件是无法直接在 MySQL 中使用的,需要对一些差异的语法进行转换。主要的差异点如下:

  • SQLite 有一些语句是 MySQL 不支持的,比如 BEGIN TRANSACTION, COMMIT, sqlite_sequence
  • SQLite 建表的一些语句和 MySQL 不兼容。比如 varchar not null,这种在 MySQL 中执行会报错。
  • SQLite 创建数据表用的是双引号: "",但 MySQL 用的是上引号: ``。
  • SQLite 的索引创建语句中,表名和字段都是使用的双引号,跟上面一条类似,需要换成上引号。
  • SQLite 使用 tf 表达布尔值, MySQL 用的是 10
  • SQLite 自增属性关键词是 AUTOINCREMENT, MySQL 是 AUTO_INCREMENT

转换这一步就是最耗时的了,网上搜了几个现成的转化代码,结果转换后都无法直接使用。只能自己一个一个的解决。

3. 导入 MySQL

通过第二步的转换后,就可以直接用 mysql 命令来导入 SQL 数据了。命令格式如下:

mysql -uroot -p123456 db_name < sqlite_dump.sql

db_name 就是要在 MySQL 中要导入的数据表名称。


zzxworld
7 声望1 粉丝