通过Cronjob备份数据存储区

时间:2015-03-05 18:34:30

标签: google-app-engine google-cloud-datastore

因此,这是备份数据存储区的本机cronjob条目

cron:
- description: My Daily Backup
  url: /_ah/datastore_admin/backup.create?name=BackupToCloud&kind=LogTitle&kind=EventLog&filesystem=gs&gs_bucket_name=whitsend
  schedule: every 12 hours
  target: ah-builtin-python-bundle

如果我有kind个空格,我该怎么办呢?所以,如果我的类型是“日志标题”,我会喜欢kind=Log%20Title吗?

无论是否有空格,这似乎都不起作用。有谁知道我还需要做些什么才能确保备份?

我在admin.appengine.google.comah-builtin-python-bundle日志中没有看到它。

我似乎无法再手动备份,因为当我点击Datastore Admin时,它会将我引导到没有内容的页面。 (Google Bug Report

任何帮助将不胜感激。 PS。我正在使用PHP App Engine。

2 个答案:

答案 0 :(得分:1)

首先,我建议您快速解决使用HTML编码&

来逃避&符号的问题。

所以你会:

&

但是该URL不能超过402个字符,因此更好的解决方案是编写自己的servlet以通过自动添加各种实体种类来处理备份。我知道您正在运行PHP后端,但这是我的代码中的XML和Java示例。

cron.xml中的cron定义

cron:
- description: My Daily Backup
  url: /_ah/datastore_admin/backup.create?name=BackupToCloud&kind=LogTitle&kind=EventLog&filesystem=gs&gs_bucket_name=whitsend
  schedule: every 12 hours
  target: ah-builtin-python-bundle

web.xml中的url映射

<cron>
    <description>Daily backups New Way</description>
    <url>/cron/backups</url>
    <schedule>every day 06:00</schedule>
    <timezone>America/Los_Angeles</timezone>
</cron>

queue.xml中的备份任务

<servlet>
    <servlet-name>BackupServlet</servlet-name>
    <servlet-class>com.your.package.BackupServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>BackupServlet</servlet-name>
    <url-pattern>/cron/backups</url-pattern>
</servlet-mapping>

servlet类BackupServlet.java

<queue>
   <name>backup-queue</name>
   <rate>25/s</rate>
   <bucket-size>25</bucket-size>
   <max-concurrent-requests>25</max-concurrent-requests>
</queue>

,最后是DatastoreUtils.java中的getEntityList()

public class BackupServlet extends HttpServlet {

    private Queue queue = QueueFactory.getQueue("backup-queue");
    private static final Logger log = Logger.getLogger(BackupServlet.class.getName());

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        List<String> entities = DatastoreUtils.getEntityList();

        // Print query results
        for (String kind : entities) {
            log.info("Creating backup task for " + kind);
            queue.add(withUrl("/_ah/datastore_admin/backup.create").param("name", "datastore-backup-" + kind + "-").param("kind", kind)
                    .param("filesystem", "gs").param("gs_bucket_name", ADMIN_BACKUPS_BUCKET));

        }

        response.setStatus(HttpServletResponse.SC_OK);

    }
}

答案 1 :(得分:1)

这对我来说非常好。要遵循的步骤

  1. 确保&#34;数据存储管理员&#34;在&#34;内置插件中启用&#34; &#34;应用程序设置&#34;中的选项菜单下&#34;管理&#34;在&#34; admin.appengine.google.com&#34;的左侧导航菜单中。

  2. 启用数据存储管理员后,转到您的&#34;应用引擎&#34; →&#34;仪表板&#34;并检查是否&#34; ah-builtin-python-bundle&#34;列在&#34;版本&#34;下拉框。

  3. 使用&#34; appcfg.py update_cron&#34;上传您的cron.yaml文件命令

  4. 转到&#34; Cron Jobs&#34;在左侧导航菜单中,检查cron.obam中提到的cronjob是否列在那里

  5. 注意:

    1. &安培;因为它使用xml文件,所以不需要替换,因为它只需要Java。由于您使用yaml,因此无需放大器编码

    2. 完全使用默认存储桶名称&#34; appid.appspot.com&#34;,这在&#34;应用程序设置&#34;

    3. 中提及

      Official Reference