postgres dump显示重复的FUNCTION

问题描述 投票:0回答:1

我的postgres版本是9.0.4,我已经创建了一个postgres数据库的dump,并且包含了自定义函数的重复条目,当我直接查询我的数据库时,我没有看到任何重复的条目,但是dump有这个重复的条目。

以下是我使用pg_restore -l命令得到的列表。

37; 1255 16402 FUNCTION public sql_dirdepth(character varying) nidhin
31; 1255 16402 FUNCTION public sql_dirdepth(character varying) nidhin
29; 1255 16403 FUNCTION public sql_getdir(character varying) nidhin
35; 1255 16403 FUNCTION public sql_getdir(character varying) nidhin
30; 1255 16404 FUNCTION public sql_subdir(character varying, integer, integer) nidhin
36; 1255 16404 FUNCTION public sql_subdir(character varying, integer, integer) nidhin
32; 1255 16405 FUNCTION public unnest(anyarray) nidhin
38; 1255 16405 FUNCTION public unnest(anyarray) nidhin

我检查了数据库内部的功能,没有看到任何重复的条目。

CDB=# \df
                                      List of functions
 Schema |      Name       | Result data type  |         Argument data types         |  Type
--------+-----------------+-------------------+-------------------------------------+--------
 public | sql_dirdepth | integer           | character varying                   | normal
 public | sql_getdir   | character varying | character varying                   | normal
 public | sql_subdir   | character varying | character varying, integer, integer | normal
(3 rows)

所以我想知道pg_dump是如何在我的dump文件中创建这些函数的重复条目的。

查询

SELECT * 
FROM pg_proc 
WHERE proname || '' IN ('unnest', 'sql_dirdepth', 'sql_getdir', 'sql_subdir');  

给出以下结果。

我可以看到重复的函数,我如何才能删除重复的函数?

|   proname    | pronamespace | proowner | prolang | procost | prorows | provariadic | proisagg | proiswindow | prosecdef | proisstrict | proretset | provolatile | pronargs | pronargdefaults | prorettype | proargtypes | proallargtypes | proargmodes | proargnames | proargdefaults |                                    prosrc                                    |         probin          | proconfig | proacl |
|--------------|--------------|----------|---------|---------|---------|-------------|----------|-------------|-----------|-------------|-----------|-------------|----------|-----------------|------------|-------------|----------------|-------------|-------------|----------------|------------------------------------------------------------------------------|-------------------------|-----------|--------|
| unnest       |           11 |       10 |      12 |       1 |     100 |           0 | f        | f           | f         | t           | t         | i           |        1 |               0 |       2283 |        2277 |                |             |             |                | array_unnest                                                                 |                         |           |        |
| sql_getdir   |         2200 |       10 |      13 |       1 |       0 |           0 | f        | f           | f         | t           | f         | i           |        1 |               0 |       1043 |        1043 |                |             |             |                | sql_getdir                                                                   | /opt/openkaz/lib/kazsql |           |        |
| sql_subdir   |         2200 |       10 |      13 |       1 |       0 |           0 | f        | f           | f         | t           | f         | i           |        3 |               0 |       1043 |  1043 23 23 |                |             |             |                | sql_subdir                                                                   | /opt/openkaz/lib/kazsql |           |        |
| sql_dirdepth |         2200 |       10 |      13 |       1 |       0 |           0 | f        | f           | f         | t           | f         | i           |        1 |               0 |         23 |        1043 |                |             |             |                | sql_dirdepth                                                                 | /opt/openkaz/lib/kazsql |           |        |
| unnest       |         2200 |       10 |      14 |     100 |    1000 |           0 | f        | f           | f         | f           | t         | i           |        1 |               0 |       2283 |        2277 |                |             |             |                | "select $1[i] from generate_series(array_lower($1,1), array_upper($1,1)) i;" |                         |           |        |
| sql_subdir   |         2200 |       10 |      13 |       1 |       0 |           0 | f        | f           | f         | t           | f         | i           |        3 |               0 |       1043 |  1043 23 23 |                |             |             |                | sql_subdir                                                                   | /opt/openkaz/lib/kazsql |           |        |
| sql_dirdepth |         2200 |       10 |      13 |       1 |       0 |           0 | f        | f           | f         | t           | f         | i           |        1 |               0 |         23 |        1043 |                |             |             |                | sql_dirdepth                                                                 | /opt/openkaz/lib/kazsql |           |        |
| unnest       |         2200 |       10 |      14 |     100 |    1000 |           0 | f        | f           | f         | f           | t         | i           |        1 |               0 |       2283 |        2277 |                |             |             |                | "select $1[i] from generate_series(array_lower($1,1), array_upper($1,1)) i;" |                         |           |        |
| sql_getdir   |         2200 |       10 |      13 |       1 |       0 |           0 | f        | f           | f         | t           | f         | i           |        1 |               0 |       1043 |        1043 |                |             |             |                | sql_getdir                                                                   | /opt/openkaz/lib/kazsql |           |        |
postgresql pg-dump postgresql-9.0
1个回答
0
投票

这就是目录数据损坏,因为实际上有重复的条目在 pg_proc 目录,尽管有一个唯一的索引保证模式名、函数名和参数列表的组合是唯一的。

你应该立即执行关机(使数据库崩溃),并对数据目录进行物理备份。这始终是处理数据损坏时的第一步。

重启数据库后,采取文本模式 pg_dumpall 的群集,并从转储文件中手动删除重复的条目。将转储文件还原到一个新的群集中,并删除旧的群集。

一旦你成功地解决了数据损坏的问题,你应该立即升级到PostgreSQL v12。在新硬件上因为9.0这样的老版本包含了许多已知的错误,会导致各种数据损坏。

这就是一个很好的例子,为什么升级不仅仅是IT部门发明的,目的是为了让自己有工作,让终端用户烦恼。

© www.soinside.com 2019 - 2024. All rights reserved.