移植MYSQL

原文:http://www.cnblogs.com/Charles-Zhang-Blog/p/3529980.html

 

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) 安装编译器:用的是4.3.2的交叉编译器。gcc之类的都是ubuntu10.10自带的。

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=$(pwd)/../mysql 
    d) make 注意,这里无需运行make install,以为主要是为了用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/中:tar zxvf ncurses-5.9.tar.gz 
    c) cd ncurses-5.6 
    d) ./configure –host=arm-none-Linux-gnueabi -prefix=$(pwd)/../build_ncurse–enable-static 
    e) make 
    f) make install之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持
      (此步在用sudo make install时出错,原因是环境变量和原来不同了,解决办法:sudo -i;make install) 

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 --host=arm-none-linux-gnueabi --enable-static --with-named-curses-libs=$(pwd)/../build_ncurse/lib/libncurses.a--prefix=$(pwd)/../build_mysql --without-debug --without-docs --without-man --without-bench --with-charset=gb2312 --with-extra-charsets=ascii,latin1,utf8

    e) 修改$(pwd)/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到开发板的相同目录(也可以是自定义的目录,我用的是/opt/mysql)
       我使用了nfs调试,所以需要使用如下指令(如果想省空间,lib只需要libmysqlclient_r.so.16.0.0,改名为libmysqlclient.so.16即可): 
       cp -r (安装路径)/build_mysql /opt/mysql
   b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里: (这步没做)
       tar –zcvf mysql-arm-5.1.51.tar.gz mysql 

   c) 到源码中拷贝配置文件模版  Copies files from one location to another. 配置文件模版) 
       cp $(pwd)/mysql-5.1.51/support-files/my-medium.cnf  /etc/my.cnf(这里的目录是板子上的/etc),这里的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) 

         运行mysql_install_db -u root –force 
         /opt/mysql/bin/mysql_install_db --user=root --force --basedir=/opt/mysql --datadir=/opt/mysql/data (我修改了datadir的路径) 
 

        中间出现过一次错误: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,手工建立: (这一步可以不需要,制定到/tmp/mysqld.pid就行)
        mkdir /opt/mysql/var/run/mysqld 

    f) 到源码中拷贝启动文件 
        cp $(pwd)/mysql-5.1.51/support-files/mysql.server /etc/init.d/mysqld 
       修改该mysqld 
       详见手册中4.3.1. mysqld — The MySQL Server的叙述 
       加上了basedir和datadir,将文件中编译的目录改成板子上的目录
        pid_file=/opt/mysql/var/run/mysqld/mysqld.pid

        server_pid_file=/opt/mysql/var/run/mysqld/mysqld.pid
use_mysqld_safe=1
user=mysql
if test -z "$basedir"
then
  basedir=/opt/mysql
  bindir=/opt/mysql/bin
  if test -z "$datadir"
  then
    datadir=/opt/mysql/data  
  fi
  sbindir=/opt/mysql/sbin
  libexecdir=/opt/mysql/libexec
else
  bindir="$basedir/bin"
  if test -z "$datadir"
  then
    datadir="$basedir/data"
  fi
  sbindir="$basedir/sbin"
  libexecdir="$basedir/libexec"
fi

       修改完后,要给新的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. 
      可能的原因是:在arm的linux上无法执行groupadd mysql,因此需要采用如下方法解决该问题: cd /opt/mysql/data 
      ls –la可以看到里面的属性中没有mysql,于是使用下面的命令: adduser mysql 
      chown mysql:mysql -R /opt/mysql/data

      chmod -R 777  /opt/mysql/var/run/mysqld
      然后开启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 /opt/mysql/bin/mysql /usr/bin 
       ln -s /opt/mysql/bin/mysqldump /usr/bin 
       ln -s /opt/mysql/bin/mysqladmin /usr/bin
       其他的还有:链接库文件

i)  
       ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /lib
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;

 

====================================维护相关=============================================

MySQL 5.1 配置文件详解:http://blog.sina.com.cn/s/blog_6813a1a70100za3h.html

比较关键的参数:http://www.cnblogs.com/littlehb/archive/2013/04/20/3032658.html

query_cache_size
sort_buffer_size

MyISAM:
key_buffer_size

INNODB:
innodb_buffer_pool_size
innodb_flush_log_at_trx_commit

 

1.日志文件

嵌入式环境下,flash不大,MYSQL会生成大量的日志和错误文件

编辑my.cnf
将log-bin=mysql-bin 注释掉就OK。(前面加#号)
同时把binlog_format=mixed这行也注释掉!
重启mysql:/etc/init.d/mysql restart

删除data路径(/opt/mysql/data)下*.err错误文件:该文件每次在mysql启动后都会被写入时间长了会很大

 

2.删除mysql中的数据后data目录仍然占据大量空间

OPTIMIZE TABLE table_name;即可

如果使用innodb引擎,则需要在my.cnf文件的[mysqld]中加入innodb_file_per_table=1

开启独立表空间(每个表一个存储文件),此时使用OPTIMIZE TABLE table_name才能缩小占用的空间

独立表空间
优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收(drop/truncate table方式操作表空间不能自动回收)
5.对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
缺点:
单表增加比共享空间方式更大。
结论:
共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好。
当启用独立表空间时,请合理调整一下 innodb_open_files 参数。
 

3.支持innodb引擎需要在编译时添加

--with-plugins=innobase  支持innobase数据库(5.1+,默认为空)

--with-federated-storage-engine 支持federated存储引擎

安装到板子上后,进入Mysql,加载innodb引擎

用show plugins;  命令查看MySQL已经安装的插件
用show variables like "have_%"; 查看是否支持动态加载, 重要的是have_dynamic_loading这行,如果是YES,那么继续
用show engines;查看数据库引擎
安装innodb:

install plugin INNODB soname "ha_innodb_plugin.so.0.0.0";  

install plugin INNODB_TRX soname "ha_innodb_plugin.so.0.0.0";  
install plugin INNODB_LOCKS soname "ha_innodb_plugin.so.0.0.0";  
install plugin INNODB_LOCK_WAITS soname "ha_innodb_plugin.so.0.0.0";  
install plugin INNODB_CMP soname "ha_innodb_plugin.so.0.0.0";  
install plugin INNODB_CMP_RESET soname "ha_innodb_plugin.so.0.0.0";  
install plugin INNODB_CMPMEM soname "ha_innodb_plugin.so.0.0.0";  
install plugin INNODB_CMPMEM_RESET soname "ha_innodb_plugin.so.0.0.0";

修改my.cnf,将innodb相关配置前的#去掉

 

4.mysql中文乱码

修改my.cnf文件,以下3部分加上default-character-set=utf8

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8

进入mysql,使用SHOW VARIABLES LIKE 'character%';查看,确保都是utf8

应用程序访问时需要设置'set names utf8'保证字符集使用UTF8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值