openGauss資料庫將磁碟錶轉換為MOT

openGaussbaby發表於2024-04-01

openGauss 資料庫將磁碟錶轉換為 MOT
一、將磁碟錶轉換為 MOT 方法

磁碟表直接轉換為 MOT 尚不能實現,這意味著尚不存在將基於磁碟的錶轉換為 MOT 的 ALTER TABLE 語句。目前 MOT 表也不支援 rename,create as select 以及 insert select(普通表)的操作。將基於磁碟的錶轉換為 MOT 方法,可以使用 gs_dump 工具匯出資料,再使用 gs_restore 工具匯入資料的方法。

步驟如下: 1.暫停應用程式活動。 2.使用 gs_dump 工具將表資料轉儲到磁碟的物理檔案中。請確保使用 data only。 3.重新命名原始基於磁碟的表。 4.建立同名同模式的 MOT。 5.使用 gs_restore 將磁碟檔案的資料載入/恢復到資料庫表中。 6.瀏覽或手動驗證所有原始資料是否正確匯入到新的 MOT 中。 7.恢復應用程式活動。

二、操作示例:將表 enmo.customer_t1 轉換為 MOT 表

1.確認 MOT 表支援表 customer_t1 所有列的資料型別

enmo=> \d
List of relations
Schema | Name | Type | Owner | Storage
--------+--------------+-------+-------+----------------------------------
enmo | all_data | table | enmo | {orientation=row,compression=no}
enmo | customer_t1 | table | enmo | {orientation=row,compression=no}
enmo | cux_setting | table | enmo | {orientation=row,compression=no}
enmo | data_studio1 | table | enmo | {orientation=row,compression=no}
enmo | table2 | table | enmo | {orientation=row,compression=no}
public | table1 | table | enmo | {orientation=row,compression=no}
(6 rows)

enmo=> \d+ customer_t1
Table "enmo.customer_t1"
Column | Type | Modifiers | Storage | Stats target | Description
-----------------+-----------------------+-----------+----------+--------------+-------------
c_customer_sk | integer | | plain | |
c_customer_name | character varying(32) | | extended | |
Has OIDs: no
Options: orientation=row, compression=no

enmo=>
2.暫停表 customer_t1 相關的應用程式操作後,使用 gs_dump 命令匯出表資料(僅資料):

$ gs_dump -U enmo -h ... -p 15400 enmo -a --table customer_t1 -F c -f /home/omm/dump/customer_t1_data_only.bak
Password:
gs_dump[port='15400'][enmo][2021-03-28 10:11:42]: dump database enmo successfully
gs_dump[port='15400'][enmo][2021-03-28 10:11:42]: total time: 8732 ms
3.重新命名原表 customer_t1 為 customer

enmo=> alter table customer_t1 rename to customer;
ALTER TABLE
4.建立與原表相同資料格式的 MOT 表 customer_t1

--首先給enmo用於賦予建立和訪問MOT(DDL、DML、SELECT)許可權:
enmo=> GRANT USAGE ON FOREIGN SERVER mot_server TO enmo;
GRANT
--建立外部表
enmo=> CREATE foreign TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));
CREATE FOREIGN TABLE
Time: 9.408 ms
enmo=> \d+
List of relations
Schema | Name | Type | Owner | Size | Storage | Description
--------+--------------+---------------+-------+------------+----------------------------------+-------------
enmo | all_data | table | enmo | 8192 bytes | {orientation=row,compression=no} |
enmo | customer | table | enmo | 8192 bytes | {orientation=row,compression=no} |
enmo | customer_t1 | foreign table | enmo | 16 kB | |
enmo | cux_setting | table | enmo | 160 kB | {orientation=row,compression=no} |
enmo | data_studio1 | table | enmo | 8192 bytes | {orientation=row,compression=no} |
enmo | table2 | table | enmo | 8192 bytes | {orientation=row,compression=no} |
public | table1 | table | enmo | 8192 bytes | {orientation=row,compression=no} |
(7 rows)

enmo=> \d+ customer_t1
Foreign table "enmo.customer_t1"
Column | Type | Modifiers | FDW Options | Storage | Stats target | Description
-----------------+-----------------------+-----------+-------------+----------+--------------+-------------
c_customer_sk | integer | | | plain | |
c_customer_name | character varying(32) | | | extended | |
Server: mot_server
FDW permition: read/write
Has OIDs: no

enmo=> select * from customer_t1;
c_customer_sk | c_customer_name
---------------+-----------------
(0 rows)

Time: 0.782 ms
enmo=>
5.使用 gs_restore 將磁碟檔案的資料載入/恢復到資料庫表中

$ gs_restore -U enmo -h ... -p 15400 -d enmo /home/omm/dump/customer_t1_data_only.bak
Password:
start restore operation ...
table customer_t1 complete data imported !
Finish reading 3 SQL statements!
end restore operation ...
restore operation successful
total time: 3697 ms
6.瀏覽或手動驗證所有原始資料是否正確匯入到新的 MOT 中

enmo=> select * from customer_t1;
c_customer_sk | c_customer_name
---------------+-----------------
0 | data 0
2 | data 2
1 | new Data
(3 rows)

Time: 0.587 ms
enmo=>

相關文章