我在 CentOS 上全新安装了 Oracle 11gr2_x64。安装完成后,我想提高效率,并开始导入我的转储。其中一个转储导致字符集错误,因此我尝试将系统字符集更改为转储中指定的字符集。
我运行了如下语句:
UPDATE nls_database_parameters SET parameter='WS....' WHERE parameter=’NLS_CHARACTERSET’;
如您所见:我在参数列中写入了字符集的值,而不是值列。我想我只是过多地考虑了这个问题,而没有检查我在那里输入的内容。查询后,参数“NLS_CHARACTERSET”消失了,服务器报告字符集为“(null)”。
我想将“NLS_CHARACTERSET”参数放回表中,但不知道如何操作。如果我尝试这样做
INSERT INTO nls_database_parameters (PARAMETERS, VALUE) VALUES ("NLS_CHARACTERSET", "AL32UTF8");
我收到错误:
Fehler bei Befehlszeile:1 Spalte:84
Fehlerbericht:
*Cause: SQL-Fehler: ORA-00984: Spalte hier nicht zulässig
*Action: 00984. 00000 - "column not allowed here"
抱歉,错误消息是德文,但它包含 Oracle 错误代码。
你知道我该如何修复它吗?
谢谢并致以最诚挚的问候
马可
答案1
您的第一个错误是修改 SYS 拥有的对象。您不应该更新/删除/截断任何由 SYS 拥有的对象除非支持人员明确说明。Oracle 提供 API(程序包)和 DDL 命令(ALTER DATABASE 等)来与系统对象交互,您不应使用其他任何内容。
现在,这不是更改数据库字符集的方法。谷歌上的第一个搜索结果“oracle 更改字符集”提供了如何更改字符集的示例。
由于这是全新安装,我建议您硬着头皮重新安装一个具有所需字符集的干净数据库。如果您真的不想重新安装,我建议您联系支持人员。
编辑
有趣的是,我浏览了MOS 支持网站了解如何更改字符集,我发现了这篇说明更改数据库字符集[225912.1] 有一条有趣的注释:
仍有一些“dba”试图通过更新 props$ 来更改 NLS_CHARACTERSET 或 NLS_NCHAR_CHARACTERSET。此操作不受支持,并且会损坏您的数据库。这是破坏完整数据集的最佳方法之一。Oracle 支持将尝试帮助您解决此问题,但 Oracle 不保证数据可以恢复或恢复的数据是正确的。您将被要求执行完整导出并完全重建数据库。
请不要更新 props$。
答案2
我自己解决了:
如果您浏览 Oracle 数据库的表列表,您会看到一个名为“PROPS$”的表。我发现我错误覆盖的列如下所示:
Parameter Value
WE8ISO8859P1, AL32UTF8
我使用 SQLDeveloper 将列更新回“NLS_CHARACTERSET”,并且我的数据库再次正常运行。
表“NLS_DATABASE_PARAMETERS”只是一个过滤多个参数表的视图。我想我只是无法在该视图上运行更新,并将该列踢出。我现在将研究如何正确更改字符集。
感谢您的帮助和建议!
马可