新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 移植MySQL到嵌入式ARM平臺

        移植MySQL到嵌入式ARM平臺

        作者: 時間:2016-11-09 來源:網絡 收藏
        因為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

        本文引用地址:http://www.104case.com/article/201611/317676.htm

        2)安裝編譯器:用的是4.3.2的交叉編譯器。gcc之類的都是ubuntu10.10自帶的。

        3)編譯PC版本的mysql備用
        a)解壓mysql-5.1.51到/opt/mysql-5.1.51: tarzxvfmysql-5.1.51.tar.gz

        b)cdmysql-5.1.51
        c)./configure-prefix=/usr/local/mysql

        d)make注意,這里無需運行makeinstall,以為主要是為了用pc版本里的gen_lex_hash庫。(注意一定要先make后,再去修改文件夾名稱)

        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/中:tarzxvfncurses-5.9.tar.gz

        c)cdncurses-5.6
        d)./configure–host=arm-linux-prefix=/usr/local/ncurse–enable-static

        e)make
        f)makeinstall之所以安裝這個,是因為對mysql的交叉編譯過程需要該庫的支持

        (此步在用sudo make install時出錯,原因是環境變量和原來不同了,解決辦法:sudo -i;make install)

        5)編譯arm版本的mysql
        a)tarzxvfmysql-5.1.51.tar.gz

        b)cdmysql-5.1.51
        c)修改配置文件:打開configure,可以使用geditconfigure分別在第26453行、48175行、48282行、48485行附近有類似代碼:
        iftest"$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:cannotruntestprogramwhilecross

        compilingSee`config.logformoredetails.">&5

        $as_echo"$as_me:error:cannotruntestprogramwhilecrosscompilingSee`config.logformoredetails.">&2;}
        {(exit1);exit1;};};}

        Else

        將這些代碼改為:
        iftest"$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:cannotruntestprogramwhilecrosscompilingSee`config.logformoredetails.">&5
        #$as_echo"$as_me:error:cannotruntestprogramwhilecrosscompilingSee`config.logformoredetails.">&2;}
        #{(exit1);exit1;};};}

        Else

        一定注意,這樣的代碼有4部分,要全部改掉。
        d)配置,直接套用了人家的配置方式:

        ./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行之前添加#defineSTACK_DIRECTION1
        如果不修改該語句,則會出現如下錯誤:sql_parse.cc:5646:21:operator 注意:這里的“#defineSTACK_DIRECTION1”一句,不能隨便加在sql_parse.cc的開頭處,而應該根據出錯信息的提示添加在相應的行上,我所遇到的行號和別人文檔上所遇到的行號并不相同。
        f)PC版本的gen_lex_hash文件到當前文件夾:

        cp/opt/mysql-5.1.51-pc/sql/gen_lex_hashsql/

        touch–msql/gen_lex_hash
        cp/opt/mysql-5.1.51-pc/sql/lex_hash.hsql/

        touch–msql/lex_hash.h
        否則會出現錯誤:
        make[2]:Leavingdirectory`/opt/mysql-5.5.3-m3/sql./gen_lex_hash>lex_hash.h-t
        /bin/sh:./gen_lex_hash:cannotexecutebinaryfile因為arm版的無法在pc上運行。

        注意:別人的文檔上說只要拷貝gen_lex_hash即可,但我試了好多次,都仍然會出現上面的報錯信息,把lex_hash.h也拷貝過來后,就不再報錯了。另外,touch一定要做,原因就是讓編譯器不要再編譯覆蓋拷貝過來的文件了。

        g)Make

        h)Makeinstall


        6)移植相應文件到ARM平臺
        a)拷貝pc的/usr/local/mysql到開發板的相同目錄
        我使用了nfs調試,所以需要使用如下指令:
        cp-r/usr/local/mysql/opt/EmbedSky/root_nfs/usr/local/mysql
        b)把編譯出的arm的mysql庫打包備份一下,考到主機的目錄里:
        tar–zcvfmysql-arm-5.1.51.tar.gzmysql
        c)到源碼中拷貝配置文件模版Copiesfilesfromonelocationtoanother.配置文件模版)

        cp/opt/mysql-5.1.51/support-files/my-medium.cnf/opt/EmbedSky/root_nfs/etc/my.cnf(這里的目錄指的是nfs調試的路徑設置),這里的my.cnf存放的路徑是按照手冊上的建議,前面編譯pc版本的MySQL 中所述的路徑并非全局配置。該文檔的注釋中說:“#Youcancopythisfileto/etc/my.cnftosetglobaloptions,mysql-data-dir/my.cnftosetserver-specificoptions(inthisinstallationthisdirectoryis /usr/local/mysql/var)or~/.my.cnftosetuser-specificoptions.”該配置文件的修改詳見mysql5.1的英文手冊的4.2.3.3.UsingOptionFiles節中的敘述。

        數據目錄是在:/var/lib/mysql (默認)

        安裝目錄是在:/usr/local/mysql (默認)
        試圖反注釋了關于InnoDB的一些配置,其它沒有動。但是修改了這些設置后,報錯,于是又改了回來。
        d)運行mysql_install_db(參見手冊的2.13.Post-InstallationSetupandTesting)
        cd/usr/local/mysql/bin(開發板路徑),運行mysql_install_db-uroot結果出現了如下錯誤:NeitherhostEmbedSkynorlocalhostcouldbelookedupwith/usr/local/mysql/bin/resolveipPleaseconfigurethehostnamecommandtoreturnacorrecthostname.Ifyouwanttosolvethisatalaterstage,restartthisscriptwiththe--forceoption這主要的原因是開發板環境中的hostname是EmbedSky,而不是通常的Federa14等,所以mysql自動認為可能在該操作系統中的運行會不兼容,有兩種辦法解決:
        第一種,運行hostnamefedora14,就是欺騙一下hostname;

        第二種,運行mysql_install_db-uroot–force

        我使用了第二種方式:bin/mysql_install_db--user=root--force--basedir=/usr/local/mysql--datadir=/usr/local/mysql/var/lib/mysql (我修改了datadir的路徑)
        中間出現過一次錯誤:15071321:06:39[ERROR]/usr/local/mysql/libexec/mysqld:unknownvariableinnodb_data_home_dir=/usr/local/mysql/var/,查明原因是my.cnf中反注釋了和InnoDB相關的配置。
        e)手動建立mysqld/mysqld.pid,手工建立: (這一步不需要,制定到/tmp/mysqld.pid就行)
        mkdir/usr/local/mysql/var/run/mysqld
        touch/usr/local/mysql/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—TheMySQLServer的敘述
        加上了basedir和datadir,

        還有pid-file=/tmp/mysqld.pid

        還有service-pid-file=/tmp/mysqld.pid

        修改完后,要給新的mysqld附以足夠的權限:Chmod+xmysqld
        g)在開發板開啟MySQL服務
        開發板不支持service指令,所以servicemysqlstart無效。

        采用的方法是運行./etc/init.d/mysqldstart
        但最初運行該指令后出現下面的錯誤:
        StartingMySQL...ERROR!Managerofpid-filequitwithoutupdatingfile.
        困擾我好久,到開發板目錄/var/lib/mysql下查閱錯誤日志文件[hostname].err,在我的系統中該錯誤日志文件為EmbedSky.err,從中看到下面的記錄:
        15071321:04:49[ERROR]Fatalerror:Cantchangetorunasusermysql;Pleasecheckthattheuserexists!
        可能的原因是:在arm的linux上無法執行groupaddmysql,因此需要采用如下方法解決該問題:cd /usr/local/mysql/var/lib/mysql
        ls–la可以看到里面的屬性中沒有mysql,于是使用下面的命令:addusermysql
        chownmysql:mysql-R/var/lib/mysql
        然后開啟mysql服務,還是出現了ERROR!Managerofpid-filequitwithoutupdatingfile.又查看EmbedSky.err日志,其中多了一條:
        1507142:48:04[ERROR]Cantstartserver:BindonTCP/IPport:Addressalreadyinuse
        1507142:48:04[ERROR]Doyoualreadyhaveanothermysqldserverrunningonport:3306?
        很顯然是因為已經有mysql的進程嘗試打開3306端口,因此就被占用了,需要殺進程,索性重啟開發板,然后運行./etc/init.d/mysqldstart,可以完美打開。

          (我使用的時候,還有另外的一個問題,由于客戶端和服務器都要訪問/tmp目錄,所以每次開機都要chmod 777 /tmp ,以便于都能訪問)
        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

        其他的還有:鏈接庫文件

        ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /lib

        7)測試ARM平臺下的MySQL
        a)mysqladmin-urootpasswordhahaha最后一項為我的密碼(設置密碼)

        b)mysql-h127.0.0.1-uroot-p或mysql-hlocalhost-uroot-p這樣便可以進入mysql環境。

        c)mysql>showdatabases;

        mysql>create databases at91;

        mysql>use at91;

        mysql>create table node (id int(5) auto_increment not null primary key, node_ID char (40), param_ID_values varchar(900));



        關鍵詞: 移植MySQLARM平

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 洮南市| 金阳县| 黄石市| 上高县| 五大连池市| 自治县| 化德县| 桐梓县| 类乌齐县| 公主岭市| 滕州市| 余庆县| 罗平县| 巧家县| 兴仁县| 惠州市| 富平县| 井研县| 紫金县| 灌南县| 新和县| 安福县| 洞口县| 普兰店市| 宣武区| 积石山| 滦南县| 临高县| 阜平县| 泰和县| 铜川市| 淮安市| 老河口市| 阳原县| 大田县| 济宁市| 渑池县| 什邡市| 蓝田县| 贡觉县| 噶尔县|