物化视图:刷新失败会使物化视图失效¶
物化视图定期由后台进程自动更新。
目前,如果物化视图刷新失败,则物化视图的数据不会更新,并且后台进程会继续定期尝试刷新物化视图。
如果失败是由于会继续发生的问题(例如由物化视图定义或数据引起的除以零错误),则后台进程将持续无法刷新物化视图,并且物化视图的数据不会更新。
在当前版本中,刷新过程中特定类型的错误会使物化视图失效。此外:
当您查询物化视图时,输出将包括失效的原因。
SHOW MATERIALIZED VIEWS 命令的输出将包含物化视图失效的原因。
根据这些命令的输出中的信息,解决物化视图的问题,并执行 ALTER MATERIALIZED VIEW ...RESUME 命令恢复物化视图。
综上所述,刷新和查询物化视图的流程发生了以下变化:
- 之前:
后台进程无法刷新物化视图。
虽然物化视图中的数据已过期,但查询物化视图的输出无法表明数据已过时。
当您执行 SHOW MATERIALIZED VIEWS 命令时,refreshed_on 列会指明数据已过期,但输出不包含过期原因。
- 现在:
后台进程会使物化视图失效。
查询物化视图会导致错误,指明刷新过程无法更新物化视图的原因。例如:
SELECT * FROM my_mv;
002037 (42601): SQL compilation error: Failure during expansion of view 'MY_MV': SQL compilation error: Materialized View MY_MV is invalid. Invalidation reason: Division by zero
当您执行 SHOW MATERIALIZED VIEWS 命令时,
invalid
列会指明物化视图无效,并且invalid_reason
列包含失效的原因。例如:SHOW MATERIALIZED VIEWS;
... +---------+------------------+ ... ... | invalid | invalid_reason | ... ... +---------+------------------+ ... ... | true | Division by zero | ... ... +---------+------------------+ ...
例如,假设您执行以下语句来创建物化视图:
CREATE OR REPLACE TABLE my_base_table (a INT, b INT, c VARCHAR(16));
INSERT INTO my_base_table VALUES (1, 1, 'valid data');
CREATE OR REPLACE MATERIALIZED VIEW my_mv AS SELECT a / b AS div FROM my_base_table;
假设您向表中插入数据,这将导致物化视图刷新失败。例如,假设您执行以下语句:
INSERT INTO my_base_table VALUES (1, 0, 'invalid data');
当接下来刷新物化视图时,刷新将失败并显示“除以零”错误。由于刷新失败,物化视图将会失效。
要查看失效原因,请查询物化视图或者执行 SHOW MATERIALIZED VIEWS 命令:
SELECT * FROM my_mv;
002037 (42601): SQL compilation error:
Failure during expansion of view 'MY_MV':
SQL compilation error: Materialized View MY_MV is invalid.
Invalidation reason: Division by zero
SHOW MATERIALIZED VIEWS;
... +---------+------------------+ ...
... | invalid | invalid_reason | ...
... +---------+------------------+ ...
... | true | Division by zero | ...
... +---------+------------------+ ...
解决导致失效的问题,并执行 ALTER MATERIALIZED VIEW ...RESUME 命令恢复物化视图:
ALTER MATERIALIZED VIEW my_mv RESUME;
参考:1178