Github的Blog Rebase 9在本周介绍了这个程序,作者又在圣诞节这一天制作了视频来演示Gaebar的使用方法。Gaebar是一个独立的基于Django的程序,可以作为插件集成在使用Google App Engine Django或者app-engine-patch开发的应用中来备份和恢复Appengine上存储的数据。
Gaebar可以将Appengine的数据备份到Python代码中,而且可以执行这些代码来进行数据恢复。作者在程序中使用了Ajax来调用备 份程序以避免产生Appengine不支持的长时间数据操作。为了避免产生过高的Cpu负载Gaebar默认每次备份五行数据,产生的备份文件也被分割为 约300KB以避免发生Appengine 1m文件的限制。
源代码地址:
- Gaebar: http://github.com/aral/gaebar/tree/master
- Gaebar-gaed: http://github.com/aral/gaebar-gaed/tree/master
- Gaebar-aep: http://github.com/aral/gaebar-aep/tree/master
以下是yobin使用GAEBAR的步骤和说明:
1、基本说明
GAEBAR只能用于基于Django框架的GAE(如Hleper和Patch),不适用于Google自带的那个Framework。python版本最好是2.5或者2.6,GAE版本用最新的1.19也行。
2、移植配置代码
Gaebar是作为Django里的一个APP使用的。
我直接在我原有工程的基础上添加修改代码的。
我使用的是这个Gaebar: http://github.com/aral/gaebar/tree/master ,参考里面的readme.txt自己配置好就可以(要看说明一个个配置的,不要简单地照抄),然后发布到GAE服务器上。
3、修改dev_appserver.py
备份数据好像需要写权限之类的吧,否则备份的时侯会遇到"'module' object has no attribute 'old_mkdir'"错误。作者打了个补丁。使用之前,要先改一下dev_appserver.py的(不是GAE根目录下的那个,而是google\appengine\tools\下的那个),具体参考文章http://aralbalkan.com/1440
大概是1227行,修改如下:
#del module.__dict__[symbol]
module.__dict__['old_'+symbol] = module.__dict__[symbol]
del module.__dict__[symbol]
4、GAE Datastore数据的备份:
(1)本地根据setting.py配置,运行本地服务器。
我写了8080端口,这样用dev_appserver.py youapp就可以运行起来了。
(2)访问你的服务器,如http://****.appspot.com//gaebar/,点击backup,然后不出意外的话,GAE服务器上的数据就以python文件的形式备份到你本地APP的目录里了。
目录大概是这样的形式(目录名以时间命名):
\yourapp\gaebar\backups\backup_2009_03_21_at_05_50_05_369904
备份的文件名大概是shard0.py之类的名字,一看就知道了。
5、GAE Datastore数据的恢复。
(1) 为以防不测,自己还是先在别的目录备份一下吧。然后appcfg.py update yourapp。
注意:GAE有1000个文件限制,文件大小也还有限制。所以,不需要用的备份文件,还是删了或者移到别的地方去。
还有一点,可以在本地修改被备份下来的数据的,但是,最好要确保格式跟原来的一致,否则可能会丢失数据。
(2)访问http://****.appspot.com//gaebar/,选好你要备份的日期,点击Restore,然后就耐心地等吧。
我测试使用的数据少,只有几十条数据,几秒钟就恢复完了。
严重注意:这个Restore,由于涉及到数据的安全性,还是读以下英文原文了解一下吧。
A Note on restoring and existing data
=====================================
When restoring a row, Gaebar checks to see if the original key for the row that was backed up exists in the datastore. If it does, it removes it.
This means that as long as you are restoring to the same datastore you backed up from or to an empty datastore, the datastore will not contain any duplicate entries after the restore process is complete.
To be extra safe, however, you may want to empty your existing datastore before restoring.
6、更多的尝试:
例如本地服务器数据的备份和恢复、往开发服务器导入真实数据等,这些都是可以做到的,大家可以读一下readme.txt,照着如法炮制就可以了。
最后,感谢GAEBAR作者Aral Balkan的圣诞礼物,我收藏这个礼物一直到现在,终于可以派上用场了。
...