公司有个项目需要把原来的MySQL 数据库 换成 Postgre数据库,做一下记录。
环境介绍
服务操作系统是Centos7,数据库的版本是Postgesql10
使用过程
在使用mysql数据库时,使用的是kitchen工具链接两端数据,进行数据同步。
换到postgre数据库,决定不在使用kitchen工具,转成使用数据库自带的一些功能实现
抽取外部数据使用dblink和extension
1. 使用dblink:
切换到centos用户postgres,执行: psql
[root@Test ~]# su postgres
[postgres@Test root]$ psql
could not change directory to “/root”: Permission denied
psql (10.7)
Type “help” for help.
postgres=#
创建dblink
postgres=# create extension dblink;
CREATE EXTENSION
postgres=# select dblink_connect(‘dblink_201’,‘dbname=dlprd host=10.199.13.201 port=5432 user=***** password=******’);
dblink_connect
OK(1row)
select * from dblink(‘dblink_201’,‘select name1,bismt from spo.v_sap_spo_ekko2 where bismt=’‘5.1113.0398’’’) as t1 (name1 varchar(255),bismt varchar(255));
每次使用dblink查询比较麻烦,可以创建视图:
postgres=# create or replace view z_material_view_sap_source as select * from dblink(‘dblink_201’,‘select bismt,matnr,maktx,mstae,mtstb,pp,laeda,gg,meins,bstme from spo.v_sap_spo_mara’) as t1 (bismt varchar(255),matnr varchar(64),maktx varchar(255),mstae varchar(64),mtstb varchar(64),pp varchar(32),laeda varchar(32),gg varchar(32),meins varchar(32),bstme varchar(32));
根据视图创建物化视图,物化视图的增量更新
postgres=# create materialized view z_mv_material as select * from z_material_view_sap_source with no data;
postgres=# refresh materialized view z_mv_material with data;
创建唯一索引
postgres=# create unique index idx_mv_material on z_mv_material(matnr);
刷新物化视图
postgres=# refresh materialized view concurrently z_mv_material with data;
增量刷新能否刷新判断的是物化视图上有没有唯一索引,并不关注基表上有没有唯一索引
2. 使用extension:
postgres=# create extension postgres_fdw;
CREATE EXTENSION
创建server
postgres=# create server pg_201 foreign data wrapper postgres_fdw options(hostaddr ‘192.168.100.154’, dbname ‘postgres’, port ‘5432’);
CREATE SERVER
创建user mapping
postgres=# create user mapping for postgres server pg154 options(user ‘postgres’, password ‘postgres’);
CREATE USER MAPPING
创建外部表
postgres=# create foreign table ft_userinfo(id int, info text, crt_time timestamp) server pg154 options(schema_name ‘public’, table_name ‘userinfo’);
CREATE FOREIGN TABLE
修改外部表
postgres=# alter foreign table tab_area options(set null ‘^null*’);
ALTER FOREIGN TABLE