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 部署的理想數據庫選擇。