mysql在Ubuntu上使用Snap安装并配置MySQL

来源:这里教程网 时间:2026-02-28 20:41:53 作者:

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
——连这个路径写错一个字符都会导致连接失败。

相关推荐