PostgreSQL 9.5时区数据库单独更新方法咨询
当然可以!PostgreSQL的时区数据依赖于IANA的tz数据库,你完全可以单独更新这部分数据,不用动整个数据库安装。下面分两种常见情况说明具体操作:
情况1:你的PostgreSQL使用系统的时区数据(绝大多数Linux发行版默认如此)
大多数Linux系统里,PostgreSQL会直接调用系统的tzdata包。这种情况下,更新系统的时区包就可以了:
- Debian/Ubuntu系列:
sudo apt-get update && sudo apt-get install --only-upgrade tzdata - RHEL/CentOS系列:
# CentOS 7及以下 sudo yum update tzdata # CentOS 8+ / RHEL 8+ sudo dnf update tzdata
更新完成后,重启PostgreSQL服务让新时区数据生效:
sudo systemctl restart postgresql
情况2:你的PostgreSQL自带独立的时区数据(比如官方二进制包、源码编译时未指定使用系统tzdata)
如果PostgreSQL是用官方二进制包安装,或者编译时加了--without-system-tzdata参数,它会自带一套独立的时区文件。这种情况下需要手动替换PostgreSQL的时区文件:
找到PostgreSQL的时区文件目录:
运行以下命令获取共享目录路径:pg_config --sharedir时区文件通常在这个路径下的
timezone子目录里,比如/usr/local/pgsql/share/timezone。备份原有时区文件:
cp -r /usr/local/pgsql/share/timezone /usr/local/pgsql/share/timezone.bak获取并替换更新后的时区文件:
你可以从PostgreSQL官方提供的同版本(9.5)最新补丁包中提取share/timezone目录下的所有文件,直接覆盖原有目录即可;也可以下载IANA最新的tzdata包,用PostgreSQL兼容的zic工具编译后替换(前者操作更简单)。重启PostgreSQL服务:
sudo systemctl restart postgresql
验证更新是否成功
建议用时区变更后的时间点测试(伏尔加格勒的时区变更发生在2014年),运行以下查询:
SELECT TIMESTAMP '2024-01-01 12:00:00' AT TIME ZONE 'Europe/Volgograd';
如果返回结果是2024-01-01 12:00:00+04,就说明时区数据已经更新成功了。
额外提醒:PostgreSQL 9.5已经在2021年结束了官方维护,虽然单独更新时区数据可行,但长期来看,升级到受支持的PostgreSQL版本(比如12+)会更安全,也能获得更多功能和更新支持。
内容的提问来源于stack exchange,提问作者Den Kasyanov

