PostgreSQL 对 IPv6 的支持情况
PostgreSQL 对 IPv6 的支持情况
PostgreSQL 全面支持 IPv6 网络协议,包括连接、存储和操作 IPv6 地址。以下是详细说明:
一、网络连接支持
1. 监听 IPv6 连接
在 postgresql.conf
中配置:
listen_addresses = '0.0.0.0,::' # 监听所有IPv4和IPv6地址
2. pg_hba.conf 配置
支持 IPv6 地址规则:
# IPv6本地连接
host all all ::1/128 md5# IPv6网络连接
host all all 2001:db8::/64 md5
二、数据类型支持
1. 内置网络地址类型
CREATE TABLE network_devices (id serial PRIMARY KEY,name text,ip_address inet, -- 支持IPv4和IPv6mac_address macaddr
);-- 插入IPv6地址
INSERT INTO network_devices (name, ip_address)
VALUES ('Server6', '2001:db8::1');
2. 专用操作函数
-- 提取地址家族
SELECT family('2001:db8::1'::inet); -- 返回6-- 地址掩码操作
SELECT text(inet '2001:db8::1' & inet 'ffff:ffff::');
三、连接字符串格式
1. 标准连接格式
psql "host=2001:db8::1 dbname=mydb user=myuser"
2. URL 格式
psql postgresql://myuser@[2001:db8::1]:5432/mydb
四、版本兼容性
PostgreSQL 版本 | IPv6 支持情况 |
---|---|
9.0+ | 完整支持 |
8.1-8.4 | 基本支持(部分功能限制) |
7.4 及更早 | 不支持 |
五、实用示例
1. 查找特定IPv6范围
SELECT * FROM access_log
WHERE ip_address << '2001:db8::/32'::inet;
2. 地址转换
-- IPv6缩写与展开
SELECT abbrev('2001:db8:0000:0000:0000:ff00:0042:8329'::inet);
-- 返回 '2001:db8::ff00:42:8329'SELECT host('2001:db8::1'::inet); -- 返回标准化格式
3. 网络聚合
SELECT network(set_masklen(ip_address, 48)) AS subnet
FROM devices
GROUP BY subnet;
六、配置注意事项
-
操作系统要求:
- 确保OS内核启用IPv6
- 检查防火墙规则允许IPv6连接
-
性能考虑:
- IPv6地址比IPv4占用更多存储空间
- 网络掩码计算可能更耗时
-
混合环境:
# 同时支持IPv4和IPv6 listen_addresses = '0.0.0.0,::'
七、故障排查
-
连接测试:
telnet ::1 5432
-
查看活动连接:
SELECT datname, usename, client_addr FROM pg_stat_activity WHERE family(client_addr) = 6;
-
常见错误解决:
# 错误:could not translate host name "::1" to address # 解决方案:确保/etc/hosts包含 ::1 localhost
PostgreSQL 的 IPv6 实现完全遵循 RFC 4291 标准,是企业级 IPv6 部署的理想数据库选择。