合 从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
文件中或在服务器命令行上设置。trace_notify
(boolean
)为
LISTEN
和NOTIFY
命令生成大量调试输出。client_min_messages和log_min_messages必须是DEBUG1
或者更低才能把这种输出分别发送到客户端或者服务器日志。trace_recovery_messages
(enum
)启用记录与恢复有关的调试输出,否则无法记录。这个参数允许用户覆盖log_min_messages的正常设置,但只用于指定的消息。这个参数的目的是用来调试热后备。有效值包括
DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
和LOG
。默认值LOG
完全不会影响日志决定。其他值会记录相关级别或更高级别的与恢复相关的调试消息,就好像它们具有LOG
优先级一样;对于log_min_messages
的通用设置,这会无条件的将消息发送给服务器日志。这个参数只能在postgresql.conf
文件中或在服务器命令行上设置。trace_sort
(boolean
)如果打开,发出在排序操作中的资源使用的相关信息。只有在编译PostgreSQL时定义了
TRACE_SORT
宏, 这个参数才可用(不过,当前在默认情况下就定义了TRACE_SORT
)。trace_locks
(boolean
)如果开启,发出锁使用情况的信息。被转储信息中包括锁操作的类型、锁的类型和 被锁或被解锁对象的唯一标识符。同样包括的还有已经授予这个对象的锁类型的位掩码和 等待这个对象的锁类型的位掩码。对每一种锁类型,已授权锁和等待锁的计数也会被一起转储。一个日志文件输出的例子如下:
LOG: LockAcquire: new: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(AccessShareLock) LOG: GrantLock: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(2) req(1,0,0,0,0,0,0)=1 grant(1,0,0,0,0,0,0)=1 wait(0) type(AccessShareLock) LOG: UnGrantLock: updated: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(AccessShareLock) LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(INVALID)
被转储结构的详细信息可以在src/include/storage/lock.h
中找到。只有在编译PostgreSQL时定义了LOCK_DEBUG
宏, 这个参数才可用。trace_lwlocks
(boolean
)如果开启,发出轻量级锁的使用信息。轻量级锁主要是为了提供对共享内存数据结构的互斥访问。只有在编译PostgreSQL时定义了
LOCK_DEBUG
宏, 这个参数才可用。trace_userlocks
(boolean
)如果开启,发出关于用户锁使用的信息。与
trace_locks
的输出一样,但只用于咨询锁。只有在编译PostgreSQL时定义了LOCK_DEBUG
宏, 这个参数才可用。trace_lock_oidmin
(integer
)本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!