热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySql移植到嵌入式Linux平台_MySQL

MySql移植到嵌入式Linux平台
bitsCN.com

最近在做考勤机系统,硬件采用的cortex-A8,哈哈,其实是有点浪费的,2410就可以的。所以就要考虑到考勤数据的存储问题,本来是打算用sqlite数据库存储的,可是后来发现,这个数据库只是一个本地数据库,无法进行联网访问,这样的话,服务器上的数据客户端是不能通过远程连接数据库的方法连接访问的,但是还可以通过其他方法,比如socket的方法,服务器把客户端请求的数据发送给客户端,不过感觉这样比较麻烦,所有后面采样MySql数据库,这样就涉及到MySql数据库的移植了。

在网上搜索了下,找到一篇文章,我就是按照该方法一步步的成功移植了MySql-5.1.51版本,以下是原文

MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因此,暂时参考这样一篇文档:

http://blog.chinaunix.net/space.php?uid=9701860&do=blog&id=285428,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。

进行如下步骤完成移植:

1) 下载mysql5.1.51:

http://www.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.1/mysql-5.1.51.tar.gz

2) 安装编译器:用的是EmbedSky提供的4.3.3的编译器。gcc之类的都是Fedora14自带的。

3) 编译PC版本的mysql备用

a) 解压mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz

b) cd mysql-5.1.51

c) ./configure -prefix=/usr/local/mysql

d) make 注意,这里无需运行make install,以为主要是为了用pc版本里的gen_lex_hash库。

e) 将文件夹mysql-5.1.51改名为mysql-5.1.51-pc备用。(将gen_lex_hash单独备份保存一下)

f) 文档上说这里会出错,但我在编译的过程中没有碰到,唯一的问题是编译了arm版本的,重新通过改文件夹的名字回头编译pc版本的时候会报错。

4) 编译arm版本的ncurses

a) 下载ncurses-5.9.tar.gz:ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz

b) 解压到/opt/中:tar zxvf ncurses-5.9.tar.gz c) cd ncurses-5.6

d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static e) make

f) make install

之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持

5) 编译arm版本的mysql

a) tar zxvf mysql-5.1.51.tar.gz

b) cd mysql-5.1.51

c) 修改配置文件:打开configure,可以使用gedit 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部分,要全部改掉。

d) 配置,直接套用了人家的配置方式:

configure ./configure --host=arm-linux –-enable-static --with-named-curses-libs=/usr/local/ncurse/lib/libncurses.a --prefix=/usr/local/mysql --without-debug --without-docs --without-man --without-bench --with-charset=gb2312 --with-extra-charsets=ascii,latin1,utf8

e) 修改opt/mysql-5.1.51/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的开头处,而应该根据出错信息的提示添加在相应的行上,我所遇到的行号和别人文档上所遇到的行号并不相同。

f) 复制PC版本的gen_lex_hash文件到当前文件夹: cp /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/ touch –m sql/gen_lex_hash

cp /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/ touch –m sql/ lex_hash.h

否则会出现错误:

make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t

/bin/sh: ./gen_lex_hash: cannot execute binary file 因为arm版的无法在pc上运行。

注意:别人的文档上说只要拷贝gen_lex_hash即可,但我试了好多次,都仍然会出现上面的报错信息,把lex_hash.h也拷贝过来后,就不再报错了。另外,touch一定要做,原因就是让编译器不要再编译覆盖拷贝过来的文件了。

g) Make

h) Make install

6) 移植相应文件到ARM平台

a) 拷贝pc的/usr/local/mysql到开发板的相同目录 我使用了nfs调试,所以需要使用如下指令:

cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql

b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里:

tar –zcvf mysql-arm-5.1.51.tar.gz mysql

c) 到源码中拷贝配置文件模版 Copies files from one location to another. 配置文件模版)

cp /opt/mysql-5.1.51/support-files/my-medium.cnf /opt/EmbedSky/root_nfs/etc/my.cnf

