django 真的非常好用,ORM 设计,加上开发时默认采用 SQLite 数据库,调试十分方便,默认的配置跑一些小的服务足够。但是,当数据变大时,SQLite 就不太够用了,我的某个项目现在 SQLite 数据库大小目前在 200 MB 左右,查询耗时,且 SQLite 不支持同步读取。服务器环境恰好已经建好 MySQL,遂打算迁移至 MySQL。下面记录一下操作过程。
安装必备的包
注意 python 的版本,我这里使用的是 ubuntu 20.04 LTS,默认 python 版本是 python3
sudo apt install python-is-python3
给系统安装 MySQL 的客户端(我这里是 Ubuntu 20.04 LTS)
sudo apt install default-libmysqlclient-dev
安装 Django 的 MySQL 驱动
pip install mysqlclient
在 MySQL 里新建数据库
CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
也可以直接在 PHPMyAdmin 里新建一个用户,顺便建立同名表并给予权限(有 PHP 环境的话这样更方便)
新建从数据库(slave)
根据刚才建好的表,填写 slave 数据库信息
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, "slave": { "ENGINE": "django.db.backends.mysql", "NAME": "dbname", "USER": "dbuser", "PASSWORD": "passwd", "HOST": "localhost", "PORT": 3306, }, }
迁移表结构和字段到从数据库
python manage.py migrate --database slave
导出数据到 JSON 中间数据
python manage.py dumpdata > data.json
这一步需要耗费一些时间,导出的中间数据体积可能会翻倍
切换主从数据库
DATABASES = { 'slave': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, "default": { "ENGINE": "django.db.backends.mysql", "NAME": "dbname", "USER": "dbuser", "PASSWORD": "passwd", "HOST": "localhost", "PORT": 3306, }, }
调换 slave 和 default,如上所示
从 JSON 中间数据导入主数据库
python manage.py loaddata data.json
要注意这一步非常吃内存,我这里导入 400 MB 的 JSON 中间数据,内存 3GB+2GB SWAP 花了四十分钟才导入完毕(CPU Xeon E5-2697A v4 @ 2.60GHz KVM 划出双核),如果服务器配置不够,建议在工作机上远程连接数据库完成
0 Comments (780 Views)
Leave a Reply