Snap安装的MySQL默认不启用服务且无传统my.cnf配置入口,须用snap set修改参数;root用户默认用auth_socket认证,需通过socket连接并执行ALTER USER切换密码认证;备份仅支持mysqldump。

Snap安装的MySQL在Ubuntu上无法启动
Snap包管理器安装的mysql(实际是mysql-server)默认不启用服务,且监听地址绑定为127.0.0.1:3306,但更关键的是:Snap版本的MySQL**不提供传统/etc/mysql/my.cnf配置入口**,所有配置必须通过snap set命令修改。直接编辑/var/snap/mysql/common/my.cnf会被忽略,重启后还原。
- 确认服务状态:
snap services mysql—— 多数情况显示inactive - 启用服务:
snap start mysql(不是systemctl start mysql) - 查看日志定位失败原因:
sudo snap logs mysql,常见报错如Can't start server: Bind on TCP/IP port: Address already in use,说明端口被其他MySQL实例(如apt安装版)占用
如何修改bind-address和root密码
Snap版MySQL不允许直接改my.cnf,所有运行时参数必须用snap set注入。但注意:部分参数(如bind-address)需配合mysql.server服务重启生效,且**不能设为0.0.0.0以外的值(如192.168.1.100)**,否则启动失败。
- 开放远程访问:
snap set mysql server.bind-address=0.0.0.0 - 设置root密码(首次初始化后才生效):
snap set mysql server.root-password="your_secure_password" - 重启服务使配置生效:
snap restart mysql - 验证绑定:
ss -tlnp | grep :3306应显示*:3306而非127.0.0.1:3306
连接失败:Access denied for user 'root'@'localhost'
Snap安装的MySQL默认使用auth_socket插件认证root用户,这意味着它**不校验密码,而是检查Unix socket所属用户**。当你用mysql -u root -p连接时,即使输对密码也会拒绝——因为客户端走TCP连接(localhost被解析为127.0.0.1),而auth_socket只认本地socket。
- 临时绕过:用
mysql -S /var/snap/mysql/common/run/mysqld.sock -u root(走socket) - 永久切换为密码认证:
mysql -S /var/snap/mysql/common/run/mysqld.sock -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;"
- 若需从远程连接,还需创建新用户:
mysql -S /var/snap/mysql/common/run/mysqld.sock -u root -e "CREATE USER 'admin'@'%' IDENTIFIED BY 'strong_pass'; GRANT ALL ON *.* TO 'admin'@'%'; FLUSH PRIVILEGES;"
数据目录不可直接访问,备份需用mysqldump
Snap应用的数据严格隔离在/var/snap/mysql/common/下,且/var/snap/mysql/current/是只读符号链接。你无法直接复制ibdata1或ib_logfile*做物理备份——Snap会阻止写入、挂载点权限受限。
- 唯一可靠备份方式:
mysqldump --socket=/var/snap/mysql/common/run/mysqld.sock -u root -p database_name > backup.sql - 恢复时注意socket路径:
mysql --socket=/var/snap/mysql/common/run/mysqld.sock -u root -p database_name - 不要尝试
chown或chmod修改/var/snap/mysql下的任何文件,Snap守护进程会重置权限
Snap版MySQL省去了手动编译和依赖管理,但把配置权收归snapd,所有操作必须绕过传统Linux习惯。最易被忽略的点是:它没有systemctl服务单元,不响应/etc/mysql/下的任何改动,且socket路径固定为/var/snap/mysql/common/run/mysqld.sock——连这个路径写错一个字符都会导致连接失败。










