
# 使用psql命令迁移RDS for PostgreSQL数据
#### 迁移准备
PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能，导出备份文件，再通过psql导入到RDS中，实现将PostgreSQL的数据导入到云数据库RDS中。
云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。
#### 准备工作
1. 准备弹性云服务器或可公网访问云数据库RDS。
   - 通过弹性云服务器连接云数据库RDS实例，需要创建一台弹性云服务器。
   
   - 通过公网地址连接云数据库RDS实例，需具备以下条件。
     1. 先对云数据库RDS实例绑定公网地址，如何绑定公网地址，请参见[绑定弹性公网IP](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_public_accessibility.html#rds_pg_public_accessibility__zh-cn_topic_0192953725_section3199593620428)。
     
     2. 保证本地设备可以访问云数据库RDS绑定的公网地址。
      
    
2. 在[1]中的弹性云服务器或可访问云数据库RDS的设备上，安装PostgreSQL客户端。
   如何安装PostgreSQL客户端，请参见[安装PostgreSQL客户端（15及以下版本）](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_connect_05.html#rds_pg_connect_05__section1934059692)。
   ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
   该弹性云服务器或可访问云数据库RDS的设备上需要安装和RDS for PostgreSQL数据库服务端相同版本的数据库客户端，PostgreSQL数据库或客户端会自带pg_dump和psql工具。
   
 
#### 导出数据
要将已有的PostgreSQL数据库迁移到云数据库RDS，需要先对它进行导出。
![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/notice_3.0-zh-cn.png)
- 相应导出工具需要与数据库引擎版本匹配。
- 数据库迁移为离线迁移，您需要停止使用源数据库的应用程序。
- 导出或导入数据时，请谨慎，避免因操作不当导致实例或业务异常。
 
1. 登录已准备的弹性云服务器，或可访问云数据库RDS的设备。
2. 使用pg_dump将源数据库导出至SQL文件。 
   **pg_dump** **--username=** *\<DB_USER\>* **--host=** *\<DB_ADDRESS\>* **--port=** *\<DB_PORT\>* **--format=plain --file=** *\<BACKUP_FILE\>* *\<DB_NAME\>*
   - DB_USER为数据库用户。
   
   - DB_ADDRESS为数据库地址。
   
   - DB_PORT为数据库端口。
   
   - BACKUP_FILE为要导出的文件名称。
   
   - DB_NAME为要迁移的数据库名称。
   
   
   根据命令提示输入数据库密码。
   ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
   导出的SQL文件为INSERT语句时可以更容易地编辑和手动修改，但是导入数据的速度可能会比使用COPY语句慢一些，建议根据实际情况选择导出合适的语句格式。
   - 若源库和目标库都使用PostgreSQL数据库，建议导出COPY语句（默认），参考[•示例一：导出源数据库至SQL文件（COPY语句...]。
   
   - 若源库或目标库使用了非PostgreSQL数据库，建议导出INSERT语句，参考[•示例二：导出源数据库至SQL文件（INSERT...]。
   
   
   更多信息，请参见[pg_dump选项说明](https://www.postgresql.org/docs/12/app-pgdump.html)。
   示例如下：
   - 示例一：导出源数据库至SQL文件（COPY语句）。
     **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --file=backup.sql my_db**
     **Password for user root:**
     
   
   - 示例二：导出源数据库至SQL文件（INSERT语句）。
     **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --inserts --file=backup.sql my_db**
     **Password for user root:**
     
   
   - 示例三：导出源数据库中所有表结构至SQL文件。 **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --schema-only --file=backup.sql my_db**
     **Password for user root:**
     
   
   - 示例四：导出源数据库中所有表数据至SQL文件。 **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --data-only --file=backup.sql my_db**
     **Password for user root:**
     
   
   
   命令执行完会生成"backup.sql"文件，如下：
   ```
   [rds@localhost ~]$ ll backup.sql
   -rw-r-----. 1 rds rds 2714 Sep 21 08:23 backup.sql
   ```
   
   
3. 使用pg_dump将源数据库中的表导出至SQL文件。 
   **pg_dump --username=** *\<DB_USER\>* **--host=** *\<DB_ADDRESS\>* **--port=** *\<DB_PORT\>* **--format=plain --file=** *\<BACKUP_FILE\>* *\<DB_NAME\>* **--table=** *\<TABLE_NAME\>*
   - DB_USER为数据库用户。
   
   - DB_ADDRESS为数据库地址。
   
   - DB_PORT为数据库端口。
   
   - BACKUP_FILE为要导出的文件名称。
   
   - DB_NAME为要迁移的数据库名称。
   
   - TABLE_NAME为要迁移的数据库中指定表名称。
   
   
   根据命令提示输入数据库密码。
   示例如下：
   - 示例一：导出源数据库中指定的单表至SQL文件。 **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --file=backup.sql my_db --table=test**
     **Password for user root:**
     
   
   - 示例二：导出源数据库中指定的多表至SQL文件。 **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --file=backup.sql my_db --table=test1 --table=test2**
     **Password for user root:**
     
   
   - 示例三：导出源数据库中以ts_开头的所有表至SQL文件。 **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --file=backup.sql my_db --table=ts_\***
     **Password for user root:**
     
   
   - 示例四：导出源数据库中除ts_开头之外的所有表至SQL文件。 **$ pg_dump --username=root --host=192.168.151.18 --port=5432 --format=plain --file=backup.sql my_db -T=ts_\***
     **Password for user root:**
     
   
   
   命令执行完会生成"backup.sql"文件，如下：
   ```
   [rds@localhost ~]$ ll backup.sql
   -rw-r-----. 1 rds rds 2714 Sep 21 08:23 backup.sql
   ```
   
   
 
#### 导入数据
1. 登录已准备的弹性云服务器，或可访问云数据库RDS的设备。
2. 确保导入的目标数据库已存在。 
   如果不存在，执行以下命令创建数据库：
   **# psql --host=** *\<RDS_ADDRESS\>* **--port=** \<*DB_PORT* \>**--username=** *root* **--dbname=postgres** **-c** "**create database** *\<DB_NAME\>* ;"
   - RDS_ADDRESS为RDS实例的IP地址。
   
   - DB_PORT为当前数据库实例的端口。
   
   - DB_NAME为要导入的数据库名称。
    
   
   
3. 将导出的文件导入到云数据库RDS。 
   **# psql --host=** *\<RDS_ADDRESS\>* **--port=** \<*DB_PORT* \> **--username=** *root* **--dbname=** *\<DB_NAME\>* **--file=** *\<BACKUP_DIR\>*/backup.sql
   - RDS_ADDRESS为云数据库RDS实例的IP地址。
   
   - DB_PORT为当前数据库实例的端口。
   
   - DB_NAME为要导入的目标数据库名称，请确保该数据库已存在。
   
   - BACKUP_DIR为"backup.sql"所在目录。
   
   
   根据命令提示输入云数据库RDS实例的密码。
   示例如下：
   **# psql --host=172.16.66.198 --port=****5432**** --username=root --dbname=my_db --file=backup.sql**
   **Password for user root:**
   
   
4. 查看迁移结果，如下。 
   **my_db=\> \\l my_db**
   示例中，名为my_db的数据库已经被导入了：
   ```
   my_db=> \l my_db
   List of databases
   Name  | Owner | Encoding | Collate     | Ctype       | Access privileges
   ------+-------+----------+-------------+-------------+-----------
   my_db | root  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
   (1 row)
   ```
   
   
 
