尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Termux上安装MariaDB:用MySQL命令在安卓手机跑数据库全指南

Termux上安装MariaDB:用MySQL命令在安卓手机跑数据库全指南 讲一个很多朋友问过的问题在Termux里执行pkg install mysql装完之后发现不对包名显示的是MariaDB命令也变成mysqld_safe然后就开始怀疑自己是不是装错了。其实没装错。Termux官方仓库早就用MariaDB完全替代了MySQL这是刻意为之——MariaDB是MySQL的一个开源分支无论命令、协议还是SQL语法都和MySQL高度兼容安装后你照样用mysql命令登录照样用3306端口提供服务。这篇文章我把自己在安卓手机上从零到一装好MariaDB、配好远程访问、踩平各种坑的完整过程写下来给想在手机上跑数据库、做轻量开发环境、或者纯粹想折腾的读者做一个可直接照抄的参考。1. 为什么Termux里装的是MariaDB而不是MySQL1.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 MySQLTermux仓库遵循开源和可分发原则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客户端命令mysqlSQL兼容性与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下载旧版Termux0.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): Cant 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-methodnormal这里说明一下几个关键点--datadir指定数据库物理文件存放目录。有些版本会从配置文件读取默认值但手动指定最稳妥。--auth-root-authentication-methodnormal让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等权限表。写入默认账号rootlocalhost初始无密码和匿名账号。生成了日志文件后续服务启动时的运行日志和错误日志都会写到这里。也就是说初始化之后你才拥有一个可启动、可连接的数据库实例。记住这个理念安装安装包 ≠ 数据库可用初始化数据目录 启动服务进程 数据库可用。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有两种常用方式方式一直接用mariadbdmariadbd --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 21 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如果你收到的报错是Cant 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 21 给脚本加可执行权限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 rootlocalhost 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 remote192.168.1.% IDENTIFIED BY strongpassword; GRANT ALL PRIVILEGES ON *.* TO remote192.168.1.% WITH GRANT OPTION; FLUSH PRIVILEGES;如果只想让特定IP访问可以把192.168.1.%换成192.168.1.100。尽量不要用remote%意味着任何IP都可以尝试登录手机又经常在公共Wi-Fi或热点环境下风险很高。第三步在电脑上连接。在电脑的数据库客户端里填主机手机的局域网IPTermux里执行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-methodnormal一套组合拳下来90%的情况能解决。如果还不行检查环境变量里是否残留了不存在的MYSQL_HOME有的话unset MYSQL_HOME再跑一次。6.2 登录时提示Access denied for user rootlocalhost初始化时用了默认的unix_socket插件认证导致你设置的密码无效。解决办法最稳妥的是先停服务用跳过权限表的方式启动pkill -f mariadbd mariadbd --skip-grant-tables --skip-networking 然后登录mysql -u root直接执行FLUSH PRIVILEGES; ALTER USER rootlocalhost 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 -ypkg有缓存机制已经下载的包不会重复下载。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、跑本地脚本、临时给项目当测试库的便利。我自己这么用了一段时间说实话打开Termuxmysqld_safe 几秒钟数据库就起来了随时mysql -u root -p进去敲几条命令很方便。相比电脑上的虚拟机手机上的数据库更轻、更安静、也更随手。但前提是你要接受它的边界IO性能受限于手机闪存和系统调度热插拔和电量管理确实会捣乱所以它更适合开发测试和个人学习不适合承载重要业务数据。如果你也打算在手机上装一个数据库按照上面的步骤走下来应该能很顺利地跑起来。装好之后不妨再试试从电脑连一次体验一下口袋里的数据库服务器的感觉。折腾有风险但把这套流程踩通一遍之后对Linux服务管理、Socket、数据库安全配置这些概念你的理解会比看十篇教程都深。
返回列表