讲一个很多朋友问过的问题:在Termux里执行pkg install mysql,装完之后发现不对,包名显示的是MariaDB,命令也变成mysqld_safe,然后就开始怀疑自己是不是装错了。
其实没装错。Termux官方仓库早就用MariaDB完全替代了MySQL,这是刻意为之——MariaDB是MySQL的一个开源分支,无论命令、协议还是SQL语法都和MySQL高度兼容,安装后你照样用mysql命令登录,照样用3306端口提供服务。这篇文章我把自己在安卓手机上从零到一装好MariaDB、配好远程访问、踩平各种坑的完整过程写下来,给想在手机上跑数据库、做轻量开发环境、或者纯粹想折腾的读者做一个可直接照抄的参考。
1. 为什么Termux里装的是MariaDB而不是MySQL
1.1 先讲清楚MariaDB和MySQL的"血缘关系"
很多教程直接把MySQL和MariaDB混着说,导致新手很懵。你只需要记住一个关键背景:MySQL在2009年被Oracle收购后,原核心开发团队部分成员基于当时的MySQL源码另起炉灶,创建了MariaDB。所以MariaDB从诞生那天起,就兼容MySQL的协议、SQL语法和常用命令。
这意味着什么呢?意味着你在Termux里pkg install mariadb之后,日常操作根本不需要改变习惯——登录还是mysql -u root,建库建表还是CREATE DATABASE,备份还是mysqldump。甚至Termux打包时为了让老用户顺手,会把客户端命令直接做成mysql,你敲mysql --version出来的是MariaDB的版本号,仅此而已。
1.2 为什么Termux官方不打包Oracle MySQL
Termux仓库遵循开源和可分发原则,M有ora MySQL 8.x属于Oracle的商业授权体系,直接二进制分发包进Termux仓库有各种合规风险。MariaDB不仅完全开源,而且在资源占用、安装体积上对手机更友好。
这里涉及一个常见认知误区:有人觉得"MySQL官方版才是正版,MariaDB是替代品所以不行"。放在服务器场景,两者各有取舍;但在Termux这种容器环境里,MariaDB是唯一正确选择——官方源维护、依赖完整、升级省心。如果你强行去装Oracle MySQL的Linux二进制包(从官网下载的),大概率会碰到glibc版本不兼容、Systemd依赖、文件权限路径等一堆问题,完全不值得。
另外提一句,现在很多云数据库、开源项目(比如WordPress、Nextcloud)默认推荐或直接支持MariaDB,所以不用担心学了这个没人用。
1.3 版本对应关系
| 项目 | Termux环境下的实际情况 |
|---|---|
| 官方安装包名 | mariadb(已包含server和client) |
| 服务端启动命令 | mysqld_safe/mariadbd |
| 客户端命令 | mysql |
| SQL兼容性 | 与MySQL 5.7/8.0常用特性兼容 |
| 默认端口 | 3306 |
| 配置文件 | $PREFIX/etc/my.cnf |
| 数据目录 | $PREFIX/var/lib/mysql |
这个表建议收藏,后面很多坑都和路径有关。
2. 安装前的准备:先把Termux环境调到能装库的状态
2.1 更新源和软件包
很多人装失败,第一步就错了——直接pkg install mariadb,结果提示找不到包、或者下载一半中断、或者依赖冲突。Termux的包仓库更新很频繁,尤其是你很久没打开Termux的话,本地索引早就过期了。
我的习惯是先跑一次:
pkg update -y && pkg upgrade -ypkg upgrade需要耐心,Termux会把所有已装包更新到与当前仓库匹配的版本。这里有一个非常实际的建议:如果网络慢,先把Termux的软件源换成国内镜像。默认的源大多在国外,安卓手机上访问经常超时。
换源操作很简单,Termux提供了官方支持的一键切换:
termux-change-repo选择镜像站点列表里的清华TUNA或中科大镜像,确认后返回。之后再跑pkg update会明显感觉到速度差异。
如果pkg upgrade过程中卡住或报错,多半是某个包版本冲突,我遇到过一次是因为openssl更新到新版本导致旧包依赖不满足。这种时候可以考虑清理缓存后重试:
pkg clean pkg update -y pkg upgrade -y2.2 存储权限和目录规划
Termux安装的软件和数据默认都在自己的私有目录下,路径一般为/data/data/com.termux/files/usr,这个目录对普通用户可写,不需要root权限。用pkg安装的MariaDB数据目录默认在:
/data/data/com.termux/files/usr/var/lib/mysql日常使用中,不太建议手动把数据库目录改到手机共享存储(/sdcard)。原因有两个:
- Android的共享存储有权限隔离和文件扫描机制,数据库引擎需要随机读写大量小文件,放在exFAT/FUSE文件系统上会明显变慢,严重时会导致表损坏。
- 手机系统重启或应用被清理后台后,共享存储的文件锁也可能失效。
我自己试过把datadir指到/sdcard/Download/mysql-data,跑了几天就出现Table './mysql/user' is marked as crashed,后来老老实实迁回Termux私有目录。
如果你非要改,那就在Termux里执行termux-setup-storage授权后,手动修改my.cnf,但记住:性能和安全都不如默认路径。
2.3 Android版本兼容性提醒
Termux新版对Android版本有最低要求(Android 7及以上)。如果你的手机是Android 5.1(热搜里有这个关键词),需要去F-Droid下载旧版Termux(0.118以前),但连带的限制是老版本Termux的软件源已经被归档,安装MariaDB这种持续更新的包会很麻烦。
所以对于老设备,要么接受旧仓库里的旧版本数据库(可能一年前就不再更新,存在已知漏洞),要么换个思路去用UserLAnd或Termux内装Ubuntu虚拟机,但这样又绕回了proot的性能问题。一句话:真想玩数据库,尽量用Android 8以上的手机。
3. 从pkg install mariadb到mysql_install_db的完整流程
3.1 安装命令和首次检查
准备工作做完,正式安装:
pkg install mariadb -y安装过程会自动拉取依赖,包括libmariadb、libc++等。装完后先验证一下核心命令是否存在:
mysql --version mariadbd --version如果都能输出版本号(比如mysql Ver 15.1 Distrib 10.6.x-MariaDB),说明安装成功。此刻如果直接执行mysql -u root,大概率会报错:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket原因是服务端还没启动,而且数据库目录还没初始化。很多新手卡在这一步,以为装完就能连,实际上Debian系/Arch系的MySQL/MariaDB在安装完成后往往自动初始化了,但在Termux里没有systemd,这个过程需要手动完成。这也是下面要重点讲的。
3.2 初始化数据目录:mysql_install_db的完整参数
Termux在安装mariadb包后,不会自动帮你跑初始化脚本。你需要手动执行:
mysql_install_db --datadir=$PREFIX/var/lib/mysql --auth-root-authentication-method=normal这里说明一下几个关键点:
--datadir指定数据库物理文件存放目录。有些版本会从配置文件读取默认值,但手动指定最稳妥。--auth-root-authentication-method=normal让root账号使用传统密码认证方式,而不是默认的unix_socket插件认证。Termux环境中unix_socket插件经常导致你明明装了数据库却无法用密码登录,所以直接指定normal更省心。- 如果提示数据目录已存在且非空,通常说明之前初始化过,需要先备份旧数据再删除重来:
mv $PREFIX/var/lib/mysql $PREFIX/var/lib/mysql.bak然后重新mysql_install_db。注意不要在生产数据上乱试,这条命令就是"格式化"数据库目录。
初始化完成后,$PREFIX/var/lib/mysql下会出现mysql、performance_schema等系统库目录,以及ibdata1、aria_log_ctl等文件。看到这些就说明初始化成功了。
3.3 理解初始化到底做了什么
如果把数据库比作一个刚租下的商铺,mysql_install_db就是开张前的"硬装":
- 创建了系统表空间
ibdata1,存放数据字典和回滚信息。 - 建好了
mysql库,里面有user、db、tables_priv等权限表。 - 写入默认账号:root(localhost,初始无密码)和匿名账号。
- 生成了日志文件,后续服务启动时的运行日志和错误日志都会写到这里。
也就是说,初始化之后你才拥有一个可启动、可连接的数据库实例。记住这个理念:安装安装包 ≠ 数据库可用,初始化数据目录 + 启动服务进程 = 数据库可用。
4. 把服务跑起来:mysqld_safe、Socket与开机自启
4.1 为什么没有service mysql start,以及mysqld_safe和mysqld的区别
在普通的Linux服务器上,你习惯了systemctl start mysqld或service mysql start,但在Termux里没有systemd,也没有init.d,所以需要手动启动服务。
Termux里启动MariaDB有两种常用方式:
方式一:直接用mariadbd
mariadbd --datadir=$PREFIX/var/lib/mysql这是服务端的主程序,但它默认前台运行,终端窗口会被占住,而且日志直接刷在当前终端。
方式二:用mysqld_safe(推荐日常使用)
mysqld_safe --datadir=$PREFIX/var/lib/mysql &mysqld_safe是一个包装脚本,它会在后台拉起mariadbd,同时帮你处理日志输出、崩溃后自动重启等细节。加上&后终端不会被占住,适合手机这种场景。
提示:如果
mysqld_safe提示--datadir参数已被忽略,一般是因为配置文件my.cnf里已经写死了datadir路径,此时直接敲mysqld_safe &即可。
为了更好排障,建议启动时把日志输出重定向到文件:
nohup mysqld_safe --datadir=$PREFIX/var/lib/mysql > $PREFIX/var/log/mysql-error.log 2>&1 &nohup确保退出当前shell后进程不会立刻被杀,这在手机Termux环境里尤其重要——你切到其他App,后台进程不至于马上被回收。
4.2 确认启动成功:socket、端口、进程三连查
启动后别急着登录,先做三个检查:
# 1. 查进程 ps aux | grep mariadbd # 2. 查端口 netstat -tlnp | grep 3306 # 3. 用mysqladmin发一个ping mysqladmin ping如果输出mysqld is alive,说明服务真正起来了。此时再登录:
mysql -u root因为初始化时root没有密码,这一步应该能直接进到MariaDB [(none)]>提示符。能走到这里,安装阶段就算通关了。
4.3 遇到连接失败先看socket路径
Termux环境里MariaDB默认的socket文件路径是:
/data/data/com.termux/files/usr/tmp/mysql.sock如果你收到的报错是Can't connect to local MySQL server through socket '/data/data/com.termux/files/usr/tmp/mysql.sock',几乎可以确定是服务进程没有在运行,而不是路径不对。这时候优先去看日志:
tail -n 50 $PREFIX/var/log/mysql-error.log日志里通常写着真正的原因,比如数据目录权限不对、端口被占用、磁盘空间不足等。别对着socket报错瞎改路径,先把服务跑起来再说。
4.4 让Termux启动后自动拉起数据库
手机重启进入Termux后,如果不想每次手动敲命令,可以用Termux:Boot插件实现开机自启:
- 在F-Droid安装
Termux:Boot,在系统设置里允许自启动和后台运行。 - 创建启动脚本目录:
mkdir -p $PREFIX/etc/termux/boot- 在该目录下创建一个脚本
start-mariadb.sh:
#!/data/data/com.termux/files/usr/bin/bash nohup mysqld_safe --datadir=$PREFIX/var/lib/mysql > $PREFIX/var/log/mysql-error.log 2>&1 &- 给脚本加可执行权限:
chmod +x $PREFIX/etc/termux/boot/start-mariadb.sh以后开机会自动运行这个脚本。实测在Android 13上,偶尔会因为电池优化把Termux:Boot掐死,所以在系统设置里把Termux相关App的电池优化改成"不受限制",成功率会高很多。
5. 安全配置:root密码、匿名用户与远程访问授权
5.1 登录后第一件事:设置root密码并清理匿名账号
刚初始化的数据库,root在localhost上无密码,并且存在匿名用户,这台数据库可以说完全裸奔。修改密码用标准SQL即可:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码'; DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;其中第一行是把root密码改成你指定的值,第二行删除所有空用户名的匿名账号,第三行让权限表改动立即生效。
你也可以走交互式安全脚本:
mysql_secure_installation但要注意,这个脚本在Termux环境有时会因为权限探测问题卡在开头,手动执行SQL反而更快。执行完FLUSH PRIVILEGES后退出,再用mysql -u root -p验证新密码是否生效。
5.2 让电脑通过局域网连接手机里的数据库
方便之处在于,你可以在电脑上用Navicat、DBeaver、MySQL Workbench(热搜里有这个词)直接连手机里的数据库,把手机当成一台便携数据库服务器。
一共三步:
第一步:修改监听地址。
默认配置下MariaDB只监听127.0.0.1,外部连接不进来。编辑配置文件:
nano $PREFIX/etc/my.cnf在[mysqld]段下加一行:
bind-address = 0.0.0.0然后重启数据库:
pkill -f mariadbd mysqld_safe --datadir=$PREFIX/var/lib/mysql &第二步:创建远程登录账号。
不要用root远程登录,单独建一个账号,并指定允许的来源IP,比如只允许你电脑所在网段访问:
CREATE USER 'remote'@'192.168.1.%' IDENTIFIED BY 'strongpassword'; GRANT ALL PRIVILEGES ON *.* TO 'remote'@'192.168.1.%' WITH GRANT OPTION; FLUSH PRIVILEGES;如果只想让特定IP访问,可以把'192.168.1.%'换成'192.168.1.100'。尽量不要用'remote'@'%',意味着任何IP都可以尝试登录,手机又经常在公共Wi-Fi或热点环境下,风险很高。
第三步:在电脑上连接。
在电脑的数据库客户端里填:
- 主机:手机的局域网IP(Termux里执行
ifconfig或ip addr查看) - 端口:3306
- 用户:remote
- 密码:刚才设置的密码
能连通后注意,千万别把你的数据库端口在路由器上做端口映射,手机数据库暴露到公网就是妥妥的安全事故。在同一个局域网里用用就够了。
5.3 手机上的数据库的额外注意点
- 锁屏断连问题:Android会杀掉占用CPU的后台进程,即使有
nohup和mysqld_safe,重度省电策略下数据库进程仍可能被冻结。建议在系统设置里关闭Termux的电池优化,或者在Termux里用termux-wake-lock保持CPU唤醒。 - 数据备份:手机端数据库最大的优势是随身携带,最脆弱的是手机丢了/摔了/恢复出厂。建议定期执行:
mysqldump -u root -p --all-databases > $HOME/db_backup_$(date +%Y%m%d).sql把备份文件传到电脑或网盘一份。
6. 实测排坑:Termux装MariaDB最常见的五个问题
6.1 初始化时报"FATAL ERROR: Could not find my_print_defaults"
看到这个报错,说明mariadb包的默认配置工具没找到,大概率是安装不完整或旧缓存污染。我的处理方式:
pkg remove mariadb -y pkg clean pkg install mariadb -y mysql_install_db --datadir=$PREFIX/var/lib/mysql --auth-root-authentication-method=normal一套组合拳下来,90%的情况能解决。如果还不行,检查环境变量里是否残留了不存在的MYSQL_HOME,有的话unset MYSQL_HOME再跑一次。
6.2 登录时提示"Access denied for user 'root'@'localhost'"
初始化时用了默认的unix_socket插件认证,导致你设置的密码无效。解决办法最稳妥的是先停服务,用跳过权限表的方式启动:
pkill -f mariadbd mariadbd --skip-grant-tables --skip-networking &然后登录:
mysql -u root直接执行:
FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('新密码'); FLUSH PRIVILEGES;接着pkill -f mariadbd,再正常启动mysqld_safe &,用新密码登录。
6.3 端口3306被占用
启动日志里出现Bind on unix socket: Address already in use或bind() failed,多半是之前某个mysqld进程还活着。先杀掉再启动:
pkill -9 mariadbd sleep 2 mysqld_safe --datadir=$PREFIX/var/lib/mysql &如果还是没有3306,那就看看是不是有其他服务占用了端口(比如你自己跑了另一个数据库实例)。可以用ss -tlnp | grep 3306查看。
6.4 安装包下载慢或pkg install中断
Termux包仓库体积不小,弱网环境下非常容易中断。除了换国内源,也可以设置pkg镜像自动重试:
pkg update --allow-unauthenticated -y一般换源加清缓存就足够,如果还经常断,就多执行几次pkg install mariadb -y,pkg有缓存机制,已经下载的包不会重复下载。
6.5 数据库连接正常但中文乱码
数据库默认字符集是latin1,如果你要存中文,需要在my.cnf的[mysqld]段里加:
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci同时建议建库时显式指定字符集:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;重启数据库后,再用SHOW VARIABLES LIKE 'character_set%';确认所有字符集相关变量已经切换成utf8mb4。这一步对移动端开发做笔记、记录日志的场景尤其重要。
写在最后
最后说一个真实感受。很多人在手机Termux里装数据库,目的其实不是真拿它跑生产环境,而是图一个可以随时练SQL、跑本地脚本、临时给项目当测试库的便利。我自己这么用了一段时间,说实话,打开Termux,mysqld_safe &,几秒钟数据库就起来了,随时mysql -u root -p进去敲几条命令,很方便。相比电脑上的虚拟机,手机上的数据库更轻、更安静、也更"随手"。但前提是,你要接受它的边界:IO性能受限于手机闪存和系统调度,热插拔和电量管理确实会捣乱,所以它更适合开发测试和个人学习,不适合承载重要业务数据。
如果你也打算在手机上装一个数据库,按照上面的步骤走下来应该能很顺利地跑起来。装好之后不妨再试试从电脑连一次,体验一下"口袋里的数据库服务器"的感觉。折腾有风险,但把这套流程踩通一遍之后,对Linux服务管理、Socket、数据库安全配置这些概念,你的理解会比看十篇教程都深。