轉:MySQL到Greenplum遷移分析

MySQL到Greenplum遷移分析

轉:http://www.pldba.com/?p=91sql

1 數據類型對比

  MySQL PostgreSQL comments
數值類型 TINYINT SMALLINT gp中無zerofill屬性及unsigned類型,因此爲了數據不越界需使用大一精度的數據類型匹配
SMALLINT SMALLINT
MEDIUMINT INTEGER
INT|INTEGER INTEGER
BIGINT BIGINT
TINYINT UNSIGNED SMALLINT
SMALLINT UNSIGNED INTEGER
MEDIUMINT UNSIGNED INTEGER
INT UNSIGNED BIGINT
BIGINT UNSIGNED NUMERIC(20)
BIT BIT
FLOAT REAL
FLOAT UNSIGNED DOUBLE PRECISION
DOUBLE|REAL|DOUBLE PRECISION DOUBLE PRECISION
DECIMAL|DEC|NUMERIC|FIXED NUMERIC
字符類型 CHAR CHARACTER|CHAR  
VARCHAR CHARACTER VARYING|VARCHAR  
TINYTEXT TEXT  
TEXT TEXT  
MEDIUMTEXT TEXT  
LONGTEXT TEXT  
BINARY|CHAR BYTE BYTEA  
VARBINARY BYTEA  
TINYBLOB BYTEA  
BLOB BYTEA  
MEDIUMBLOB BYTEA  
LONGBLOB BYTEA  
時間類型 DATE DATE  
TIME TIME  
YEAR  
DATETIME TIMESTAMP  
TIMESTAMP TIMESTAMP  
其餘類型 BOOL|BOOLEAN BOOLEAN  
ENUM CREATE TYPE … AS ENUM  
SET  

2 語法對比

2.1 limit

MySQL:函數

LIMIT offset, limit

orspa

Greenplum:日誌

2.2 replace

MySQL:code

REPLACE [INTO] tbl_name [(col_name,...)]

    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

Greenplum:orm

不支持該語法,須要使用函數實現,例:blog

CREATE FUNCTION replace() RETURNS void AS $$
BEGIN
        IF EXISTS( SELECT * FROM phonebook WHERE name = 'john doe' ) THEN
                UPDATE phonebook
                SET extension = '1234' WHERE name = 'john doe';
        ELSE
                INSERT INTO phonebook VALUES( 'john doe', '1234' );
        END IF;
        RETURN;
END;
$$ LANGUAGE plpgsql;

2.3 insert into … on duplicate key update

MySQL:seo

INSERT [INTO] tbl_name [(col_name,...)]

    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

    [ ON DUPLICATE KEY UPDATE

      col_name=expr

        [, col_name=expr] ... ]

Greenplum:rem

不支持該語法,須要使用函數實現,例:字符串

CREATE FUNCTION replace() RETURNS void AS $$
BEGIN
        IF EXISTS( SELECT * FROM phonebook WHERE name = 'john doe' ) THEN
                UPDATE phonebook
                SET extension = '1234' WHERE name = 'john doe';
        ELSE

                INSERT INTO phonebook VALUES( 'john doe', '1234' );
        END IF;
        RETURN;
END;
$$ LANGUAGE plpgsql;

2.4 select … into outfile

MySQL:

Greenplum:

2.5 自增列

MySQL:

列加auto_increment屬性,例:create table a(id int auto_increment primary key)

獲取當前值:select last_insert_id()

 

Greenplum:

字段類型使用serial,例:create table a(id serial primary key)

獲取當前值:select currval(‘a_id_seq’)

2.6 註釋

MySQL:

使用#或–

Greenplum:

使用–

2.7 執行存儲過程

MySQL:

Greenplum:

Greenplum並沒有存儲過程,使用函數代替,因此執行:

3 經常使用函數對比

3.1 時間函數

3.1.1 時間轉字符串

MySQL:date_format()

例:select date_format(now(),’%Y%m%d%H%i%s’)

Greenplum:to_char()

例:select to_char(now(), ‘YYYYMMDDHH24MISS’)

3.1.2 字符串轉時間

MySQL:str_to_date()

例:select str_to_date(‘20171120′,’%Y%m%d%H%i%s’)

Greenplum:to_date(),to_timestamp()

例:select to_date(‘20171120’, ‘YYYYMMDD’)

select to_date(‘20171120’, ‘YYYYMMDDHH24MISS’)

3.1.3 時間計算

MySQL:date_add()

例:select date_add(now(), interval 2 day)

Greenplum:直接計算

例:select now() + interval ‘2 day’

3.2 字符函數

3.2.1 空字符串處理

MySQL:ifnull

例:select ifnull(null,‘default’)

Greenplum:coalesce

例:select coalesce(null,‘default’)

3.2.2 字符串拼接

MySQL:concat()

例:select concat(‘abc’,‘def’)

Greenplum:||

例:select ‘abc’||’def’

4 數據遷移

Greenplum數據導入3種方式:

4.1 COPY命令

COPY須要通過master,僅建議在小數據量時使用。沒法並行導入,在大量數據導入時效率很低,不過多介紹。

例:COPY tablea FROM ‘/data/tablea_data’;

4.2 使用外部表

外部表以及4.3中的gpload都須要使用gpfdist服務。

gpfdist是Greenplum自帶的一個並行文件服務,原理以下圖:

gpfdist爲每一個segment提供並行讀寫數據文件的服務。

 

一、先啓動gpfdist服務,例:

-d 指定數據目錄 -p指定服務端口 -l 指定日誌文件

將數據文件放入該目錄下

二、建立外部表,例:

    從外部表導入數據,例:

create table t as select * from a;

或者先建立,後導入:

 

4.3 gpload

經過配置yaml控制文件來進行數據導入,一樣

依賴gpfdist服務。

例:

一、編輯a.yml文件

二、進行導入:

相關文章
相關標籤/搜索