目录
说明
今天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
参考资料
- 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