最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
PostgreSQL数据库升级的完整流程以及注意事项
时间:2026-06-09 08:47:55 编辑:袖梨 来源:一聚教程网
引言
在现代软件开发和运维实践中,数据库作为核心基础设施,其稳定性和性能至关重要。PostgreSQL 作为一款功能强大、开源且高度可靠的数据库管理系统,持续推出新版本以增强性能、安全性和功能特性。然而,随着业务系统的不断演进,数据库版本的升级成为不可避免的任务。本文将深入探讨 PostgreSQL 数据库升级的完整流程、关键注意事项,并结合 Java 应用的实际场景,提供可落地的操作指南和代码示例。
为什么需要升级 PostgreSQL?
PostgreSQL 社区通常每一年发布一个主要版本(如从 14 到 15),并定期发布次要版本(如 14.1、14.2 等)。主要版本升级通常包含新特性、性能优化、SQL 标准支持增强以及可能的不兼容变更;而次要版本升级则专注于 bug 修复和安全补丁,通常向后兼容。
升级的主要驱动力包括:
- 安全性增强:新版本修复已知漏洞,防止潜在攻击。
- 性能提升:查询优化器改进、并行处理能力增强、索引效率提升等。
- 新功能支持:如逻辑复制、JSONB 增强、分区表改进、存储过程语言扩展等。
- 长期支持(LTS)策略:PostgreSQL 官方对每个主要版本提供约 5 年的支持。超出支持周期的版本将不再接收安全更新,存在风险。
- 兼容性要求:某些新框架或工具可能要求特定 PostgreSQL 版本。
官方支持周期参考:PostgreSQL Release Support Policy
忽视升级可能导致系统暴露于安全风险、错失性能红利,甚至在未来因依赖过时版本而难以集成新生态组件。
升级前的准备工作
1. 明确升级类型
首先区分是主版本升级(如 13 → 14)还是次版本升级(如 14.5 → 14.6):
- 次版本升级:通常只需替换二进制文件并重启服务,数据文件完全兼容,风险极低。
- 主版本升级:涉及数据目录结构变更,必须使用专用工具(如
pg_upgrade或逻辑导出/导入)进行迁移,存在较高复杂度和风险。
本文重点讨论主版本升级,因其更具挑战性。
2. 检查当前环境
在执行任何操作前,全面了解当前系统状态:
# 查看当前 PostgreSQL 版本psql -c "SELECT version();"# 查看数据目录位置psql -c "SHOW data_directory;"# 查看安装路径which pg_ctl
同时记录以下信息:
- 操作系统版本(如 Ubuntu 22.04、CentOS 7)
- PostgreSQL 安装方式(源码编译、包管理器如 apt/yum、Docker 容器等)
- 是否使用了扩展(如 PostGIS、pg_cron、uuid-ossp)
- 是否启用了复制(流复制、逻辑复制)
- 自定义配置参数(
postgresql.conf、pg_hba.conf)
3. 阅读官方发行说明
每个新版本的 Release Notes 都详细列出了:
- 新增功能
- 性能改进
- 不兼容变更(Incompatible Changes)
- 已弃用的功能
- 扩展兼容性说明
特别注意“不兼容变更”部分!例如,PostgreSQL 15 移除了 pg_dump 的 --inserts 默认行为变更,PostgreSQL 14 修改了 GROUP BY 对 NULL 值的处理逻辑等。这些变更可能直接影响现有应用。
4. 备份!备份!备份!
这是升级过程中最重要的一步。无论采用何种升级方法,都必须在操作前创建完整、可验证的备份。
推荐备份策略:
物理备份(基础备份 + WAL 归档):
# 使用 pg_basebackup 创建基础备份pg_basebackup -h localhost -U replicator -D /backup/pg_basebackup_$(date +%Y%m%d) -Ft -z -P
结合 WAL 归档,可实现时间点恢复(PITR)。
逻辑备份(pg_dump):
# 全库逻辑备份(推荐用于中小型数据库)pg_dumpall -h localhost -U postgres -f /backup/full_backup_$(date +%Y%m%d).sql
逻辑备份可跨版本、跨平台恢复,但大数据库耗时较长。
验证备份:在测试环境中尝试从备份恢复,确保其有效性。不要假设“备份成功 = 可恢复”。
5. 搭建测试环境
在生产环境执行升级前,务必在隔离的测试环境中完整演练升级流程。测试环境应尽可能模拟生产配置(数据量、负载、扩展、网络拓扑等)。
可通过以下方式快速构建测试环境:
- 使用生产数据库的逻辑备份(
pg_dump)恢复到测试实例 - 使用 Docker 快速部署不同版本的 PostgreSQL
- 利用云平台快照功能克隆生产实例
在测试环境中验证:
- 升级流程是否顺畅
- 应用连接是否正常
- 关键业务 SQL 是否仍能正确执行
- 性能是否有预期提升或意外下降
升级方法详解
PostgreSQL 主版本升级主要有两种方法:pg_upgrade(就地升级) 和 逻辑导出/导入(dump/restore)。选择哪种方法取决于数据量、停机时间窗口、磁盘空间等因素。
方法一:使用pg_upgrade(推荐用于大型数据库)
pg_upgrade 是 PostgreSQL 官方提供的工具,可在极短停机时间内完成主版本升级。它通过重用现有数据文件(仅转换必要元数据)来避免全量数据复制,特别适合 TB 级数据库。
工作原理简述
pg_upgrade 并不真正“升级”旧集群,而是启动新旧两个 PostgreSQL 实例,将旧集群的数据文件“链接”或“复制”到新集群目录,并更新系统目录以兼容新版本。整个过程跳过了逐行解析和插入数据的步骤,因此速度极快。

