手头有一个小项目,线上是 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 使用
t
和f
表达布尔值, MySQL 用的是1
和0
。 - SQLite 自增属性关键词是
AUTOINCREMENT
, MySQL 是AUTO_INCREMENT
。
转换这一步就是最耗时的了,网上搜了几个现成的转化代码,结果转换后都无法直接使用。只能自己一个一个的解决。
3. 导入 MySQL
通过第二步的转换后,就可以直接用 mysql
命令来导入 SQL 数据了。命令格式如下:
mysql -uroot -p123456 db_name < sqlite_dump.sql
db_name
就是要在 MySQL 中要导入的数据表名称。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。