Linux环境下如何设置数据库用户名及密码,有哪些详细步骤和注意事项?

更新于
2026-08-15 02:40:17
3阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

一、为什么要在 Linux 下重新设置数据库使用者名和密码?

在实际运维和开发过程中。常见的痛点包括:

  • 忘记了 MySQL 或 PostgreSQL 的 root密码,导致无法登录。
  • 默认的弱密码被暴露,容易成为攻击目标。
  • 新建项目需要独立的数据库账号,却不清楚如何安全地创建并授予最小权限。
  • 修改密码后忘记刷新权限,导致新密码立即失效。不过,

下面提供一套 完整、可复制 的操作步骤。帮助你尽快处理以上问题,

Linux环境下如何设置数据库用户名及密码,有哪些详细步骤和注意事项?

二、准备工作

1. 确认已安装对应的数据库软件

以下示例以 MySQL 为主,PostgreSQL 部分在文末给出对应命令。

# 对于基于 Debian/Ubuntu 的程序
sudo apt update
sudo apt install -y mysql-server
# 对于基于 RHEL/CentOS 的程序
sudo yum install -y mysql-server
# 开启服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

2. 获取管理员权限

所有后续操作都需要以程序 root 或拥有 sudo 权限的使用者执行。

三、登录 MySQL 并检查当前状态

1. 查看 MySQL 服务是否运行

# 检查状态
sudo systemctl status mysqld # 或 mysql.service

2. 使用默认方式登录

如果是全新安装且没有设置 root 密码,可直接:

# 直接进入 MySQL 控制台
mysql -u root

3. 若已有密码但忘记了怎么办?

安全模式下重置 root 密码:

Linux环境下如何设置数据库用户名及密码,有哪些详细步骤和注意事项?
  1. 停止 MySQL 服务:
    sudo systemctl stop mysqld
  2. 以跳过授权表的方式启动:
    sudo mysqld_safe --skip-grant-tables &
  3. 打开一个新终端,用无密码登录:
    mysql -u root
  4. 切换到 mysql 数据库并更新密码:
    USE mysql;UPDATE user SET auntication_string=PASSWORD WHERE User='root';FLUSH PRIVILEGES;
  5. 退出并重新开启服务:
    \q
    sudo systemctl start mysqld
  6. 此时使用新密码登录即可:

四、创建普通数据库使用者并设置密码

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

六、PostgreSQL 使用者与密码管理

A) 登录 PostgreSQL 超级使用者

# 切换到 postgres 程序使用者并进入 psql:
sudo -i -u postgres
psql
\password postgres # 按提示输入新密码并确认。\q # 退出 psql。exit # 返回普通使用者。

B) 创建普通使用者并授予权限

#
进入 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 登录
- 确认输入的密码是否正确
- 按第 § 4‑1 节重置根密码
- 检查/etc/mysql/my.cnfskip-grant-tables是否仍然开启,完成后删除该行并重新启动
ERROR 1049 : Unknown database 'mydb' - 数据库名称拼写错误 - 数据库尚未创建 - 使用 CREATE DATABASE mydb; 创建后再授权

或检查 `SHOW DATABASES;` 列表确认名称,

FATAL: password auntication failed for user "newuser" - PostgreSQLpghba.conf中 auth 方法不匹配
- 密码输入错误 - 编辑
/var/lib/pgsql/data/pg
hba.conf将对应条目改为md5scram-sha-256接下来systemctl reload postgresql
- 使用
psql -U newuser -W输入正确口令 ERROR 2006 : MySQL server has gone away - 长时间空闲导致连接超时
- 配置文件中
waittimeout太低 - 在/etc/mysql/my.cnf中适当增大waittimeout。如设为 28800 秒,接下来重新启动。 Access denied for user ''@'localhost' - 客户端未传递使用者名或密码,如直接执行mysql - 必须明确指定使用者名:mysql -u root -p Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'" - 服务未启动或 socket 方法不匹配 - 确认服务状态;如方法不同,可在客户端使用 --socket=/path/to/socket

八、常用方法建议

  • "最小特权原则": 给每个业务账号仅授予其所需的最小权限。避免全局 "ALL PRIVILEGES".
  • Password Complexity: 长度 ≥12 位,包含大小写字母、数字和特殊字符。定期更换,可以使用工具如
  • MFA / SSH 隧道: 生产环境建议通过 SSH 隧道或 VPN 接入数据库,不直接暴露端口。
  • .my.cnf 安全存储: 如果必须在脚本中免交互登录,可在根目录下创建 .my.cnf 并严格 chmod 600;内容示例:
    
    user=root
    password=StrongRootPass!host=127.0.0.1
    socket=/var/run/mysqld/mysqld.sock
    ]
    避免将明文放入版本控制程序。


