热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多提宝贵地意见,我们一起提升,守住自己的饭碗。
正文开始
适用场景: 当您忘记了数据库系统(MySQL, Oracle, PostgreSQL)的超级管理员(如 root
, sys
, postgres
)密码,需要重置以重新获得管理权限时。
重要安全提示:
1. 权限要求: 以下操作通常需要操作系统的 root
(Linux/Unix) 或Administrator
(Windows) 权限,因为需要停止数据库服务、修改配置文件或创建特殊文件。2. 服务中断: 重置密码需要停止数据库服务。请务必在维护窗口进行操作,避免影响生产环境。 3. 生产环境谨慎: 在生产环境执行此类操作前,务必进行备份(数据库和配置文件),并在测试环境验证步骤。 4. 最小权限原则: 重置后,请立即使用新密码登录并修改为强密码。避免长时间使用临时或弱密码。 5. 审计: 记录操作过程、时间、操作人员,符合审计要求。 6. 云数据库注意: 对于云服务商托管的数据库(如 RDS, Cloud SQL, Azure Database 等),通常不提供操作系统访问权限。忘记密码时,请使用云服务商提供的管理控制台或API进行密码重置(通常有专门的功能按钮),本手册的某些步骤可能不适用。
第一部分:MySQL MariaDB 密码重置
方法一:使用 --skip-grant-tables
启动 (推荐)
这是最常用且相对安全的方法。
1. 停止 MySQL 服务: • Linux (Systemd): sudo systemctl stop mysql # 或 mysqld, mariadb• Linux (SysVinit): sudo service mysql stop # 或 mysqld, mariadb• Windows:
使用“服务”管理工具 (services.msc
) 停止 "MySQL" 或 "MariaDB" 服务,或在管理员命令提示符下:net stop MySQL2. 以跳过权限表方式启动 MySQL: • Linux: sudo mysqld_safe --skip-grant-tables --skip-networking &• --skip-networking
: 禁止远程连接,增强临时状态下的安全性(可选但强烈推荐)。• &
: 放入后台运行。• Windows:
找到 MySQL 的安装目录(如C:\Program Files\MySQL\MySQL Server X.Y\bin
),在管理员命令提示符下:
保持此窗口运行(不要关闭)。mysqld --skip-grant-tables --skip-networking3. 无密码连接 MySQL: • 打开另一个终端或命令提示符窗口。 • 连接 MySQL:
(在 Windows 上,确保在包含mysql -u rootmysql.exe
的目录下运行,或将该目录加入系统 PATH)。4. 刷新权限并重置密码 (MySQL 5.7.6+ MariaDB 10.4+):
将FLUSH PRIVILEGES; -- 必须先执行这个,让后续权限操作生效
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!';
FLUSH PRIVILEGES; -- 再次刷新'YourNewStrongPassword!'
替换为您设定的强密码。5. 重置密码 (较旧版本 MySQL < 5.7.6): FLUSH PRIVILEGES;
UPDATE mysql.user SET authentication_string = PASSWORD('YourNewStrongPassword!') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;6. 退出 MySQL: quit;7. 正常重启 MySQL 服务: • Linux ( --skip-grant-tables
窗口): 找到mysqld_safe
进程的 PID (使用ps aux | grep mysqld
),然后sudo kill PID
。或者直接sudo killall mysqld
/sudo killall mysqld_safe
。然后启动服务:sudo systemctl start mysql # 或 mysqld, mariadb• Windows ( --skip-grant-tables
窗口): 按Ctrl+C
停止运行中的mysqld
。然后使用“服务”管理工具或net start MySQL
启动服务。8. 使用新密码登录:
输入您设置的新密码。mysql -u root -p
方法二:使用 init-file
(可选)
此方法在启动时自动执行 SQL 文件修改密码,无需手动连接。
1. 创建 SQL 文件 (如 /tmp/reset_root.sql
):ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!';
-- 或者对于旧版: UPDATE mysql.user SET authentication_string = PASSWORD('...') ... (同方法一步骤5)2. 停止 MySQL 服务 (同方法一步骤1)。 3. 以 --init-file
参数启动:• Linux: sudo mysqld_safe --init-file=/tmp/reset_root.sql &• Windows: mysqld --init-file="C:\Path\To\reset_root.sql"4. 等待服务启动并执行文件后,正常停止 MySQL (可能需要观察日志确认执行完成)。 5. 移除或重命名 SQL 文件 (防止下次启动再次执行)。 6. 正常启动 MySQL 服务。 7. 使用新密码登录。
第二部分:Oracle Database 密码重置
方法一:本地操作系统认证 (最常见)
Oracle 允许属于 dba
或 oper
操作系统组的用户直接登录数据库,无需密码。oracle
用户通常在这些组里。
1. 连接到数据库服务器: 以 oracle
用户身份登录(或具有dba/oper
组权限的用户)。2. 设置 Oracle 环境变量: source /u01/app/oracle/product/19.0.0/dbhome_1/bin/oraenv # 路径根据实际安装调整
ORACLE_SID=your_sid # 设置要修改的目标数据库实例 SID
export ORACLE_SID3. 使用 SQL*Plus 以 / AS SYSDBA
连接:
这应该能直接登录到 SQL 提示符 (sqlplus as sysdbaSQL>
)。4. 修改 SYS
或其他用户密码:
将ALTER USER sys IDENTIFIED BY YourNewStrongPassword!;
ALTER USER system IDENTIFIED BY YourNewStrongPassword!; -- 通常也需要重置 SYSTEMYourNewStrongPassword!
替换为强密码。5. 退出 SQL*Plus: EXIT;
方法二:使用密码文件 (orapwd
)
如果本地认证不可用(如远程管理或特定配置),或者需要重置密码文件本身。
1. 定位并备份现有密码文件: • 默认位置: $ORACLE_HOME/dbs/orapw$ORACLE_SID
(Unix/Linux),%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora
(Windows)。• 备份: cp orapw$ORACLE_SID orapw$ORACLE_SID.bak2. 停止 Oracle 数据库实例:
如果无法用sqlplus as sysdba
SQL> SHUTDOWN IMMEDIATE;
SQL> EXIT;/ as sysdba
连接(密码文件损坏或丢失),可能需要强制终止进程(风险高,谨慎操作)。3. 使用 orapwd
工具重建密码文件:orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=YourNewStrongPassword! entries=10 force=y• file
: 新密码文件路径和名称。• password
: 为SYS
用户设置的新密码。• entries
: 密码文件中可存储的最大特权用户数。• force=y
: 覆盖已存在的密码文件。4. 启动数据库实例: sqlplus as sysdba
SQL> STARTUP;
SQL> EXIT;5. 验证:
使用新密码连接SYS
:
如果需要重置sqlplus sys/YourNewStrongPassword!@your_service as sysdbaSYSTEM
或其他用户密码,登录后用ALTER USER
修改(同方法一步骤4)。
第三部分:PostgreSQL 密码重置
PostgreSQL 通过 pg_hba.conf
文件控制认证方式。重置密码需要临时允许本地信任认证。
1. 停止 PostgreSQL 服务: • Linux (Systemd): sudo systemctl stop postgresql• Linux (SysVinit): sudo service postgresql stop• Windows:
使用“服务”管理工具 (services.msc
) 停止 "postgresql-XX" 服务,或在管理员命令提示符下:net stop postgresql-XX # XX 代表版本号,如 142. 修改 pg_hba.conf
允许本地信任认证:• 找到 pg_hba.conf
文件。常见位置:• Linux: /etc/postgresql/XX/main/pg_hba.conf
,/var/lib/pgsql/XX/data/pg_hba.conf• Windows: C:\Program Files\PostgreSQL\XX\data\pg_hba.conf• 备份该文件。 • 在文件开头附近,找到针对 localhost
(IPv4/IPv6127.0.0.1/::1
) 和local
(Unix-domain socket) 的条目,将其认证方法 (METHOD
) 临时改为trust
。例如:
确保这些行在文件顶部或没有其他更严格的规则覆盖它们。# TYPE DATABASE USER ADDRESS METHOD
# 修改前可能是 md5 或 scram-sha-256
host all all 127.0.0.1/32 trust # 修改这行
host all all ::1/128 trust # 修改这行
local all all trust # 修改这行3. 启动 PostgreSQL 服务: • Linux: sudo systemctl start postgresql• Windows: 启动 "postgresql-XX" 服务。 4. 无密码连接 PostgreSQL (作为 postgres
用户):• Linux: 切换到 postgres
系统用户:sudo -u postgres psql• Windows: 打开命令提示符(无需管理员),使用 psql
(确保在 PATH 中) 并指定用户:
由于psql -U postgrespg_hba.conf
设置为trust
,此时应无需密码即可登录到psql
提示符 (postgres=#
)。5. 重置 postgres
用户密码:
将ALTER USER postgres WITH PASSWORD 'YourNewStrongPassword!';'YourNewStrongPassword!'
替换为强密码。6. 退出 psql
:\q7. 恢复 pg_hba.conf
配置:• 停止 PostgreSQL 服务 (步骤1)。 • 将 pg_hba.conf
中刚才修改的trust
条目恢复为原来的认证方法(通常是scram-sha-256
或md5
)。• 保存文件。 8. 启动 PostgreSQL 服务 (步骤3)。 9. 使用新密码登录:
输入您设置的新密码。psql -U postgres -W # Linux 或 Windows
文中的概念来源于互联网,如有侵权,请联系我删除。
欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。
文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




