openGauss数据库内存优化表MOT实践-磁盘表转换为MOT表

举报
Gauss松鼠会小助手 发表于 2024/12/23 15:24:21 2024/12/23
【摘要】 本篇主要介绍怎么把普通的表转换为MOT表。磁盘表直接转换为MOT尚不能实现,这意味着尚不存在将基于磁盘的表转换为MOT的ALTER TABLE语句。 下面介绍如何手动将基于磁盘的表转换为MOT,如何使用gs_dump工具导出数据,以及如何使用gs_restore工具导入数据。

本文作者: 二两烧麦

前言

篇主要介绍怎么把普通的表转换为MOT表。

磁盘表直接转换为MOT尚不能实现,这意味着尚不存在将基于磁盘的表转换为MOT的ALTER TABLE语句。

下面介绍如何手动将基于磁盘的表转换为MOT,如何使用gs_dump工具导出数据,以及如何使用gs_restore工具导入数据。

一、前置条件

  • 检查待转换为MOT的磁盘表的模式是否包含所有需要的列。

  • 检查架构是否包含任何不支持的列数据类型,具体参见“不支持的数据类型”章节。

  • 如果不支持特定列,则建议首先创建一个更新了模式的备磁盘表。此模式与原始表相同,只是所有不支持的类型都已转换为支持的类型。

二、转换步骤介绍

要将基于磁盘的表转换为MOT,请执行以下步骤:

  1. 暂停应用程序活动。

  2. 使用gs_dump工具将表数据转储到磁盘的物理文件中。请确保使用data only。

  3. 重命名原始基于磁盘的表。

  4. 创建同名同模式的MOT。请确保使用创建FOREIGN关键字指定该表为MOT。

  5. 使用gs_restore将磁盘文件的数据加载/恢复到数据库表中。

  6. 浏览或手动验证所有原始数据是否正确导入到新的MOT中。

  7. 恢复应用程序活动。

须知:
由于表名称保持不变,应用程序查询和相关数据库存储过程将能够无缝访问新的MOT,而无需更改代码。另一种方法是通过INSERT INTO SELECT语句将数据从普通(堆)表复制到新的MOT表。
INSERT INTO [MOT_table] SELECT * FROM [PG_table] WHERE condition;
此方法受MOT事务大小限制,小于1GB。

三、开始转换实践

假设要将数据库benchmarksql中一个基于磁盘的表customer迁移到MOT中。

将customer表迁移到MOT,操作步骤如下:

1、创建测试表并插入数据

  • 创建表

CREATE TABLE customer
(
    c_customer_sk             integer,
    c_customer_id             char(5),
    c_first_name              char(6),
    c_last_name               char(8),
    Amount                    integer
);

图片

  • 插入数据

INSERT INTO customer(c_customer_sk, c_customer_id, c_first_name,Amount) VALUES (3769, 'hello', 'Grace', 1000);
INSERT INTO customer (c_customer_sk, c_first_name) VALUES (3769, 'Grace');
INSERT INTO customer (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT);
INSERT INTO customer (c_customer_sk, c_customer_id, c_first_name,Amount) VALUES 
    (6885, 'maps', 'Joes',2200),
    (4321, 'tpcds', 'Lily',3000),
    (9527, 'world', 'James',5000);

图片

2、检查测试表列类型。

验证MOT支持所有类型,详情请参阅附录:不支持的数据类型。

openGauss=# \d+ customer
                             Table "public.customer"
    Column     |     Type     | Modifiers | Storage  | Stats target | Description
---------------+--------------+-----------+----------+--------------+-------------
 c_customer_sk | integer      |           | plain    |              |
 c_customer_id | character(5) |           | extended |              |
 c_first_name  | character(6) |           | extended |              |
 c_last_name   | character(8) |           | extended |              |
 amount        | integer      |           | plain    |              |
Has OIDs: no
Options: orientation=row, compression=no

openGauss=#

图片

3、请检查测试表数据。

openGauss=#  select * from customer;
 c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------
          3769 | hello         | Grace        |             |   1000
          3769 |               | Grace        |             |
          3769 | hello         |              |             |
          6885 | maps          | Joes         |             |   2200
          4321 | tpcds         | Lily         |             |   3000
          9527 | world         | James        |             |   5000
(6 rows)

图片

4、使用gs_dump转储表数据。

 [omm@master01 ~]$ gs_dump -Fc postgres -a --table customer -f customer.dump -p 15000
