PostgreSQL11修改wal-segsize的操作
修改有风险,谨慎行事。
PostgreSQL11以前改变wal-segsize(WAL段大小)必须在编译时通过–with-wal-segsize参数确定,编译后不可更改.
#PostgreSQL11之前的版本 #数据块按8K划分(--with-blocksize,单位为K,默认为8K) #WAL块尺寸按8k划分(--with-wal-blocksize,单位为K,默认为8K) #数据文件按1G一个分解(--with-segsize,单位为G,默认为1G) #WAL段尺寸按16MB划分(--with-wal-segsize,单位为K,默认为16MB) ./configure--with-blocksize=8--with-wal-blocksize=8--with-segsize=1--with-wal-segsize=16
PostgreSQL11取消了编译参数–with-wal-segsize.使用pg_resetwal(–wal-segsize)更改WAL段大小.
#PostgreSQL11先编译程序 #数据块按8K划分(--with-blocksize,单位为K,默认为8K) #WAL块尺寸按8k划分(--with-wal-blocksize,单位为K,默认为8K) #数据文件按1G一个分解(--with-segsize,单位为G,默认为1G) ./configure--with-blocksize=8--with-wal-blocksize=8--with-segsize=1
编译完成并初始化后使用pg_resetwal修改wal-segsize
#首先停止PostgreSQL服务 pg_ctl-D/data/pgdatastop-mfast #修改wal-segsize段大小,默认单位是MB,值必须是2的幂并且在1到1024MB之间 pg_resetwal--wal-segsize=32/data/pgdata;
查看
showblock_size; showwal_block_size; showsegment_size; showwal_segment_size; ls/data/pgdata/pg_wal-lh
补充:PostgreSQL11新特性解读:Initdb/Pg_resetwal支持修改WAL文件大小
PostgreSQL11版本的一个重要调整是支持initdb和pg_resetwal修改WAL文件大小,而11版本之前只能在编译安装PostgreSQL时设置WAL文件大小。这一特性能够方便WAL文件的管理。
Release的说明
AllowtheWALfilesizetobesetviainitdb(BeenaEmerson)
Previouslythe16MBdefaultcouldonlybechangedatcompiletime.
下面分别演示通过initdb和pg_resetwal修改WAL文件大小。
使用initdb调整WAL文件大小
initdb命令关于修改WAL文件大小选项,如下:
--wal-segsize=size
SettheWALsegmentsize,inmegabytes.ThisisthesizeofeachindividualfileintheWALlog.Thedefaultsizeis16megabytes.Thevaluemustbeapowerof2between1and1024(megabytes).Thisoptioncanonlybesetduringinitialization,andcannotbechangedlater.
ItmaybeusefultoadjustthissizetocontrolthegranularityofWALlogshippingorarchiving.Also,indatabaseswithahighvolumeofWAL,thesheernumberofWALfilesperdirectorycanbecomeaperformanceandmanagementproblem.IncreasingtheWALfilesizewillreducethenumberofWALfiles.
WAL日志文件大小默认为16MB,该值必须是1到1024之间的2的次方,增大WAL文件大小能够减少WAL日志文件的产生。
初始化一个新的PostgreSQL数据库实例,指定WAL文件大小64MB,如下:
[pg11@pghost2~]$initdb-EUTF8--locale=C--wal-segsize=64-D/home/pg11/data01-Upostgres-W Thefilesbelongingtothisdatabasesystemwillbeownedbyuser"pg11". Thisusermustalsoowntheserverprocess. Thedatabaseclusterwillbeinitializedwithlocale"C". Thedefaulttextsearchconfigurationwillbesetto"english". Datapagechecksumsaredisabled. Enternewsuperuserpassword: Enteritagain: creatingdirectory/home/pg11/data01...ok creatingsubdirectories...ok selectingdefaultmax_connections...100 selectingdefaultshared_buffers...128MB selectingdynamicsharedmemoryimplementation...posix creatingconfigurationfiles...ok runningbootstrapscript...ok performingpost-bootstrapinitialization...ok syncingdatatodisk...ok WARNING:enabling"trust"authenticationforlocalconnections Youcanchangethisbyeditingpg_hba.conforusingtheoption-A,or --auth-localand--auth-host,thenexttimeyouruninitdb. Success.Youcannowstartthedatabaseserverusing: pg_ctl-D/home/pg11/data01-llogfilestart
修改postgresql.conf相关配置,之后启动数据库。
[pg11@pghost2data01]$pg_ctlstart-D/home/pg11/data01 waitingforservertostart....2018-10-1615:58:16.714CST[10583]LOG:listeningonIPv6address"::1",port1950 2018-10-1615:58:16.714CST[10583]LOG:listeningonIPv4address"127.0.0.1",port1950 2018-10-1615:58:16.731CST[10583]LOG:listeningonUnixsocket"/tmp/.s.PGSQL.1950" 2018-10-1615:58:16.762CST[10584]LOG:databasesystemwasshutdownat2018-10-1615:56:46CST 2018-10-1615:58:16.782CST[10583]LOG:databasesystemisreadytoacceptconnections done serverstarted
验证WAL文件大小,如下:
[pg11@pghost2~]$ll/home/pg11/data01/pg_wal total65M -rw-------1pg11pg1164MOct1616:03000000010000000000000001 drwx------2pg11pg114.0KOct1615:56archive_status
可见WAL文件大小为64MB。
使用pg_resetwal调整WAL文件大小
pg_resetwal用来重置WAL日志和一些控制信息,常用于数据库恢复场景,不到万不得已不轻易使用,以下演示使用pg_resetwal命令调整WAL日志文件大小,仅供测试参考,生产环境慎用。
pg_resetwal命令关于调整WAL文件大小的选项,如下:
--wal-segsize=wal_segment_size
SetthenewWALsegmentsize,inmegabytes.Thevaluemustbesettoapowerof2between1and1024(megabytes).Seethesameoptionofinitdbformoreinformation.
以下演示在已有PostgreSQL实例基础上调整WAL日志文件大小。
查看当前数据库的pg_wal目录,如下:
[pg11@pghost2pg_wal]$ll/database/pg11/pg_root/pg_wal/ total2.3G -rw-------1pg11pg1116MSep3014:45000000010000001700000013 -rw-------1pg11pg1116MSep3014:45000000010000001700000014 -rw-------1pg11pg1116MSep3014:45000000010000001700000015 -rw-------1pg11pg1116MSep3014:45000000010000001700000016 -rw-------1pg11pg1116MSep3014:45000000010000001700000017 -rw-------1pg11pg1116MSep3014:45000000010000001700000018 -rw-------1pg11pg1116MSep3014:45000000010000001700000019 -rw-------1pg11pg1116MSep3014:4500000001000000170000001A -rw-------1pg11pg1116MSep3014:4500000001000000170000001B ... 省略 drwx------2pg11pg1116KOct1608:38archive_status
pg_wal目录中已有大量WAL日志文件,WAL文件大小为16MB,计划将WAL日志文件调整成64MB。
pg_resetwal操作时需要关闭数据库,如下。
[pg11@pghost2~]$pg_ctlstop-mfast waitingforservertoshutdown....done serverstopped pg_resetwal命令调整WAL日志文件大小为64MB: [pg11@pghost2~]$pg_resetwal--wal-segsize=64-D/database/pg11/pg_root Write-aheadlogreset
验证WAL文件大小,如下:
[pg11@pghost2~]$ll/database/pg11/pg_root/pg_wal/ total65M -rw-------1pg11pg1164MOct1608:55000000010000001700000029 drwx------2pg11pg1116KOct1608:55archive_status
发现pg_wal目录中原有的WAL日志被清理,同时生成了大小为64MB新的WAL文件。
启动数据库提示min_wal_size参数至少需设置成wal_segment_size大小为2倍。
[pg11@pghost2~]$pg_ctlstart waitingforservertostart....2018-10-1609:01:26.096CST[24318]FATAL:"min_wal_size"mustbeatleasttwice"wal_segment_size". 2018-10-1609:01:26.096CST[24318]LOG:databasesystemisshutdown stoppedwaiting pg_ctl:couldnotstartserver Examinethelogoutput.
根据提示调整postgresql.conf,设置如下:
min_wal_size=128MB
启动数据库正常,如下:
[pg11@pghost2~]$pg_ctlstart waitingforservertostart....2018-10-1609:02:45.680CST[24614]LOG:listeningonIPv4address"0.0.0.0",port1930 2018-10-1609:02:45.680CST[24614]LOG:listeningonIPv6address"::",port1930 2018-10-1609:02:45.687CST[24614]LOG:listeningonUnixsocket"/tmp/.s.PGSQL.1930" 2018-10-1609:02:45.715CST[24614]LOG:redirectinglogoutputtologgingcollectorprocess 2018-10-1609:02:45.715CST[24614]HINT:Futurelogoutputwillappearindirectory"log".
总结
以上演示了11版本通过initdb和pg_resetwal调整WAL文件大小。
pg_resetwal会清除pg_wal目录的WAL文件,本博客的测试样例仅供参考,生产环境使用需慎重。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。