使用gs_restore命令导入数据

操作场景

gs_restore是openGauss数据库提供的与gs_dump配套的导入工具。通过该工具,可将gs_dump导出的文件导入至数据库。gs_restore支持导入的文件格式包含自定义归档格式、目录归档格式和tar归档格式。

gs_restore具备如下两种功能。

  • 导入至数据库

    如果指定了数据库,则数据将被导入到指定的数据库中。其中,并行导入必须指定连接数据库的密码。

  • 导入至脚本文件

    如果未指定导入数据库,则创建包含重建数据库所需的SQL语句脚本,并将其写入至文件或者标准输出。该脚本文件等效于gs_dump导出的纯文本格式文件。

gs_restore工具在导入时,允许用户选择需要导入的内容,并支持在数据导入前对等待导入的内容进行排序。

操作步骤

使用gs_restore命令导入数据 - 图1 说明:
gs_restore默认是以追加的方式进行数据导入。为避免多次导入造成数据异常,在进行导入时,建议选择使用”-c” 和”-e”参数。”-c”表示在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象;”-e”表示当发送SQL语句到数据库时如果出现错误请退出,默认状态下会继续,且在导入后会显示一系列错误信息。

  1. 以操作系统用户omm登录数据库主节点。

  2. 使用gs_restore命令,从postgres整个数据库内容的导出文件中,将数据库的所有对象的定义导入到backupdb。

    1. gs_restore -U jack /home/omm/backup/MPPDB_backup.tar -p 8000 -d backupdb -s -e -c
    2. Password:

