只编译x86_ubuntu|编译安装mysql2pgsql

b6bd1c2490ed82d07b0374c2b45a81a6.gif

介绍

        dbsync 项目目标是围绕 PostgreSQL Greenplum ,实现易用的数据的互迁功能。

        官方地址:

        https://github.com/aliyun/rds_dbsync

        提供mysql2pgsql和pgsql2pgsql两个工具.

        不过竟然只提供了Centos版或者说rpm版.而我司服务器清一色ubuntu,不能因为这个工具,存在一个异类吧?于是开启了这趟不大顺利的编译之旅

        系统

Distributor ID: UbuntuDescription:    Ubuntu 16.04.6 LTSRelease:        16.04Codename:       xenial

下载代码

        放在src目录是好习惯

cd /usr/local/srcgit clone https://github.com/aliyun/rds_dbsync.git

安装mysql的开发包 

        既然编译安装自然依赖mysql的开发包

apt-get install  mysql-community-embedded-devel

安装pg的开发包

        pg的包安装相对麻烦一些,毕竟不常用

echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" >> /etc/apt/sources.list.d/pgdg.listwget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key addapt-get updateapt-get install postgresql-server-dev-9.6Reading package lists... DoneBuilding dependency tree       Reading state information... DoneThe following packages were automatically installed and are no longer required:  comerr-dev krb5-multidev libgssrpc4 libkadm5clnt-mit9 libkadm5srv-mit9 libkdb5-8Use 'sudo apt autoremove' to remove them.The following additional packages will be installed:  libpq-dev libpq5 postgresql-client-9.6Suggested packages:  postgresql-doc-12 postgresql-9.6 postgresql-doc-9.6The following NEW packages will be installed:  postgresql-client-9.6 postgresql-server-dev-9.6The following packages will be upgraded:  libpq-dev libpq52 upgraded, 2 newly installed, 0 to remove and 52 not upgraded.Need to get 2,438 kB of archives.After this operation, 10.8 MB of additional disk space will be used.Do you want to continue? [Y/n] y...Setting up postgresql-client-9.6 (9.6.18-1.pgdg16.04+1) ...update-alternatives: using /usr/share/postgresql/9.6/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto modeSetting up postgresql-server-dev-9.6 (9.6.18-1.pgdg16.04+1) ...Processing triggers for libc-bin (2.23-0ubuntu11) ...

编译

        尴尬开始

cd rds_dbsync/dbsyncmake/usr/lib/postgresql/9.6/lib/pgxs/src/makefiles/pgxs.mk:219: warning: ignoring old recipe for target 'clean'g++ -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -pie -fno-omit-frame-pointer -fPIC -fPIC demo.o pg_logicaldecode.o pqformat.o stringinfo.o utils.o misc.o pgsync.o ini.o -L/usr/lib/postgresql/9.6/lib -lpgcommon -lpgport -L/usr/lib/x86_64-linux-gnu -lpq '-Wl,-rpath,$ORIGIN,-rpath,$ORIGIN/lib,-rpath,$ORIGIN/../lib,-rpath,/usr/lib/x86_64-linux-gnu,-rpath,/usr/lib/x86_64-linux-gnu' -L/usr/lib/x86_64-linux-gnu  -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now  -L/usr/lib/x86_64-linux-gnu/mit-krb5 -Wl,--as-needed  -lpthread -o demo /usr/bin/ld: demo.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPICdemo.o: error adding symbols: Bad valuecollect2: error: ld returned 1 exit statusMakefile:27: recipe for target 'all' failedmake: *** [all] Error 1

        网上查到两个同类问题

问题:fileappender.o relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPI解决:使用 ar -x liblog4cplus.a 解包readelf --relocs fileappender.o | egrep '(GOT|PLT|JU?MP_SLOT)' 如果输出为空,则该静态库没有position-independent,需要在该静态库的编译脚本添加 -fPICffmpeg  --enable-shared编译时libavcodec/mqc.o: relocation r_x86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fpicffmpeg编译错误,修改Makefile121:$$(OBJS-$(1)): CFLAGS  += $(CFLAGS-$(1))为121:$$(OBJS-$(1)): CFLAGS  += -fPIC $(CFLAGS-$(1))重新make,成功。

        解决办法都是添加-fPIC

        经过一番尝试,发现其实编译过程已经添加了-fPIC,但是始终编译不过

        查看demo.cpp发现,里面竟然写死了数据库连接的用户名和密码

1094092c39daa11b37602445e9fc639c.png

        看来是测试的demo了,那不是可以直接不编译这哥们儿?

        将Makefile中demo相关的代码注释掉

-all: demo.o dbsync-pgsql2pgsql.o mysql2pgsql.o dbsync-mysql2pgsql.o readcfg.o-       $(CXX) $(CFLAGS) demo.o $(OBJS) $(libpq_pgport) $(RPATH_LDFLAGS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o demo +#all: demo.o dbsync-pgsql2pgsql.o mysql2pgsql.o dbsync-mysql2pgsql.o readcfg.o+all: dbsync-pgsql2pgsql.o mysql2pgsql.o dbsync-mysql2pgsql.o readcfg.o+       #$(CXX) $(CFLAGS) demo.o $(OBJS) $(libpq_pgport) $(RPATH_LDFLAGS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o demo         $(CXX) $(CFLAGS) readcfg.o dbsync-pgsql2pgsql.o $(OBJS) $(libpq_pgport) $(RPATH_LDFLAGS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o pgsql2pgsql        $(CXX) $(CFLAGS) readcfg.o ini.o mysql2pgsql.o dbsync-mysql2pgsql.o misc.o stringinfo.o $(libpq_pgport) $(RPATH_LDFLAGS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -L$(mysql_lib_dir) -lmysqlclient -o mysql2pgsql @@ -36,7 +37,7 @@ package:        mkdir -p install/bin        mkdir -p install/lib        cp -fr pgsql2pgsql install/bin-       cp -fr demo install/bin+#      cp -fr demo install/bin        cp -fr ali_recvlogical.so install/lib        cp -fr mysql2pgsql install/bin        cp -fr $(mysql_lib_dir)/libmysqlclient.so* install/lib

        再次make,顺利通过

打包二进制

        这步比较顺利

# make package mkdir -p installmkdir -p install/binmkdir -p install/libcp -fr pgsql2pgsql install/bincp -fr ali_recvlogical.so install/libcp -fr mysql2pgsql install/bincp -fr /usr/lib/x86_64-linux-gnu/libmysqlclient.so* install/libcp -fr /usr/lib/x86_64-linux-gnu/libpq.so* install/lib

        将生成一个install目录,里面有二进制和lib

验证

#cd install/bin/#lsmysql2pgsql  pgsql2pgsql#./mysql2pgsql Failed to load config fileread config file error, insufficient permissions or my.cfg does not exist

        看起来工作ok

总结

        编译过程看似复杂,其实就卡在一个测试的demo文件上.花了有两个小时研究解决方案.好尴尬.

长按下图可以关注哟~

1ce1f3d72c2e6a798ddc0c41a1845bef.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值