我正在按照本指南 關於如何備份一個GAE應用程序中的數據並將其恢復到另一個。GAE數據存儲還原停止與API調用urlfetch.Fetch()花了很長時間來響應並被取消
但每次我恢復目標應用的備份時間我得到的錯誤:
The API call urlfetch.Fetch() took too long to respond and was cancelled.
任何想法我做錯了嗎?
我正在按照本指南 關於如何備份一個GAE應用程序中的數據並將其恢復到另一個。GAE數據存儲還原停止與API調用urlfetch.Fetch()花了很長時間來響應並被取消
但每次我恢復目標應用的備份時間我得到的錯誤:
The API call urlfetch.Fetch() took too long to respond and was cancelled.
任何想法我做錯了嗎?
你urlfetch.Fetch()花費的時間太長(大於60秒),以respsond,所以它是超時。下面是關於它的文章https://cloud.google.com/appengine/articles/deadlineexceedederrors
一種解決方案是使用任務隊列。任務隊列有更長的超時時間,或者更恰當地說,您可以將作業分成更小的部分。 https://cloud.google.com/appengine/docs/python/taskqueue/
下面是一個簡單的例子,說明如何使用「推送」任務隊列執行此操作。我意識到從一個數據存儲模型轉到另一個可能不是你想要的冗餘。您可能想要將數據存儲實體備份到另一個應用程序或其他類型的數據庫或雲服務。你也可能有多個你正在備份的模型。這是使用每24小時一個cron作業設置和安排「推」任務隊列的只是一個簡單的例子:
首先你必須添加「推遲」到你的app.yaml中的內建的:
builtins:
- deferred: on
接下來,您需要創建第二個數據存儲模型中,我們將稱之爲「備份」只是複製粘貼您的舊模式,將其重命名備份 - 它有助於使用相同型號的相同版本的備份,而不是相同的模式,因爲你可以給他們相同的主鑰匙和備用鑰匙:
class Backup(db.Model): # example
prop1 = db.StringProperty()
prop2 = db.StringListProperty()
prop3 = db.StringProperty()
下一頁設置你cron.yaml cron作業:
- description: Creates a backup of the target db every 24 hours at 10:45 GMT
url: /backup
schedule: everyday 10:45
添加/備份至app.yaml處理程序:
- url: /backup
script: mybackup.py
login: admin
最後,創建mybackup.py
from google.appengine.ext import deferred
from google.appengine.ext import db
#from google.appengine.ext import ndb
def backup_my_model(model_name):
"""
Takes all enities in the model_name model and copies it to Backup model
"""
logging.info("Backing up %s" % model_name)
query = db.GqlQuery('SELECT * From %s ' % model_name)
for primary_db in query:
backup = Backup(key_name = primary_db.key_name)
backup.prop1 = primary_db.prop1
backup.prop2 = primary_db.prop2
...
backup.put()
deferred.defer(backup_my_model, MyModel) #where MyModel is the model you want to backup
deferred.defer(backup_my_model, MyOtherModel)
...
deferred.defer(backup_my_model, MyFinalModel)
我希望有所幫助。
我正在使用數據存儲管理員,據我所知,沒有辦法設置任務隊列使用:http://screencast.com/t/H6cTrvvr – ThomasD
爲了完成你正在嘗試做的事情與任務,你將不得不從你的應用程序,而不是從數據存儲管理員。我將更新我的代碼,給出一個簡單的例子,說明如何從一個數據存儲模型到另一個數據存儲模型。 – Doug
我正在嘗試備份我的生產數據庫並在我的測試環境中恢復它。所以我試圖將生產谷歌應用程序引擎應用程序的數據複製到谷歌應用程序引擎測試應用程序。據我可以告訴你上面的代碼將數據複製到同一應用程序中的另一個模型,而不是跨應用程序? – ThomasD