表 1 常用参数说明

  1. <a name="zh-cn_topic_0237121137_table1781122816253"></a>
  2. <table><thead align="left"><tr id="zh-cn_topic_0237121137_row10837281257"><th class="cellrowborder" valign="top" width="25%" id="mcps1.2.4.1.1"><p id="zh-cn_topic_0237121137_p48382816258"><a name="zh-cn_topic_0237121137_p48382816258"></a><a name="zh-cn_topic_0237121137_p48382816258"></a>参数</p>
  3. </th>
  4. <th class="cellrowborder" valign="top" width="43.33%" id="mcps1.2.4.1.2"><p id="zh-cn_topic_0237121137_p18332812257"><a name="zh-cn_topic_0237121137_p18332812257"></a><a name="zh-cn_topic_0237121137_p18332812257"></a>参数说明</p>
  5. </th>
  6. <th class="cellrowborder" valign="top" width="31.669999999999998%" id="mcps1.2.4.1.3"><p id="zh-cn_topic_0237121137_p583122816257"><a name="zh-cn_topic_0237121137_p583122816257"></a><a name="zh-cn_topic_0237121137_p583122816257"></a>举例</p>
  7. </th>
  8. </tr>
  9. </thead>
  10. <tbody><tr id="zh-cn_topic_0237121137_row1483528152520"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0237121137_p3830287252"><a name="zh-cn_topic_0237121137_p3830287252"></a><a name="zh-cn_topic_0237121137_p3830287252"></a>-U</p>
  11. </td>
  12. <td class="cellrowborder" valign="top" width="43.33%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0237121137_p8232111218592"><a name="zh-cn_topic_0237121137_p8232111218592"></a><a name="zh-cn_topic_0237121137_p8232111218592"></a>连接数据库的用户名。</p>
  13. </td>
  14. <td class="cellrowborder" valign="top" width="31.669999999999998%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0237121137_p1583152842510"><a name="zh-cn_topic_0237121137_p1583152842510"></a><a name="zh-cn_topic_0237121137_p1583152842510"></a>-U jack</p>
  15. </td>
  16. </tr>
  17. <tr id="zh-cn_topic_0237121137_row199295855317"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0237121137_p89920588539"><a name="zh-cn_topic_0237121137_p89920588539"></a><a name="zh-cn_topic_0237121137_p89920588539"></a>-W</p>
  18. </td>
  19. <td class="cellrowborder" valign="top" width="43.33%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0237121137_p69431335210"><a name="zh-cn_topic_0237121137_p69431335210"></a><a name="zh-cn_topic_0237121137_p69431335210"></a>指定用户连接的密码。</p>
  20. <a name="zh-cn_topic_0237121137_ul194074341627"></a><a name="zh-cn_topic_0237121137_ul194074341627"></a><ul id="zh-cn_topic_0237121137_ul194074341627"><li>如果主机的认证策略是trust,则不会对数据库管理员进行密码验证,即无需输入-W选项;</li><li>如果没有-W选项,并且不是数据库管理员,会提示用户输入密码。</li></ul>
  21. </td>
  22. <td class="cellrowborder" valign="top" width="31.669999999999998%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0237121137_p1898043113581"><a name="zh-cn_topic_0237121137_p1898043113581"></a><a name="zh-cn_topic_0237121137_p1898043113581"></a>-W abcd@123</p>
  23. </td>
  24. </tr>
  25. <tr id="zh-cn_topic_0237121137_row4650191445011"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0237121137_p9650161425019"><a name="zh-cn_topic_0237121137_p9650161425019"></a><a name="zh-cn_topic_0237121137_p9650161425019"></a>-d</p>
  26. </td>
  27. <td class="cellrowborder" valign="top" width="43.33%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0237121137_p1565110140508"><a name="zh-cn_topic_0237121137_p1565110140508"></a><a name="zh-cn_topic_0237121137_p1565110140508"></a>连接数据库dbname,并直接将数据导入到该数据库中。</p>
  28. </td>
  29. <td class="cellrowborder" valign="top" width="31.669999999999998%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0237121137_p7651201455010"><a name="zh-cn_topic_0237121137_p7651201455010"></a><a name="zh-cn_topic_0237121137_p7651201455010"></a>-d backupdb</p>
  30. </td>
  31. </tr>
  32. <tr id="zh-cn_topic_0237121137_row9411195215519"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0237121137_p84119521250"><a name="zh-cn_topic_0237121137_p84119521250"></a><a name="zh-cn_topic_0237121137_p84119521250"></a>-p</p>
  33. </td>
  34. <td class="cellrowborder" valign="top" width="43.33%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0237121137_p14838631464"><a name="zh-cn_topic_0237121137_p14838631464"></a><a name="zh-cn_topic_0237121137_p14838631464"></a>指定服务器所侦听的TCP端口或本地Unix域套接字后缀,以确保连接。</p>
  35. </td>
  36. <td class="cellrowborder" valign="top" width="31.669999999999998%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0237121137_p341117521853"><a name="zh-cn_topic_0237121137_p341117521853"></a><a name="zh-cn_topic_0237121137_p341117521853"></a>-p <span id="zh-cn_topic_0237121137_text986814282459"><a name="zh-cn_topic_0237121137_text986814282459"></a><a name="zh-cn_topic_0237121137_text986814282459"></a>8000</span></p>
  37. </td>
  38. </tr>
  39. <tr id="zh-cn_topic_0237121137_row1362511481379"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0237121137_p195642019125512"><a name="zh-cn_topic_0237121137_p195642019125512"></a><a name="zh-cn_topic_0237121137_p195642019125512"></a>-e</p>
  40. </td>
  41. <td class="cellrowborder" valign="top" width="43.33%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0237121137_p18979244175512"><a name="zh-cn_topic_0237121137_p18979244175512"></a><a name="zh-cn_topic_0237121137_p18979244175512"></a>当发送SQL语句到数据库时如果出现错误,则退出。默认状态下会忽略错误任务并继续执行导入,且在导入后会显示一系列错误信息。</p>
  42. </td>
  43. <td class="cellrowborder" valign="top" width="31.669999999999998%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0237121137_p12782147122820"><a name="zh-cn_topic_0237121137_p12782147122820"></a><a name="zh-cn_topic_0237121137_p12782147122820"></a>-</p>
  44. </td>
  45. </tr>
  46. <tr id="zh-cn_topic_0237121137_row057817297550"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0237121137_p1557922912557"><a name="zh-cn_topic_0237121137_p1557922912557"></a><a name="zh-cn_topic_0237121137_p1557922912557"></a>-c</p>
  47. </td>
  48. <td class="cellrowborder" valign="top" width="43.33%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0237121137_p1762611020568"><a name="zh-cn_topic_0237121137_p1762611020568"></a><a name="zh-cn_topic_0237121137_p1762611020568"></a>在重新创建数据库对象前,清理(删除)已存在于将要导入的数据库中的数据库对象。</p>
  49. </td>
  50. <td class="cellrowborder" valign="top" width="31.669999999999998%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0237121137_p55791029105515"><a name="zh-cn_topic_0237121137_p55791029105515"></a><a name="zh-cn_topic_0237121137_p55791029105515"></a>-</p>
  51. </td>
  52. </tr>
  53. <tr id="zh-cn_topic_0237121137_row1339718574716"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0237121137_p18625164815715"><a name="zh-cn_topic_0237121137_p18625164815715"></a><a name="zh-cn_topic_0237121137_p18625164815715"></a>-s</p>
  54. </td>
  55. <td class="cellrowborder" valign="top" width="43.33%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0237121137_p1962511481717"><a name="zh-cn_topic_0237121137_p1962511481717"></a><a name="zh-cn_topic_0237121137_p1962511481717"></a>只导入模式定义,不导入数据。当前的序列值也不会被导入。</p>
  56. </td>
  57. <td class="cellrowborder" valign="top" width="31.669999999999998%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0237121137_p1662514481776"><a name="zh-cn_topic_0237121137_p1662514481776"></a><a name="zh-cn_topic_0237121137_p1662514481776"></a>-</p>
  58. </td>
  59. </tr>
  60. </tbody>

