应使用系统包管理器安装 mariadb-server,而非源码编译;装后需手动启用服务、运行 mysql_secure_installation 初始化安全配置,并修改 bind-address 与防火墙设置以支持远程访问,同时全程统一设为 utf8mb4 字符集。

直接用系统包管理器装,别下源码编译
绝大多数 Linux 发行版的官方仓库里都有现成打包好的 mariadb-server,版本稳定、依赖自动解决、后续升级也方便。自己编译不仅容易出错,还绕过系统更新机制,后续安全补丁得手动跟——没人这么干。
常见错误现象:systemctl start mariadb 失败,报 Failed to start mariadb.service: Unit mariadb.service not found,大概率是只装了客户端 mariadb,漏了服务端包。
- Ubuntu/Debian:运行
sudo apt update && sudo apt install mariadb-server - CentOS/RHEL 8+:用
sudo dnf install mariadb-server - CentOS/RHEL 7:用
sudo yum install mariadb-server
装完默认不启动、不设开机自启,得手动执行 sudo systemctl enable --now mariadb。
初始化安全配置必须跑 mysql_secure_installation
刚装完的 MariaDB 默认 root 密码为空,且允许本地无密码登录,还留着 test 数据库和匿名用户——这在任何环境里都是安全隐患。官方提供的 mysql_secure_installation 就是干这个的,不是可选项。
容易踩的坑:mysql_secure_installation 第一步就问 “Enter current password for root (enter for none):”,很多人直接回车,结果卡住或跳过关键步骤。正确做法是:首次运行时直接按回车(表示当前无密码),后续按提示关掉远程 root、删 test 库、禁用匿名用户。
- 如果已设过 root 密码但忘了,得先停服务:
sudo systemctl stop mariadb,再用sudo mysqld_safe --skip-grant-tables &启动跳过权限验证,进mysql -u root手动重置 - 该脚本不会动你已有的数据库,只清理默认危险配置
远程访问要开两个口子:配置文件 + 系统防火墙
MariaDB 默认绑定 127.0.0.1,只响应本地连接。想让其他机器连,得改 /etc/mysql/mariadb.conf.d/50-server.cnf(Debian/Ubuntu)或 /etc/my.cnf.d/mariadb-server.cnf(RHEL/CentOS),把 bind-address 改成 0.0.0.0 或具体 IP。
但改完还连不上?八成是防火墙拦了。MariaDB 默认用 3306 端口,得显式放行:
- ufw(Ubuntu):
sudo ufw allow 3306 - firewalld(RHEL/CentOS):
sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload
别忘了给远程用户授权:GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES; —— 注意 '%' 是通配符,不是占位符,得加单引号。
字符集建议从安装时就设成 utf8mb4
默认配置用的是 latin1 或旧版 utf8(实际只支持 BMP 字符),存 emoji、生僻汉字会丢数据或报错 Incorrect string value。这不是后期能“修好”的事,得从初始化就定死。
操作方式:在 [mysqld] 段下加两行:
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
还要在客户端段加 [client] 和 [mysql],都设 default-character-set = utf8mb4,否则命令行连进去看到的仍是乱码。
注意:utf8mb4 对索引长度有影响,比如 VARCHAR(255) 加索引可能超限,建表时得留意 innodb_large_prefix 和行格式。
MariaDB 的配置项分散在多个文件、多个段落里,改一处忘一处是常态。最稳妥的做法是:每次改完配置,用 sudo mysqld --verbose --help | grep "Default options" 确认它到底读了哪些文件,再用 SELECT @@character_set_server, @@collation_server; 在 SQL 里验结果。










