Oracle 11gR2:使用 UPDATE 查询意外删除了 NLS_CHARACTERSET

Oracle 11gR2:使用 UPDATE 查询意外删除了 NLS_CHARACTERSET

我在 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”只是一个过滤多个参数表的视图。我想我只是无法在该视图上运行更新,并将该列踢出。我现在将研究如何正确更改字符集。

感谢您的帮助和建议!

马可

相关内容