Cloud SQL:定期将数据导出到 CSV 以避免重复
Cloud SQL: export data to CSV periodically avoiding duplicates
我想定期(例如一天一次)从 Cloud SQL (postgres) 将数据导出到 CSV 文件,并且每次导出数据库行时都不能在下一次导出时导出任务。
我目前正在使用 POST 请求来使用云调度程序执行导出任务。这里的问题(或者至少直到我知道)是它无法在单个 http 导出请求中导出和删除(或更新行以将它们标记为已导出)。
是否有可能删除(或更新)已使用 http 导出请求中的任何 Cloud SQL 参数自动导出的行?
如果没有,我认为应该由 pub/sub 触发的云函数来完成(使用调度程序每天向 pub/sub 发送一次数据)但是,是否有任何最佳方法来获取从 select 语句(将在 export 中使用)中检索到的所有行的 ID,以便稍后删除(或更新)它们?
您可以使用 RETURNING 同时导出和删除(或更新)。
\copy (DELETE FROM pgbench_accounts WHERE aid<1000 RETURNING *) to foo.txt
问题将出现在崩溃面前。在允许提交 DELETE 之前,您怎么知道 foo.txt 已经写入并刷新到磁盘?或者相反,foo.txt 部分(或全部)写入,但崩溃阻止 DELETE 提交。
你不能使系统幂等,以便多次导出同一行不会产生问题吗?
您可以使用设置来实现您想要的:
1.Create 一个云函数,用于从订阅 Pub/Sub 主题的数据库中提取信息。
2.Create 一个 Pub/Sub 主题来触发该功能。
3.Create 调用 Pub/Sub 触发器的 Cloud Scheduler 作业。
4.Run Cloud Scheduler 作业。
5.Then 创建一个触发器来激活另一个 Cloud Function,以便在创建 csv 后从数据库中删除所有需要的数据。
这里我给你留下一些文件,如果你决定走这条路,这些文件可能会对你有所帮助。
使用Pub/Sub触发云函数:https://cloud.google.com/scheduler/docs/tut-pub-sub
从 Cloud Functions 连接到云 SQL:https://cloud.google.com/sql/docs/mysql/connect-functionsCloud
存储教程:https://cloud.google.com/functions/docs/tutorials/storage
除@jjanes 之外的另一种方法是按日期 partition 您的数据库。这将允许您在日期上创建索引,从而使导出或删除日期条目变得非常容易。使用此实现,您还可以创建一个 Cron 作业,删除 X 天前的所有表。
所提供的文档将引导您完成 Ranged 分区的设置
The table is partitioned into “ranges” defined by a key column or set of columns, with no overlap between the ranges of values assigned to different partitions. For example, one might partition by date ranges, or by ranges of identifiers for particular business objects.
感谢您的所有回答。有多种方法可以做到这一点,所以我将解释我是如何做到的。
我在数据库中加入了一个包含数据插入日期的列。
我使用了一个具有以下主体的云调度程序:
{"exportContext":{"fileType": "CSV", "csvExportOptions" :{"selectQuery" : "select \"column1\", \"column2\",... , \"column n\" from public.\"tablename\" where \"Insertion_Date\" = CURRENT_DATE - 1" },"uri": "gs://bucket/filename.csv","databases": ["postgres"]}}
这个调度器每天触发一次,只会导出前一天的数据
此外,我必须注意到,在我在云调度程序中使用的查询中,您可以选择要导出的列,这样做可以避免导出包含 Insertion_Date 的列并使用它列只是一个辅助。
最后,云调度器会自动在bucket中创建csv文件
我想定期(例如一天一次)从 Cloud SQL (postgres) 将数据导出到 CSV 文件,并且每次导出数据库行时都不能在下一次导出时导出任务。
我目前正在使用 POST 请求来使用云调度程序执行导出任务。这里的问题(或者至少直到我知道)是它无法在单个 http 导出请求中导出和删除(或更新行以将它们标记为已导出)。
是否有可能删除(或更新)已使用 http 导出请求中的任何 Cloud SQL 参数自动导出的行?
如果没有,我认为应该由 pub/sub 触发的云函数来完成(使用调度程序每天向 pub/sub 发送一次数据)但是,是否有任何最佳方法来获取从 select 语句(将在 export 中使用)中检索到的所有行的 ID,以便稍后删除(或更新)它们?
您可以使用 RETURNING 同时导出和删除(或更新)。
\copy (DELETE FROM pgbench_accounts WHERE aid<1000 RETURNING *) to foo.txt
问题将出现在崩溃面前。在允许提交 DELETE 之前,您怎么知道 foo.txt 已经写入并刷新到磁盘?或者相反,foo.txt 部分(或全部)写入,但崩溃阻止 DELETE 提交。
你不能使系统幂等,以便多次导出同一行不会产生问题吗?
您可以使用设置来实现您想要的:
1.Create 一个云函数,用于从订阅 Pub/Sub 主题的数据库中提取信息。 2.Create 一个 Pub/Sub 主题来触发该功能。 3.Create 调用 Pub/Sub 触发器的 Cloud Scheduler 作业。 4.Run Cloud Scheduler 作业。 5.Then 创建一个触发器来激活另一个 Cloud Function,以便在创建 csv 后从数据库中删除所有需要的数据。
这里我给你留下一些文件,如果你决定走这条路,这些文件可能会对你有所帮助。
使用Pub/Sub触发云函数:https://cloud.google.com/scheduler/docs/tut-pub-sub
从 Cloud Functions 连接到云 SQL:https://cloud.google.com/sql/docs/mysql/connect-functionsCloud
存储教程:https://cloud.google.com/functions/docs/tutorials/storage
除@jjanes 之外的另一种方法是按日期 partition 您的数据库。这将允许您在日期上创建索引,从而使导出或删除日期条目变得非常容易。使用此实现,您还可以创建一个 Cron 作业,删除 X 天前的所有表。
所提供的文档将引导您完成 Ranged 分区的设置
The table is partitioned into “ranges” defined by a key column or set of columns, with no overlap between the ranges of values assigned to different partitions. For example, one might partition by date ranges, or by ranges of identifiers for particular business objects.
感谢您的所有回答。有多种方法可以做到这一点,所以我将解释我是如何做到的。
我在数据库中加入了一个包含数据插入日期的列。
我使用了一个具有以下主体的云调度程序:
{"exportContext":{"fileType": "CSV", "csvExportOptions" :{"selectQuery" : "select \"column1\", \"column2\",... , \"column n\" from public.\"tablename\" where \"Insertion_Date\" = CURRENT_DATE - 1" },"uri": "gs://bucket/filename.csv","databases": ["postgres"]}}
这个调度器每天触发一次,只会导出前一天的数据
此外,我必须注意到,在我在云调度程序中使用的查询中,您可以选择要导出的列,这样做可以避免导出包含 Insertion_Date 的列并使用它列只是一个辅助。
最后,云调度器会自动在bucket中创建csv文件