MySQL到Greenplum迁移分析
MySQL到Greenplum迁移分析
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:
|
1
|
LIMIT offset, limit
|
or
|
1
|
LIMIT limit OFFSET offset
|
Greenplum:
|
1
|
LIMIT limit OFFSET offset
|
2.2 replace
MySQL:
|
1
2
3
|
REPLACE [INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
|
Greenplum:
不支持该语法,需要使用函数实现,例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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:
|
1
2
3
4
5
6
7
8
9
|
INSERT [INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
|
Greenplum:
不支持该语法,需要使用函数实现,例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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:
|
1
2
3
|
SELECT ...
INTO OUTFILE 'path/file_name'
|
Greenplum:
|
1
2
3
|
COPY ( SELECT ... )
TO 'path/file_name'
|
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:
|
1
|
call proc_name()
|
Greenplum:
Greenplum并无存储过程,使用函数代替,所以执行:
|
1
|
select proc_name()
|
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提供并行读写数据文件的服务。
1、先启动gpfdist服务,例:
|
1
|
gpfdist -d /data0/data -p 8123 -l /home/greenplum/gpfdist.log &
|
-d 指定数据目录 -p指定服务端口 -l 指定日志文件
将数据文件放入该目录下
2、创建外部表,例:
|
1
|
create external table lzk.a(a int,b varchar(50)) location (‘gpfdist:localhost:8123/a.txt’) fromat ‘text’(delimiter ‘,’)
|
- 从外部表导入数据,例:
|
1
|
create table t as select * from a;
|
或者先创建,后导入:
|
1
2
3
|
create table t (a int,b varchar(50)) distributed by (a);
insert into t select * from a;
|
4.3 gpload
通过配置yaml控制文件来进行数据导入,同样依赖gpfdist服务。
例:
1、编辑a.yml文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
VERSION: 1.0.0.1
DATABASE: lzk
USER: greenplum
HOST: localhost
PORT: 5432
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- localhost
PORT: 8234
FILE:
- /data0/data/a.txt
- COLUMNS:
- a: integer
- b: text
- FORMAT: text
- DELIMITER: ','
- ERROR_LIMIT: 25
- LOG_ERRORS: true
OUTPUT:
- TABLE: public.a
- MODE: INSERT
|
2、进行导入:
|
1
|
gpload -f a.yml -l a.log
|
MySQL到Greenplum迁移分析的更多相关文章
- MySQL监控、性能分析——工具篇
https://blog.csdn.net/leamonjxl/article/details/6431444 MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性 ...
- MySQL监控、性能分析——工具篇(转载)
MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预 ...
- 从MySQL 5.5迁移到Mariadb 10.1.14
从MySQL 5.5迁移到Mariadb 10.1.14 迁移计划如下: 1.备份MySQL 5.5的数据库,对指定库进行备份. 2.还原到Mariadb,然后建立复制. 3.然后就可以愿意啥时候切换 ...
- MySQL 慢查询日志分析及可视化结果
MySQL 慢查询日志分析及可视化结果 MySQL 慢查询日志分析 pt-query-digest分析慢查询日志 pt-query-digest --report slow.log 报告最近半个小时的 ...
- Mysql 死锁的详细分析方法
用数据库的时候,偶尔会出现死锁,针对我们的业务系统,出现死锁的直接结果就是系统卡顿.客户找事儿,所以我们也在想尽全力的消除掉数据库的死锁.出现死锁的时候,如果只是想解锁,用show full proc ...
- [转载]mysql慢日志文件分析处理
原文地址:mysql慢日志文件分析处理作者:maxyicha mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysq ...
- Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...
- 重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化
重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化 一:Mysql原理与慢查询 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...
- MySQL InnoDB MVCC深度分析
关于MySQL的InnoDB的MVCC原理,很多朋友都能说个大概: 每行记录都含有两个隐藏列,分别是记录的创建时间与删除时间 每次开启事务都会产生一个全局自增ID 在RR隔离级别下 INSERT -& ...
随机推荐
- 微信WeixinJSBridge的接口使用
以下都要包含weixinApi.js(见底部git里的js文件) 1).分享 WeixinApi.ready(function(Api) { // 微信分享的数据 var wxData = { &qu ...
- 【LOJ】#2114. 「HNOI2015」菜肴制作
题解 把所有边反向 从小到大枚举每个点,把每个点能到达的点挑出来,判完无解后显然是一个DAG,然后在上面求一个编号最大的拓扑序,把这些点全部标记为已选,把每次求得的拓扑序倒序输出 代码 #includ ...
- 【LOJ】#2077. 「JSOI2016」飞机调度
题解 考虑一架飞机飞完自己之后还能飞到哪些航线,用floyd求两点最短路 这个图建出来是个DAG,求最小路径覆盖即可,二分图匹配 注意判断时是航班的起飞时刻+直飞时间+加油时间+最短路时间 代码 #i ...
- 【Java】 大话数据结构(10) 查找算法(1)(顺序、二分、插值、斐波那契查找)
本文根据<大话数据结构>一书,实现了Java版的顺序查找.折半查找.插值查找.斐波那契查找. 注:为与书一致,记录均从下标为1开始. 顺序表查找 顺序查找 顺序查找(Sequential ...
- JSP中的Java代码和内置对象
一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...
- NOIP练习赛题目1
有些题目可能没做,如计算几何.恶心模拟. 高级打字机 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 早苗入手了最新的高级打字机 ...
- HDU 5744 Keep On Movin 贪心
Keep On Movin 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5744 Description Professor Zhang has k ...
- spring-boot parent变更为依赖方式
原parent继承方式 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...
- [原创]用Charles模拟App各种网络带宽测试介绍
[原创]用Charles模拟App各种网络带宽测试介绍 相信每个测试在进行自己公司App测试时,都会碰到一个问题,如何去模拟各种App在各种带宽下的测试情况,估计很少有公司直接去采用2g/3g/4g卡 ...
- IBDAP-CMSIS-DAP
IBDAP-CMSIS-DAP Armstart's CMSIS-DAP firmware implementation in gcc and makefile. http://www.armstar ...