我想定期(例如每天一次(将数据从Cloud SQL(postgres(导出到CSV文件,每次导出DB行时,都不能在下一个导出任务中导出。
我目前正在使用POST请求来使用云调度程序执行导出任务。这里的问题(或者至少在我知道之前(是,它无法在单个http导出请求中导出和删除(或更新行以将其标记为已导出(。
是否有可能删除(或更新(http导出请求中使用任何Cloud SQL参数自动导出的行?
如果没有,我认为应该通过pub/sub触发的云功能(使用调度器每天向pub/sub发送一次数据(来完成,但是,有没有任何最佳的方法可以将从select语句中检索到的所有行的ID(将在导出中使用(在以后删除(或更新(它们?
您可以使用RETURNING同时导出和删除(或更新(。
copy (DELETE FROM pgbench_accounts WHERE aid<1000 RETURNING *) to foo.txt
问题将是面对崩溃。在DELETE被允许提交之前,你怎么知道foo.txt已经被写入并刷新到磁盘?或者相反,foo.txt被部分(或全部(写入,但崩溃会阻止DELETE提交。
难道你不能让系统幂等,这样多次导出同一行就不会产生问题吗?
您可以使用一个设置来实现您想要的:
1.创建云函数以从订阅Pub/Sub主题的数据库中提取信息。2.创建一个Pub/Sub主题来触发该函数。3.创建一个调用Pub/Sub触发器的Cloud Scheduler作业。4.运行Cloud Scheduler作业。5.然后创建一个触发器,该触发器激活另一个云功能,以便在创建csv后从数据库中删除所需的所有数据。
在这里,我给你留下一些文件,如果你决定走这条路,这些文件可能会对你有所帮助。
使用Pub/Sub触发Cloud函数:https://cloud.google.com/scheduler/docs/tut-pub-sub
从云函数连接到云SQL:https://cloud.google.com/sql/docs/mysql/connect-functionsCloud
存储教程:https://cloud.google.com/functions/docs/tutorials/storage
@jjanes之外的另一种方法是按日期对数据库进行分区。这将允许您创建日期索引,使导出或删除一天的条目变得非常容易。有了这个实现,您还可以创建一个Cron作业,删除X天前的所有表。
提供的文档将引导您完成设置远程分区
表被划分为由键列或列集定义的"范围",分配给不同分区的值的范围之间没有重叠。例如,可以按日期范围或特定业务对象的标识符范围进行分区。
感谢您的回答。有多种方法可以做到这一点,所以我将解释我是如何做到的
在数据库中,我包含了一列,其中包含插入数据的日期。
我使用了一个具有以下主体的云调度器:
{"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文件