家庭网络
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
, 主要修改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
如果不存在会自动创建),手动创建这个目录后再次执行就正常了。表名区分大小写
在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就可以看到默认的编码了:
因配置文件权限错误导致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参考资料
- Solarck, 利用extroot为openwrt扩充存储空间
- OpenWRT中文应用技术网, MySQL在OpenWRT上的安装教程
- MySQL官方文档, 9.2.2. 识别符大小写敏感性
- stackoverflow, Enable remote MySQL connection
- a1354791550, MySQL latin1字符集中文乱码解决方案
- gatoti, MySQL InnoDB Enabled pada OpenWrt Backfire 10.03.1
本文为原创文章,未经允许请勿非法盗用资源。我们保护知识产权,尊重每一个创作者的劳动成果。如需转载,请务必注明出处并获得授权,谢谢合作!
作者:Lance | 发表日期:2014 年 8 月 9 日