原文地址:http://www.shuyz.com/install-and-config-mysql-on-openwrt.html

说明

今天Windows上的MySQL突然不能运行了,正好有一个项目需要使用MySQL数据库,于是想试试将MySQL Server部署到OpenWrt上解决一下燃眉之急。

OpenWrt的软件源上有编译好的mysql-server软件包的,可以直接安装,总共需要安装以下几个包:

  • mysql-server
  • libmysqlclient
  • uclibcxx
  • libncursesw
  • libreadline

上面这些软件包的体积加起来大约有3M,加上数据库文件,普通的路由器肯定是没有这么大的空间的,所以需要使用extroot将系统扩展到U盘上。

我使用的是pivot-root方式扩展,即整个系统都在U盘里,从U盘启动后直接安装就可以了:

opkg update && opkg install libreadline libncursesw uclibcxx libmysqlclient mysql-server 

配置

文件及目录

安装完成之后先更改一下配置文件/etc/my.conf, 主要修改datadir和tmpdir配置项, 这两个目录需要放在U盘上,最好手动建立这两个目录。

############ Don't put this on the NAND #############
# Figure out where you are going to put the databases
# And run mysql_install_db --force datadir         = /home/db/mysql/

######### This should also not go on the NAND #######
tmpdir          = /home/db/tmp/

初始化数据库

mysql_install_db --force 

初始化完成之后就可以启动了:

/etc/init.d/mysqld start 

更改root密码

mysqladmin -u root password 'new-password' 

启动和登录

mysql -u root -p 

外网访问

  • 首先需要更改一下绑定的ip,修改my.conf文件的bind-address为0.0.0.0.

  • 授权用户

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'my-password' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
  • 添加一条转发规则(路由器IP是10.2.2.1),开放3306端口:
config redirect
        option target 'DNAT'
        option src 'wan'
        option dest 'lan'
        option proto 'tcp udp'
        option src_dport '3306'
        option dest_ip '10.2.2.1'
        option dest_port '3306'
        option name 'mysql'
  • 测试
    在Windows下可以通过telnet命令检测是否可远程访问MySQL服务器:
    如telnet 10.1.1.238 3306, 如果成功将可以看到类似下面的输出:

    配置完成之后就可以通过程序连接了:

问题及解决方案

初始化数据库时失败

运行mysql_install_db --force命令时提示错误,检查了一下配置文件是没问题的,后来发现是配置文件里的tmpdir目录不存在,而MySQL不会自动创建(datadir如果不存在会自动创建),手动创建这个目录后再次执行就正常了。

表名区分大小写

因为软件需要兼容SQL Server和MySQL,项目组的成员大小写习惯也不一样,所以需要将表名的大小写敏感去掉,在my.conf文件的mysqld配置项中加一行配置:

lower_case_table_names=1

mysql命令行客户端中文乱码

由于使用了latin1字符集,使用mysql命令行客户端进行查询时,中文显示乱码。
修改/etc/my.cnf文件指定编码:

  • 在[client]字段里加入default-character-set=utf8
  • 在[mysqld]字段里加入character-set-server=utf8
  • 在[mysql]字段里加入default-character-set=utf8

重启一下mysqld就可以看到默认的编码了:

因配置文件权限错误导致mysqld不能启动

Warning: World-writable config file '/etc/my.cnf' is ignored
140817 22:21:06 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

140817 22:21:06 [ERROR] Aborting

140817 22:21:06 [Note] mysqld: Shutdown complete

将/etc/my.cnf文件的权限改成644即可。

不支持事务

OpenWrt的MySQL编译时没有添加InnoDB引擎支持,而默认的MyISAM不支持事务处理。如果需要支持事务需要自己编译并添加InnoDB引擎。
这里提供一个带InnoDB引擎的MySQL下载,是gatoti编译的,版本为5.1.53,适用于ar71xx平台,下载地址:http://robots.shuyz.com/openwrt/wr703n/non-official/MySQL_with_InnoDB/

mysql> SHOW ENGINES; +------------+---------+-------------------------------------------------------- ----+--------------+------+------------+ | Engine     | Support | Comment
    | Transactions | XA   | Savepoints |
+------------+---------+-------------------------------------------------------- ----+--------------+------+------------+ | CSV        | YES     | CSV storage engine
    | NO           | NO   | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables
    | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tabl
es  | NO           | NO   | NO         |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign k
eys | YES          | YES  | YES        |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance
    | NO           | NO   | NO         |
+------------+---------+-------------------------------------------------------- ----+--------------+------+------------+ 5 rows in set (0.01 sec) 

MySQL的默认引擎为MyISAM,如果需要改成InnoDB的话需要在my.cnf配置文件的mysqld段添加一行default-storage-engine=innodb。
如果想自己编译其它平台的可以参考他博客上的教程:MySQL InnoDB Enabled pada OpenWrt Backfire 10.03.1

参考资料


09-17 16:52