标签:密码

一、为什么要在 Linux 下重新设置数据库使用者名和密码?

在实际运维和开发过程中。常见的痛点包括:

  • 忘记了 MySQL 或 PostgreSQL 的 root密码,导致无法登录。
  • 默认的弱密码被暴露,容易成为攻击目标。
  • 新建项目需要独立的数据库账号,却不清楚如何安全地创建并授予最小权限。
  • 修改密码后忘记刷新权限,导致新密码立即失效。不过,

下面提供一套 完整、可复制 的操作步骤。帮助你尽快处理以上问题,

Linux环境下如何设置数据库用户名及密码,有哪些详细步骤和注意事项?

二、准备工作

1. 确认已安装对应的数据库软件

以下示例以 MySQL 为主,PostgreSQL 部分在文末给出对应命令。

# 对于基于 Debian/Ubuntu 的程序
sudo apt update
sudo apt install -y mysql-server
# 对于基于 RHEL/CentOS 的程序
sudo yum install -y mysql-server
# 开启服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

2. 获取管理员权限

所有后续操作都需要以程序 root 或拥有 sudo 权限的使用者执行。

三、登录 MySQL 并检查当前状态

1. 查看 MySQL 服务是否运行

# 检查状态
sudo systemctl status mysqld # 或 mysql.service

2. 使用默认方式登录

如果是全新安装且没有设置 root 密码,可直接:

# 直接进入 MySQL 控制台
mysql -u root

3. 若已有密码但忘记了怎么办?

安全模式下重置 root 密码:

Linux环境下如何设置数据库用户名及密码,有哪些详细步骤和注意事项?
  1. 停止 MySQL 服务:
    sudo systemctl stop mysqld
  2. 以跳过授权表的方式启动:
    sudo mysqld_safe --skip-grant-tables &
  3. 打开一个新终端,用无密码登录:
    mysql -u root
  4. 切换到 mysql 数据库并更新密码:
    USE mysql;UPDATE user SET auntication_string=PASSWORD WHERE User='root';FLUSH PRIVILEGES;
  5. 退出并重新开启服务:
    \q
    sudo systemctl start mysqld
  6. 此时使用新密码登录即可:

四、创建普通数据库使用者并设置密码

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

六、PostgreSQL 使用者与密码管理

A) 登录 PostgreSQL 超级使用者

# 切换到 postgres 程序使用者并进入 psql:
sudo -i -u postgres
psql
\password postgres # 按提示输入新密码并确认。\q # 退出 psql。exit # 返回普通使用者。

B) 创建普通使用者并授予权限

#
进入 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 登录
- 确认输入的密码是否正确
- 按第 § 4‑1 节重置根密码
- 检查/etc/mysql/my.cnfskip-grant-tables是否仍然开启,完成后删除该行并重新启动
ERROR 1049 : Unknown database 'mydb' - 数据库名称拼写错误 - 数据库尚未创建 - 使用 CREATE DATABASE mydb; 创建后再授权

或检查 `SHOW DATABASES;` 列表确认名称,

FATAL: password auntication failed for user "newuser" - PostgreSQLpghba.conf中 auth 方法不匹配
- 密码输入错误 - 编辑
/var/lib/pgsql/data/pg
hba.conf将对应条目改为md5scram-sha-256接下来systemctl reload postgresql
- 使用
psql -U newuser -W输入正确口令 ERROR 2006 : MySQL server has gone away - 长时间空闲导致连接超时
- 配置文件中
waittimeout太低 - 在/etc/mysql/my.cnf中适当增大waittimeout。如设为 28800 秒,接下来重新启动。 Access denied for user ''@'localhost' - 客户端未传递使用者名或密码,如直接执行mysql - 必须明确指定使用者名:mysql -u root -p Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'" - 服务未启动或 socket 方法不匹配 - 确认服务状态;如方法不同,可在客户端使用 --socket=/path/to/socket

八、常用方法建议

  • "最小特权原则": 给每个业务账号仅授予其所需的最小权限。避免全局 "ALL PRIVILEGES".
  • Password Complexity: 长度 ≥12 位,包含大小写字母、数字和特殊字符。定期更换,可以使用工具如
  • MFA / SSH 隧道: 生产环境建议通过 SSH 隧道或 VPN 接入数据库,不直接暴露端口。
  • .my.cnf 安全存储: 如果必须在脚本中免交互登录,可在根目录下创建 .my.cnf 并严格 chmod 600;内容示例:
    
    user=root
    password=StrongRootPass!host=127.0.0.1
    socket=/var/run/mysqld/mysqld.sock
    ]
    避免将明文放入版本控制程序。


标签:密码