其他参数说明请参见《工具参考》中“服务端工具 > gs_restore”章节。

示例

示例一:执行gs_restore,导入指定MPPDB_backup.dmp文件(自定义归档格式)中postgres数据库的数据和对象定义。

  1. gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb
  2. Password:
  3. gs_restore[2017-07-21 19:16:26]: restore operation successful
  4. gs_restore: total time: 13053 ms

示例二:执行gs_restore,导入指定MPPDB_backup.tar文件(tar归档格式)中postgres数据库的数据和对象定义。

  1. gs_restore backup/MPPDB_backup.tar -p 8000 -d backupdb
  2. gs_restore[2017-07-21 19:21:32]: restore operation successful
  3. gs_restore[2017-07-21 19:21:32]: total time: 21203 ms

示例三:执行gs_restore,导入指定MPPDB_backup目录文件(目录归档格式)中postgres数据库的数据和对象定义。

  1. gs_restore backup/MPPDB_backup -p 8000 -d backupdb
  2. gs_restore[2017-07-21 19:26:46]: restore operation successful
  3. gs_restore[2017-07-21 19:26:46]: total time: 21003 ms

示例四:执行gs_restore,将postgres数据库的所有对象的定义导入至backupdb数据库。导入前,postgres存在完整的定义和数据,导入后,backupdb数据库只存在所有对象定义,表没有数据。

  1. gs_restore /home/omm/backup/MPPDB_backup.tar -p 8000 -d backupdb -s -e -c
  2. Password:
  3. gs_restore[2017-07-21 19:46:27]: restore operation successful
  4. gs_restore[2017-07-21 19:46:27]: total time: 32993 ms

示例五:执行gs_restore,导入MPPDB_backup.dmp文件中PUBLIC模式的所有定义和数据。在导入时会先删除已经存在的对象,如果原对象存在跨模式的依赖则需手工强制干预。

  1. gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb -e -c -n PUBLIC
  2. gs_restore: [archiver (db)] Error while PROCESSING TOC:
  3. gs_restore: [archiver (db)] Error from TOC entry 313; 1259 337399 TABLE table1 gaussdba
  4. gs_restore: [archiver (db)] could not execute query: ERROR: cannot drop table table1 because other objects depend on it
  5. DETAIL: view t1.v1 depends on table table1
  6. HINT: Use DROP ... CASCADE to drop the dependent objects too.
  7. Command was: DROP TABLE public.table1;

手工删除依赖,导入完成后再重新创建。

  1. gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb -e -c -n PUBLIC
  2. gs_restore[2017-07-21 19:52:26]: restore operation successful
  3. gs_restore[2017-07-21 19:52:26]: total time: 2203 ms

示例六:执行gs_restore,导入MPPDB_backup.dmp文件中hr模式下表hr.staffs的定义。在导入之前,hr.staffs表不存在。

  1. gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb -e -c -s -n hr -t hr.staffs
  2. gs_restore[2017-07-21 19:56:29]: restore operation successful
  3. gs_restore[2017-07-21 19:56:29]: total time: 21000 ms

示例七:执行gs_restore,导入MPPDB_backup.dmp文件中hr模式下表hr.staffs的数据。在导入之前,hr.staffs表不存在数据。

  1. gs_restore backup/MPPDB_backup.dmp -p 8000 -d backupdb -e -a -n hr -t hr.staffs
  2. gs_restore[2017-07-21 20:12:32]: restore operation successful
  3. gs_restore[2017-07-21 20:12:32]: total time: 20203 ms

