家庭网络 2014 年 8 月 9 日

在OpenWrt路由器上安装和部署MySQL Server

这篇文章介绍了在OpenWrt上部署MySQL Server的过程。作者在OpenWrt的软件源上找到了编译好的mysql-server软件包,并通过使用extroot将系统扩展到U盘上,解决了空间不足的问题。之后,作者修改了配置文件中的datadir和tmpdir配置项,将它们放在了U盘上,然后通过运行mysql_install_db来初始化数据库,并启动了MySQL Server。最后,作者还介绍了如何更改root密码。

说明

今天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, 主要修改datadirtmpdir配置项, 这两个目录需要放在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
mysql test
mysql test

外网访问

  • 首先需要更改一下绑定的ip,修改my.conf文件的bind-address0.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, 如果成功将可以看到类似下面的输出:

    remote test 1
    remote test 1

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

问题及解决方案

初始化数据库时失败

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

表名区分大小写

在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。

因为软件需要兼容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就可以看到默认的编码了: encode

因配置文件权限错误导致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

参考资料