一起学习
分类: Mysql/postgreSQL
2017-01-10 14:00:40
最近需要在pxa270的嵌入式平台上应用数据库进行通信信息管理,客户要求使用mysql数据库,接下任务后,在网上一查才知道mysql 根本很少用于嵌入式环境,而且支持的少数几种芯片中并没有arm的分发包!继续搜索有没有mysql在arm平台移植的相关文章,几乎找不到相关资料.而自己在网上发了一些帖却没有收到一个回复,没办法,只能硬着头皮自己动手了.幸好经过一番”苦战”,今天终于克服了所有障碍,让mysql在270板子上跑了起来!而且简单的测试也都收到了预期的效果,不过还要看客户的经一步测试了.
现在将mysql 的arm+linux移植经验贴出来,希望对以后做相关方面工作的人有所帮助.
首先是要从网上获取mysql的源码包,官方网址如下:
我用的是mysql-5.0.22.tar.gz
采用的交叉编译器是适合于270板子的codesourcery这要根据具体的情况来进行修改.
以下分几个阶段来介绍:
一: configure
解开包以后得到文件夹mysql-5.0.22我将其改名为mysql-pc,进入目录后,首先要做configure 来生成交叉编译的Makefile文件,编译的时候一般configure是都能通过的但我用./configure --host=arm-none-linux-gnueabi来生成Makefile时却出现了多个错误,如下:
1) return type of sprintf : error: cannot run test program while cross compiling
检查configure脚本,发现脚本在检测到在做cross-compile时就提示以上错误并退出,说明至少是这个版本的mysql并不支持交叉编译,但我用了最新的版本试了也还是有同样的错误,基本可以肯定mysql还没有支持交叉编译的版本出现.但为了让编译继续,我在configure脚本中将多处这样的命令全都注释掉以让configure通过.
2) error: Your compiler cannot convert a longlong value to a float!
这个问题在较低版本的mysql中是一个bug,但5.0的版本已经修复了这个问题,有可能是交叉编译器的问题,找不到解决的方法,这里我也将它注释屏蔽了.
3) error: No curses/termcap library found
缺少curses和termcap的库,反复安装了各种相关的软件包,还是解决不了这个问题,最后是在configure的参数里直接指定了安装的ncurses-5.6下的libncurses.a库根据我的路径参数设置如下:
--with-named-curses-libs=/home/huaming/mysql/ncurses-arm-d501/lib/libncurses.a
(这里要注意的是ncurses的安装也要采用交叉编译的方式在pc上装好,否则后面做make的时候编译器会指出libncurses.a的格式不对)
经过反复尝试我最后使用的参数如下:
./configure --host=arm-none-linux-gnueabi --with-named-curses-libs=/home/huaming/mysql/ncurses-arm-270/lib/libncurses.a --prefix=/home/huaming/mysql/mysql_arm_270 --without-debug --without-docs --without-man --without-bench --with-extra-charset=gbk,gb2312
二: make
这一步遇到的问题最难解决:
1) ../extra/comp_err: ../extra/comp_err: cannot execute binary file
编译过程中要运行comp_err命令,但这个命令是arm格式的在pc机上运行不起来,解决方法是要编译好一个在pc上运行的mysql,从相应的目录下拷出comp_err命令覆盖extra下的这个arm格式的comp_err命令(这里要注意的是这个pc机上运行的mysql编译路径要和现在这个arm上运行的mysql路径完全相同,否则后面同样的问题中执行命令时涉及到路径问题,解决办法是先把现在编译的mysql-pc目录改为其他名称,再解一个mysql包改名为mysql-pc将其编译成pc上运行的版本,只要简单的用./configure |make就行了,再把现在这个mysql-pc改为别的名称,将原来的那个名称改回mysql-pc)
2) /home/huaming/mysql/mysql-pc/sql 目录下出现:
./gen_lex_hash: cannot execute binary file
原因和解决方法基本和上面遇到的问题相同,但这里还要加一命令:
touch –m sql/gen_lex_hash
上面的命令是改变gen_lex_hash的最后修改时间,这样做的目的是告诉编译器gen_lex_hash已经是最新的了,不要重新生成它,否则编译器检查gen_lex_hash和它的依赖文件的最后修改时间会发现gen_lex_hash比它的依赖文件更旧,就会重新交叉编译生成它,这样不管我们做几次覆盖的工作错误都还会再现.
3)还是在sql这个目录下出现了类似如下的错误:
gen_lex_hash.o: could not read symbols: File in wrong format或
./gen_lex_hash > lex_hash.h
g++: ../zlib/.libs/libz.so: No such file or directory
经过对Makefile文件的观察,发现这些错误都是在生成lex_hash.h文件的时候产生的,所以直接从pc上运行的版本中拷贝这个文件到此目录下,同样要执行touch –m lex_hash.h
否则会陷入一个循环的需要arm上运行的文件和pc上运行的文件的错误中出不来.
Make 的过程总结起来主要就是以上几个错误,但我的configure参数中已经去掉了几个模块的编译,如果不去掉这几个模块还会有更多错误出现.
三: make install
这一步很顺利,在指定的目录下生成了可以移植的文件,但进入这个目录的bin目录下可以看到这里有一个comp_err命令,用file命令可以看出这个命令就是前面拷进来的在pc上运行的命令,移植到arm的板子上还要把arm版的comp_err命令重新拷回来覆盖它,如果前面没有备份arm版的这个命令,可以进入extra目录,运行make clean | make 出现上面提到的错误停止的时候就可以把里面的arm版的comp_err命令拷出来了.
四:移植
将install产生的文件夹整个拷贝到板子上,这一步要注意的是,板子上放置mysql的路径和pc上安装的路径要完全相同,比如我在pc上的安装路径是:/home/huaming/mysql/mysql_arm_270 则在板子上也要是同样的目录,此路径上没有的目录可以用mkdir来建立.
在板子上启动数据库服务遇到的与移植有关的问题如下:
1) 使用命令: ./mysql_install_db --user=root 执行数据库安装的时候出现如下警告:
WARNING: The host 'master_card' could not be looked up with resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !
mysql启动的时候会检查/etc下的hosts文件,从中查看检测到的处理器名称是否登记过,未登记的则有可能运行的版本与处理器不兼容,将hosts文件拷到板子上,并在里面加入 master_card(要根据以上的出错信息来定),这样启动时警告没了,是否100%的兼容那就要看测试的结果了.
2) 还有一个与移植有关的是/etc/my.cnf文件,这个文件设置了mysql的相关文
件的存放路径,可以修改它来方便系统的管理,将这个文件也拷贝到/etc目录下.
在板子上运行的过程中还遇到了许多其他的问题,但个人认为这些问题已经基本与移植无关,而是使用mysql数据库的问题,问题的解决办法可以参考pc上运行遇到同样问题的解决办法,这里就不赘述了.
中文官方网址如下:
最后按照mysql中文官方网站上的参考手册运行了一些测试命令,都收到了预期的效果,感觉很不错!
在移植的过程中,得到了同事的极大参与和帮助,这里不便提名字,在此一并谢过了!