# 检查状态
sudo systemctl status mysqld # 或 mysql.service
2. 使用默认方式登录
如果是全新安装且没有设置 root 密码,可直接:
# 直接进入 MySQL 控制台
mysql -u root
3. 若已有密码但忘记了怎么办?
安全模式下重置 root 密码:
停止 MySQL 服务:
sudo systemctl stop mysqld
以跳过授权表的方式启动:
sudo mysqld_safe --skip-grant-tables &
打开一个新终端,用无密码登录:
mysql -u root
切换到 mysql 数据库并更新密码:
USE mysql;UPDATE user SET auntication_string=PASSWORD WHERE User='root';FLUSH PRIVILEGES;
退出并重新开启服务:
\q
sudo systemctl start mysqld
此时使用新密码登录即可:
四、创建普通数据库使用者并设置密码
1. 登录为 root 并切换到 mysql 库
# 登录
mysql -u root -p
# 切换库
USE mysql;
2. 创建使用者语法
<代码示例>
# 语法:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'StrongP@ssw0rd';# 如果希望允许远程登录,可改为 '%' 或具体 IP:
CREATE USER 'newuser'@'%' IDENTIFIED BY 'StrongP@ssw0rd';
3. 授予最小必要权限
A. 只读访问某个库:
GRANT SELECT ON mydb.* TO 'newuser'@'localhost';
B. 读写访问某个库:
GRANT SELECT。INSERT,UPDATE,DELETE ON mydb.* TO 'newuser'@'localhost';
C. 全部权限:
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION;
⚠️ 注意事项:
`WITH GRANT OPTION` 让该使用者可以再授权他人。除非真的需要,否则请勿使用。怎么说呢,
`localhost` 限制只能本机连接;若业务需要远程访问,请使用具体 IP 或 `%` 并做好防火墙限制。
*每次授权后一定要执行* FLUSH PRIVILEGES; 使更改立即生效。
4. 刷新权限缓存
# 执行一次即可
FLUSH PRIVILEGES;
\q # 退出 MySQL 控制台
五、验证账号是否生效
A) 本地登录测试
# 使用新建账号登录
mysql -u newuser -p
# 输入上一步设定的 StrongP@ssw0rd,即可进入控制台。\q
B) 权限验证
# 登录后尝试写入操作,会被拒绝:
INSERT INTO mydb.test VALUES;# Expected output:
ERROR 1142 : INSERT command denied to user 'newuser'@'localhost' for table 'test'
# 再尝试查询则正常:
SELECT * FROM mydb.test;# 正常返回结果,\q
#
进入 psql:
psql -U postgres
-- 创建使用者并设定密码:
CREATE USER newuser WITH PASSWORD 'StrongP@ssw0rd';-- 授予对特定数据库的全部权限:
GRANT ALL PRIVILEGES ON DATABASE mydb TO newuser;-- 若只想授予只读:
GRANT CONNECT ON DATABASE mydb TO newuser;GRANT USAGE ON SCHEMA public TO newuser;GRANT SELECT ON ALL TABLES IN SCHEMA public TO newuser;\q # 退出 psql。exit # 返回普通 shell。
⚠️ PostgreSQL 常见坑:
`pg_hba.conf` 中的认证方式必须与实际需求匹配,否则即使账号正确也会被拒绝连接。
`ALTER ROLE` 可用于修改已有使用者的口令或属性,例如:
ALTER ROLE newuser WITH PASSWORD 'AnorPass!',
一样需要重新加载配置 `SELECT pg_reload_conf;`,
七、常见错误及排查技巧
错误现象 / 提示信息
可能原因
方法
ERROR 1045 : Access denied for user 'root'@'localhost'
- 密码错误
- MySQL 正在以skip-grant-tables启动但未刷新
-root被限制只能通过 socket 登录
# 检查状态
sudo systemctl status mysqld # 或 mysql.service
2. 使用默认方式登录
如果是全新安装且没有设置 root 密码,可直接:
# 直接进入 MySQL 控制台
mysql -u root
3. 若已有密码但忘记了怎么办?
安全模式下重置 root 密码:
停止 MySQL 服务:
sudo systemctl stop mysqld
以跳过授权表的方式启动:
sudo mysqld_safe --skip-grant-tables &
打开一个新终端,用无密码登录:
mysql -u root
切换到 mysql 数据库并更新密码:
USE mysql;UPDATE user SET auntication_string=PASSWORD WHERE User='root';FLUSH PRIVILEGES;
退出并重新开启服务:
\q
sudo systemctl start mysqld
此时使用新密码登录即可:
四、创建普通数据库使用者并设置密码
1. 登录为 root 并切换到 mysql 库
# 登录
mysql -u root -p
# 切换库
USE mysql;
2. 创建使用者语法
<代码示例>
# 语法:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'StrongP@ssw0rd';# 如果希望允许远程登录,可改为 '%' 或具体 IP:
CREATE USER 'newuser'@'%' IDENTIFIED BY 'StrongP@ssw0rd';
3. 授予最小必要权限
A. 只读访问某个库:
GRANT SELECT ON mydb.* TO 'newuser'@'localhost';
B. 读写访问某个库:
GRANT SELECT。INSERT,UPDATE,DELETE ON mydb.* TO 'newuser'@'localhost';
C. 全部权限:
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION;
⚠️ 注意事项:
`WITH GRANT OPTION` 让该使用者可以再授权他人。除非真的需要,否则请勿使用。怎么说呢,
`localhost` 限制只能本机连接;若业务需要远程访问,请使用具体 IP 或 `%` 并做好防火墙限制。
*每次授权后一定要执行* FLUSH PRIVILEGES; 使更改立即生效。
4. 刷新权限缓存
# 执行一次即可
FLUSH PRIVILEGES;
\q # 退出 MySQL 控制台
五、验证账号是否生效
A) 本地登录测试
# 使用新建账号登录
mysql -u newuser -p
# 输入上一步设定的 StrongP@ssw0rd,即可进入控制台。\q
B) 权限验证
# 登录后尝试写入操作,会被拒绝:
INSERT INTO mydb.test VALUES;# Expected output:
ERROR 1142 : INSERT command denied to user 'newuser'@'localhost' for table 'test'
# 再尝试查询则正常:
SELECT * FROM mydb.test;# 正常返回结果,\q
#
进入 psql:
psql -U postgres
-- 创建使用者并设定密码:
CREATE USER newuser WITH PASSWORD 'StrongP@ssw0rd';-- 授予对特定数据库的全部权限:
GRANT ALL PRIVILEGES ON DATABASE mydb TO newuser;-- 若只想授予只读:
GRANT CONNECT ON DATABASE mydb TO newuser;GRANT USAGE ON SCHEMA public TO newuser;GRANT SELECT ON ALL TABLES IN SCHEMA public TO newuser;\q # 退出 psql。exit # 返回普通 shell。
⚠️ PostgreSQL 常见坑:
`pg_hba.conf` 中的认证方式必须与实际需求匹配,否则即使账号正确也会被拒绝连接。
`ALTER ROLE` 可用于修改已有使用者的口令或属性,例如:
ALTER ROLE newuser WITH PASSWORD 'AnorPass!',
一样需要重新加载配置 `SELECT pg_reload_conf;`,
七、常见错误及排查技巧
错误现象 / 提示信息
可能原因
方法
ERROR 1045 : Access denied for user 'root'@'localhost'
- 密码错误
- MySQL 正在以skip-grant-tables启动但未刷新
-root被限制只能通过 socket 登录