此前处理过几次edx数据迁移方面的工作,包括
release-2014-09-17)release-2014-09-17)迁移到birch中1,3本质上是数据导出与导入问题,2涉及到新旧版edx数据结构的变化,下边分别说明。
#几点建议
/edx/var/edxapp/staticfiles#just do it 分三部分来说:
##同版本的edx迁移时的数据迁移(本质是数据导出和导入) 之所以要在同版本中迁移数据,是因为服务器发生了变更,需要迁移整个平台。尝试过打包整个系统的做法(tar备份还原),也试过使用Remastersys做整个系统的镜像,两种方法造成的结果都是数据库罢工。基于dd指令的方法还没用过 :)。以上其实是个运维的问题,我对此并不很熟悉。
所以最终采用的是重新在一个新的平台上部署,之后将数据迁移过去。这样做确实挺烦的,edx的每次国内安装过程都很蛋疼(你懂的),所以才一直想使用docker来跑edx,这样迁移什么的都酸爽极了,更不用说开发。
###mysql
|
|
一般来说主要数据都在edxapp里,如果你要备份所有数据的话,使用这条mysqldump -u root --all-databases> alldb.sql
对应的还原mysql -u root -p < alldb.sql
###mongo
|
|
##edx升级后的数据迁移 首先让人想到的是update,但据我所知很少有人能一次性update成功的,这归结于edx的依赖错综复杂。
update究竟干了啥,look here
如果使用update,中途遇到的问题,只好手动处理了
如果是从aspen升级到birch,参考这里
###手动迁移
我当时面对的场景是,在一台新的服务器上部署birch,然后要将release-2014-09-17版上的数据迁移过去。
当时的做法比较简单,因为我们只对文章开头提到几类数据感兴趣,所以对比了这些数据表结构基本没变化后,我直接导出旧有数据,覆盖新的,至于mongo部分也是如此,推荐使用diff做比较。手动的方案虽然繁琐,但足够灵活。
至于定制的代码,都限制在独立的django application里,所以定制代码的迁移也并不麻烦。复制整个application目录便是,之后syncdb/migrate一下。
####mysql
|
|
####mongo
|
|
###自动迁移
后来想到更好的方案
当初在release-2014-09-17上做二次开发时有考虑到之后要升级的问题,所以二次开发的代码除了限制在一个application里之外,还都在wwj_master分支上。
首先在旧版服务器上工作:
git checkout -b new_branch origin/new_branchgit rebase new_branch wwj_master关于衍合的知识可以看这里
rebase完之后,同步数据库,执行syncdb和migrate。这里有相关命令
如此一来,就完成了edx-platform源码的升级,定制的内容也都在,同时旧版的数据库也和新版一致了。
此后直接将旧版上整套edx-platform源码和数据库备份文件,移到新版服务器中进行替换就行。
很像1中同版本的迁移时的数据迁移的情况了。
##将数据迁移给docker中的edx使用(edx版本相同)
这里其实和同版本的edx迁移时的数据迁移(本质是数据导出和导入)没啥区别,需要注意的是,记得将数据库文件目录挂载出来,使用-v参数,这样数据的安全性得到保证,数据不会因为docker进程的挂掉而丢失。
顺便提一下,把静态文件目录/edx/var/edxapp/staticfiles也挂载出去.
总之,使用docker的核心观念之一是容器无状态。把你认为需要状态的数据都挂载出去
#附录
我在升级release-2014-09-17到named-release/birch时,对比过mysql中所有表结构的差异。
##用到的相关指令
|
|
2016.04.07更新
如果从birch迁移到dogwood,那么数据表有以下差异
###mongodb cs_comments_service_development数据库中contents表新版比老版多一个key:context,value:string
cat contents.dat | jq -c ‘. + { “context”: “course” }’ > contents_ok.dat
-c:不改变单行模式
另一个问题是course_id发生了变化你可以使用vi逐个替代
:%s,edX/DemoX/Demo_Course,course-v1:edX+DemoX+Demo_Course,g
课程多的话使用,vi显然效率太低,也可以使用sed和jq来做流式编辑
(思路:1.使用正则首先需要定位,course_id之后,然后分组捕获元素,使用环顾,或者逐行装换为json)
我对python的正则熟悉一些还是用python好了,往format_course_id.py写入
|
|
cat contents.dat | python format_course_id.py >/tmp/contents.dat
###mysql auth_userprofile表dogwood比brich多了两个字段:bio和profile_image_uploaded_at;
迁移方法为先
|
|
最后SET FOREIGN_KEY_CHECKS=1
此前处理过几次edx数据迁移方面的工作,包括
release-2014-09-17)release-2014-09-17)迁移到birch中1,3本质上是数据导出与导入问题,2涉及到新旧版edx数据结构的变化,下边分别说明。
#几点建议
/edx/var/edxapp/staticfiles#just do it 分三部分来说:
##同版本的edx迁移时的数据迁移(本质是数据导出和导入) 之所以要在同版本中迁移数据,是因为服务器发生了变更,需要迁移整个平台。尝试过打包整个系统的做法(tar备份还原),也试过使用Remastersys做整个系统的镜像,两种方法造成的结果都是数据库罢工。基于dd指令的方法还没用过 :)。以上其实是个运维的问题,我对此并不很熟悉。
所以最终采用的是重新在一个新的平台上部署,之后将数据迁移过去。这样做确实挺烦的,edx的每次国内安装过程都很蛋疼(你懂的),所以才一直想使用docker来跑edx,这样迁移什么的都酸爽极了,更不用说开发。
###mysql
|
|
一般来说主要数据都在edxapp里,如果你要备份所有数据的话,使用这条mysqldump -u root --all-databases> alldb.sql
对应的还原mysql -u root -p < alldb.sql
###mongo
|
|
##edx升级后的数据迁移 首先让人想到的是update,但据我所知很少有人能一次性update成功的,这归结于edx的依赖错综复杂。
update究竟干了啥,look here
如果使用update,中途遇到的问题,只好手动处理了
如果是从aspen升级到birch,参考这里
###手动迁移
我当时面对的场景是,在一台新的服务器上部署birch,然后要将release-2014-09-17版上的数据迁移过去。
当时的做法比较简单,因为我们只对文章开头提到几类数据感兴趣,所以对比了这些数据表结构基本没变化后,我直接导出旧有数据,覆盖新的,至于mongo部分也是如此,推荐使用diff做比较。手动的方案虽然繁琐,但足够灵活。
至于定制的代码,都限制在独立的django application里,所以定制代码的迁移也并不麻烦。复制整个application目录便是,之后syncdb/migrate一下。
####mysql
|
|
####mongo
|
|
###自动迁移
后来想到更好的方案
当初在release-2014-09-17上做二次开发时有考虑到之后要升级的问题,所以二次开发的代码除了限制在一个application里之外,还都在wwj_master分支上。
首先在旧版服务器上工作:
git checkout -b new_branch origin/new_branchgit rebase new_branch wwj_master关于衍合的知识可以看这里
rebase完之后,同步数据库,执行syncdb和migrate。这里有相关命令
如此一来,就完成了edx-platform源码的升级,定制的内容也都在,同时旧版的数据库也和新版一致了。
此后直接将旧版上整套edx-platform源码和数据库备份文件,移到新版服务器中进行替换就行。
很像1中同版本的迁移时的数据迁移的情况了。
##将数据迁移给docker中的edx使用(edx版本相同)
这里其实和同版本的edx迁移时的数据迁移(本质是数据导出和导入)没啥区别,需要注意的是,记得将数据库文件目录挂载出来,使用-v参数,这样数据的安全性得到保证,数据不会因为docker进程的挂掉而丢失。
顺便提一下,把静态文件目录/edx/var/edxapp/staticfiles也挂载出去.
总之,使用docker的核心观念之一是容器无状态。把你认为需要状态的数据都挂载出去
#附录
我在升级release-2014-09-17到named-release/birch时,对比过mysql中所有表结构的差异。
##用到的相关指令
|
|
2016.04.07更新
如果从birch迁移到dogwood,那么数据表有以下差异
###mongodb cs_comments_service_development数据库中contents表新版比老版多一个key:context,value:string
cat contents.dat | jq -c ‘. + { “context”: “course” }’ > contents_ok.dat
-c:不改变单行模式
另一个问题是course_id发生了变化你可以使用vi逐个替代
:%s,edX/DemoX/Demo_Course,course-v1:edX+DemoX+Demo_Course,g
课程多的话使用,vi显然效率太低,也可以使用sed和jq来做流式编辑
(思路:1.使用正则首先需要定位,course_id之后,然后分组捕获元素,使用环顾,或者逐行装换为json)
我对python的正则熟悉一些还是用python好了,往format_course_id.py写入
|
|
cat contents.dat | python format_course_id.py >/tmp/contents.dat
###mysql auth_userprofile表dogwood比brich多了两个字段:bio和profile_image_uploaded_at;
迁移方法为先
|
|
最后SET FOREIGN_KEY_CHECKS=1