PostgreSQL跨版本升級(jí)的方法技巧與問(wèn)題排查
引言
在現(xiàn)代企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,PostgreSQL 作為一款功能強(qiáng)大、開(kāi)源且高度可靠的數(shù)據(jù)庫(kù)系統(tǒng),被廣泛采用。隨著 PostgreSQL 社區(qū)持續(xù)活躍地發(fā)布新版本(通常每年一個(gè)大版本),新版本往往帶來(lái)性能提升、安全增強(qiáng)、SQL 功能擴(kuò)展以及對(duì)現(xiàn)代硬件更好的支持。然而,如何安全、高效地完成從舊版本(如 10、11)到新版本(如 14、15 或 16)的跨版本升級(jí),成為許多 DBA 和開(kāi)發(fā)團(tuán)隊(duì)面臨的重要挑戰(zhàn)。
本文將深入探討 PostgreSQL 跨版本升級(jí)的核心策略、實(shí)操步驟、常見(jiàn)陷阱及問(wèn)題排查方法,并結(jié)合 Java 應(yīng)用場(chǎng)景提供代碼示例,幫助你構(gòu)建一套穩(wěn)健、可復(fù)現(xiàn)的升級(jí)流程。無(wú)論你是初次接觸 PostgreSQL 升級(jí),還是已有經(jīng)驗(yàn)但希望優(yōu)化流程,本文都將為你提供實(shí)用參考。
為什么需要跨版本升級(jí)?
PostgreSQL 的每個(gè)主要版本(如從 12 到 13)都包含不兼容的內(nèi)部數(shù)據(jù)格式變更,這意味著你不能簡(jiǎn)單地替換二進(jìn)制文件并啟動(dòng)服務(wù)。必須通過(guò)特定方式遷移數(shù)據(jù)。而次要版本(如 14.1 到 14.5)則僅包含 bug 修復(fù)和安全補(bǔ)丁,可通過(guò)原地替換實(shí)現(xiàn)無(wú)縫升級(jí)。
進(jìn)行跨版本升級(jí)的主要原因包括:
- 性能提升:新版本通常包含查詢優(yōu)化器改進(jìn)、并行處理增強(qiáng)、索引效率提升等。
- 新 SQL 功能:如
GENERATED列、JSONB增強(qiáng)、MERGE語(yǔ)句(PG 15+)等。 - 安全性增強(qiáng):修復(fù)已知漏洞,支持更安全的認(rèn)證機(jī)制(如 SCRAM-SHA-256)。
- 長(zhǎng)期支持(LTS)策略:PostgreSQL 官方僅對(duì)最近 5 個(gè)主要版本提供支持。例如,截至 2024 年,官方支持 14–18,而 13 及更早版本已停止維護(hù)。
- 兼容性需求:某些新框架或工具(如 Spring Boot 3.x、Hibernate 6)可能要求 PostgreSQL 12+。
升級(jí)前的準(zhǔn)備:評(píng)估與規(guī)劃
成功的升級(jí)始于充分的準(zhǔn)備。跳過(guò)此步驟可能導(dǎo)致生產(chǎn)環(huán)境長(zhǎng)時(shí)間不可用,甚至數(shù)據(jù)丟失。
1. 確定當(dāng)前版本與目標(biāo)版本
首先,確認(rèn)你當(dāng)前運(yùn)行的 PostgreSQL 版本:
SELECT version();
輸出示例:
PostgreSQL 11.22 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
然后,根據(jù)業(yè)務(wù)需求和兼容性,選擇目標(biāo)版本。建議不要一次性跨越多個(gè)大版本(如從 10 直接到 16),而是分階段升級(jí)(10 → 11 → 12 → … → 16),以降低風(fēng)險(xiǎn)。
2. 檢查應(yīng)用兼容性
雖然 PostgreSQL 保持高度的 SQL 兼容性,但某些行為變更可能影響現(xiàn)有應(yīng)用。重點(diǎn)關(guān)注:
- 廢棄函數(shù)或語(yǔ)法:如
timestamp(0) without time zone在舊版本中允許,新版本可能更嚴(yán)格。 - 默認(rèn)配置變更:如
max_connections、shared_buffers的默認(rèn)值可能變化。 - 權(quán)限模型調(diào)整:如
CREATE ROLE默認(rèn)不再具有LOGIN權(quán)限(PG 15+)。 - 擴(kuò)展兼容性:如
postgis、pg_cron等第三方擴(kuò)展是否支持目標(biāo)版本。
3. 備份!備份!備份!
在任何升級(jí)操作前,必須執(zhí)行完整備份。推薦使用 pg_dumpall(包含角色和表空間)或 pg_basebackup(物理備份)。
# 邏輯備份(推薦用于跨版本) pg_dumpall -U postgres > full_backup_20240501.sql # 或針對(duì)單個(gè)數(shù)據(jù)庫(kù) pg_dump -U myuser -d mydb > mydb_backup.sql
同時(shí),確保備份文件可恢復(fù)——在測(cè)試環(huán)境中驗(yàn)證恢復(fù)流程。
4. 構(gòu)建測(cè)試環(huán)境
在與生產(chǎn)環(huán)境盡可能一致的測(cè)試環(huán)境中演練整個(gè)升級(jí)流程。包括:
- 相同的操作系統(tǒng)版本
- 相同的 PostgreSQL 配置(
postgresql.conf,pg_hba.conf) - 相同的數(shù)據(jù)量級(jí)(可用
pg_sample工具生成子集)
升級(jí)策略:pg_dump / pg_restore vs pg_upgrade
PostgreSQL 提供兩種主流跨版本升級(jí)方式:
| 方法 | 優(yōu)點(diǎn) | 缺點(diǎn) | 適用場(chǎng)景 |
|---|---|---|---|
| pg_dump / pg_restore | 簡(jiǎn)單、可靠、可跨平臺(tái)、可清理數(shù)據(jù) | 耗時(shí)長(zhǎng)(尤其 TB 級(jí)數(shù)據(jù))、停機(jī)時(shí)間長(zhǎng) | 小中型數(shù)據(jù)庫(kù)、需要數(shù)據(jù)清洗、跨 OS 升級(jí) |
| pg_upgrade | 極快(秒級(jí)切換)、停機(jī)時(shí)間短 | 不能跨平臺(tái)、需相同編譯選項(xiàng)、無(wú)法清理數(shù)據(jù) | 大型數(shù)據(jù)庫(kù)、最小化停機(jī)窗口 |
下面分別詳解。
方式一:使用 pg_dump / pg_restore(邏輯升級(jí))
這是最通用、最安全的方法,適用于所有場(chǎng)景。
步驟詳解
安裝新版本 PostgreSQL
# Ubuntu 示例 sudo apt install postgresql-16
初始化新集群
sudo pg_createcluster 16 main --port=5433 # 使用不同端口避免沖突
導(dǎo)出舊數(shù)據(jù)庫(kù)
pg_dump -U postgres -p 5432 -d mydb -Fc > mydb.dump # -Fc 表示自定義格式,支持并行恢復(fù)
在新集群中創(chuàng)建數(shù)據(jù)庫(kù)和用戶
-- 連接到新實(shí)例(端口 5433) CREATE DATABASE mydb; CREATE USER myuser WITH PASSWORD 'secret'; GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
導(dǎo)入數(shù)據(jù)
pg_restore -U postgres -p 5433 -d mydb -j 4 mydb.dump # -j 4 表示使用 4 個(gè)并行進(jìn)程加速
驗(yàn)證數(shù)據(jù)一致性
- 比較表行數(shù)
- 運(yùn)行關(guān)鍵業(yè)務(wù)查詢
- 檢查索引、約束、觸發(fā)器是否完整
切換應(yīng)用連接
修改應(yīng)用配置,指向新端口(5433)或停用舊實(shí)例后將新實(shí)例改為 5432。
Java 應(yīng)用配置示例
假設(shè)你使用 Spring Boot + HikariCP,只需修改 application.yml:
spring:
datasource:
url: jdbc:postgresql://localhost:5433/mydb
username: myuser
password: secret
hikari:
maximum-pool-size: 20
注意:升級(jí)后首次啟動(dòng)應(yīng)用時(shí),建議開(kāi)啟 SQL 日志,觀察是否有因 SQL 語(yǔ)法變更導(dǎo)致的異常。
性能優(yōu)化技巧
- 使用
-j N并行恢復(fù)(需pg_restore支持) - 在恢復(fù)前禁用外鍵和觸發(fā)器(恢復(fù)后再啟用)
- 調(diào)整
maintenance_work_mem和max_wal_size提升導(dǎo)入速度
-- 恢復(fù)前執(zhí)行 SET session_replication_role = 'replica'; -- 恢復(fù)后執(zhí)行 SET session_replication_role = 'origin';
方式二:使用 pg_upgrade(物理升級(jí))
pg_upgrade 通過(guò)重用舊數(shù)據(jù)文件(在兼容的前提下)實(shí)現(xiàn)快速升級(jí),適合大型數(shù)據(jù)庫(kù)。
先決條件
- 新舊版本必須在同一操作系統(tǒng)、同一架構(gòu)(x86_64)
- 數(shù)據(jù)目錄路徑不能包含符號(hào)鏈接
- 所有擴(kuò)展必須兼容(需提前安裝新版本擴(kuò)展)
步驟詳解
安裝新版本 PostgreSQL
sudo apt install postgresql-16
停止舊實(shí)例
sudo systemctl stop postgresql@11-main
初始化新集群(不啟動(dòng))
sudo pg_createcluster 16 main --port=5433 sudo systemctl stop postgresql@16-main # 確保未運(yùn)行
運(yùn)行 pg_upgrade 檢查模式
sudo -u postgres /usr/lib/postgresql/16/bin/pg_upgrade \ --old-bindir=/usr/lib/postgresql/11/bin \ --new-bindir=/usr/lib/postgresql/16/bin \ --old-datadir=/var/lib/postgresql/11/main \ --new-datadir=/var/lib/postgresql/16/main \ --check
如果輸出 Clusters are compatible,則繼續(xù)。
執(zhí)行實(shí)際升級(jí)
sudo -u postgres /usr/lib/postgresql/16/bin/pg_upgrade \ --old-bindir=/usr/lib/postgresql/11/bin \ --new-bindir=/usr/lib/postgresql/16/bin \ --old-datadir=/var/lib/postgresql/11/main \ --new-datadir=/var/lib/postgresql/16/main \ --link # 使用硬鏈接加速(節(jié)省磁盤(pán)空間)
啟動(dòng)新實(shí)例
sudo systemctl start postgresql@16-main
運(yùn)行統(tǒng)計(jì)信息更新腳本
./analyze_new_cluster.sh
刪除舊集群(確認(rèn)無(wú)誤后)
./delete_old_cluster.sh
Java 應(yīng)用注意事項(xiàng)
由于 pg_upgrade 不改變數(shù)據(jù)庫(kù)內(nèi)容,Java 應(yīng)用通常無(wú)需修改代碼。但需注意:
- 連接池配置:確保 JDBC URL 指向新端口或新 socket 路徑
- 驅(qū)動(dòng)版本:建議升級(jí)到最新版
postgresqlJDBC 驅(qū)動(dòng)(如 42.6.0+)
Maven 依賴示例:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.3</version>
</dependency>
常見(jiàn)問(wèn)題與排查技巧
即使準(zhǔn)備充分,升級(jí)過(guò)程中仍可能遇到問(wèn)題。以下是高頻問(wèn)題及解決方案。
1. 擴(kuò)展缺失或版本不匹配
現(xiàn)象:pg_restore 報(bào)錯(cuò) extension "postgis" does not exist。
解決:
在新集群中安裝對(duì)應(yīng)擴(kuò)展:
sudo apt install postgis postgresql-16-postgis-3
在恢復(fù)前,在目標(biāo)數(shù)據(jù)庫(kù)中創(chuàng)建擴(kuò)展:
CREATE EXTENSION postgis;
提示:使用 pg_dump 時(shí)添加 --create 選項(xiàng)可自動(dòng)包含 CREATE EXTENSION 語(yǔ)句。
2. 權(quán)限錯(cuò)誤(Ownership Issues)
現(xiàn)象:恢復(fù)后應(yīng)用無(wú)法訪問(wèn)表,報(bào) permission denied for table xxx。
原因:pg_dump 默認(rèn)保留原始所有者,但新集群中該用戶可能不存在。
解決:
在恢復(fù)前創(chuàng)建相同用戶:
CREATE USER app_user WITH LOGIN PASSWORD 'xxx';
或使用 --no-owner 選項(xiàng)忽略所有權(quán),恢復(fù)后手動(dòng)授權(quán):
pg_restore --no-owner -d mydb mydb.dump
3. 序列值不一致
現(xiàn)象:插入新記錄時(shí)報(bào) duplicate key value violates unique constraint。
原因:pg_dump 默認(rèn)不重置序列值,導(dǎo)致新插入 ID 與已有數(shù)據(jù)沖突。
解決:
- 使用
pg_dump的--inserts選項(xiàng)(不推薦,性能差) - 或在恢復(fù)后手動(dòng)同步序列:
SELECT setval('users_id_seq', (SELECT MAX(id) FROM users));
4. 時(shí)區(qū)或區(qū)域設(shè)置差異
現(xiàn)象:日期解析錯(cuò)誤,如 2024-05-01 12:00:00+08 被識(shí)別為無(wú)效。
解決:
- 確保新舊集群的
timezone和lc_time設(shè)置一致 - 在
postgresql.conf中顯式設(shè)置:
timezone = 'Asia/Shanghai' lc_time = 'en_US.UTF-8'
5. pg_upgrade 失敗:WAL 格式不兼容
現(xiàn)象:pg_upgrade --check 報(bào)錯(cuò) WAL format is not compatible。
原因:跨越了太多版本(如 9.6 → 14),中間存在 WAL 格式變更。
解決:
- 必須分階段升級(jí),例如:
9.6 → 10 → 11 → 12 → 13 → 14
- 每次只升一級(jí),確保
pg_upgrade支持相鄰版本。
注意:PostgreSQL 10 是一個(gè)重要分水嶺,引入了新的內(nèi)部版本號(hào)機(jī)制(從 9.6 的 90600 到 10 的 100000),因此 9.6 到 10 的升級(jí)需特別小心。
Java 應(yīng)用中的兼容性測(cè)試策略
升級(jí)數(shù)據(jù)庫(kù)后,必須驗(yàn)證 Java 應(yīng)用能否正常工作。以下是系統(tǒng)化測(cè)試方法。
1. 單元測(cè)試與集成測(cè)試
使用 Testcontainers 啟動(dòng)指定版本的 PostgreSQL 進(jìn)行測(cè)試:
@Testcontainers
@SpringBootTest
class UserRepositoryTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Test
void shouldSaveAndFindUser() {
User user = new User("Alice", "alice@example.com");
userRepository.save(user);
assertThat(userRepository.findById(user.getId())).isPresent();
}
}
2. SQL 語(yǔ)法兼容性檢查
使用 pg_hint_plan 或 auto_explain 模塊捕獲慢查詢,對(duì)比新舊版本執(zhí)行計(jì)劃:
-- 在新版本中啟用 auto_explain LOAD 'auto_explain'; SET auto_explain.log_min_duration = 0; SET auto_explain.log_analyze = true; -- 執(zhí)行關(guān)鍵查詢 SELECT * FROM orders WHERE customer_id = 123;
檢查日志中是否有 Seq Scan 替代了 Index Scan,這可能意味著統(tǒng)計(jì)信息未更新或索引失效。
3. 連接池與事務(wù)行為驗(yàn)證
PostgreSQL 新版本可能調(diào)整 MVCC 行為或鎖機(jī)制。編寫(xiě)并發(fā)測(cè)試:
@Test
void concurrentInsertShouldNotCauseDeadlock() throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(10);
CountDownLatch latch = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
try {
userService.createUser("User" + ThreadLocalRandom.current().nextInt());
} finally {
latch.countDown();
}
});
}
latch.await();
assertThat(userRepository.count()).isEqualTo(10);
}
自動(dòng)化升級(jí)腳本示例
為減少人為錯(cuò)誤,建議將升級(jí)流程腳本化。以下是一個(gè) Bash 腳本骨架:
#!/bin/bash
set -e
OLD_VERSION=11
NEW_VERSION=16
DB_NAME=myapp
BACKUP_FILE="/backups/${DB_NAME}_$(date +%Y%m%d).dump"
echo "?? Starting PostgreSQL upgrade from $OLD_VERSION to $NEW_VERSION"
# 1. 備份
echo "?? Creating backup..."
pg_dump -U postgres -p 5432 -d $DB_NAME -Fc > $BACKUP_FILE
# 2. 安裝新版本(Ubuntu)
echo "?? Installing PostgreSQL $NEW_VERSION..."
sudo apt update
sudo apt install -y postgresql-$NEW_VERSION
# 3. 初始化新集群
echo "InitStructuring new cluster..."
sudo pg_createcluster $NEW_VERSION main --port=5433
# 4. 創(chuàng)建數(shù)據(jù)庫(kù)和用戶
echo "?? Setting up roles..."
sudo -u postgres psql -p 5433 -c "CREATE DATABASE $DB_NAME;"
sudo -u postgres psql -p 5433 -c "CREATE USER appuser WITH PASSWORD 'secret';"
sudo -u postgres psql -p 5433 -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO appuser;"
# 5. 恢復(fù)數(shù)據(jù)
echo "?? Restoring data..."
pg_restore -U postgres -p 5433 -d $DB_NAME -j 4 $BACKUP_FILE
# 6. 驗(yàn)證
echo "?? Validating..."
ROW_COUNT=$(psql -U postgres -p 5433 -d $DB_NAME -t -c "SELECT COUNT(*) FROM users;")
echo "Total users: $ROW_COUNT"
echo "? Upgrade completed successfully!"
生產(chǎn)環(huán)境務(wù)必加入回滾邏輯(如保留舊實(shí)例 72 小時(shí))。
升級(jí)后的優(yōu)化與監(jiān)控
升級(jí)不是終點(diǎn),而是新起點(diǎn)。完成升級(jí)后應(yīng)立即進(jìn)行以下操作:
1. 更新統(tǒng)計(jì)信息
ANALYZE VERBOSE;
2. 重建索引(可選)
新版本可能支持更高效的索引類型(如 PG 12+ 的 INCLUDE 索引):
REINDEX DATABASE mydb;
3. 調(diào)整配置參數(shù)
參考 PGTune 根據(jù)新硬件調(diào)整 shared_buffers、work_mem 等。
4. 監(jiān)控關(guān)鍵指標(biāo)
使用 Prometheus + Grafana 監(jiān)控:
- 查詢延遲
- 鎖等待時(shí)間
- WAL 生成速率
特殊場(chǎng)景處理
跨平臺(tái)升級(jí)(如 Linux → Windows)
只能使用 pg_dump / pg_restore,且需注意:
- 路徑分隔符(
/vs\) - 文件編碼(UTF-8 一致性)
- 大小寫(xiě)敏感(Windows 表名默認(rèn)大寫(xiě))
使用 Docker 的升級(jí)方案
若 PostgreSQL 運(yùn)行在容器中:
# docker-compose.yml
services:
postgres-old:
image: postgres:11
volumes:
- pgdata:/var/lib/postgresql/data
postgres-new:
image: postgres:16
volumes:
- pgdata-new:/var/lib/postgresql/data
升級(jí)步驟:
- 停止
postgres-old docker run --rm -v pgdata:/old -v pgdata-new:/new postgres:16 pg_upgrade ...- 啟動(dòng)
postgres-new
云數(shù)據(jù)庫(kù)(如 AWS RDS、Azure Database for PostgreSQL)
云廠商通常提供一鍵升級(jí)功能,但需注意:
- 升級(jí)窗口由廠商控制
- 可能不支持
pg_upgrade,僅支持邏輯復(fù)制 - 擴(kuò)展支持有限(如 RDS 不支持所有 PostGIS 功能)
回滾策略:當(dāng)升級(jí)失敗時(shí)
盡管我們力求萬(wàn)無(wú)一失,但必須準(zhǔn)備回滾方案。
邏輯升級(jí)回滾
- 停止新實(shí)例
- 啟動(dòng)舊實(shí)例(端口 5432)
- 應(yīng)用連接回舊數(shù)據(jù)庫(kù)
物理升級(jí)回滾(pg_upgrade)
pg_upgrade 會(huì)保留舊數(shù)據(jù)目錄,只需:
# 停止新實(shí)例 sudo systemctl stop postgresql@16-main # 啟動(dòng)舊實(shí)例 sudo systemctl start postgresql@11-main
注意:如果使用了 --link 選項(xiàng),不要刪除舊集群,否則新集群數(shù)據(jù)也會(huì)丟失!
結(jié)語(yǔ):擁抱變化,穩(wěn)健前行
PostgreSQL 的跨版本升級(jí)雖有一定復(fù)雜性,但通過(guò)科學(xué)規(guī)劃、充分測(cè)試和自動(dòng)化工具,完全可以做到安全、高效。記?。?/p>
- 永遠(yuǎn)先備份
- 在測(cè)試環(huán)境演練
- 分階段升級(jí)大跨度版本
- 驗(yàn)證應(yīng)用兼容性
- 準(zhǔn)備回滾方案
隨著 PostgreSQL 16 的發(fā)布,新特性如 pg_stat_io(I/O 統(tǒng)計(jì))、MERGE 語(yǔ)句、邏輯復(fù)制改進(jìn)等,正等待你去探索。每一次升級(jí),都是系統(tǒng)性能與安全的一次飛躍。
以上就是PostgreSQL跨版本升級(jí)的方法技巧與問(wèn)題排查的詳細(xì)內(nèi)容,更多關(guān)于PostgreSQL跨版本升級(jí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PostgreSQL中進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出
在PostgreSQL中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是數(shù)據(jù)庫(kù)管理中不可或缺的操作,通過(guò)使用COPYCOPYpg_dump和pg_dumpall等工具,您可以高效地管理您的數(shù)據(jù),感興趣的可以了解一下2026-05-05
postgresql流復(fù)制原理以及流復(fù)制和邏輯復(fù)制的區(qū)別說(shuō)明
這篇文章主要介紹了postgresql流復(fù)制原理以及流復(fù)制和邏輯復(fù)制的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
PostgreSQL查看數(shù)據(jù)庫(kù)占用空間大小的幾種常用方法
在PostgreSQL中,查看數(shù)據(jù)庫(kù)及數(shù)據(jù)表當(dāng)前數(shù)據(jù)的占用量可以通過(guò)執(zhí)行特定的SQL查詢來(lái)實(shí)現(xiàn),本文給大家介紹了幾種常用的方法,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-05-05
PostgreSQL如何根據(jù)字符串的長(zhǎng)度排序
在PostgreSQL數(shù)據(jù)庫(kù)中,可以通過(guò)LENGTH函數(shù)獲取字符串的長(zhǎng)度,并據(jù)此進(jìn)行排序,LENGTH函數(shù)會(huì)計(jì)算并返回字符串的字符數(shù)量,要根據(jù)字符串長(zhǎng)度進(jìn)行升序排序,可以在SQL查詢中直接使用LENGTH函數(shù),本文介紹PostgreSQL如何根據(jù)字符串的長(zhǎng)度排序,感興趣的朋友一起看看吧2024-11-11
PostgreSQL管理工具phpPgAdmin入門(mén)指南
phpPgAdmin是用PHP開(kāi)發(fā)的一個(gè)基于web的PostgreSQL數(shù)據(jù)庫(kù)管理工具。和MySql時(shí)代的PHPMyAdmin類似。本文介紹了phpPgAdmin安裝和使用方法,需要的朋友可以參考下2014-03-03
PostgreSQL+GeoHash地圖點(diǎn)位聚合實(shí)現(xiàn)代碼
這篇文章主要介紹了PostgreSQL+GeoHash地圖點(diǎn)位聚合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07

