残留文件管理函数
获取残留文件列表函数
- pg_get_residualfiles()
描述:用于获取当前节点的所有残留文件记录。该函数为实例级函数,与当前所在的数据库无关,可以在任意实例上运行。
参数类型:无
返回值类型:record
函数返回字段如下:
名称
类型
描述
isverified
bool
是否已经验证
isdeleted
bool
是否已经被删除
dbname
text
所属数据库名称
residualfile
text
数据文件路径
filepath
text
残留文件记录路径
notes
text
注释
示例:
1 2 3 4 5 6 7
select * from pg_get_residualfiles(); isverified | isdeleted | dbname | residualfile | filepath | notes ------------+-----------+--------+-------------------+---------------------------+------- f | f | db2 | base/49155/114691 | pgrf_20200908160211441546 | f | f | db2 | base/49155/114694 | pgrf_20200908160211441546 | f | f | db2 | base/49155/114696 | pgrf_20200908160211441546 | (3 rows)
- pgxc_get_residualfiles()
描述:pg_get_residualfiles()的CN统一查询函数。该函数为集群级函数,与当前所在的数据库无关,在CN实例上运行。
参数类型:无
返回值类型:record
函数返回字段如下:
名称
类型
描述
nodename
text
节点名称
isverified
bool
是否已经验证
isdeleted
bool
是否已经被删除
dbname
text
所属数据库名称
residualfile
text
数据文件路径
filepath
text
残留文件记录路径
notes
text
注释
示例:
1 2 3 4 5 6 7 8
select * from pgxc_get_residualfiles(); nodename | isverified | isdeleted | dbname | residualfile | filepath | notes --------------+------------+-----------+----------+-------------------+---------------------------+------- cn_5001 | f | f | gaussdb | base/15092/32803 | pgrf_20200910170129360401 | dn_6001_6002 | f | f | db2 | base/49155/114691 | pgrf_20200908160211441546 | dn_6001_6002 | f | f | db2 | base/49155/114694 | pgrf_20200908160211441546 | dn_6001_6002 | f | f | db2 | base/49155/114696 | pgrf_20200908160211441546 | (4 rows)
验证残留文件函数
- pg_verify_residualfiles(filepath)
描述:用于验证参数指定文件中记录的文件是否为残留文件。该函数为实例级函数,与当前所在的数据库相关,可以在任意实例上运行。
参数类型:text
返回值类型:bool
函数返回字段如下:
名称
类型
描述
isverified
bool
是否完成验证
示例:
1 2 3 4 5
select * from pg_verify_residualfiles('pgrf_20200908160211441546'); isverified ------------ t (1 row)
本函数只能验证记录的文件在当前登录的database中是否是残留文件。如果记录的文件不属于当前登录的数据库,则不会进行校验行为。
- pg_verify_residualfiles()
描述:用于验证当前实例上所有残留文件列表中记录的文件是否为残留文件。该函数为实例级函数,与当前所在的数据库相关,可以在任意实例上运行。
参数类型:无
返回值类型:record
函数返回字段如下:
名称
类型
描述
result
bool
是否完成验证
filepath
text
残留文件记录路径
notes
text
注释
示例:
1 2 3 4 5
select * from pg_verify_residualfiles(); result | filepath | notes --------+---------------------------+------- t | pgrf_20200908160211441546 | (1 row)
本函数只能验证记录的文件在当前登录的database中是否是残留文件。如果记录的文件不属于当前登录的数据库,则不会进行校验行为。
- pgxc_verify_residualfiles()
描述:pg_verify_residualfiles()的CN统一查询函数。该函数为集群级函数,与当前所在的数据库相关,在CN实例上运行。
参数类型:无
返回值类型:record
函数返回字段如下:
名称
类型
描述
nodename
text
节点名称
result
bool
是否完成验证
filepath
text
残留文件记录路径
notes
text
注释
示例:
1 2 3 4 5 6
select * from pgxc_verify_residualfiles(); nodename | result | filepath | notes --------------+--------+---------------------------+------- cn_5001 | t | pgrf_20200910170129360401 | dn_6001_6002 | t | pgrf_20200908160211441546 | (2 rows)
本函数只能验证记录的文件在当前登录的database中是否是残留文件。如果记录的文件不属于当前登录的数据库,则不会进行校验行为。
- pg_is_residualfiles(residualfile)
描述:用于从当前库中查询指定的relfilenode是否为残留文件。该函数为实例级函数,与当前所在的数据库相关,可以在任意实例上运行。
参数类型:text
返回值类型:bool
函数返回字段如下:
名称
类型
描述
result
bool
是否是残留文件
示例:
1 2 3 4 5
select * from pg_is_residualfiles('base/49155/114691'); result -------- t (1 row)
本函数只能验证记录的文件在当前登录的database中是否为残留文件。如果记录的文件不属于当前登录的数据库,则会被检测为是残留文件。
例如:针对gaussdb数据库中的非残留文件 base/15092/14790,如果在gaussdb库中查询,则认为是非残留文件;在其他数据库中查询,则认为是残留文件。
select * from pg_is_residualfiles('base/15092/14790');
result
--------
f
(1 row)
\c db2
db2=# select * from pg_is_residualfiles('base/15092/14790');
result
--------
t
(1 row)
删除残留文件函数
- pg_rm_residualfiles(filepath)
描述:用于删除当前实例中指定的残留文件列表中的文件。该函数为实例级函数,与当前所在的数据库无关,可以在任意实例上运行。
参数类型:text
返回值类型:record
函数返回字段如下:
名称
类型
描述
result
bool
是否已经完成删除
示例:
1 2 3 4 5
select * from pg_rm_residualfiles('pgrf_20200908160211441599'); result -------- t (1 row)
1. 残留文件只有在调用pg_verify_residualfiles()进行verify后才能被真正删除。
2. 删除动作不区分数据库,指定文件中所有已经verify的文件都会被删除。
3. 如果指定文件中记录的所有文件都已经被删除,指定文件会被移除并备份到$PGDATA/pg_residualfile/backup目录下。
- pg_rm_residualfiles()
描述:用于删除当前实例中所有的残留文件列表中的文件。该函数为实例级函数,与当前所在的数据库无关,可以在任意实例上运行。
参数类型:无
返回值类型:record
函数返回字段如下:
名称
类型
描述
result
bool
是否已经完成删除
filepath
text
残留文件记录路径
notes
text
注释
示例:
1 2 3 4 5
select * from pg_rm_residualfiles(); result | filepath | notes --------+---------------------------+------- t | pgrf_20200908160211441546 | (1 row)
- 残留文件只有在调用pg_verify_residualfiles()进行验证后才能被真正删除。
- 删除动作不区分数据库,指定文件中所有已经验证的文件都会被删除。
- 如果指定文件中记录的所有文件都已经被删除,指定文件会被移除并备份到$PGDATA/pg_residualfile/backup目录下。
- pgxc_rm_residualfiles()
描述:pgxc_rm_residualfiles的CN统一查询函数。该函数为集群级函数,与当前所在的数据库无关,在CN实例上运行。
参数类型:无
返回值类型:record
函数返回字段如下:
名称
类型
描述
nodename
text
节点名
result
bool
是否已经完成删除
filepath
text
残留文件记录路径
notes
text
注释
示例:
1 2 3 4 5 6
select * from pgxc_rm_residualfiles(); nodename | result | filepath | notes --------------+--------+---------------------------+------- cn_5001 | t | pgrf_20200910170129360401 | dn_6001_6002 | t | pgrf_20200908160211441546 | (2 rows)
残留文件管理函数使用步骤及示例:
残留文件管理函数使用步骤:
- 调用pgxc_get_residualfiles()函数,获取存在残留文件的数据库名称。
- 分别进入确认有残留文件的数据库,调用pgxc_verify_residualfiles()函数,对当前数据库中记录的残留文件进行验证。
- 调用pgxc_rm_residualfiles()函数,删除所有已经验证过的残留文件。
![](https://support.huaweicloud.com/intl/zh-cn/ae-ad-1-sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
pgxc类残留文件管理函数只对CN和当前主DN进行操作,不会验证和清理备DN上的残留文件。所以主DN完成清理后,应在备DN上及时执行残留文件清理操作或对备机进行build,防止主备切换后由于增量build导致备机残留文件被重新拷贝回主DN,导致未成功清理的假象。
残留文件管理函数使用示例:
以当前两个用户自建的数据库db1、db2为例:
- 在CN上获取集群的所有残留文件记录:
1
db1=# select * from pgxc_get_residualfiles() order by 4, 6; -- order by不是必须的
当前集群中:
- dn_6001_6002 节点(当前的主节点实例)的db1和db2数据库中都存在残留文件记录。
- 残留文件在residualfile 列展示。
- filepath列为记录残留文件的记录文件,保存在实例数据目录下pg_residualfiles目录中。
- 调用pgxc_verify_residualfiles() 函数对db1库进行验证:
1
db1=# select * from pgxc_verify_residualfiles();
因为verify类函数都是database级别,所以当前在db1库中调用verify函数时,只对属于db1的残留文件进行验证。
可以再次调用get函数查看是否验证完成:
1
db1=# select * from pgxc_get_residualfiles() order by 4, 6;
如上图所示,已确认db1数据库中的残留文件都已经验证,db2数据库中的残留文件都未进行验证。
- 调用 pgxc_rm_residualfiles()函数删除残留文件。
1
db1=# select * from pgxc_rm_residualfiles();
- 再次调用pgxc_get_residualfiles()函数检查删除后的结果。
结果显示db1数据库中的残留文件已经被删除(isdeleted标记为t),db2中的残留文件都未被删除。
同时可以看到查询出9条结果,与之前查询出的结果想比,缺少一条以9438结尾的残留文件记录文件。这是因为以9438结尾的残留文件记录文件中只有一条残留文件记录,这条记录在步骤3中被删除,当记录文件中的所有残留文件都被删除后,记录文件本身也会被删除,并备份到pg_residualfiles/backup目录中:
- 如果需要删除db2数据库中的文件,需要在db2中调用verify函数后再调用rm函数。