如何启用及调整SQL中系统目录的直接修改功能
关于直接修改SQL系统目录的操作说明
首先必须严肃提醒:直接修改SQL系统目录是极度危险的操作,可能导致数据库损坏、数据永久丢失、后续版本升级失败,只有在你完全清楚后果,且已经做好完整备份的前提下,才考虑进行以下操作。
1. 启用对SQL系统目录的直接修改操作
不同数据库系统的启用方式差异很大,以下是主流数据库的操作步骤:
SQL Server
- 首先开启高级配置选项:
sp_configure 'show advanced options', 1; RECONFIGURE; - 然后启用系统表更新权限:
sp_configure 'allow updates', 1; RECONFIGURE; - 注意:SQL Server 2005及之后版本官方已不推荐直接修改系统表,上述操作仅能在单用户模式下生效。你需要重启SQL Server服务,并在启动参数中添加
-m(单用户模式),才能实际对系统表执行修改操作。
PostgreSQL
- 找到PostgreSQL的配置文件
postgresql.conf(位置根据操作系统不同而变化,比如Linux下通常在/var/lib/postgresql/<version>/main/) - 修改或添加参数:
allow_system_table_mods = on - 重启PostgreSQL服务,之后超级用户(
postgres)即可直接修改系统目录表。
MySQL
- MySQL的系统目录(如
mysql库下的user、db等表)默认允许超级用户直接修改,但需要注意:- 若要修改InnoDB相关的系统表(如
innodb_table_stats),可能需要先设置innodb_force_recovery参数(仅限紧急修复场景) information_schema是虚拟视图,无法直接修改,只能通过修改底层mysql库的表来间接调整相关配置
- 若要修改InnoDB相关的系统表(如
2. 调整SQL系统目录直接修改的相关配置
针对不同数据库,调整配置的方式如下:
SQL Server
- 操作完成后务必关闭系统表更新权限:
sp_configure 'allow updates', 0; RECONFIGURE; sp_configure 'show advanced options', 0; RECONFIGURE; - 移除单用户模式启动参数:修改SQL Server服务的启动选项,去掉
-m,然后重启服务回到多用户模式。
PostgreSQL
- 操作完成后,务必将
postgresql.conf中的参数改回默认值:allow_system_table_mods = off - 重启PostgreSQL服务,恢复系统目录的只读保护。
MySQL
- 若设置了
innodb_force_recovery,修复完成后需将其改回0(默认值),然后重启服务 - 限制系统表修改权限:通过
GRANT语句收回普通用户对mysql库的修改权限,仅保留超级用户的相关权限:REVOKE ALL ON mysql.* FROM '普通用户名'@'localhost'; FLUSH PRIVILEGES;
再次强调:除非是紧急修复或数据库专家指导下的操作,否则绝对不要直接修改系统目录。执行任何操作前,一定要对数据库进行完整备份。
内容的提问来源于stack exchange,提问作者Bodhi