gs_dump[port='15000'][postgres][2024-11-08 09:26:28]: Begin scanning database.
Progress: [==================================================] 100% (38/37, cur_step/total_step). finish scanning database
gs_dump[port='15000'][postgres][2024-11-08 09:26:29]: Finish scanning database.
gs_dump[port='15000'][postgres][2024-11-08 09:26:29]: Start dumping objects
Progress: [==================================================] 100% (3974/3974, dumpObjNums/totalObjNums). dump objects
gs_dump[port='15000'][postgres][2024-11-08 09:26:29]: Finish dumping objects
gs_dump[port='15000'][postgres][2024-11-08 09:26:29]: dump database postgres successfully
gs_dump[port='15000'][postgres][2024-11-08 09:26:29]: total time: 487  ms

图片

5、重命名测试表。

openGauss=# alter table customer rename to customer_bk;
ALTER TABLE

图片

6、创建与测试表完全相同的MOT。

openGauss=# CREATE foreign TABLE customer
(
    c_customer_sk             integer,
    c_customer_id             char(5),
    c_first_name              char(6),
    c_last_name               char(8),
    Amount                    integer
);openGauss-# openGauss(# openGauss(# openGauss(# openGauss(# openGauss(# openGauss(#
CREATE FOREIGN TABLE

图片

7、将测试转储数据导入到新MOT中。

[omm@master01 ~]$ gs_restore -C -d postgres customer.dump -p 15000
start restore operation ...
Progress: [==================================================] 100% (3/3, restored_entries/total_entries). restore entires
end restore operation ...
restore operation successful
total time: 68  ms

查询数据

openGauss=# select * from customer;
 c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------
          3769 | hello         | Grace        |             |   1000
          3769 |               | Grace        |             |
          3769 | hello         |              |             |
          6885 | maps          | Joes         |             |   2200
          4321 | tpcds         | Lily         |             |   3000
          9527 | world         | James        |             |   5000
(6 rows)

openGauss=# \d
                                List of relations
 Schema |     Name     |     Type      | Owner |             Storage
--------+--------------+---------------+-------+----------------------------------
 public | bmsql_oorder | foreign table | omm   |
 public | customer     | foreign table | omm   |
 public | customer_bk  | table         | omm   | {orientation=row,compression=no}
 public | test         | foreign table | omm   |
(4 rows)

图片

四、使用INSERT方式转换

  • 通过INSERT INTO SELECT语句将数据从普通(堆)表复制到新的MOT表。

INSERT INTO [MOT_table] SELECT * FROM [PG_table] WHERE condition;

此方法受MOT事务大小限制,小于1GB。

1、创建MOT表customer_bk01

openGauss=# CREATE foreign TABLE customer_bk01
(
    c_customer_sk             integer,
    c_customer_id             char(5),
    c_first_name              char(6),
    c_last_name               char(8),
    Amount                    integer
);openGauss-# openGauss(# openGauss(# openGauss(# openGauss(# openGauss(# openGauss(#
CREATE FOREIGN TABLE
openGauss=#

图片

2、使用INSERT转换

openGauss=# INSERT INTO customer_bk01 SELECT * FROM customer_bk ;
INSERT 0 6
openGauss=#
  • 查询表customer_bk01的数据

openGauss=# select * from customer_bk01;
 c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------
          3769 | hello         | Grace        |             |   1000
          3769 |               | Grace        |             |
          3769 | hello         |              |             |
          6885 | maps          | Joes         |             |   2200
          4321 | tpcds         | Lily         |             |   3000
          9527 | world         | James        |             |   5000
(6 rows)

openGauss=# \d
                                 List of relations
 Schema |     Name      |     Type      | Owner |             Storage
--------+---------------+---------------+-------+----------------------------------
 public | bmsql_oorder  | foreign table | omm   |
 public | customer      | foreign table | omm   |
 public | customer_bk   | table         | omm   | {orientation=row,compression=no}
 public | customer_bk01 | foreign table | omm   |
 public | test          | foreign table | omm   |
(5 rows)

图片

附录:不支持的数据类型

UUID
User-Defined Type (UDF)
Array data type
NVARCHAR2(n)
Clob
Name
Blob
Raw
Path
Circle
Reltime
Bit varying(10)
Tsvector
Tsquery
JSON
Box
Text
Line
Point
LSEG
POLYGON
INET
CIDR
MACADDR
Smalldatetime
BYTEA
Bit
Varbit
OID
Money
无限制的varchar/character varying
HSTORE

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。