本帖最后由 流浪记 于 2013-8-29 18:23 编辑
Mysql的嵌入式移植(mysql-5.1.69)
编译mysql也需要编译两个版本,一个是基于本机的,一个是基于ARM的。
我这里将基于本机的解压到/home/jason/PC/下,将基于ARM的解压到/home/jason/arm下。
编译本机版本的mysql
# cd /home/jason/PC/mysql-5.1.69
# ./configure
# make
这里仍然不需要make install,因为我们只需要用到本机编译后的gen_lex_hash文件。
下面编译arm版本的mysql
这里要用到ncurses库,所以先安装这个库,ncurses-5.9.tar.gz并解压
# cd /ncurses-5.9
# ./configure --enable-static 这里我用的是默认安装目录。
# make
# make install
开始编译基于arm的 mysql
# cd /home/jason/arm/mysql-5.1.69
#sudo gedit configure 打开配置文件,修改configure。
分别在第26453行、 48175行、 48282行、 48485行附近有类似代码:(行不一定是这几行,附近找就可以了,或者用搜索功能)
if test "$cross_compiling" = yes; then
{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5
$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }; }
Else
将这些代码改为:
if test "$cross_compiling" = yes; then
echo “skip …..!”
#{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5
#$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;}
#{ (exit 1); exit 1; }; }; }
Else
一定注意,这样的代码有4部分,要全部改掉。
12. #CC=arm-linux-gcc ./configure --host=arm-linux –-enable-static --with-named-curses-libs=/usr/local/ncurse/lib/libncurses.a --localstatedir=/var/lib/mysql --prefix=/usr/local/mysql --without-debug --without-docs --without-man --without-bench --with-charset=gb2312 --with-extra-charsets=ascii,latin1,utf8
13 . 修改/mysql-5.1.69/sql/sql_parse.cc:在5646行之前添加
#define STACK_DIRECTION 1,当然并不一定是这行,
否则会出现如下错误:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏变量STACK_DIRECTION没有定义初值,arm中定义STACK_DIRECTION为1。
注意:这里的“#define STACK_DIRECTION 1”一句,不能随便加在sql_parse.cc的开头处,而应该加在用这个宏的前面一句。
复制PC版本的gen_lex_hash文件到arm版本的对应路径处
# cp /mysql-5.1.51-pc/sql/gen_lex_hash sql/
# touch –m sql/gen_lex_hash
# cp /mysql-5.1.51-pc/sql/lex_hash.h sql/
# touch –m sql/lex_hash.h
# make
# mak install
将/usr/local/下的mysql文件夹移植到开发板相同目录下,即/usr/local/.
将mysql源码(基于arm的)中的/mysql-5.1.69/support-files/my-medium.cnf文件拷贝到开发板的/etc/目录下,并改名字为my.conf
下面说的都是在开发板里面执行的,即串口终端,什么意思自己去了解下,需要用到minicom。
运行mysql_install_db
# cd /usr/local/mysql/bin
# 运行 ./mysql_install_db -u root
结果出现了如下错误:Neither host 'EmbedSky' nor 'localhost' could be looked up with /usr/local/mysql/bin/resolveip Please configure the 'hostname' command to return a correct hostname. If you want to solve this at a later stage, restart this script with the --force option 这主要的原因是开发板环境中的hostname是EmbedSky,所以mysql自动认为可能在该操作系统中的运行会不兼容.
解决办法:# ./mysql_install_db --user=root --force --basedir=/usr/local/mysql --datadir=/var/lib/mysql
.创建mysqld.pid文件(不知道这步是不是必须,但我做了)
在/var/run目录下穿件mysqld文件夹 # mydir /usr/run/mysqld
并在该文件夹创建文件mysqld.pid # touch /var/run/mysqld/mysqld.pid
拷贝mysql-5.1.69/support-files/mysql.server 文件到开发板的/etc/init.d/目录下并改名为mysqld,修改这个mysqld文件:
添加下列几项的值
Basedir =/usr/local/mysql
Datadir =/var/lib/mysql
pid-file=/var/run/mysqld/mysqld.pid
修改完后要给mysqld文件以足够的权限 #chmod 777 mysqld
21 .在开发板上开启mysql服务
# cd /etc/init.d
# ./mysqld start
结果出错:Starting MySQL... ERROR! Manager of pid-file quit without updating file.
到开发板目录/var/lib/mysql下查阅错误日志文件EmbedSky.err,从中看到下面的记录:
150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ; Please check that the user exists!
因此需要采用如下方法解决该问题:
# cd /var/lib/mysql
# ls –la可以看到里面的属性中没有mysql,于是使用下面的命令:
# adduser mysql
# chown mysql:mysql -R /var/lib/mysql
然后开启mysql服务,还是出现了ERROR! Manager of pid-file quit without updating file. 又查看EmbedSky.err日志,其中多了一条:
150714 2:48:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use。
这似乎是端口被占用了,当然你不一定会碰到这个问题,不管出什么问题,查看错误日志来解决。
# cd /etc/init.d
# ./mysqld start 启动mysql服务。
22. 设置软连接使mysql, mysqldump, mysqladmin这三个命令能在开发板的shell中直接运行。
# ln -s /usr/local/mysql/bin/mysql /usr/bin
# ln -s /usr/local/mysql/bin/mysqldump /usr/bin
# ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
23.修改密码方法:
# mysqladmin -u root password hahaha(hahaha即为你要改的密码)
这样就可以用这个密码进入mysql操作界面了
进入mysql服务界面的方法:
# mysql -u root -p
Enter passwd :这里输入密码就可以进入mysql服务界面
Mysql> (这是进入mysql服务界面的标志)
启动mysql的过程中可能会出现问题:
ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)
解决方法:# cd /etc/init.d/
# ./mysqld stop # cd /usr/local/mysql/bin
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
解决了这个问题之后可以再进入mysql服务
# mysql -u root -p
Enter passwd : 输入密码
Mysql>
移植后感:整个apache+php+mysql的移植花了我真的有3个星期,当然对于我这个刚接触linux的人来说这个时间还是可以的,哈哈,小小的得意一下。当然过程肯定不会一帆风顺,无论移植这里面的哪一个,都遇到了太多的问题,解决了一个问题,又出现一个新的问题,出现问题当然去找度娘了,有些问题很多人碰到,所以会有很多解决方法供我们参考,有些方法不一定适合自己,只有再尝试了很多方法之后才能找到真正能解决问题的那个。不过有些问题在度娘里面可能找不到答案,那就问问google咯,还有一些大家用的比较少的搜索引擎,比如360,有道,必应,Jlike时刻等等都可以尝试下,也许就能找到能解决你问题的方法。
花了差不多一整天的时间来整理这个,一来是以后可能会再次移植,二来是想认真写个文档,供别的朋友参考,毕竟这个是集结了很多网友的移植经验,当我们成功之后再将自己成功的经验供别的网友参考。
有问题的朋友可以加我QQ,374075382,输入验证我的名字:邓林杰.互相交流,互相学习。
|