PostgreSQL 备库会同步主库修改的参数吗?
1前言 今天①群里一位筒子问了我这样一个问题: 大佬,今天偶然操作发现alter system修改参数,reload备库不会跟着应用,调用的操作系统写auto.conf文件。但是这应该算是个ddl,这个要怎么理解呢? 这个是不是跟pg_setting里边的signal,superuser,postmaster有关 其实这个问题涉及到了不少原理,值得写出来分享一下。 2何如 这个问题不难理解,理解流复制的原理就能知晓通俗一点来说就是主库不断产生 WAL 并且持续发送给备库,备库收到了再进行回放。因此,这个问题就转变成了主库修改参数是否会记录 WAL record。 那让我们试验一下: postgres=# alter system set deadlock_timeout to '5s'; ALTER SYSTEM postgres=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 row) postgres=# select pg_walfile_name(pg_current_wal_lsn()); pg_walfile_name -------------------------- 0000000100000000000000C5 (1 row) postgres=# create table t2(id int); CREATE TABLE pg_waldump 解析一下 [postgres@xiongcc pg_wal]$ pg_waldump 0000000100000000000000C5 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/C5000028, prev 0/C401CBA8, desc: RUNNING_XACTS nextXid 53284 latestCompletedXid 53283 oldestRunningXid 53284 rmgr: Storage len (rec/tot): 42/ 42, tx: 0, lsn: 0/C5000060, prev 0/C5000028, desc: CREATE base/24927/25043 rmgr: Heap2 len (rec/tot): 60/ 60, tx: 53284, lsn: 0/C5000090, prev 0/C5000060, desc: NEW_CID rel 1663/24927/1247; tid 15/17; cmin: 0, cmax: 4294967295, combo: 4294967295 ... 可以看到,确实没有相关的 WAL record。因此,备库不会复制也就是”理所应当”了。但是是否所有的参数都不会记录呢?其实不然,让我们瞅瞅代码:WAL 日志的类型很多,具体每一种的目的之前文章已经写过,这里我们只关注 XLOG_PARAMETER_CHANGE,顾名思义,参数变更,参数变更之后会记录一条相关日志。 else if (info == XLOG_PARAMETER_CHANGE) { xl_parameter_change xlrec; const char *wal_level_str; const struct config_enum_entry *entry; memcpy(&xlrec, rec, sizeof(xl_parameter_change)); /* Find a string representation for wal_level */ wal_level_str = "?"; for (entry = wal_level_options; entry->name; entry++) { if (entry->val == xlrec.wal_level) { wal_level_str = entry->name; break; } } appendStringInfo(buf, "max_connections=%d max_worker_processes=%d " "max_wal_senders=%d max_prepared_xacts=%d " "max_locks_per_xact=%d wal_level=%s " "wal_log_hints=%s track_commit_timestamp=%s", xlrec.MaxConnections, xlrec.max_worker_processes, xlrec.max_wal_senders, xlrec.max_prepared_xact