postgre使用一个sql脚本插入多个事务



我有一个微服务,它使用Liquibase来管理PostgreSQL表数据。在表中,我有来自.sql脚本的~ 300000行数据。插入这么多的记录需要3-4小时。

有哪些可能的方法可以删除表中所有以前的数据(可能是清除)并添加新数据而不会经历停机?

例如,我可以这样创建一个事务吗:

BEGIN;
truncate table_name restart identity
insert into table_name (column1, .., columnn) values (val1, ..valn), ..., (val1, ..valn)
insert into table_name (column1, .., columnn) values (val1, ..valn), ..., (val1, ..valn)
-- more 300 000 records

COMMIT;

如果某些软件在脚本执行过程中执行SQL查询会发生什么?它会得到所有的数据吗?如果SQL脚本失败,我想恢复所有以前的数据。

您必须在同一事务中运行所有行的DELETE,然后是INSERTs。这将允许并发读取,但并发数据修改将被阻塞。

如果所有语句都在同一个事务中运行,并且没有大量的索引或缓慢的触发器,那么加载仅仅300000行应该是几秒钟的事情。探索准备语句和COPY以进一步提高加载速度。

另一种方法是在另一个模式中准备新数据。然后您只需要短暂的中断,在此期间您可以重命名模式或更改search_path