操作步骤
安装新版本 PostgreSQL
# Ubuntu/Debian 示例sudo apt updatesudo apt install postgresql-14 postgresql-client-14# CentOS/RHEL 示例sudo dnf install postgresql14-server postgresql14
初始化新集群(但不启动)
# 通常安装包会自动初始化,若未初始化:sudo -u postgres /usr/pgsql-14/bin/initdb -D /var/lib/pgsql/14/data
停止旧集群
sudo systemctl stop postgresql-13
运行 pg_upgrade(检查模式)
sudo -u postgres /usr/pgsql-14/bin/pg_upgrade --old-bindir=/usr/pgsql-13/bin --new-bindir=/usr/pgsql-14/bin --old-datadir=/var/lib/pgsql/13/data --new-datadir=/var/lib/pgsql/14/data --check
--check 选项仅验证兼容性,不执行实际升级。务必先运行此步骤!
执行实际升级
sudo -u postgres /usr/pgsql-14/bin/pg_upgrade --old-bindir=/usr/pgsql-13/bin --new-bindir=/usr/pgsql-14/bin --old-datadir=/var/lib/pgsql/13/data --new-datadir=/var/lib/pgsql/14/data --link # 使用硬链接加速(需同一文件系统)
--link:使用硬链接而非复制文件,极大节省时间和磁盘空间(但要求新旧数据目录在同一文件系统)。- 若无法使用
--link,可省略,但需确保有足够磁盘空间(至少等于原数据大小)。
启动新集群并执行统计信息更新
sudo systemctl start postgresql-14# 运行 pg_upgrade 生成的 analyze_new_cluster.shsudo -u postgres /var/lib/pgsql/14/data/analyze_new_cluster.sh
验证与清理
- 检查日志
/var/lib/pgsql/14/data/log/是否有错误 - 运行应用测试用例
- 确认无误后,删除旧集群(
/var/lib/pgsql/13/)和pg_upgrade生成的脚本
优点与局限
✅ 优点:
- 停机时间极短(仅需停止旧实例到启动新实例的时间)
- 节省磁盘 I/O(尤其使用
--link时) - 保留所有物理存储结构(如表空间、WAL 配置)
❌ 局限:
- 不能跨大版本跳跃升级(如 12 → 14 需先升到 13)
- 要求新旧版本在相同架构(如都是 x86_64)
- 某些扩展需手动处理(见下文)
方法二:逻辑导出/导入(dump/restore)
此方法使用 pg_dump 导出逻辑 SQL 或自定义格式,再用 pg_restore 导入到新版本集群。适用于中小型数据库或需要彻底清理数据的场景。
操作步骤
安装并初始化新版本 PostgreSQL
sudo apt install postgresql-14sudo pg_ctlcluster 14 main start # Debian/Ubuntu
从旧集群导出数据
# 导出为自定义格式(推荐,支持并行恢复)pg_dump -h localhost -U postgres -Fc mydb > /backup/mydb.dump# 或导出为纯 SQL(便于查看和修改)pg_dump -h localhost -U postgres mydb > /backup/mydb.sql
在新集群中创建数据库和用户
CREATE DATABASE mydb;CREATE USER myapp WITH PASSWORD 'secret';GRANT ALL PRIVILEGES ON DATABASE mydb TO myapp;
导入数据到新集群
# 自定义格式导入(支持并行)pg_restore -h localhost -U postgres -d mydb -j 4 /backup/mydb.dump# SQL 格式导入psql -h localhost -U postgres -d mydb -f /backup/mydb.sql
验证数据一致性
- 行数对比:
SELECT count(*) FROM important_table; - 关键业务数据抽样校验
- 运行应用集成测试
优点与局限
✅ 优点:
- 最安全、最通用的方法,几乎适用于所有场景
- 可跨平台、跨架构迁移
- 导出的 SQL 可人工审查和修改
- 自动重建索引和约束,可能优化存储
❌ 局限:
- 停机时间长(导出 + 导入时间)
- 大型数据库(TB 级)可能耗时数小时甚至数天
- 需要额外磁盘空间存储 dump 文件
- 不保留物理存储细节(如 fillfactor、TOAST 表结构)
方法选择建议
| 场景 | 推荐方法 |
|---|---|
| 数据库 > 500GB,停机窗口 < 1 小时 | pg_upgrade |
| 数据库 < 100GB,可接受数小时停机 | dump/restore |
| 需要跨操作系统迁移(如 Linux → Windows) | dump/restore |
| 存在大量自定义扩展或不确定兼容性 | dump/restore(更可控) |
| 需要彻底清理膨胀数据(bloat) | dump/restore |
扩展与插件的处理
PostgreSQL 的强大之处在于其丰富的扩展生态(如 PostGIS、pg_partman、pg_cron)。升级时,这些扩展往往成为“雷区”。
常见问题
- 扩展未安装在新版本:新集群缺少旧集群使用的扩展,导致
pg_upgrade失败或导入报错。 - 扩展版本不兼容:扩展本身未适配新 PostgreSQL 版本。
- 扩展函数签名变更:即使扩展存在,内部 API 变更导致调用失败。
处理流程
列出所有已安装扩展
SELECT name, default_version, installed_version FROM pg_available_extensions WHERE installed_version IS NOT NULL;
查阅扩展的升级文档
- PostGIS: PostGIS Upgrade Guide
- pg_partman: pg_partman GitHub Releases(查看版本兼容性)
- 其他扩展:通常在其官网或文档中有明确说明
在新集群中安装对应版本扩展
# Ubuntu 安装 PostGIS 3.3 for PostgreSQL 14sudo apt install postgis postgresql-14-postgis-3# 在数据库中启用CREATE EXTENSION postgis;
特殊处理(以 PostGIS 为例)
PostGIS 升级通常需要额外步骤:
-- 在新数据库中先创建旧版 PostGISCREATE EXTENSION postgis VERSION '3.2.0';-- 然后升级到新版ALTER EXTENSION postgis UPDATE TO '3.3.0';
验证扩展功能
-- 测试 PostGIS 函数SELECT ST_AsText(ST_Point(1, 2));
重要提示:pg_upgrade 不会自动升级扩展数据!某些扩展(如 PostGIS)在升级后需手动运行 ALTER EXTENSION ... UPDATE。
应用层兼容性验证(Java 示例)
数据库升级后,应用能否正常工作是最终检验标准。Java 应用通常通过 JDBC 驱动连接 PostgreSQL。以下是关键验证点和代码示例。
1. JDBC 驱动版本兼容性
PostgreSQL JDBC 驱动(org.postgresql:postgresql)需与数据库版本兼容。虽然驱动通常向后兼容多个版本,但新数据库特性可能需要新驱动支持。
- 检查驱动版本:访问 PostgreSQL JDBC Driver Downloads
Maven 依赖示例(推荐使用最新稳定版):
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> <!-- 2023年最新版,支持 PG 15 --></dependency>
2. 连接字符串与认证
PostgreSQL 14+ 默认 scram-sha-256 认证,若旧应用使用 md5,需调整 pg_hba.conf 或升级驱动。
// 标准 JDBC 连接String url = "jdbc:postgresql://localhost:5432/mydb";Properties props = new Properties();props.setProperty("user", "myapp");props.setProperty("password", "secret");props.setProperty("ssl", "false"); // 生产环境应启用 SSLtry (Connection conn = DriverManager.getConnection(url, props)) { System.out.println("Connected to PostgreSQL " + conn.getMetaData().getDatabaseProductVersion());}3. 验证关键业务逻辑
编写集成测试覆盖核心数据库操作:
import org.junit.jupiter.api.Test;import java.sql.*;import static org.junit.jupiter.api.Assertions.*;public class PostgreSqlUpgradeTest { private static final String DB_URL = "jdbc:postgresql://localhost:5432/testdb"; private static final String USER = "testuser"; private static final String PASS = "testpass"; @Test public void testBasicCRUD() throws SQLException { try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) { // 创建测试表 try (Statement stmt = conn.createStatement()) { stmt.execute("DROP TABLE IF EXISTS upgrade_test"); stmt.execute("CREATE TABLE upgrade_test (id SERIAL PRIMARY KEY, name TEXT, created_at TIMESTAMP DEFAULT NOW())"); } // 插入数据 try (PreparedStatement pstmt = conn.prepareStatement( "INSERT INTO upgrade_test (name) VALUES (?) RETURNING id")) { pstmt.setString(1, "Test Record"); try (ResultSet rs = pstmt.executeQuery()) { assertTrue(rs.next()); int id = rs.getInt("id"); assertTrue(id > 0); } } // 查询数据 try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM upgrade_test")) { assertTrue(rs.next()); assertEquals(1, rs.getInt(1)); } // 更新数据 try (PreparedStatement pstmt = conn.prepareStatement( "UPDATE upgrade_test SET name = ? WHERE id = ?")) { pstmt.setString(1, "Updated Name"); pstmt.setInt(2, 1); assertEquals(1, pstmt.executeUpdate()); } // 删除数据 try (Statement stmt = conn.createStatement()) { assertEquals(1, stmt.executeUpdate("DELETE FROM upgrade_test")); } } } @Test public void testJsonbSupport() throws SQLException { // 验证 JSONB 类型(PG 9.4+ 支持,但新版本有增强) try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); Statement stmt = conn.createStatement()) { stmt.execute("DROP TABLE IF EXISTS json_test"); stmt.execute("CREATE TABLE json_test (data JSONB)"); stmt.execute("INSERT INTO json_test VALUES ('{"key": "value", "num": 42}')"); try (ResultSet rs = stmt.executeQuery( "SELECT data->>'key' as key_val, (data->>'num')::int as num_val FROM json_test")) { assertTrue(rs.next()); assertEquals("value", rs.getString("key_val")); assertEquals(42, rs.getInt("num_val")); } } } @Test public void testPartitioning() throws SQLException { // 验证声明式分区(PG 10+ 引入,后续版本增强) try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); Statement stmt = conn.createStatement()) { stmt.execute("DROP TABLE IF EXISTS sales"); stmt.execute(""" CREATE TABLE sales ( id SERIAL, sale_date DATE NOT NULL, amount NUMERIC ) PARTITION BY RANGE (sale_date) """); stmt.execute(""" CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01') """); stmt.execute("INSERT INTO sales (sale_date, amount) VALUES ('2023-06-15', 100.50)"); try (ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM sales_2023")) { assertTrue(rs.next()); assertEquals(1, rs.getInt(1)); } } }}4. 监控与日志
在应用中启用 SQL 日志,观察是否有异常:
# log4j2.xml 片段<Logger name="org.springframework.jdbc" level="DEBUG"/><Logger name="com.zaxxer.hikari" level="DEBUG"/>
重点关注:
PSQLException异常- 查询性能突变(可能因执行计划改变)
- 连接池耗尽(认证或网络问题)
升级后的优化与验证
升级完成后,工作并未结束。还需进行一系列优化和验证,确保系统稳定高效。
1. 更新统计信息
新版本的查询优化器可能依赖更准确的统计信息。立即执行 ANALYZE:
-- 分析整个数据库ANALYZE;-- 或针对关键大表ANALYZE VERBOSE large_table;
2. 检查并重建索引(可选)
虽然 pg_upgrade 保留了索引,但 dump/restore 方式会重建索引。对于 pg_upgrade,可考虑:
- 检查索引膨胀:
SELECT * FROM pg_stat_user_indexes WHERE idx_tup_read = 0; - 重建低效索引:
REINDEX INDEX CONCURRENTLY idx_name;
3. 验证配置参数
新版本可能引入新参数或废弃旧参数。对比 postgresql.conf:
# 使用 pg_controldata 检查控制文件版本pg_controldata /var/lib/pgsql/14/data# 检查配置差异diff /var/lib/pgsql/13/data/postgresql.conf /var/lib/pgsql/14/data/postgresql.conf
特别注意:
shared_buffers、work_mem等内存参数是否合理- 新版本默认值变更(如 PostgreSQL 13 调整了
max_worker_processes) - 已废弃参数(如
checkpoint_segments在 PG 9.5+ 被移除)
4. 监控关键指标
升级后 24-72 小时内密切监控:
- 查询性能:慢查询日志、
pg_stat_statements - 连接数:
SELECT count(*) FROM pg_stat_activity; - 锁等待:
SELECT * FROM pg_locks WHERE granted = false; - WAL 生成速率:
pg_wal/目录增长速度 - 系统资源:CPU、内存、I/O 使用率
可使用开源工具如 pgAdmin、Prometheus + postgres_exporter 进行可视化监控。
5. 回滚计划(最后的安全网)
尽管我们做了充分准备,但生产环境总有意外。确保有清晰的回滚方案:
pg_upgrade回滚:保留旧数据目录,修改 systemd 服务指向旧版本,启动即可。- dump/restore 回滚:从备份恢复到旧集群。
回滚步骤应写入升级文档,并在测试环境验证过。
常见陷阱与解决方案
1. 权限与 SELinux/AppArmor
Linux 安全模块(SELinux、AppArmor)可能阻止新 PostgreSQL 实例访问数据目录。
症状:启动失败,日志显示“Permission denied”。
解决:
# SELinux 上下文修复(CentOS/RHEL)sudo semanage fcontext -a -t postgresql_db_t "/var/lib/pgsql/14(/.*)?"sudo restorecon -R /var/lib/pgsql/14# AppArmor 配置(Ubuntu)sudo nano /etc/apparmor.d/usr.sbin.postgresql-14# 添加数据目录路径
2. 扩展缺失导致pg_upgrade失败
症状:pg_upgrade 报错 “extension ‘xxx’ is not installed”。
解决:
- 在新集群中安装对应扩展
- 若扩展不再维护,考虑 dump/restore 并移除该扩展
3. 时间/时区处理变更
PostgreSQL 10+ 对时区处理有细微调整,可能影响 timestamp with time zone 字段。
验证:
-- 检查时区设置SHOW timezone;-- 测试时间转换SELECT '2023-01-01 12:00:00+00'::timestamptz;
Java 应用中,确保使用 java.time 包而非旧 Date/Calendar:
// 正确处理带时区的时间OffsetDateTime odt = resultSet.getObject("created_at", OffsetDateTime.class);LocalDateTime ldt = odt.toLocalDateTime(); // 转换为本地时间4. 复制槽(Replication Slot)处理
若使用逻辑复制或物理流复制,升级前需处理复制槽:
-- 查看复制槽SELECT * FROM pg_replication_slots;-- 升级前暂停复制,升级后重建槽SELECT pg_drop_replication_slot('my_slot');-- 升级后SELECT pg_create_logical_replication_slot('my_slot', 'pgoutput');5. 大对象(Large Objects)迁移
pg_upgrade 默认不迁移大对象(pg_largeobject),需额外步骤:
# 升级后运行vacuumdb --all --analyze-in-stages
或使用 --clone 选项(PostgreSQL 12+)替代 --link。
自动化与 DevOps 实践
在现代 DevOps 环境中,数据库升级应尽可能自动化,减少人为错误。
1. 使用 Ansible 自动化升级
编写 Ansible Playbook 管理升级流程:
---- name: PostgreSQL Major Version Upgrade hosts: db_servers become: yes vars: pg_old_version: "13" pg_new_version: "14" pg_data_dir_old: "/var/lib/pgsql/{{ pg_old_version }}/data" pg_data_dir_new: "/var/lib/pgsql/{{ pg_new_version }}/data" tasks: - name: Backup current database shell: pg_dumpall -U postgres > /backup/pg_full_{{ ansible_date_time.iso8601 }}.sql register: backup_result - name: Install new PostgreSQL version package: name: "postgresql-{{ pg_new_version }}" state: present - name: Initialize new cluster command: /usr/pgsql-{{ pg_new_version }}/bin/initdb -D {{ pg_data_dir_new }} args: creates: "{{ pg_data_dir_new }}/PG_VERSION" - name: Stop old cluster systemd: name: "postgresql-{{ pg_old_version }}" state: stopped - name: Run pg_upgrade check command: > /usr/pgsql-{{ pg_new_version }}/bin/pg_upgrade --old-bindir=/usr/pgsql-{{ pg_old_version }}/bin --new-bindir=/usr/pgsql-{{ pg_new_version }}/bin --old-datadir={{ pg_data_dir_old }} --new-datadir={{ pg_data_dir_new }} --check register: pg_upgrade_check ignore_errors: yes - name: Fail if check fails fail: msg: "pg_upgrade check failed!" when: pg_upgrade_check.rc != 0 - name: Run pg_upgrade command: > /usr/pgsql-{{ pg_new_version }}/bin/pg_upgrade --old-bindir=/usr/pgsql-{{ pg_old_version }}/bin --new-bindir=/usr/pgsql-{{ pg_new_version }}/bin --old-datadir={{ pg_data_dir_old }} --new-datadir={{ pg_data_dir_new }} --link - name: Start new cluster systemd: name: "postgresql-{{ pg_new_version }}" state: started enabled: yes2. 蓝绿部署(适用于云环境)
在云平台(如 AWS RDS、Azure Database for PostgreSQL)上,可利用快照和只读副本实现近乎零停机升级:
- 从生产实例创建快照
- 从快照恢复到新版本实例(绿色环境)
- 在绿色环境运行验证测试
- 切换应用连接字符串到新实例
- 保留旧实例一段时间作为回滚选项
3. 数据库迁移即代码(Migrations as Code)
使用 Flyway 或 Liquibase 管理数据库 schema 变更,使升级过程可重复、可审计:
// Flyway 配置示例@Configurationpublic class FlywayConfig { @Bean public Flyway flyway(DataSource dataSource) { return Flyway.configure() .dataSource(dataSource) .locations("classpath:db/migration") .load(); }}虽然 Flyway/Liquibase 主要用于 schema 变更,但可结合版本号控制,确保应用与数据库版本匹配。
总结
PostgreSQL 数据库升级是一项需要周密计划、严谨执行和全面验证的系统工程。无论是选择高效的 pg_upgrade 还是稳妥的 dump/restore,核心原则始终是:备份先行、测试验证、逐步推进。
通过本文的完整流程梳理、Java 应用集成示例、常见陷阱解析以及自动化实践,希望能为你的 PostgreSQL 升级之旅提供坚实支撑。记住,每一次成功的升级,都是对系统稳定性与未来可扩展性的一次投资 。
以上就是PostgreSQL数据库升级的完整流程与注意事项的详细内容,更多关于PostgreSQL数据库升级的资料请关注本站其它相关文章!
相关文章
- 聚美优品官网入口 - 2026最新正品美妆购物平台 06-12
- 折800网 - 2026热门折扣购物平台 06-12
- 秘塔写作猫官方入口 - 2026在线AI写作工具 06-12
- 百事可乐官方旗舰店 - 淘宝网正品购买平台 06-12
- 什么是感情备胎 - 感情备胎的心理成因与应对方法 06-12
- 记忆大师电影全集在线观看 - 2026高清完整版 06-12