
# 使用gs_restore导入数据
#### 操作场景
gs_restore是DWS提供的与gs_dump配套的导入工具。通过该工具，可将gs_dump导出的文件导入至数据库。gs_restore支持导入的文件格式包含自定义归档格式、目录归档格式和tar归档格式。
gs_restore具备如下两种功能。
- 导入至数据库 如果指定了数据库，则数据将被导入到指定的数据库中。其中，并行导入必须指定连接数据库的密码。
  
- 导入至脚本文件 如果未指定导入数据库，则创建包含重建数据库所需的SQL语句脚本，并将其写入至文件或者标准输出。该脚本文件等效于gs_dump导出的纯文本格式文件。
  
gs_restore工具在导入时，允许用户选择需要导入的内容，并支持在数据导入前对等待导入的内容进行排序。
#### 操作步骤
![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
gs_restore默认是以追加的方式进行数据导入。为避免多次导入造成数据异常，在进行导入时，建议使用"-e"和"-c"参数，即导入前删除已存在于待导入数据库中的数据库对象，同时当出现导入错误时，忽略当前错误，继续执行导入任务，并在导入后会显示相应的错误信息。
1. 以root用户登录到服务器，执行如下命令进入数据存放路径。 
   ```
   cd /opt/bin
   ```
   
   
2. 使用gs_restore命令，从postgres整个数据库内容的导出文件中，将数据库的所有对象的定义导入到backupdb。 
   ```
   gs_restore -W password -U jack /home/dbadmin/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb -s -e -c
   ```
   表1常用参数说明 
   | 参数 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 举例                         |
   |:---|:---|:---|
   | -U | 连接数据库的用户名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | -U jack                    |
   | -W | 指定用户连接的密码。 - 如果主机的认证策略是trust，则不会对数据库管理员进行密码验证，即无需输入-W选项；  - 如果没有-W选项，并且不是数据库管理员，会提示用户输入密码。   | -W *password*，此处密码需要用户自定义。 |
   | -d | 连接数据库dbname，并直接将数据导入到该数据库中。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | -d backupdb                |
   | -p | 指定服务器所监听的TCP端口或本地Unix域套接字后缀，以确保连接。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | -p 8000                    |
   | -h | "集群地址"如果通过公网地址连接，请指定为集群"公网访问地址"或"公网访问域名"，如果通过内网地址连接，请指定为集群"内网访问地址"或"内网访问域名"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | -h 10.10.10.100            |
   | -e | 当发送SQL语句到数据库时如果出现错误，退出当前出现错误的任务，并执行其他导入任务。即默认状态下会忽略错误任务并继续执行导入，且在导入后会显示一系列错误信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | -                          |
   | -c | 在重新创建数据库对象前，清理（删除）已存在于将要导入的数据库中的数据库对象。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | -                          |
   | -s | 只导入模式定义，不导入数据。当前的序列值也不会被导入。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | -                          |
      
   其他参数说明请参见《数据仓库服务工具参考》中"服务端工具\>gs_restore"章节。
   
   
 
#### 示例
示例一：执行gs_restore，导入指定MPPDB_backup.dmp文件（自定义归档格式）中postgres数据库的数据和对象定义。
```
gs_restore -W password backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb
gs_restore[2017-07-21 19:16:26]: restore operation successful
gs_restore: total time: 13053  ms
```
示例二：执行gs_restore，导入指定MPPDB_backup.tar文件（tar归档格式）中postgres数据库的数据和对象定义。
```
gs_restore backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb 
gs_restore[2017-07-21 19:21:32]: restore operation successful
gs_restore[2017-07-21 19:21:32]: total time: 21203  ms
```
示例三：执行gs_restore，导入指定MPPDB_backup目录文件（目录归档格式）中postgres数据库的数据和对象定义。
```
gs_restore backup/MPPDB_backup -p 8000 -h 10.10.10.100 -d backupdb
gs_restore[2017-07-21 19:26:46]: restore operation successful
gs_restore[2017-07-21 19:26:46]: total time: 21003  ms
```
示例四：执行gs_restore，将postgres数据库的所有对象的定义导入至backupdb数据库。导入前，postgres存在完整的定义和数据，导入后，backupdb数据库只存在所有对象定义，表没有数据。
```
gs_restore -W password /home/dbadmin/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb -s -e -c 
gs_restore[2017-07-21 19:46:27]: restore operation successful
gs_restore[2017-07-21 19:46:27]: total time: 32993  ms
```
示例五：执行gs_restore，导入MPPDB_backup.dmp文件中PUBLIC模式的所有定义和数据。在导入时会先删除已经存在的对象，如果原对象存在跨模式的依赖则需手工强制干预。
```
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -n PUBLIC
gs_restore: [archiver (db)] Error while PROCESSING TOC:
gs_restore: [archiver (db)] Error from TOC entry 313; 1259 337399 TABLE table1 gaussdba
gs_restore: [archiver (db)] could not execute query: ERROR:  cannot drop table table1 because other objects depend on it
DETAIL:  view t1.v1 depends on table table1
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
Command was: DROP TABLE public.table1;
```
手工删除依赖，导入完成后再重新创建。
```
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -n PUBLIC
gs_restore[2017-07-21 19:52:26]: restore operation successful
gs_restore[2017-07-21 19:52:26]: total time: 2203  ms
```
示例六：执行gs_restore，导入MPPDB_backup.dmp文件中PUBLIC模式下表hr.staffs的定义。在导入之前，hr.staffs表不存在。
```
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -s -n PUBLIC -t hr.staffs
gs_restore[2017-07-21 19:56:29]: restore operation successful
gs_restore[2017-07-21 19:56:29]: total time: 21000  ms
```
示例七：执行gs_restore，导入MPPDB_backup.dmp文件中PUBLIC模式下表hr.staffs的数据。在导入之前，hr.staffs表不存在数据。
```
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -a -n PUBLIC -t hr.staffs
gs_restore[2017-07-21 20:12:32]: restore operation successful
gs_restore[2017-07-21 20:12:32]: total time: 20203  ms
```
示例八：执行gs_restore，导入指定表hr.staffs的定义。在导入之前，hr.staffs表的数据是存在的。
```
human_resource=# select * from hr.staffs;
 staff_id | first_name  |  last_name  |  email   |    phone_number    |      hire_date      | employment_id |  salary  | commission_pct | manager_id | section_id 
----------+-------------+-------------+----------+--------------------+---------------------+---------------+----------+----------------+------------+------------
      200 | Jennifer    | Whalen      | JWHALEN  | 515.123.4444       | 1987-09-17 00:00:00 | AD_ASST       |  4400.00 |                |        101 |         10
      201 | Michael     | Hartstein   | MHARTSTE | 515.123.5555       | 1996-02-17 00:00:00 | MK_MAN        | 13000.00 |                |        100 |         20
gsql -d human_resource -p 8000
gsql ((GaussDB x.x.x build 39137c2d) compiled at 2022-04-01 15:43:11 commit 3629 last mr 5138 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
human_resource=# drop table hr.staffs CASCADE;
NOTICE:  drop cascades to view hr.staff_details_view
gs_restore -W password /home/dbadmin/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100-d human_resource -n hr -t staffs -s -e 
restore operation successful
total time: 904  ms
human_resource=# select * from hr.staffs;
 staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id 
----------+------------+-----------+-------+--------------+-----------+---------------+--------+----------------+------------+------------
(0 rows)
```
示例九：执行gs_restore，导入staffs和areas两个指定表的定义和数据。在导入之前，staffs和areas表不存在。
```
human_resource=# \d
                                 List of relations
 Schema |        Name        | Type  |  Owner   |             Storage              
--------+--------------------+-------+----------+----------------------------------
 hr     | employment_history | table | dbadmin | {orientation=row,compression=no}
 hr     | employments        | table | dbadmin | {orientation=row,compression=no}
 hr     | places             | table | dbadmin | {orientation=row,compression=no}
 hr     | sections           | table | dbadmin | {orientation=row,compression=no}
 hr     | states             | table | dbadmin | {orientation=row,compression=no}
(5 rows)
gs_restore -W password /home/mppdb/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d human_resource -n hr -t staffs -n hr -t areas 
restore operation successful
total time: 724  ms
human_resource=# \d
                                 List of relations
 Schema |        Name        | Type  |  Owner   |             Storage              
--------+--------------------+-------+----------+----------------------------------
 hr     | areas              | table | dbadmin | {orientation=row,compression=no}
 hr     | employment_history | table | dbadmin | {orientation=row,compression=no}
 hr     | employments        | table | dbadmin| {orientation=row,compression=no}
 hr     | places             | table | dbadmin | {orientation=row,compression=no}
 hr     | sections           | table | dbadmin | {orientation=row,compression=no}
 hr     | staffs             | table | dbadmin | {orientation=row,compression=no}
 hr     | states             | table | dbadmin | {orientation=row,compression=no}
(7 rows)
human_resource=# select * from hr.areas;
 area_id |       area_name        
---------+------------------------
       4 | Iron
       1 | Wood
       2 | Lake
       3 | Desert
(4 rows)
```
示例十：执行gs_restore，导入hr的模式，包含模式下的所有对象定义和数据。
```
gs_restore -W password /home/dbadmin/backup/MPPDB_backup1.sql -p 8000 -h 10.10.10.100 -d backupdb -n hr -e -c
restore operation successful
total time: 702  ms
```
示例十一：执行gs_restore，同时导入hr和hr1两个模式，仅导入模式下的所有对象定义。
```
gs_restore -W password /home/dbadmin/backup/MPPDB_backup2.dmp -p 8000 -h 10.10.10.100 -d backupdb -n hr -n hr1 -s
restore operation successful
total time: 665  ms
```
示例十二：执行gs_restore，将human_resource数据库导出文件进行解密并导入至backupdb数据库中。
```
create database backupdb;
gs_restore /home/dbadmin/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb --with-key=1234567812345678
restore operation successful
total time: 23472  ms
gsql -d backupdb -p 8000 -r
gsql ((GaussDB x.x.x build 39137c2d) compiled at 2022-04-01 15:43:11 commit 3629 last mr 5138 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
backupdb=# select * from hr.areas;
 area_id |       area_name        
---------+------------------------
       4 | Iron
       1 | Wood
       2 | Lake
       3 | Desert
(4 rows)
```
示例十三：用户user1不具备将导出文件中数据导入至数据库backupdb的权限，而角色role1具备该权限，要实现将文件数据导入数据库backupdb，可以在导出命令中设置--role角色为role1，使用role1的权限，完成导出目的。
```
human_resource=# CREATE USER user1 IDENTIFIED BY 'password';
gs_restore -U user1 -W password /home/dbadmin/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb --role role1 --rolepassword password
restore operation successful
total time: 554  ms
gsql -d backupdb -p 8000 -r 
gsql ((GaussDB x.x.x build 39137c2d) compiled at 2022-04-01 15:43:11 commit 3629 last mr 5138 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
backupdb=# select * from hr.areas;
 area_id |       area_name        
---------+------------------------
       4 | Iron
       1 | Wood
       2 | Lake
       3 | Desert
(4 rows)
```
