合 从PG12开始,可以对系统表执行修改操作
Tags: PG系统表allow_system_table_mods
在PG12中可以对system table进行alter table操作
前提:postgresql.conf设置allow_system_table_mods=on,然后再启动PG instance
注意:allow_system_table_mods的默认值为off,不建议修改为on,除非用于数据库损坏等的某些异常恢复场景中,详情请见https://www.postgresql.org/docs/12/runtime-config-developer.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | [pg124@iZm5 data]$ pg_ctl start waiting for server to start....2020-11-26 17:39:56.710 CST [23770] LOG: starting PostgreSQL 12.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit 2020-11-26 17:39:56.711 CST [23770] LOG: listening on IPv4 address '127.0.0.1', port 5124 2020-11-26 17:39:56.711 CST [23770] LOG: could not bind IPv6 address '::1': Cannot assign requested address 2020-11-26 17:39:56.711 CST [23770] HINT: Is another postmaster already running on port 5124? If not, wait a few seconds and retry. 2020-11-26 17:39:56.716 CST [23770] LOG: listening on Unix socket '/tmp/.s.PGSQL.5124' 2020-11-26 17:39:56.753 CST [23770] LOG: redirecting log output to logging collector process 2020-11-26 17:39:56.753 CST [23770] HINT: Future log output will appear in directory 'log'. done server started [pg124@iZm5ehqfjhnsbtxrzrnh2zZ data]$ psql -d postgres psql (12.4) Type 'help' for help. postgres=# show allow_system_table_mods ; ---->>>已经为on allow_system_table_mods ------------------------- on (1 row) postgres=# ALTER TABLE pg_attribute SET (autovacuum_vacuum_scale_factor=0) ; ALTER TABLE postgres=# \x Expanded display is on. postgres=# select * from pg_class where relname='pg_attribute'; -[ RECORD 1 ]-------+----------------------------------- oid | 1249 relname | pg_attribute relnamespace | 11 reltype | 75 reloftype | 0 relowner | 10 relam | 2 relfilenode | 0 reltablespace | 0 relpages | 54 reltuples | 2913 relallvisible | 54 reltoastrelid | 0 relhasindex | t relisshared | f relpersistence | p relkind | r relnatts | 25 relchecks | 0 relhasrules | f relhastriggers | f relhassubclass | f relrowsecurity | f relforcerowsecurity | f relispopulated | t relreplident | n relispartition | f relrewrite | 0 relfrozenxid | 479 relminmxid | 1 relacl | {pg124=arwdDxt/pg124,=r/pg124} reloptions | {autovacuum_vacuum_scale_factor=0} ---->>>注意此处已经存储了alter table的结果 relpartbound | postgres=# |
开发者选项
下面的参数目的是用在PostgreSQL源代码上, 并且在某些情况下可以帮助恢复严重损坏了的数据库。在一个生产数据库中没有理由使用它们。同样,它们被从例子postgresql.conf
文件中排除。请注意许多这些参数要求特殊的源代码编译标志才能工作。
allow_system_table_mods
(boolean
)允许对系统表结构的修改,以及对系统表的某些其他危险操作。这是不允许的,即使是对超级用户。 不理智地使用此设置可能导致无法恢复的数据丢失或严重损坏数据库系统。只有超级用户才能更改此设置
backtrace_functions
(string
)这个参数包含一个以逗号分隔的C函数名称列表。 如果出现错误,并且发生错误的内部C函数的名称与列表中的值相匹配,那么将向服务器日志中写入一个回溯跟踪信息和错误消息。 这可以用来调试源代码的特定区域。回溯支持并非在所有平台上都可以使用,并且回溯的质量取决于编译选项。该参数只能由超级用户设置。
ignore_system_indexes
(boolean
)读取系统表时忽略系统索引(但是修改系统表时依然同时更新索引)。这在从被破坏的系统索引中恢复数据的时有用。这个参数在会话开始之后不能被更改。
post_auth_delay
(integer
)执行身份验证过程后启动新服务器进程时延迟的时间量。这是为了给开发者们一个机会在一个服务器进程上附加一个调试器。 如果指定值时没有单位,则以秒为单位。0值(默认值)禁用延迟。这个参数在会话开始之后不能被更改。
pre_auth_delay
(integer
)在新服务器进程分叉后,在进行身份验证过程之前,延迟的时间量。这是为了给开发者们一个机会在一个服务器进程上附加一个调试器来跟踪认证过程中的不当行为。 如果指定值时没有单位,则以秒为单位。0值(默认值)禁用延迟。这个参数只能在
postgresql.conf
文件中或在服务器命令行上设置。本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!