mysql安装后创建初始数据库和用户的配置方法

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

MySQL 8.0+ 安装后首次登录用的是
auth_socket
插件,不是密码

新装的 MySQL(尤其是 Ubuntu/Debian 包安装或官方 APT 源)默认禁用 root 密码登录,

root@localhost
用户使用
auth_socket
插件认证——它直接校验系统用户身份,不走密码。所以执行
mysql -u root -p
会报错
Access denied for user 'root'@'localhost'
,哪怕你记得安装时没设密码。

解决方法是临时切换到

mysqld_safe
模式跳过权限验证:

sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root

进库后立刻刷新权限并重置插件和密码:

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
EXIT;

再重启服务:

sudo systemctl restart mysql
,之后就能用密码登录了。

创建初始数据库和用户要避开
IDENTIFIED BY
语法错误

MySQL 8.0+ 废弃了老式

CREATE USER ... IDENTIFIED BY
后直接跟密码哈希的写法,也禁止在一条语句里同时建用户、赋权、设密码。必须分步:先
CREATE USER
,再
GRANT
,且密码必须明文传入
IDENTIFIED BY
(不是哈希值)。

常见错误示例(会报错

ERROR 1064
):

-- ❌ 错误:MySQL 8 不支持这种旧语法
CREATE USER 'appuser'@'localhost' IDENTIFIED BY PASSWORD '*ABC...';

正确做法:

CREATE DATABASE IF NOT EXISTS appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'strong_pass_2024';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
(仅在修改系统表后必要;
GRANT
本身已自动刷新)

远程访问需要额外放开
bind-address
和防火墙

默认配置中

bind-address = 127.0.0.1
,只允许本地连接。想让应用服务器(比如 Python 的
pymysql
或 Node.js 的
mysql2
)远程连进来,得改 MySQL 配置:

编辑
/etc/mysql/mysql.conf.d/mysqld.cnf
(Ubuntu)或
/etc/my.cnf
(CentOS),把
bind-address
改成
0.0.0.0
或具体内网 IP
创建用户时用
'appuser'@'192.168.1.%'
'appuser'@'%'
(后者不推荐生产环境)
确认系统防火墙放行 3306 端口:
sudo ufw allow 3306
(Ubuntu)或
sudo firewall-cmd --add-port=3306/tcp --permanent
(CentOS)
测试连接:
mysql -h your_mysql_ip -u appuser -p

字符集不设
utf8mb4
会导致 emoji 和部分中文乱码

MySQL 的

utf8
实际只支持最多 3 字节 UTF-8 字符(不含 emoji、某些生僻汉字),必须显式用
utf8mb4
。不只是建库时设,还要确保客户端连接也用这个字符集,否则插入 emoji 会变成
???
或报错
Incorrect string value

完整设置建议:

建库:
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
建表时也指定:
CREATE TABLE users (name VARCHAR(100)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
连接字符串里加参数:
?charset=utf8mb4
(如 Python 的
mysql://user:pass@host/db?charset=utf8mb4
检查当前连接字符集:
SHOW VARIABLES LIKE 'character_set%';
,确保
character_set_client
connection
results
都是
utf8mb4

漏掉任意一环都可能让中文或 emoji 在某一层被截断或转义。

相关推荐