(这里的目录指的是nfs调试的路径设置),这里的my.cnf存放的路径是按照手册上的建议,前面编译pc版本的MySQL中所述的路径并非全局配置。该文档的注释中说:“# You can copy this file to /etc/my.cnf to set global options, mysql-data-dir/my.cnf to set server-specific options (in this installation this directory is /usr/local/mysql/var) or ~/.my.cnf to set user-specific options.”该配置文件的修改详见mysql5.1的英文手册的4.2.3.3. Using Option Files节中的叙述。 数据目录是在:/var/lib/mysql 安装目录是在:/usr/local/mysql

试图反注释了关于InnoDB的一些配置,其它没有动。但是修改了这些设置后,报错,于是又改了回来。

d) 运行mysql_install_db(参见手册的2.13. Post-Installation Setup and Testing)

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,而不是通常的Federa14等,所以mysql自动认为可能在该操作系统中的运行会不兼容,有两种办法解决:

第一种,运行hostname fedora14,就是欺骗一下hostname; 第二种,运行mysql_install_db -u root –force 我使用了第二种方式: bin/mysql_install_db --user=root --force --basedir=/usr/local/mysql -- datadir=/var/lib/mysql

中间出现过一次错误:150713 21:06:39 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'innodb_data_home_dir=/usr/local/mysql/var/',查明原因是my.cnf中反注释了和InnoDB相关的配置。

e) 手动建立mysqld/mysqld.pid,手工建立:

mkdir /var/run/mysqld

touch /var/run/mysqld/mysqld.pid

这一步不知道是不是必须的。但我这样做了。

f) 到源码中拷贝启动文件

cp /opt/mysql-5.1.51/support-files/mysql.server /opt/EmbedSky/root_nfs/etc/init.d/mysqld 修改该mysqld

详见手册中4.3.1. mysqld — The MySQL Server的叙述

加上了basedir和datadir,还有pid-file=/var/run/mysqld/mysqld.pid 修改完后,要给新的mysqld附以足够的权限: Chmod +x mysqld

g) 在开发板开启MySQL服务

开发板不支持service指令,所以service mysql start无效。采用的方法是运行./etc/init.d/mysqld start

但最初运行该指令后出现下面的错误:

Starting MySQL... ERROR! Manager of pid-file quit without updating file.

困扰我好久,到开发板目录/var/lib/mysql下查阅错误日志文件[hostname].err,在我的系统中该错误日志文件为EmbedSky.err,从中看到下面的记录:

150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ; Please check that the user exists!

可能的原因是:在arm的linux上无法执行groupadd mysql,因此需要采用如下方法解决该问题: 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

150714 2:48:04 [ERROR] Do you already have another mysqld server running on port: 3306 ?

很显然是因为已经有mysql的进程尝试打开3306端口,因此就被占用了,需要杀进程,索性重启开发板,然后运行./etc/init.d/mysqld start,可以完美打开。

h) 设置软连接使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

7) 测试ARM平台下的MySQL

a) mysqladmin -u root password hahaha 最后一项为我的密码 (设置密码)

b) mysql -h 127.0.0.1 -u root -p 或mysql -h localhost -u root -p 这样便可以

进入mysql环境。

c) mysql>show databases

按照上面的方法基本可以完成交叉编译,但是在后面运行的时候,可能会有些问题,提示Permission denied,造成这个错误的主要原因就是开发部启动后默认是root账户,但是你添加的mysql账户是不具备root账户权限的,所以没有权限执行,解决办法就是给你的账户加入到root用户组,修改用户组时要注意usermod命令可能文件系统中没有提供,这个时候你需要用vi打开开发板文件系统下面的/etc/passwd文件,把你创建的mysql账户修改为root用户组,这样就可以运行了,再次运行提示mysql sucess...

恭喜你mysql终于移植成功了,但是如果你在开发板上面想用Qt开发时还需要移植嵌入式的mysql Qt驱动,即交叉编译生成libqsqlmysql.so文件。

bitsCN.com
推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
author-avatar
他乡绿树_762
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有