
# 通过SQL命令转储与还原升级大版本
#### 操作场景
升级RDS for PostgreSQL引擎大版本，能让您享受到RDS for PostgreSQL新版本带来的功能、性能、安全的提升。但大版本升级可能存在向后不兼容的数据变更，可能导致现有业务运行不兼容。因此需要用户使用目标版本测试确保业务能够正常运行后，再执行大版本升级。
本章节中"源数据库"表示待升级的低版本RDS for PostgreSQL数据库，"目标数据库"表示待升级到的高版本RDS for PostgreSQL数据库。
#### RDS for PostgreSQL版本号说明
- RDS for PostgreSQL v10及其以上版本的版本号由major.minor组成。其中，major表示大版本号，minor表示小版本号。大版本升级是指major部分增加，比如：11.x升级到12.x。
- RDS for PostgreSQL v10之前的版本号由major.major.minor组成。其中，major.major表示大版本号，minor表示小版本号。大版本升级是指如major.major部分增加，比如：从9.5.x升级到9.6.x或者从9.x.x升级到10.x。
 
#### 准备工作
1. 查看待升级的云数据库 RDS for PostgreSQL实例信息。
   1. 在"实例管理"页面，单击待升级实例名称，进入待升级实例"概览"页面。
   
   2. 在"概览"页面中，可以查看到实例所属区域、可用区、虚拟私有云、子网、安全组。
    
2. 准备弹性云服务器。
   通过弹性云服务器连接云数据库RDS实例，需要创建一台弹性云服务器。
   该弹性云服务器的区域、可用区、虚拟私有云、子网、安全组与待升级RDS for PostgreSQL实例相同。
   
3. 在[2]中的弹性云服务器上，安装PostgreSQL客户端，详见[5](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_connect_05.html#rds_pg_connect_05__zh-cn_topic_0192953574_li5356515192315)。
   ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
   该弹性云服务器需要安装和RDS for PostgreSQL数据库服务端相同版本的数据库客户端，PostgreSQL数据库或客户端会自带[pg_dump](https://www.postgresql.org/docs/current/static/app-pgdump.html)、[pg_restore](https://www.postgresql.org/docs/current/static/app-pgrestore.html)和[psql](https://www.postgresql.org/docs/current/app-psql.html)工具。
   
4. [通过psql连接源数据库](https://support.huaweicloud.com/qs-rds-pg/rds_02_0016.html)，在每一个数据库上执行如下sql，获取已使用列表。
   **select extname from pg_extension;**
   
5. 根据查看的已使用列表，选择一个包含当前所有插件的目标升级版本。 RDS for PostgreSQL各版本支持的插件，参考[支持的插件列表](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0045.html)。
   
6. 参考[创建参数模板](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_parameter_group.html)，创建一个兼容待升级实例参数的目标版本参数模板。
7. 创建目标版本RDS for PostgreSQL实例。
   - 创建RDS for PostgreSQL实例，请参见[购买RDS for PostgreSQL实例](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_10_0028.html)。
   
   - 目标版本RDS for PostgreSQL实例所属区域、可用区、虚拟私有云、子网、安全组与源实例相同。
    
8. 在[2]中的弹性云服务器上，[通过psql连接目标数据库](https://support.huaweicloud.com/qs-rds-pg/rds_02_0016.html)，确认目标实例连接正常。
 
#### 操作步骤
以下操作均在已准备的弹性云服务器上执行。
1. 使用psql连接源数据库，执行以下sql，获取数据库列表。
   
   **postgres=# \\l**
   
   
2. 使用psql连接目标数据库，执行以下sql，确认[1]中的所有数据库在目标数据库中是否均存在。
   
   **postgres=# \\l**
   - 存在，执行[3]。
   
   - 不存在，执行以下sql创建缺失的数据库，然后执行[3]。
     **postgres=# create database my_target_db;**
     ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
     - 模板库template0、template1不需要迁移。
     
     - 默认创建的数据库postgres，一般不会存放业务数据，也不需要迁移。但是如果存放了业务数据，也需要迁移。
       
   
   
   
   
3. 使用pg_dump转储源数据库，并使用pg_restore恢复到目标数据库。针对每一个业务库，重复执行[3]\~[4]。
   
   - 对于除RDS for PostgreSQL 11外的其他版本，转储命令如下： **pg_dump -Fc -v --host=source_IP --port=source_port --username=my_user --dbname=my_source_db \| pg_restore -v --no-owner --host=target_IP --port=target_port --username=my_user --dbname=my_target_db**
     
   
   - 对于RDS for PostgreSQL 11版本，转储命令如下： **pg_dump -Fc -v --host=source_IP --port=source_port -Ndbms_lob -Ndbms_output -Ndbms_random -Nsys -Nutl_raw -Npg_catalog --username=my_user --dbname=my_source_db \| pg_restore -v --no-owner --host=target_IP --port=target_port --username=my_user --dbname=my_target_db**
     
   
   
   ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
   - [pg_dump](https://www.postgresql.org/docs/current/static/app-pgdump.html)所使用的登录用户需要拥有访问该数据库所有对象的权限。
   
   - [pg_restore](https://www.postgresql.org/docs/current/static/app-pgrestore.html)所使用的登录用户需要拥有该数据库的所有操作权限。
   
   - 授权操作请参考[grant](https://www.postgresql.org/docs/current/sql-grant.html)。
   
   - 若pg_dump命令使用-N参数，blob对象不会被导出。
   
   - 若pg_dump命令使用-Fc参数，则导出的文件格式为二进制格式，如果需要导出sql类型的文件请使用-Fp参数。
    
   
   
4. 每迁移完一个数据库，就可以通过目标数据库测试相应业务，保证业务在目标数据库中运行正常。
5. **请务必确保验证业务可以在目标库正常运行后，再将业务切换到目标数据库，然后删除源数据库。**
 
