MySQL安装完成后,很多人直接用root账户连接业务程序就开始开发了,这种做法在小项目里看不出问题,一旦部署到线上,权限失控带来的风险就会暴露出来。规范的流程应该是:装好数据库后先创建独立的业务数据库,再新建专用用户并授予最小必要权限,业务程序只用这个账号连接。本文以MySQL 5.7和8.0为例,完整演示这套初始配置的操作过程。

一、登录MySQL并确认安装状态
安装完成后第一步是确认服务正常、能成功登录。Linux下如果是yum或apt安装的MySQL,可以用systemctl status mysqld查看服务状态。首次登录的密码通常在日志文件里,CentOS下执行grep 'temporary password' /var/log/mysqld.log就能找到root的临时密码。Windows安装包方式则在安装向导中设置过root密码。
拿到临时密码后,用mysql -u root -p登录,第一次进去建议立刻改密码。这里有个常见的坑:MySQL 5.7之后默认开启了密码强度校验插件validate_password,密码必须包含大小写字母、数字和特殊字符,否则会报错ERROR 1819。如果只是本地测试想用简单密码,可以先执行SET GLOBAL validate_password_policy=0;降低策略再修改。
-- 修改root密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass_2024!'; -- 查看当前版本和用户 SELECT VERSION(); SELECT user, host FROM mysql.user;
执行SELECT user, host FROM mysql.user;这条语句时留意一下host列,如果出现host为百分号%的匿名用户或多余账户,建议直接删除,避免留下安全隐患。
二、创建初始数据库并指定字符集
创建数据库的关键点不是CREATE DATABASE这条语句本身,而是字符集的选择。中文环境下推荐统一使用utf8mb4而不是utf8,因为MySQL中的utf8实际上是阉割版,最多支持三个字节的Unicode字符,遇到emoji表情或生僻字会直接报错或存成问号。utf8mb4才是完整的UTF-8实现。同时建议显式指定排序规则为utf8mb4_general_ci或utf8mb4_unicode_ci,前者比较速度快,后者排序更符合语言习惯。
-- 创建业务数据库,显式指定字符集和排序规则 CREATE DATABASE IF NOT EXISTS shop_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; -- 查看数据库确认 SHOW CREATE DATABASE shop_db; -- 进入数据库 USE shop_db;
IF NOT EXISTS的作用是让脚本可以重复执行而不报错,在自动化部署脚本中特别有用。另外要注意,数据库级别的字符集只是默认值,每张表还可以单独覆盖,但为了维护方便,建议整个项目保持统一,避免出现同一库里混杂多种字符集的情况。
三、新建专用用户并授权
业务程序不应该使用root账户,这是数据库安全的基本原则。正确做法是为每个应用创建独立用户,只授予它在特定数据库上的权限。用户由用户名和主机两部分组成,'app_user'@'localhost'和'app_user'@'192.168.1.%'是两个不同的账户,这一点初学者经常混淆。
这里有一个版本差异必须说明。在MySQL 5.7及之前,可以用GRANT直接创建用户并授权,一条语句搞定。但MySQL 8.0移除了这个特性,必须先CREATE USER再GRANT,分两步执行,否则会报语法错误。为了兼容性和习惯统一,建议无论哪个版本都按两步来写。
-- 创建用户,限制只能从192.168.1网段连接 CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppUser_Pass_88'; -- 授予shop_db库的全部权限 GRANT ALL PRIVILEGES ON shop_db.* TO 'app_user'@'192.168.1.%'; -- 如果只需要读写,不需要建表删表,权限可以更细 GRANT SELECT, INSERT, UPDATE, DELETE ON shop_db.* TO 'app_user'@'192.168.1.%'; -- 刷新权限(修改user表后需要,GRANT本身可省略) FLUSH PRIVILEGES;
授权粒度可以精确到表甚至列,通配符shop_db.*表示整个库,*. *(写作*.*时注意中间不能有空格)表示全局权限。host部分尽量避免直接写百分号%,也就是允许任意主机连接,除非确实有分布式访问需求。生产环境更稳妥的方式是写具体网段或开启SSH隧道访问。MySQL 8.0默认的认证插件是caching_sha2_password,如果客户端驱动较老连接不上,可以在创建用户时加IDENTIFIED WITH mysql_native_password BY '密码'来兼容。
四、验证配置并做收尾工作
配置完成后不要急着投入使用,先用新账号实际连接一次验证权限是否符合预期。在命令行执行mysql -u app_user -p -h 数据库IP,登录后尝试SHOW DATABASES;,正常情况下只能看到shop_db和information_schema,看不到其他库,这说明权限隔离生效了。再试着对其他库执行查询,收到ACCESS DENIED就说明配置正确。
-- 查看当前用户 SELECT CURRENT_USER(); -- 查看自己的权限 SHOW GRANTS; -- 用root查看指定用户权限 SHOW GRANTS FOR 'app_user'@'192.168.1.%';
最后还有几件收尾的事值得做。检查my.cnf配置文件中的bind-address,如果只允许本机访问就保持127.0.0.1,需要远程连接则改为服务器内网IP;确认防火墙只对可信网段开放3306端口;对于不再使用的账户及时用DROP USER清理。这些初始配置花不了十分钟,却能让整个项目的数据库权限体系从一开始就走上正轨,比出问题后再补救省心得多。
mysql创建数据库mysql用户管理mysql初始配置修改时间:2026-09-12 13:46:32