我有一个微服务,它使用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
,然后是INSERT
s。这将允许并发读取,但并发数据修改将被阻塞。
如果所有语句都在同一个事务中运行,并且没有大量的索引或缓慢的触发器,那么加载仅仅300000行应该是几秒钟的事情。探索准备语句和COPY
以进一步提高加载速度。
另一种方法是在另一个模式中准备新数据。然后您只需要短暂的中断,在此期间您可以重命名模式或更改search_path
。