将mysql数据导入gp
本文记录的方法,可能并不高明。思路有很多中,可以自己写php脚本,先将mysql的数据吐出csv格式,或者直接php脚本连两个都行。另外,听人说好像有个工具,可以同时连mysql跟gp,这样可以直接dump过来。没有研究过,先暂时用自己的笨办法,反正数据量也并不是太多。
开头
其实,真是感谢这些前人的工作,让像我这样的普通人,也能操作大数据,然后将复杂的工作隐藏在幕后,只需要编写简单的sql,就能在海量的数据中筛选出自己需要的数据。
导入的过程记录
# 找个mysql容器,直接利用 mysql、mysqldump这些客户端 注意,直接bash,不用起数据库
docker run --rm -it -v $PWD:/mywork -w /mywork mysql:5.7.23 bash
# 容器内操作
# 客户端,可以查看有哪些表
mysql -h 10.131.31.11 -P 3402 -u root -pmypasswd
# 导出表的sql
mysqldump -h 10.131.31.11 -P 3402 -u ladp -pmypasswd --skip-lock-tables ydserver gs > gs.sql
mysqldump -h 10.131.31.11 -P 3402 -u ladp -pmypasswd --skip-lock-tables ydserver county > county.sql
mysqldump -h 10.131.31.11 -P 3402 -u ladp -pmypasswd --skip-lock-tables ydserver city > city.sql
mysqldump -h 10.131.31.11 -P 3402 -u ladp -pmypasswd --skip-lock-tables ydserver wdzzz_cw > wdzzz_cw.sql
# mysql的sql跟 gp还是有区别的,去除差异
sed -n '1,/LOCK TABLES/p' gs.sql > gs.sql
sed -i '1,/LOCK TABLES/d' gs.sql
sed -i 's/`gs`/gs/g' gs.sql
sed -i '/UNLOCK TABLES/d' gs.sql
sed -n '1,/LOCK TABLES/p' county.sql > county_table.sql
sed -i '1,/LOCK TABLES/d' county.sql
sed -i 's/`county`/county/g' county.sql
sed -i '/UNLOCK TABLES/d' county.sql
sed -n '1,/LOCK TABLES/p' city.sql > city_table.sql
sed -i '1,/LOCK TABLES/d' city.sql
sed -i 's/`city`/city/g' city.sql
sed -i '/UNLOCK TABLES/d' city.sql
sed -n '1,/LOCK TABLES/p' wdzzz_cw.sql > wdzzz_cw_table.sql
sed -i '1,/LOCK TABLES/d' wdzzz_cw.sql
sed -i 's/`wdzzz_cw`/wdzzz_cw/g' wdzzz_cw.sql
sed -i '/UNLOCK TABLES/d' wdzzz_cw.sql
# 先在gp上建立表结构
# 使用自己写的mysql结构转换到gp的工具
# 导表
psql -d develop -h localhost -U gpadmin -p 5432 -f gs.sql
psql -d develop -h localhost -U gpadmin -p 5432 -f county.sql
psql -d develop -h localhost -U gpadmin -p 5432 -f city.sql
psql -d develop -h localhost -U gpadmin -p 5432 -f wdzzz_cw.sql
实际上,我需要的是,联表的处理结果,执行下面:
DROP TABLE IF EXISTS branch;
CREATE TABLE branch WITH (
APPENDONLY = TRUE,
COMPRESSLEVEL = 5,
ORIENTATION = COLUMN,
COMPRESSTYPE = ZLIB
) AS
SELECT
bm, -- 网点编码
mc, -- 网点名称
szd, -- 区
county.CityID as city_id, -- 市
city.ProvinceID as province_id, -- 省
sjdw,-- 上级公司id
wdzzz_cw.zzz -- 上级分拨id
FROM
gs
LEFT JOIN county ON gs.szd = county.CountyID
LEFT JOIN city ON county.CityID = city.CityID
LEFT JOIN wdzzz_cw ON gs.bm = wdzzz_cw.wdbm
--# 果然,到官网瞬间能找到正确的用法。
--# https://gpdb.docs.pivotal.io/6-17/ref_guide/sql_commands/CREATE_TABLE_AS.html
DISTRIBUTED BY (bm) ;
备注
导出的数据,最大大概有10M左右,导出瞬间完成,导入也快,但是略慢一点。可能是因为机器比较好。
mysql导出sql很快,250万记录,10秒以内完成导入。但是,导出的sql并不能直接用,需要先转换,主要是去掉多余的LOCK TABLES、去掉多余的符号等。然后gp,导入sql,平均每秒1万条左右。对余大批量的数据,确实有点慢。
对比,采用csv,使用php简单的写个代码,导出csv,然后批量导入csv,速度提升更快。如果换成gpload等工具加载,速度会更快。
其他
导表报错问题:
使用 --skip-lock-tables来避免锁表。
mysqldump -h 10.131.31.11 -P 3402 -u ladp -pmypasswd --skip-lock-tables ydserver gs > gs.sql
如果是启动数据库,则可以这么干,但是这次,毕竟只是用一下里面的mysql连接工具而已。
docker run --rm -it -v $PWD:/mywork -w /mywork -e MYSQL_ROOT_PASSWORD=adhjsfljkdashjflasdj 10.131.9.12:5000/docker.io/mysql:5.7.23