在Linux和Windows下PostgreSQL运维避坑 类延良 PostgreSQL济南峰会 2024.09.21 特别声明 本PPT所说的Linux,仅仅是如下三种Linux操作系统: •RHEL •OracleLinux •SLES 2 CONTENTS 01. 02. 03. 在Linux下的运维注意点 Loremipsumdolorsitamet,consectetur adipiscingelit 在Windows下的运维注意点 Loremipsumdolorsitamet,consectetur adipiscingelit 怎么为PostgreSQL做贡献 Loremipsumdolorsitamet,consectetur adipiscingelit Linux 1.在RHEL8上建立的xfs无法在RHEL7上mount https://access.redhat.com/solutions/4582401 问题: Can'tmountaXFSfilesystemcreatedinRHEL8onRHEL7 WhentryingtomountaXFSfilesystemthatwascreatedinRHEL8onRHEL7,Igetthiserror: mount:wrongfstype,badoption,badsuperblockon/dev/sdN,missingcodepageorhelperprogram,orothererror. 决议: CreatethefilesystemwithoutthereflinkfeaturetouseaXFSfilesystembothinRHEL8andRHEL7: #mkfs.xfs-mreflink=0/dev/sdN 根源: ThishappensbecauseRHEL8metadatacontainsextrafieldswhichcannotbeproperlyhandledby RHEL7andpreviousreleases. RefertoCHAPTER5.RHEL8.0.0RELEASE-5.1.12.Filesystemsandstorage 2.在SUSE12上,SUSE12的进程数限制 在SUSE12上,SUSE12的进程数限制: SLES12SP2的linux上发生的问题,并不常见,但是给出了一些新的思路。现象是数据库进程达到300个左右时,就无法继续连接数据库了 最终的原因是因为在SUSE12上增加了systemd的资源控制,其中默认参数:DefaultTasksMaxwasdefaultvalue(512). systemdlimitedmaximumnumberoftasksthatmaybecreatedintheunit.这个值会影响OS上的maxpid,将该参数设为无限制后解决该问题:修改/etc/systemd/system.conf 设置DefaultTasksMax的值为‘infinity’,重启主机。参考自: https://blogs.oracle.com/database4cn/sles12-sp2%e4%b8%8a%e9%81%87%e5%88%b0ora-12518%3a-tns%3alistener-could-not-hand-off-client-connection%e9%94%99%e8%af%af MountingXFSfilesystemcreatedon 7 7 RHEL9failsonRHEL8.6(andolder)andRHEL https://access.redhat.com/solutions/7023563 OracleLinux:UnabletoMountaxfsFilesystemCreatedonOracleLinux9onOracleLinux7 or8(DocID2945343.1) OracleLinux:HowtoEnableBigTimestampsFeature'bigtime=1'forXFSFilesystems(Doc ID2993572.1) bigtime的解释: #manmkfs.xfs -mglobal_metadata_options Theseoptionsspecifymetadataformatoptionsthateitherapplytotheentirefilesystemoraren'teasilycharacterisedbyaspecificfunctionalitygroup.Thevalidglobal_metadata_optionsare: bigtime=value ThisoptionenablesfilesystemsthatcanhandleinodetimestampsfromDecember1901toJuly2486,andquotatimerexpirationsfromJanuary1970toJuly2486.Thevalueiseither0todisablethefeature,or1toenablelargetimestamps. Ifthisfeatureisnotenabled,thefilesystemcanonlyhandletimestampsfrom December1901toJanuary2038,andquotatimersfromJanuary1970toFebruary2106. Bydefault,mkfs.xfswillnotenablethisfeature.Iftheoption-mcrc=0isused, 手工发出pg_ctl启停数据库与 systemd去调用pg_ctl启停数据库的区别 两个知识点: 1)systemctl启动的PostgreSQL数据库,pg_ctlstop-m-f能关闭; 2)pg_ctlstart的PostgreSQL数据库,systemctlstop停不掉; 请大家思考:这是PG的锅么?大象说:这也怪我?? Oracle单机DB也有此现象,这其实是与systemd实现方式有关,跟哪种DB无关,见: AutoStartup/ShutdownIssueInRHEL7.XUsingSystemctlAfterManuallyShutdown/StartDatabase(DocID2401600.1) 怎么看一个PG数据库实例是通过手工发起pg_ctlstart启动的还是用systemd机制启动的?答案: cat/sys/fs/cgroup/systemd/system.slice/postgresql-12.service/tasks 看上面的结果有阿拉伯数字(这些数字是PG相关进程的ospid),就表示是由systemctl(systemd)机制启动的 /etc/security/limits.conf中定义的资源限制对systemd机制启动的服务有效吗? 答案是:无效,这是两种不同的资源限制机制,可以说是井水不犯河水。 参考1: HowtosetlimitsforservicesinRHEL7andsystemd https://access.redhat.com/solutions/1257953 Howtosetlimits(ulimit)forservicesrunbysystemd https://access.redhat.com/solutions/1346533 查看新盘有无数据的命令 适用场景: 工程师接到客户要求,$PGDATA原来在/opt目录下,由于业务增长导致数据量变大,因此,需要将$PGDATA迁移到更大的文件系统中。经过客户协调存储工程师,存储工程师为数据库服务器映射了一个/dev/sdh盘,并且客户对工程师说:就是这个sdh盘,你们用这个盘存放$PGDATA即可。那么问题来了:工程师应该用什么命令来确认这个sdh盘是空的,也就是用什么命令来确认这个sdh盘里边是没有数据的? 答案: 使用hexdump/dev/sdh 若是返回结果都是0000,就表示是空盘,如下是一个实际的例子: 新盘: #hexdump/dev/sdb 查看新盘有无数据的命令 hexdump会将相同的都是0的行标记为"*",所以即使全部读完,依旧只会显示: 已经被使用的盘: #hexdump/dev/sda https://access.redhat.com/solutions/790733 https://access.redhat.com/solutions/790733 Windows 为服务器选择认证过的Windows操作系统版本: 请参考微软windows操作系统(包括Server和Client)对硬件的认证列表(见下面的2个链接) Windowsserver端操作系统的认证列表https://www.windowsservercatalog.com/ WindowsClient端操作系统的认证列表http://sysdev.microsoft.com/zh-CN/hardware/lpl/ 上述认证列表主要是服务器型号与Windows操作系统版本之间的兼容认证清单在实际环境中,请务必满足上述兼容认证清单。 举例如下:浪潮TS860G3这款服务器,认证过的Windows操作系统版本是: https://www.windowsservercatalog.com/item.aspx?idItem=ad8e968a-c57b-d4e0-7f3e-367a7b18f676&bCatID=1282 选择PostgreSQL版本时注意支持的Windows版本 可以参考https://www.postgresql.org/download/windows/这个网址中有如下的截图 有如下两个注意点(均指64bit操作系统): •从PostgreSQL13开始不支持Windows2012R2及更低的操作系统版本。 •从PostgreSQL11开始不支持WindowsClient操作系统,比如Windows10之类的 不打任何操作系统补丁的Windows2012R2安装不了PostgreSQL数据库 现象是(pg12.4见下),该windows的版本号为6.3,内部版本号是9600. 或者(pg12.5见下): 这是因为Windows2012R2没有安装过任何操作系统补丁更新,此 操作系统版本的详细版本号见下:(通过在cmd下敲入winver得到) 解决方法是: 请按照https://www.microsoft.com/zh-CN/download/details.aspx?id=42334文章的提示进行补丁--- WindowsServer2012R2更新(KB2919355)更新。 特别提醒:请按照如下的顺序打补丁: 1)clearcompressionflag.exe 2)KB2919442 3)KB2975061http://support.microsoft.com/kb/2975061/, 4)KB2919355若是不安装KB2975061,那么在安装KB2919355时将安装将失败,事件查看器中的错误代码为0x80070005。安装KB2919355耗时1小时,需要重启OS生效。 5)KB2932046,重启os生效 6)KB2959977,重启os生效 7)KB2937592,不需要重启 8)KB2938439,重启os生效 9)KB2934018,重启os生效 点击postgresql-12.5-1-windows-x64.exe安装程序后,GUI安装界面不能弹出的问题 问题说明:弹不出来安装的GUI界面(下一步下一步的那个安装界面),也就无法安装, 介质是postgresql-12.5-1-windows-x64.exe,从edb公司官网下载