示例八:执行gs_restore,导入指定表hr.staffs的定义。在导入之前,hr.staffs表的数据是存在的。

  1. human_resource=# select * from hr.staffs;
  2. staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id
  3. ----------+-------------+-------------+----------+--------------------+---------------------+---------------+----------+----------------+------------+------------
  4. 200 | Jennifer | Whalen | JWHALEN | 515.123.4444 | 1987-09-17 00:00:00 | AD_ASST | 4400.00 | | 101 | 10
  5. 201 | Michael | Hartstein | MHARTSTE | 515.123.5555 | 1996-02-17 00:00:00 | MK_MAN | 13000.00 | | 100 | 20
  6. gsql -d human_resource -p 8000
  7. gsql ((openGauss x.x.x build 290d125f) compiled at 2020-12-08 02:59:43 commit 2143 last mr 131
  8. Non-SSL connection (SSL connection is recommended when requiring high-security)
  9. Type "help" for help.
  10. human_resource=# drop table hr.staffs CASCADE;
  11. NOTICE: drop cascades to view hr.staff_details_view
  12. DROP TABLE
  13. gs_restore -W Bigdata@123 /home/omm/backup/MPPDB_backup.tar -p 8000 -d human_resource -n hr -t staffs -s -e
  14. restore operation successful
  15. total time: 904 ms
  16. human_resource=# select * from hr.staffs;
  17. staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id
  18. ----------+------------+-----------+-------+--------------+-----------+---------------+--------+----------------+------------+------------
  19. (0 rows)

示例九:执行gs_restore,导入staffs和areas两个指定表的定义和数据。在导入之前,staffs和areas表不存在。

  1. human_resource=# \d
  2. List of relations
  3. Schema | Name | Type | Owner | Storage
  4. --------+--------------------+-------+----------+----------------------------------
  5. hr | employment_history | table | omm | {orientation=row,compression=no}
  6. hr | employments | table | omm | {orientation=row,compression=no}
  7. hr | places | table | omm | {orientation=row,compression=no}
  8. hr | sections | table | omm | {orientation=row,compression=no}
  9. hr | states | table | omm | {orientation=row,compression=no}
  10. (5 rows)
  11. gs_restore -W Bigdata@123 /home/gaussdb/backup/MPPDB_backup.tar -p 8000 -d human_resource -n hr -t staffs -n hr -t areas
  12. restore operation successful
  13. total time: 724 ms
  14. human_resource=# \d
  15. List of relations
  16. Schema | Name | Type | Owner | Storage
  17. --------+--------------------+-------+----------+----------------------------------
  18. hr | areas | table | omm | {orientation=row,compression=no}
  19. hr | employment_history | table | omm | {orientation=row,compression=no}
  20. hr | employments | table | omm | {orientation=row,compression=no}
  21. hr | places | table | omm | {orientation=row,compression=no}
  22. hr | sections | table | omm | {orientation=row,compression=no}
  23. hr | staffs | table | omm | {orientation=row,compression=no}
  24. hr | states | table | omm | {orientation=row,compression=no}
  25. (7 rows)
  26. human_resource=# select * from hr.areas;
  27. area_id | area_name
  28. ---------+------------------------
  29. 4 | Middle East and Africa
  30. 1 | Europe
  31. 2 | Americas
  32. 3 | Asia
  33. (4 rows)

示例十:执行gs_restore,导入hr的模式,包含模式下的所有对象定义和数据。

  1. gs_restore -W Bigdata@123 /home/omm/backup/MPPDB_backup1.sql -p 8000 -d backupdb -n hr -e -c
  2. restore operation successful
  3. total time: 702 ms

示例十一:执行gs_restore,同时导入hr和hr1两个模式,仅导入模式下的所有对象定义。

  1. gs_restore -W Bigdata@123 /home/omm/backup/MPPDB_backup2.dmp -p 8000 -d backupdb -n hr -n hr1 -s
  2. restore operation successful
  3. total time: 665 ms

示例十二:用户user1不具备将导出文件中数据导入至数据库backupdb的权限,而角色role1具备该权限,要实现将文件数据导入数据库backupdb,可以在导出命令中设置—role角色为role1,使用role1的权限,完成导出目的。

  1. human_resource=# CREATE USER user1 IDENTIFIED BY "1234@abc";
  2. CREATE ROLE
  3. gs_restore -U user1 -W 1234@abc /home/omm/backup/MPPDB_backup.tar -p 8000 -d backupdb --role role1 --rolepassword abc@1234
  4. restore operation successful
  5. total time: 554 ms
  6. gsql -d backupdb -p 8000 -r
  7. gsql ((openGauss x.x.x build 290d125f) compiled at 2020-12-08 02:59:43 commit 2143 last mr 131
  8. Non-SSL connection (SSL connection is recommended when requiring high-security)
  9. Type "help" for help.
  10. backupdb=# select * from hr.areas;
  11. area_id | area_name
  12. ---------+------------------------
  13. 4 | Middle East and Africa
  14. 1 | Europe
  15. 2 | Americas
  16. 3 | Asia
  17. (4 rows)